[PB4 B10] CreateThread aber Thread noch nicht starten?

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

[PB4 B10] CreateThread aber Thread noch nicht starten?

Beitrag 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.
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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 ^^.
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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:

Code: Alles auswählen

    PokeB(pbproc+$0C,flags)
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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Sowas dachte ich mir schon. Du bist gut :mrgreen:. Ich staune immer
wieder, wie findet man sowas raus?
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

>Sowas dachte ich mir schon. Du bist gut :mrgreen:.

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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag 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
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Weil ich für sowas nicht einen Namen verschweden möchte, wenn man
das auch anders lösen könnte ;).
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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   
---------------------------
Bild
Gesperrt