Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #AutoIt3Wrapper_UseX64=n
- #include <include/FASM.au3>
- #include <Array.au3>
- #include <include/MemoryDll.au3>
- ;AutoIt Multithreading
- Dim $Fasm = FasmInit()
- ;struct mit Buchstaben erstellen, um die unterschiedliche Laufzeit der beiden Threads darzustellen
- $struct = DllStructCreate("char[4]") ;platz für 4 Buchstaben
- DllStructSetData($struct, 1, "XXXX")
- $ptr = DllStructGetPtr($struct)
- ;platz für Bytecode, der gleiche Bytecode wird von jedem Thread einzeln aufgerufen
- $thread1_struct = DllStructCreate("byte[255]") ;asmcode
- $ptr_asm = DllStructGetPtr($thread1_struct)
- FasmReset($Fasm)
- _("use32")
- _("mov esi,[esp+4]");parameter
- _("mov ecx,esi") ;
- _("shl ecx,2") ;vervierfachen, thread 1 soll doppelt so lange laufen wie thread 2
- _("mov edi," & $ptr) ;Integer belegen
- ;Zeitschleife
- _("rdtsc") ;counter in eax
- _("mov ebx, edx") ;obere 32 Bit merken ebx=timerinit()
- _("_wait:")
- _("rdtsc") ;counter in eax
- _("sub edx,ebx") ;timerdifferenz von aktuellem timestamp zum gemerkten timestamp ebx=timerdiff(ebx)
- _("cmp edx,ecx") ;ecx einheiten (2^32 Takte) vergangen?
- _("jl _wait") ;wenn weniger, dann _wait
- ;zeitschleife ende
- _("mov eax,esi") ;parameter in eax
- _("add eax,64") ;einen ansi-Buchstaben machen
- _("mov byte[edi-1+esi],al") ;buchstabe in struct schreiben
- _("ret")
- $Binary = FasmGetBinary($Fasm)
- If @extended Then
- $Error = FasmGetLastError()
- ConsoleWrite("Error Code:" & $Error[0] & @CRLF & "Error Message:" & $Error[1] & @CRLF & "Error Line:" & $Error[2] & @CRLF)
- Else
- ConsoleWrite(String(FasmGetBinary($Fasm)) & @CRLF)
- ;bytecode in struct schreiben
- DllStructSetData($thread1_struct, 1, $Binary)
- MsgBox(0, "Structinhalt vor dem Starten der beiden Threads", DllStructGetData($struct, 1))
- ;2 Threads vom gleichen Maschinencode aufrufen, das Autoitscript läuft weiter
- ;der zweite Thread läuft doppelt so lange wie der erste
- ;jeder Thread schreibt nach einer gewissen Zeit einen Buchstaben ascii(64+param) in die struct
- ;der erste Thread schreibt ein A an die erste Position
- ;der zweite Thread schreibt ein B an die 2. Position
- $param = 1
- $ret1 = DllCall("kernel32.dll", "hwnd", "CreateThread", "ptr", 0, "dword", 0, "long", $ptr_asm, "ptr", $param, "long", 0, "int*", 0)
- $param = 2
- $ret2 = DllCall("kernel32.dll", "hwnd", "CreateThread", "ptr", 0, "dword", 0, "long", $ptr_asm, "ptr", $param, "long", 0, "int*", 0)
- While sleep(10) ;threads are running
- $eax1 = DllCall("Kernel32.dll", "int", "GetExitCodeThread", "ptr", $ret1[0], "dword*", 0) ;Rückgabe (EAX) aus den Threads
- $eax2 = DllCall("Kernel32.dll", "int", "GetExitCodeThread", "ptr", $ret2[0], "dword*", 0)
- ToolTip("AutoIt ist nicht geblockt!"&@crlf&"EAX1 = " & $eax1[2] & " EAX2 = " & $eax2[2] & @CRLF & "structinhalt: " & DllStructGetData($struct, 1))
- if ($eax1[2]<>259) and ($eax2[2]<>259) then exitloop ;so lange, wie noch keine Rückgabe aus den Threads erfolgt
- WEnd
- DllCall("Kernel32.dll", "int", "TerminateProcess", "ptr", $ret1[0], "uint", 0) ;Threads löschen
- DllCall("Kernel32.dll", "int", "TerminateProcess", "ptr", $ret2[0], "uint", 0)
- MsgBox(0, "Structinhalt nach dem Beenden der beiden Threads", DllStructGetData($struct, 1))
- EndIf
- FasmExit($Fasm)
- Exit
- Func _($str) ; Nur für die bequemlichkeit ^^
- Fasmadd($Fasm, $str)
- EndFunc ;==>_
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement