Advertisement
Guest User

Untitled

a guest
Oct 12th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 3.26 KB | None | 0 0
  1. #AutoIt3Wrapper_UseX64=n
  2. #include <include/FASM.au3>
  3. #include <Array.au3>
  4. #include <include/MemoryDll.au3>
  5.  
  6. ;AutoIt Multithreading
  7.  
  8. Dim $Fasm = FasmInit()
  9.  
  10.  
  11. ;struct mit Buchstaben erstellen, um die unterschiedliche Laufzeit der beiden Threads darzustellen
  12. $struct = DllStructCreate("char[4]") ;platz für 4 Buchstaben
  13. DllStructSetData($struct, 1, "XXXX")
  14. $ptr = DllStructGetPtr($struct)
  15.  
  16. ;platz für Bytecode, der gleiche Bytecode wird von jedem Thread einzeln aufgerufen
  17. $thread1_struct = DllStructCreate("byte[255]") ;asmcode
  18. $ptr_asm = DllStructGetPtr($thread1_struct)
  19.  
  20.  
  21. FasmReset($Fasm)
  22. _("use32")
  23. _("mov esi,[esp+4]");parameter
  24. _("mov ecx,esi")    ;
  25. _("shl ecx,2")      ;vervierfachen, thread 1 soll doppelt so lange laufen wie thread 2
  26. _("mov edi," & $ptr) ;Integer belegen
  27. ;Zeitschleife
  28. _("rdtsc") ;counter in eax
  29. _("mov ebx, edx") ;obere 32 Bit merken  ebx=timerinit()
  30. _("_wait:")
  31. _("rdtsc") ;counter in eax
  32. _("sub edx,ebx") ;timerdifferenz von aktuellem timestamp zum gemerkten timestamp ebx=timerdiff(ebx)
  33. _("cmp edx,ecx") ;ecx einheiten (2^32 Takte) vergangen?
  34. _("jl _wait") ;wenn weniger, dann _wait
  35. ;zeitschleife ende
  36. _("mov eax,esi") ;parameter in eax
  37. _("add eax,64") ;einen ansi-Buchstaben machen
  38. _("mov byte[edi-1+esi],al") ;buchstabe in struct schreiben
  39. _("ret")
  40.  
  41. $Binary = FasmGetBinary($Fasm)
  42. If @extended Then
  43.     $Error = FasmGetLastError()
  44.     ConsoleWrite("Error Code:" & $Error[0] & @CRLF & "Error Message:" & $Error[1] & @CRLF & "Error Line:" & $Error[2] & @CRLF)
  45. Else
  46.     ConsoleWrite(String(FasmGetBinary($Fasm)) & @CRLF)
  47.  
  48.     ;bytecode in struct schreiben
  49.     DllStructSetData($thread1_struct, 1, $Binary)
  50.  
  51.     MsgBox(0, "Structinhalt vor dem Starten der beiden Threads", DllStructGetData($struct, 1))
  52.  
  53.     ;2 Threads vom gleichen Maschinencode aufrufen, das Autoitscript läuft weiter
  54.     ;der zweite Thread läuft doppelt so lange wie der erste
  55.     ;jeder Thread schreibt nach einer gewissen Zeit einen Buchstaben ascii(64+param) in die struct
  56.     ;der erste Thread schreibt ein A an die erste Position
  57.     ;der zweite Thread schreibt ein B an die 2. Position
  58.     $param = 1
  59.     $ret1 = DllCall("kernel32.dll", "hwnd", "CreateThread", "ptr", 0, "dword", 0, "long", $ptr_asm, "ptr", $param, "long", 0, "int*", 0)
  60.     $param = 2
  61.     $ret2 = DllCall("kernel32.dll", "hwnd", "CreateThread", "ptr", 0, "dword", 0, "long", $ptr_asm, "ptr", $param, "long", 0, "int*", 0)
  62.  
  63.     While sleep(10) ;threads are running
  64.         $eax1 = DllCall("Kernel32.dll", "int", "GetExitCodeThread", "ptr", $ret1[0], "dword*", 0) ;Rückgabe (EAX) aus den Threads
  65.         $eax2 = DllCall("Kernel32.dll", "int", "GetExitCodeThread", "ptr", $ret2[0], "dword*", 0)
  66.         ToolTip("AutoIt ist nicht geblockt!"&@crlf&"EAX1 = " & $eax1[2] & "     EAX2 = " & $eax2[2] & @CRLF & "structinhalt: " & DllStructGetData($struct, 1))
  67.         if ($eax1[2]<>259) and ($eax2[2]<>259) then exitloop ;so lange, wie noch keine Rückgabe aus den Threads erfolgt
  68.     WEnd
  69.     DllCall("Kernel32.dll", "int", "TerminateProcess", "ptr", $ret1[0], "uint", 0) ;Threads löschen
  70.     DllCall("Kernel32.dll", "int", "TerminateProcess", "ptr", $ret2[0], "uint", 0)
  71.  
  72.     MsgBox(0, "Structinhalt nach dem Beenden der beiden Threads", DllStructGetData($struct, 1))
  73.  
  74. EndIf
  75. FasmExit($Fasm)
  76. Exit
  77.  
  78. Func _($str) ; Nur für die bequemlichkeit ^^
  79.     Fasmadd($Fasm, $str)
  80. EndFunc   ;==>_
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement