Seite 1 von 2
[PB4 B10] CreateThread aber Thread noch nicht starten?
Verfasst: 15.04.2006 04:03
von MVXA
Hi,
Kann man diesen Befehl irgendwie nachbauen, sodass er auch mit den
anderen Befehlen von PB zurecht kommt? Mir geht es darum, wenn der
Thread erstellt wird, soll er noch nicht starten. Er soll erst los legen, wenn
ich grünes Licht gebe.
Verfasst: 15.04.2006 04:44
von Deeem2031
Sowas wär doch mal eine schöne Aufgabenstellung für ein Contest
Meine Lösung (schmutzig, aber funktioniert)
Code: Alles auswählen
Procedure CreateThread_M(proc.l,value,flags.b)
Protected result, pbproc, old
!MOV Eax, _PB_CreateThread@8
!CMP byte[Eax+0x0B], 0x6A
!JNE asm_CreateThread_M_fail
!CMP dword[Eax+0x90], 0x0008C2C9
!JNE asm_CreateThread_M_fail
!MOV dword[p.v_pbproc], Eax
If VirtualProtect_(pbproc,$100,#PAGE_EXECUTE_READWRITE,@old)
PokeB(pbproc+$0C,flags)
result = CreateThread(proc,value)
PokeB(pbproc+$0C,$00)
VirtualProtect_(pbproc,$100,old,@old)
ProcedureReturn result
EndIf
!asm_CreateThread_M_fail:
ProcedureReturn #False
EndProcedure
;-Bsp
Procedure a(void)
Debug 1234
ProcedureReturn
EndProcedure
thread = CreateThread_M(@a(),0,#CREATE_SUSPENDED) ;Warten bis ResumeThread
Delay(500)
ResumeThread(thread)
Delay(500)
Verfasst: 15.04.2006 05:01
von MVXA
Kann es sein du fummelst da an PB internen Sachen rum? Sieht ganz
interessant aus. Danke für die Antwort um die Uhrzeit ^^.
Verfasst: 15.04.2006 05:11
von Deeem2031
Naja, zuerst überprüf ich ob die CreateThread()-proc die du benutzt auch die ist die ich haben will (kann sich ja mit den PB-Versionen ändern):
Code: Alles auswählen
!MOV Eax, _PB_CreateThread@8
!CMP byte[Eax+0x0B], 0x6A
!JNE asm_CreateThread_M_fail
!CMP dword[Eax+0x90], 0x0008C2C9
!JNE asm_CreateThread_M_fail
!MOV dword[p.v_pbproc], Eax
Dann befrei ich den Speicher, wo die Procedure liegt von seiner Protection, damit ich was ändern darf:
Code: Alles auswählen
If VirtualProtect_(pbproc,$100,#PAGE_EXECUTE_READWRITE,@old)
Und änder dann innerhald der CreateThread-Procedure die flags für den Kernel32-CreateThread_() aufruf:
Dann wird nurnoch CreateThread aufgerufen (wobei ja dann die angegebenen Flags benutzt werden) und die Änderungen werden rückgangig gemacht.
Solang also Fred an der CreateThread-Proc nichts ändert und die flags nicht die byte-grenze überschreiten dürfte das immer funktionieren.
Verfasst: 15.04.2006 05:16
von MVXA
Sowas dachte ich mir schon. Du bist gut

. Ich staune immer
wieder, wie findet man sowas raus?
Verfasst: 15.04.2006 05:26
von Deeem2031
>Sowas dachte ich mir schon. Du bist gut

.
Thx
>Ich staune immer wieder, wie findet man sowas raus?
Naja, mit bisl WinAPI- und Assembler-Wissen plus OllyDebugger ist sowas recht schnell rausgefunden. Das einzige was mich am Anfang gestört hat war der "Invalid Memory Access"-Fehler als ich ohne VirtualProtect_() versucht hab in die Procedure zu schreiben, desswegen hats paar Minütchen länger gedauert.
Verfasst: 15.04.2006 07:40
von Konne
Mann kann den Thread auch einfach mit PauseThread anhalten...
Aber eine amazing Loesung die du da bietest. Und danke Fred das sowas in PB moeglich ist ;0
Verfasst: 15.04.2006 14:12
von AND51
Wenn schon nicht Konne's Idee, warum dann am Anfang des Threads mittels Repeat nicht warten, bis eine globale Variable mit 1 (oder so) belegt ist?
Verfasst: 15.04.2006 16:10
von MVXA
Weil ich für sowas nicht einen Namen verschweden möchte, wenn man
das auch anders lösen könnte

.
Verfasst: 16.04.2006 00:47
von MVXA
Mh, Dein Code kommt nicht so ganz mit der Threadsafe Option klar, deeem
Code: Alles auswählen
---------------------------
PureBasic - Assembler error
---------------------------
PureBasic.asm [1792]:
MP6
PureBasic.asm [660] MP6 [18]:
MOV Eax , _PB_CreateThread@8
error: undefined symbol.
---------------------------
OK
---------------------------