Moin,
ich bastele grade ein Programm, dass ein anderes via CreateProcess startet, dadurch habe ich ein TProcessInformation record welches das
Handle des Prozesses und des Hauptthreads enthält. Nun versuche ich kurz nach dem starten des Programmes (sleep (100)) einen der Register des Hauptthreads auszulesen:
Delphi-Quellcode:
var
FTargetContext: _CONTEXT;
// = winapi.windows._CONTEXT
FStartUpInfo: TStartupInfo;
FProcessSpawnInfo: TProcessInformation;
[....]
ZeroMemory(@FStartUpInfo, SizeOf(TStartUpInfo));
ZeroMemory(@FProcessSpawnInfo, SizeOf(TProcessInformation));
FStartUpInfo.cb := SizeOf(TStartUpInfo);
if not CreateProcess(PChar(StrBuf2),
nil,
nil,
nil, true,
DETACHED_PROCESS
or CREATE_SUSPENDED,
nil, PChar(StrBuf1), FStartUpInfo, FProcessSpawnInfo)
then
ErrorAndExit();
//pseudocode
repeat
if ResumeThread(FProcessSpawnInfo.hThread) = -1
then
ErrorAndExit();
//pseudocode
Sleep(100);
FTargetContext.ContextFlags := CONTEXT_FULL;
if SuspendThread(FProcessSpawnInfo.hThread) = -1
then
ErrorAndExit();
//pseudocode
if not GetThreadContext(FProcessSpawnInfo.hThread, FTargetContext)
then
ErrorAndExit();
// <---- failed
until SomeCondition;
Das ganze funktioniert wunderbar in der 32Bit Version (target prozess ist natürlich auch 32bit), mit 64Bit (target prozess ist auch 64bit) kommt GetThreadContext mit false zurück und FTargetContext ist ausgenullt. Im
MSDN steht leider nichts bezüglich irgendwelcher unterschiede von GetThreadContext bei 32 und 64Bit, abgesehen davon, dass ein 64bit Programm ein 32bit-Thread mittels Wow64GetThreadContext auslesen kann, aber das trifft ja nicht zu, da meine 64bit-Executable auch eine 64bit-Executable wieder ausführt.