Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CreateThread unter 64 bit - Crash (https://www.delphipraxis.net/168056-createthread-unter-64-bit-crash.html)

Zacherl 2. Mai 2012 19:22

CreateThread unter 64 bit - Crash
 
Hallo Leute,

ich habe grade mal versucht in einer 64 bit Anwendung mit CreateThread() einen neuen Thread zu starten. Unter 32 bit funktioniert folgender Code:
Delphi-Quellcode:
function DummyThread(Parameter: Pointer): DWord; stdcall;
begin
  Result := 0;
end;

CreateRemoteThread(hProcess, nil, 0, @DummyThread, nil, 0, TID);
Unter 64 bit führt der Aufruf allerdings direkt zum Crash. Wenn ich innerhalb des Threads einen Breakpoint setze, dann sehe ich, dass auch der Parameter Pointer komplett falsch ist. Irgendwie wird also der Stack corrupted.

Muss ich unter 64 bit da eine andere Aufrufkonvention als stdcall angeben?

Viele Grüße
Zacherl

Assarbad 2. Mai 2012 19:33

AW: CreateThread unter 64 bit - Crash
 
Zitat:

Zitat von Zacherl (Beitrag 1164624)
Muss ich unter 64 bit da eine andere Aufrufkonvention als stdcall angeben?

Definitiv nein. In x64 (auf Windows) gibt es nur noch eine Aufrufkonvention.

Du versuchst aber keine "Schweinereien" wie einen Thread aus einem 64bit-Prozeß in einem WOW64-Prozeß zu erzuegen, oder?

haentschman 2. Mai 2012 19:35

AW: CreateThread unter 64 bit - Crash
 
Leider kann ich dir nicht helfen, hätte aber eine Frage an dich. Warum nicht TThread ? Ich denke mal daß die ganzen Anpassungen für 64 Bit dort eingeflossen sind.
[Edit] ... sorry, habe das Remote übersehen. Nehme alles zurück.[/Edit]

Zacherl 2. Mai 2012 19:44

AW: CreateThread unter 64 bit - Crash
 
Zitat:

Zitat von Assarbad (Beitrag 1164627)
Du versuchst aber keine "Schweinereien" wie einen Thread aus einem 64bit-Prozeß in einem WOW64-Prozeß zu erzuegen, oder?

Nein nein :)

Ich habe das Problem grade beheben können. Vorher hatte ich die Threadfunktion innerhalb einer anderen Funktion, also folgendermaßen, deklariert:
Delphi-Quellcode:
function Inject(..): Boolean;

function DummyThread(P: Pointer): DWord; stdcall;
begin
  Result := 0;
end;

begin
  CreateRemoteThread(..);
end;
Dies hat unter 64 Bit wohl die Probleme verursacht. Nachdem ich die Threadfunktion nun über der Inject Funktion deklariert habe, funktioniert jetzt alles.

Assarbad 2. Mai 2012 20:11

AW: CreateThread unter 64 bit - Crash
 
Zitat:

Zitat von Zacherl (Beitrag 1164630)
Ich habe das Problem grade beheben können. Vorher hatte ich die Threadfunktion innerhalb einer anderen Funktion, also folgendermaßen, deklariert:
Delphi-Quellcode:
function Inject(..): Boolean;

function DummyThread(P: Pointer): DWord; stdcall;
begin
  Result := 0;
end;

begin
  CreateRemoteThread(..);
end;
Dies hat unter 64 Bit wohl die Probleme verursacht. Nachdem ich die Threadfunktion nun über der Inject Funktion deklariert habe, funktioniert jetzt alles.

Aua. Allerdings. Ähnliches kannst du sogar provozieren wenn du auf 32bit die register-Aufrufkonvention benutzt. Hab ich mich auch mal vor Jahren mit angeschmiert und seitdem meine Callbacks fein säuberlich von anderen Funktionen getrennt. Das Problem ist also sozusagen zurück. Macht Sinn. Aber gut es wieder im Hinterkopf zu haben.

jbg 2. Mai 2012 20:59

AW: CreateThread unter 64 bit - Crash
 
Zitat:

Zitat von Assarbad (Beitrag 1164636)
Das Problem ist also sozusagen zurück. Macht Sinn. Aber gut es wieder im Hinterkopf zu haben.

Embarcadero war beim Entwickeln des 64-Bit Compilers einfach zu faul, die gleiche Optimierung wie beim 32-Bit Compiler für lokale Funktionen einzubauen. In 32-Bit wird der versteckte "EBP" Parameter nur mitgegeben, wenn die lokale Funktion auf den äußeren Scope zugreift. Beim 64-Bit wird der versteckte "RBP" Parameter immer mitgegeben. Und das führt nun bei sämtlichen Callbacks zu Problemen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz