Hallo,
Ich befürchte entweder einen ganz ekligen undurchschaubaren Fehler oder einen Leichtsinnsfehler. (Habe bisher fast garnichts mit
COM gemacht).
Ich habe folgende
DLL, die ich in einen anderen Prozess injeziere (was alles klappt und eigentlich nichts zur Sache tut). Von dort aus möchte ich
XML Dateien parsen. Doch es scheitert schon beim instanzieren von IXMLDomDocument2. Der Aufruf "DOMDocument40.Create" friert gleich den ganzen Prozess ein.
Hier mal vereinfacht der Code:
Die
DLL:
Delphi-Quellcode:
library DllMain;
uses
Windows,
Sysutils,
ActiveX,
ComObj,
...
uSettings
in '
uSettings.pas';
{$R *.res}
//============================================================================//
procedure Main(dwReason: DWord);
begin
case dwReason
of
DLL_PROCESS_ATTACH:
begin
DisableThreadLibraryCalls(hInstance);
OleCheck(CoInitialize(
nil));
// Init Classes
...
gSet := CSettings.Create(gLog,cvar,ModulePath+'
\settings.xml');
...
end;
DLL_PROCESS_DETACH:
begin
...
gSet.Free;
CoUninitialize;
end;
end;
end;
//============================================================================//
begin
DllProc := @Main;
Main(DLL_PROCESS_ATTACH);
end.
In der uSettings.pas
Delphi-Quellcode:
type
CSettings =
class(TObject)
public
constructor Create(log: CDeepLog; cvar: CCVAR; xmlfile:
String);
private
xmlDoc: IXMLDomDocument2;
outLog: CDeepLog;
DoLog : Boolean;
useXML: Boolean;
procedure LoadDefaults(
var cvar: CCVAR);
procedure LoadXMLSettings(
var cvar: CCVAR);
end;
implementation
//***************************************************************************//
// //
// CSettings - Implementation //
// //
//***************************************************************************//
constructor CSettings.Create(log: CDeepLog; cvar: CCVAR; xmlfile:
String);
begin
inherited Create;
outlog := log;
If Assigned(outlog)
Then
DoLog := True
Else
DoLog := False;
If FileExists(xmlFile)
Then
begin
// asm
// db $EB, $FE
// end;
xmlDoc := CoDOMDocument40.Create;
MessageBox(0,'
I do never appear :(','
:(',$40);
...
end;
Das habe ich in OllyDbg mal untersucht. Mal alle Function Calls ab CoDOMDocument40.Create getraced und es läuft darauf hinaus, dass ein Syscall "NtMapViewOfSection" nie zurückkehrt und gleich den ganzen prozess einfrieren lässt.
Delphi-Quellcode:
7C91DC55 B8 6C000000 MOV EAX,6C //0x6C -> NtMapViewOfSection
7C91DC5A BA 0003FE7F MOV EDX,7FFE0300
7C91DC5F FF12 CALL DWORD PTR DS:[EDX] //KiFastSystemCall
7C91DC61 C2 2800 RETN 28 //Kehrt nicht zurück :/
Stack:
[ESP] 7C91DC61 RETURN to 7C91DC61
0379EE08 7C92C3DA RETURN to 7C92C3DA from 7C91DC55
0379EE0C 00002F64
0379EE10 FFFFFFFF
0379EE14 0379EEDC
0379EE18 00000000
0379EE1C 00000000
0379EE20 00000000
0379EE24 0379EED0
0379EE28 00000001
0379EE2C 00000000
0379EE30 00000004
http://undocumented.ntinternals.net/...OfSection.html
Ich bin eigentlich nicht sehr optimistisch, aber vielleicht hat einer eine Idee.
Danke schonmal für jeden Hinweis.