[PB4 B10] CreateThread aber Thread noch nicht starten?
[PB4 B10] CreateThread aber Thread noch nicht starten?
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.
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.
Sowas wär doch mal eine schöne Aufgabenstellung für ein Contest 
Meine Lösung (schmutzig, aber funktioniert)

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)

[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
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):
Dann befrei ich den Speicher, wo die Procedure liegt von seiner Protection, damit ich was ändern darf:
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.
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
Code: Alles auswählen
If VirtualProtect_(pbproc,$100,#PAGE_EXECUTE_READWRITE,@old)
Code: Alles auswählen
PokeB(pbproc+$0C,flags)
Solang also Fred an der CreateThread-Proc nichts ändert und die flags nicht die byte-grenze überschreiten dürfte das immer funktionieren.

[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
>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.

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.

[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
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?
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
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
---------------------------