exe weiter laufen lassen und erneut mit Parametern aufrufen

  • Hi @ all !

    Ich habe da mal eine Frage :

    Wenn ich eine exe ( ein Compiliertes Script ) aufrufe, kann ich diese ja via cmd-line parametrisieren.

    Dann wird diese abgearbeitet und beendet.

    Ich möchte jetzt aber die Exe so schreiben, dass ich Diese einmal Starte z.b. parameter "-start"

    Diese dann im Hintergrund weiter arbeitet, und wenn ich dann diese erneut aufrufe, Sie nicht erneut startet sondern einfach nur neue Parameter übernimmt z.b. "-parameter=5"


    Ich habe hier mal etwas vorbereitet, das das vielleicht etwas genauer erklärt.

    Hier mein Haupt Script welches die EXE aufrufen soll.

    Spoiler anzeigen
    [autoit]

    HotKeySet("{ESC}", "Terminate")
    HotKeySet("+1", "callFunc1") ; Shift+Number
    HotKeySet("+2", "callFunc2") ; Shift+Number
    HotKeySet("+q", "callFuncQ") ; Shift+Number

    [/autoit] [autoit][/autoit] [autoit]

    $subExe = "subEXE.exe"

    [/autoit] [autoit][/autoit] [autoit]

    While 1

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Sleep(100)

    [/autoit] [autoit][/autoit] [autoit]

    ToolTip(@HOUR & ":" & @MIN & " ->Shift+Number drücken", 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func callFunc1()
    Run(@ScriptDir&"\"&$subExe & " -start=5","")
    EndFunc ;==>callFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func callFunc2()
    Run(@ScriptDir&"\"&$subExe & " -param=2","")
    EndFunc ;==>callFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func callFuncQ()
    Run(@ScriptDir&"\"&$subExe & " -exit","")
    EndFunc ;==>callFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Terminate()

    [/autoit] [autoit][/autoit] [autoit]

    Exit 0
    EndFunc ;==>Terminate

    [/autoit]


    und hier die EXE ( welche im Hintergrund laufen soll )

    Spoiler anzeigen
    [autoit]

    $_IND_Start = "start"
    $_IND_Parameter = "param"
    $_IND_Exit = "exit"

    [/autoit] [autoit][/autoit] [autoit]

    Static $value = 0

    [/autoit] [autoit][/autoit] [autoit]

    If $CMDLINE[0] > 0 Then
    ;MsgBox(0, "", "SubExe" & $CMDLINE[1])
    ;MsgBox(0, "", StringLeft($CMDLINE[1],StringLen($_IND_Start)+1))
    ;MsgBox(0,$_IND_Start,StringCompare(StringLeft($CMDLINE[1],StringLen($_IND_Start)+1), "-"&$_IND_Start))
    ;MsgBox(0,$_IND_Parameter,StringCompare(StringLeft($CMDLINE[1],StringLen($_IND_Parameter)+1), "-"&$_IND_Parameter))
    ;MsgBox(0,$_IND_Exit,StringCompare(StringLeft($CMDLINE[1],StringLen($_IND_Exit)+1), "-"&$_IND_Exit))

    [/autoit] [autoit][/autoit] [autoit]

    If StringCompare(StringLeft($CMDLINE[1], StringLen($_IND_Start) + 1), "-" & $_IND_Start) = 0 Then
    MsgBox(0, $_IND_Start, $_IND_Start)
    $value = StringTrimLeft($CMDLINE[1], StringLen($_IND_Start) + 2)

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf StringCompare(StringLeft($CMDLINE[1], StringLen($_IND_Parameter) + 1), "-" & $_IND_Parameter) = 0 Then
    MsgBox(0, $_IND_Parameter, $_IND_Parameter)
    $value = StringTrimLeft($CMDLINE[1], StringLen($_IND_Parameter) + 2)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ElseIf StringCompare(StringLeft($CMDLINE[1], StringLen($_IND_Exit) + 1), "-" & $_IND_Exit) = 0 Then
    MsgBox(0, $_IND_Exit, $_IND_Exit)
    Exit 0
    Else
    MsgBox(0, "ELSE", "Else")
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Else
    MsgBox(0, "", "SubExe" & $CMDLINE[0])

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "$value", $value)

    [/autoit]

    ist natürlich nicht fertig ..
    Zile ist es : Die exe mit "-Start=5" zu starten.

    5 soll dann als fix wert hinterlegt werden.

    Jedes mal, wenn dann die Exe mit "-parameter=..." aufgerufen wird soll z.b. zu dem Startwert die "...." ( hier 2) dazugezählt werden.


    Ich möchte das ohne den IO-Steam machen .. und ohne das verwenden von ini-oder Registry

    Warum die Frage:
    Ich habe ein Programm welches via Parameter ( "-reuse-instance" ) genau diese Funktion bereitstellt und möchte wissen wie das geht und eventuell selber in einer anderen Anwendung nachbauen.
    Finde ich nämlich richtig praktisch.

    Jemand ne idee ==?? ?(

  • Du könntest mit deinem ersten Script nen localen TCP Server starten und sobald der task deineexe.exe 2mal vorhanden ist soll auf dein server verbunden werden und die parameter geschickt werden.

    -

  • das mit dem lokalen TCP Server .. macht das nicht Probleme mit der Firewall ?

    Glaub bevor ich da noch den IP-Stack mit ein beziehe versuche ichs doch lieber mit der Registry ... oder hast du n sample parad ?

    @ chesstiger .. das mit dem StdInWrite / StdOutRead hat ich gemeint mit dem IO-Steam den ich nicht benutzen wollen würde ..
    das habe ich bei einem anderen projekt schon mal probiert und hatte problemchen mit gehabt....
    da lass ich lieber die finger davon ..

    Sonstige Vorschläge ?

    @ Nachid .. wie hast du das gemeint, mit der überprüfung, ob meine EXE 2 mal vorhanden ist ?
    Ich meine, wenn das Programm einen Dynamischen namen bekommt, dann kann das ja leider nicht wissen , wie die "zweite" instance heist .. oder ?

    .. kann man vielleicht über die Comand-line ein handle by Ref ? oder sowas in der art übergeben. ... ?
    muss ich mal probieren .. ein Gui Handle geht ja ..

  • Also wenn du nur die Daten in den Variablen ändern willst, dann arbeite mit der Pointer.au3.
    So kannst du die Adresse im RAM ermitteln und den Wert direkt ansprechen und verändern.

    Wäre auch noch ne Idee! :P

  • Das mit dem RAM find ich weitaus schwerer.
    Wenn du nen Server auf 127.0.0.1 startest gibts keine Firewall Probleme, nur bei @IPAdress1
    Dynamische namen kannst du mit $x = StringSplitt(@ScriptFullPath,"\",1) damit umgehen. dein script ist dann in
    $x[$x[0]] also schaust du nun durchsuchst du ProcessList ob dein script 2x auftaucht (was beim ersten start nicht der fall ist).
    Wenn ja dann Connecte auf server 127.0.0.1 wenn nein dann starte Server.
    Beispiel hab ich grad keins da.

    -

  • Also ich würde das ganze so machen:

    Haupt-Anwendung:

    [autoit]


    If Not ProcessExists("EigentlicheAnwendung.exe") Then Run("EigentlicheAnwendung.exe")
    ClipPut($CMDLINERAW)

    [/autoit]


    Eigentliche Anwendung:

    [autoit]


    AdlibRegister("GetParameters")

    [/autoit][autoit][/autoit][autoit]

    ;HIER DAS SKRIPT EINFÜGEN

    [/autoit][autoit][/autoit][autoit]

    Func GetParameters()
    $Parameters = ClipGet()
    ClipPut("")
    Return $Parameters
    EndFunc

    [/autoit]
  • Die Zwischenablage zu nutzen, ist - sorry - kompletter Schwachsinn.^^
    Da dann doch lieber eine Temp-Datei. ;)

    Wie gesagt: Optimal sind Std-Stream & TCP/UDP. :P

    Und... Das was Make-Grafik genannt hat (Aus dem RAM auslesen)...
    Es gibt sowas ähnliches, nennt sich Exchange Variables von eukalyptus. ;)

    lg chess

  • Die Zwischenablage zu nutzen, ist - sorry - kompletter Schwachsinn.^^
    Da dann doch lieber eine Temp-Datei. ;)

    Hast schon Recht :D

    Das war halt das erste, das mir eingefallen ist. Aber man kann natürlich einfach so machen:

    Haupt-Anwendung:

    [autoit]

    If Not ProcessExists("EigentlicheAnwendung.exe") Then Run("EigentlicheAnwendung.exe")
    IniWrite("TMP", "TMP", "TMPPARAM", $CMDLINERAW)

    [/autoit]

    Eigentliche-Anwendung:

    [autoit]

    AdlibRegister("GetParameters")

    [/autoit][autoit][/autoit][autoit]

    ;HIER DAS SKRIPT EINFÜGEN

    [/autoit][autoit][/autoit][autoit]

    Func GetParameters()
    $Parameters = IniRead("TMP", "TMP", "TMPPARAM", "")
    IniWrite("TMP", "TMP", "TMPPARAM", "")

    [/autoit][autoit][/autoit][autoit]

    ;HIER FUNKTIONEN AUFRUFEN

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]

    I-wie komm ich mir n bischen noob like vor :D

  • mmm .. alles gute idee'n .. aber befriedigt bin ich rigend wie noch nicht nicht ...

    ... ich meine .. nehmen wir einmal ein ganz simples dll Beispiel ..

    dll open .. -> dll Befehl -> dll Befehl -> dll close ..

    das müsste doch auch mit einer Exe machbar sein .. eine dll ist doch eigentlich nix anderes .. nur halt das diese im Gegensatz
    zu einer exe keine eigene "Main" Funktion hat.

    oder hab ich da was falsch verstanden ...

    ich müsste noch mal suche, aber hier im Forum gibt es eine CommMG.dll für den RS232 Port

    Da muss man z.b. die DLL "Starten" und den Port definieren. ( zb. als Funktion 1 )

    anschließend liest oder schreibt man nur noch Werte. ( z.b. als Funktion n+)

    der DLL call ansich benötigt aber keine definition, welcher Port gemeint ist. d.h. dass sich die DLL dieses merkt.
    ( logisch, dazu ist diese ja da )

    Dass muss doch auch mit einer EXE gehen.

    ggrrr.. verflixt .. wieso komm ich nicht drauf ... ?(

    mit einem virtuellen oder versteckten "irgendwas" fühl ich mich nicht wohl .. die Zwischenablage ist mir zu Fehleranfällig
    ( hab n Programmierer Kolleg, der die Zwischenablage mit einem Programm belegt um einen Video-Steam um 90 ° zu drehen.
    furchtbahr.. !!!!!!!!!!!!!!!!!!!!!!!!!!! sobald man was kopieren will, hat man plötzlich ein Bild im Text .. igitigit !! :cursing: )

    die REG finde ich ( persönlich ) sollte nicht so häufig gepoolt werden .. hab aber keine Ahnung, ob das Windows interessiert oder nicht ..

    eine hidden TXT oder ini finde ich auch ziemlich fehlerlastig . .. ich denke da vor allem an Antivirus Programme.. o.ä.
    wenn diese entsprechend scharf gestellt werden, prüfen die bei jedem Zugriff.. . . kann bei ein paar Variablen exponentiell werden ..

    mmm .mm .. m

    Einmal editiert, zuletzt von vivus (10. März 2013 um 17:02)

  • Hey! Ich mische mich auch mal wieder ein... :x
    Du hast eigentlich nur folgende Möglichkeiten:

    1.: *.txt / *.ini (usw.) Files
    Der einzigste Nachteil den ich hierbei sehe, der Anwender kann einfach die Datei verändern und dies würde zu Fehlern im Programm führen...
    Aber ich glaube man kann diese auch Schreibgeschützt öffnen sodass eine Änderung ohne weiteres nicht mehr möglich ist.

    2. Registry
    Es gibt einen bestimmten Schlüssel der extra für Anwendungen ist. Dort kann man Werte unbedenkt verändern, löschen oder hinzu fügen. Die einzigste Folge wäre dann: Die betroffenen Programme könnten bei veränderungen nicht mehr richtig laufen.

    3. IO-Stream
    Eigentlich sehr sicher. Ich sehe da derzeitig keine Probleme... Ob du damit umgehen kannst ist eine andere Geschichte. Wenn du willst schreibe ich dir ein Skript bzw. Funktionen die das ganze verwalten. Dann hättest du nur noch 2 Funktionen. Und zwar eine Sende und eine Empfang Funktion...

    4. TCP / UDP
    Eiegntlich auch sehr sicher. Siehe IO-Stream...

    5. RAM
    Betroffene Werte einfach direkt im RAM ändern. Einfacher Datenaustausch... Naja, wenn man es kann ^^

    6. Zwischenspeicher
    Auch hier können Werte vorrübergehend gespeichert werden. Der nachteil wäre dann, dass dieser dann nicht mehr wärend der Laufzeit besetzbar ist. Bzw. Bei veränderungen kann das Programm nicht mehr sicher laufen.

    7. Controls (danke autoBert)
    Einfach mit dem Script eine nicht sichtbare GUI mit einem Input bzw. Edit Feld auslesen. Nachteile fallen mir spontan nicht ein...


    Mehr Ideen fallen mir nicht ein. Ist eigentlich auch nur eine Zusammenfassung...
    Hoffe ich konnte helfen! :x

    Einmal editiert, zuletzt von Yjuq (11. März 2013 um 14:46)

  • Zitat

    Könnte man nicht einfach einen "Zeiger" wie bei C++ auf einen Speicherbereicht machen und den dann direkt verarbeiten. Vorher natürlich noch gucken, ob der Prozess schon läuft.

    Das habe ich in Post #6 vorgeschlagen. Allerdings mit anderen Worten...

    Zitat

    Man könnte es vielleicht auch über Objekte machen.

    Und wie? Würde mich interessieren! (Ist nicht sarkastisch gemeint...)

    €dit:
    Hab ne simple Möglichkeit gefunden mit diesen "Zeigern".
    Werde dazu ein Beispiel schreiben und dann hier hochladen!

    Mfg. MG

    Einmal editiert, zuletzt von Yjuq (11. März 2013 um 15:46)

  • Okey, besser bekomme ich das nicht hin...

    Skript1: (kompilieren)

    Spoiler anzeigen
    [autoit]

    Global $tagStruct, $tStruct, $sSave
    $tagStruct = 'int;' & _ ; 4 Byte
    'char[5]' ; 8 Byte

    [/autoit] [autoit][/autoit] [autoit]

    $tStruct = DllStructCreate($tagStruct)
    DllStructSetData($tStruct, 1, 777)
    DllStructSetData($tStruct, 2, 'Hallo')
    RunWait('Skript2.exe ' & @AutoItPID & ' ' & DllStructGetPtr($tStruct))

    [/autoit] [autoit][/autoit] [autoit]

    $sSave = '1.: ' & DllStructGetData($tStruct, 1) & @CRLF & _ ; 333
    '2.: ' & DllStructGetData($tStruct, 2) ; Welt!

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(262144, 'Output Skript1.exe', $sSave)

    [/autoit] [autoit][/autoit] [autoit]

    $tagStruct = ''
    $tStruct = ''
    $sSave = ''

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit]

    Skript2: (kompilieren)

    Spoiler anzeigen
    [autoit]

    #include <Pointer.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $tagStruct1, $tagStruct2, $hOpen, $tStruct1, $tStruct2, $sSave
    $tagStruct1 = 'int; int'
    $tagStruct2 = 'char[5]'

    [/autoit] [autoit][/autoit] [autoit]

    $hOpen = _MemoryOpen($CmdLine[1])

    [/autoit] [autoit][/autoit] [autoit]

    $tStruct1 = DllStructCreate($tagStruct1)
    DllStructSetData($tStruct1, 1, _MemoryRead($CmdLine[2] + 4, $hOpen))
    DllStructSetData($tStruct1, 2, _MemoryRead($CmdLine[2] + 8, $hOpen))

    [/autoit] [autoit][/autoit] [autoit]

    $tStruct2 = DllStructCreate($tagStruct2, DllStructGetPtr($tStruct1))

    [/autoit] [autoit][/autoit] [autoit]

    $sSave = '1.: ' & _MemoryRead($CmdLine[2], $hOpen) & @CRLF & _ ; 777
    '2.: ' & DllStructGetData($tStruct2, 1) ; Hallo

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(262144, 'Output Skript2.exe', $sSave)

    [/autoit] [autoit][/autoit] [autoit]

    _MemoryWrite($CmdLine[2], $hOpen, 333)
    _MemoryWrite($CmdLine[2] + 4, $hOpen, 0x746c6557) ; 74 -> t
    ; 6c -> l
    ; 65 -> e
    ; 57 -> W
    _MemoryWrite($CmdLine[2] + 8, $hOpen, 0x00000021) ; 00 -> NUL
    ; 00 -> NUL
    ; 00 -> NUL
    ; 21 -> !
    _MemoryClose($hOpen)

    [/autoit] [autoit][/autoit] [autoit]

    $tagStruct1 = ''
    $tagStruct2 = ''
    $hOpen = ''
    $tStruct1 = ''
    $tStruct2 = ''
    $sSave = ''

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit]

    Pointer.au3:

    Spoiler anzeigen
    [autoit]

    #include-once
    #region _Memory
    ;=================================================================================================
    ; AutoIt Version: 3.1.127 (beta)
    ; Language: English
    ; Platform: All Windows
    ; Author: Nomad
    ; Requirements: These functions will only work with beta.
    ;=================================================================================================
    ; Credits: wOuter - These functions are based on his original _Mem() functions. But they are
    ; easier to comprehend and more reliable. These functions are in no way a direct copy
    ; of his functions. His functions only provided a foundation from which these evolved.
    ;=================================================================================================
    ;
    ; Functions:
    ;
    ;=================================================================================================
    ; Function: _MemoryOpen($iv_Pid(, $iv_DesiredAccess(, $iv_InheritHandle)))
    ; Description: Opens a process and enables all possible access rights to the process. The
    ; Process ID of the process is used to specify which process to open. You must
    ; call this function before calling _MemoryClose(), _MemoryRead(), or _MemoryWrite().
    ; Parameter(s): $iv_Pid - The Process ID of the program you want to open.
    ; $iv_DesiredAccess - (optional) Set to 0x1F0FFF by default, which enables all
    ; possible access rights to the process specified by the
    ; Process ID.
    ; $if_InheritHandle - (optional) If this value is TRUE, all processes created by
    ; this process will inherit the access handle. Set to TRUE
    ; (1) by default. Set to 0 if you want it to be FALSE.
    ; Requirement(s): A valid process ID.
    ; Return Value(s): On Success - Returns an array containing the Dll handle and an open handle to
    ; the specified process.
    ; On Failure - Returns 0
    ; @Error - 0 = No error.
    ; 1 = Invalid $iv_Pid.
    ; 2 = Failed to open Kernel32.dll.
    ; 3 = Failed to open the specified process.
    ; Author(s): Nomad
    ; Note(s):
    ;=================================================================================================
    Func _MemoryOpen($iv_Pid, $iv_DesiredAccess = 0x1F0FFF, $if_InheritHandle = 1)

    [/autoit] [autoit][/autoit] [autoit]

    If Not ProcessExists($iv_Pid) Then
    SetError(1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $ah_Handle[2] = [DllOpen('kernel32.dll')]

    [/autoit] [autoit][/autoit] [autoit]

    If @Error Then
    SetError(2)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $av_OpenProcess = DllCall($ah_Handle[0], 'int', 'OpenProcess', 'int', $iv_DesiredAccess, 'int', $if_InheritHandle, 'int', $iv_Pid)

    [/autoit] [autoit][/autoit] [autoit]

    If @Error Then
    DllClose($ah_Handle[0])
    SetError(3)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $ah_Handle[1] = $av_OpenProcess[0]

    [/autoit] [autoit][/autoit] [autoit]

    Return $ah_Handle

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================================
    ; Function: _MemoryRead($iv_Address, $ah_Handle(, $sv_Type))
    ; Description: Reads the value located in the memory address specified.
    ; Parameter(s): $iv_Address - The memory address you want to read from. It must be in hex
    ; format (0x00000000).
    ; $ah_Handle - An array containing the Dll handle and the handle of the open
    ; process as returned by _MemoryOpen().
    ; $sv_Type - (optional) The "Type" of value you intend to read. This is set to
    ; 'dword'(32bit(4byte) signed integer) by default. See the help file
    ; for DllStructCreate for all types.
    ; An example: If you want to read a word that is 15 characters in
    ; length, you would use 'char[16]'.
    ; Requirement(s): The $ah_Handle returned from _MemoryOpen.
    ; Return Value(s): On Success - Returns the value located at the specified address.
    ; On Failure - Returns 0
    ; @Error - 0 = No error.
    ; 1 = Invalid $ah_Handle.
    ; 2 = $sv_Type was not a string.
    ; 3 = $sv_Type is an unknown data type.
    ; 4 = Failed to allocate the memory needed for the DllStructure.
    ; 5 = Error allocating memory for $sv_Type.
    ; 6 = Failed to read from the specified process.
    ; Author(s): Nomad
    ; Note(s): Values returned are in Decimal format, unless specified as a 'char' type, then
    ; they are returned in ASCII format. Also note that size ('char[size]') for all
    ; 'char' types should be 1 greater than the actual size.
    ;=================================================================================================
    Func _MemoryRead($iv_Address, $ah_Handle, $sv_Type = 'dword')

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsArray($ah_Handle) Then
    SetError(1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $v_Buffer = DllStructCreate($sv_Type)

    [/autoit] [autoit][/autoit] [autoit]

    If @Error Then
    SetError(@Error + 1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')

    [/autoit] [autoit][/autoit] [autoit]

    If Not @Error Then
    Local $v_Value = DllStructGetData($v_Buffer, 1)
    Return $v_Value
    Else
    SetError(6)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================================
    ; Function: _MemoryWrite($iv_Address, $ah_Handle, $v_Data(, $sv_Type))
    ; Description: Writes data to the specified memory address.
    ; Parameter(s): $iv_Address - The memory address you want to write to. It must be in hex
    ; format (0x00000000).
    ; $ah_Handle - An array containing the Dll handle and the handle of the open
    ; process as returned by _MemoryOpen().
    ; $v_Data - The data to be written.
    ; $sv_Type - (optional) The "Type" of value you intend to write. This is set to
    ; 'dword'(32bit(4byte) signed integer) by default. See the help file
    ; for DllStructCreate for all types.
    ; An example: If you want to write a word that is 15 characters in
    ; length, you would use 'char[16]'.
    ; Requirement(s): The $ah_Handle returned from _MemoryOpen.
    ; Return Value(s): On Success - Returns 1
    ; On Failure - Returns 0
    ; @Error - 0 = No error.
    ; 1 = Invalid $ah_Handle.
    ; 2 = $sv_Type was not a string.
    ; 3 = $sv_Type is an unknown data type.
    ; 4 = Failed to allocate the memory needed for the DllStructure.
    ; 5 = Error allocating memory for $sv_Type.
    ; 6 = $v_Data is not in the proper format to be used with the "Type"
    ; selected for $sv_Type, or it is out of range.
    ; 7 = Failed to write to the specified process.
    ; Author(s): Nomad
    ; Note(s): Values sent must be in Decimal format, unless specified as a 'char' type, then
    ; they must be in ASCII format. Also note that size ('char[size]') for all
    ; 'char' types should be 1 greater than the actual size.
    ;=================================================================================================
    Func _MemoryWrite($iv_Address, $ah_Handle, $v_Data, $sv_Type = 'dword')

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsArray($ah_Handle) Then
    SetError(1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $v_Buffer = DllStructCreate($sv_Type)

    [/autoit] [autoit][/autoit] [autoit]

    If @Error Then
    SetError(@Error + 1)
    Return 0
    Else
    DllStructSetData($v_Buffer, 1, $v_Data)
    If @Error Then
    SetError(6)
    Return 0
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ah_Handle[0], 'int', 'WriteProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')

    [/autoit] [autoit][/autoit] [autoit]

    If Not @Error Then
    Return 1
    Else
    SetError(7)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================================
    ; Function: _MemoryClose($ah_Handle)
    ; Description: Closes the process handle opened by using _MemoryOpen().
    ; Parameter(s): $ah_Handle - An array containing the Dll handle and the handle of the open
    ; process as returned by _MemoryOpen().
    ; Requirement(s): The $ah_Handle returned from _MemoryOpen.
    ; Return Value(s): On Success - Returns 1
    ; On Failure - Returns 0
    ; @Error - 0 = No error.
    ; 1 = Invalid $ah_Handle.
    ; 2 = Unable to close the process handle.
    ; Author(s): Nomad
    ; Note(s):
    ;=================================================================================================
    Func _MemoryClose($ah_Handle)

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsArray($ah_Handle) Then
    SetError(1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($ah_Handle[0], 'int', 'CloseHandle', 'int', $ah_Handle[1])
    If Not @Error Then
    DllClose($ah_Handle[0])
    Return 1
    Else
    DllClose($ah_Handle[0])
    SetError(2)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================================
    ; Function: _MemoryPointerRead ($iv_Address, $ah_Handle, $av_Offset(, $sv_Type))
    ; Description: Reads a chain of pointers and returns an array containing the destination
    ; address and the data at the address.
    ; Parameter(s): $iv_Address - The static memory address you want to start at. It must be in
    ; hex format (0x00000000).
    ; $ah_Handle - An array containing the Dll handle and the handle of the open
    ; process as returned by _MemoryOpen().
    ; $av_Offset - An array of offsets for the pointers. Each pointer must have an
    ; offset. If there is no offset for a pointer, enter 0 for that
    ; array dimension. (Offsets must be in decimal format, NOT hex!)
    ; $sv_Type - (optional) The "Type" of data you intend to read at the destination
    ; address. This is set to 'dword'(32bit(4byte) signed integer) by
    ; default. See the help file for DllStructCreate for all types.
    ; Requirement(s): The $ah_Handle returned from _MemoryOpen.
    ; Return Value(s): On Success - Returns an array containing the destination address and the value
    ; located at the address.
    ; On Failure - Returns 0
    ; @Error - 0 = No error.
    ; 1 = $av_Offset is not an array.
    ; 2 = Invalid $ah_Handle.
    ; 3 = $sv_Type is not a string.
    ; 4 = $sv_Type is an unknown data type.
    ; 5 = Failed to allocate the memory needed for the DllStructure.
    ; 6 = Error allocating memory for $sv_Type.
    ; 7 = Failed to read from the specified process.
    ; Author(s): Nomad
    ; Note(s): Values returned are in Decimal format, unless a 'char' type is selected.
    ; Set $av_Offset like this:
    ; $av_Offset[0] = NULL (not used)
    ; $av_Offset[1] = Offset for pointer 1 (all offsets must be in Decimal)
    ; $av_Offset[2] = Offset for pointer 2
    ; etc...
    ; (The number of array dimensions determines the number of pointers)
    ;=================================================================================================
    Func _MemoryPointerRead ($iv_Address, $ah_Handle, $av_Offset, $sv_Type = 'dword')

    [/autoit] [autoit][/autoit] [autoit]

    If IsArray($av_Offset) Then
    If IsArray($ah_Handle) Then
    Local $iv_PointerCount = UBound($av_Offset) - 1
    Else
    SetError(2)
    Return 0
    EndIf
    Else
    SetError(1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $iv_Data[2], $i
    Local $v_Buffer = DllStructCreate('dword')

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 to $iv_PointerCount

    [/autoit] [autoit][/autoit] [autoit]

    If $i = $iv_PointerCount Then
    $v_Buffer = DllStructCreate($sv_Type)
    If @Error Then
    SetError(@Error + 2)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $iv_Address = '0x' & hex($iv_Data[1] + $av_Offset[$i])
    DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
    If @Error Then
    SetError(7)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $iv_Data[1] = DllStructGetData($v_Buffer, 1)

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $i = 0 Then
    DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
    If @Error Then
    SetError(7)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $iv_Data[1] = DllStructGetData($v_Buffer, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Else
    $iv_Address = '0x' & hex($iv_Data[1] + $av_Offset[$i])
    DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
    If @Error Then
    SetError(7)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $iv_Data[1] = DllStructGetData($v_Buffer, 1)

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit]

    $iv_Data[0] = $iv_Address

    [/autoit] [autoit][/autoit] [autoit]

    Return $iv_Data

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================================
    ; Function: _MemoryPointerWrite ($iv_Address, $ah_Handle, $av_Offset, $v_Data(, $sv_Type))
    ; Description: Reads a chain of pointers and writes the data to the destination address.
    ; Parameter(s): $iv_Address - The static memory address you want to start at. It must be in
    ; hex format (0x00000000).
    ; $ah_Handle - An array containing the Dll handle and the handle of the open
    ; process as returned by _MemoryOpen().
    ; $av_Offset - An array of offsets for the pointers. Each pointer must have an
    ; offset. If there is no offset for a pointer, enter 0 for that
    ; array dimension.
    ; $v_Data - The data to be written.
    ; $sv_Type - (optional) The "Type" of data you intend to write at the destination
    ; address. This is set to 'dword'(32bit(4byte) signed integer) by
    ; default. See the help file for DllStructCreate for all types.
    ; Requirement(s): The $ah_Handle returned from _MemoryOpen.
    ; Return Value(s): On Success - Returns the destination address.
    ; On Failure - Returns 0.
    ; @Error - 0 = No error.
    ; 1 = $av_Offset is not an array.
    ; 2 = Invalid $ah_Handle.
    ; 3 = Failed to read from the specified process.
    ; 4 = $sv_Type is not a string.
    ; 5 = $sv_Type is an unknown data type.
    ; 6 = Failed to allocate the memory needed for the DllStructure.
    ; 7 = Error allocating memory for $sv_Type.
    ; 8 = $v_Data is not in the proper format to be used with the
    ; "Type" selected for $sv_Type, or it is out of range.
    ; 9 = Failed to write to the specified process.
    ; Author(s): Nomad
    ; Note(s): Data written is in Decimal format, unless a 'char' type is selected.
    ; Set $av_Offset like this:
    ; $av_Offset[0] = NULL (not used, doesn't matter what's entered)
    ; $av_Offset[1] = Offset for pointer 1 (all offsets must be in Decimal)
    ; $av_Offset[2] = Offset for pointer 2
    ; etc...
    ; (The number of array dimensions determines the number of pointers)
    ;=================================================================================================
    Func _MemoryPointerWrite ($iv_Address, $ah_Handle, $av_Offset, $v_Data, $sv_Type = 'dword')

    [/autoit] [autoit][/autoit] [autoit]

    If IsArray($av_Offset) Then
    If IsArray($ah_Handle) Then
    Local $iv_PointerCount = UBound($av_Offset) - 1
    Else
    SetError(2)
    Return 0
    EndIf
    Else
    SetError(1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $iv_StructData, $i
    Local $v_Buffer = DllStructCreate('dword')

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 to $iv_PointerCount
    If $i = $iv_PointerCount Then
    $v_Buffer = DllStructCreate($sv_Type)
    If @Error Then
    SetError(@Error + 3)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($v_Buffer, 1, $v_Data)
    If @Error Then
    SetError(8)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $iv_Address = '0x' & hex($iv_StructData + $av_Offset[$i])
    DllCall($ah_Handle[0], 'int', 'WriteProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
    If @Error Then
    SetError(9)
    Return 0
    Else
    Return $iv_Address
    EndIf
    ElseIf $i = 0 Then
    DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
    If @Error Then
    SetError(3)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $iv_StructData = DllStructGetData($v_Buffer, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Else
    $iv_Address = '0x' & hex($iv_StructData + $av_Offset[$i])
    DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
    If @Error Then
    SetError(3)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $iv_StructData = DllStructGetData($v_Buffer, 1)

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================
    ; Function: SetPrivilege( $privilege, $bEnable )
    ; Description: Enables (or disables) the $privilege on the current process
    ; (Probably) requires administrator privileges to run
    ;
    ; Author(s): Larry (from autoitscript.com's Forum)
    ; Notes(s):
    ; http://www.autoitscript.com/forum/index.ph…ndpost&p=223999
    ;==================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func SetPrivilege( $privilege, $bEnable )
    Const $TOKEN_ADJUST_PRIVILEGES = 0x0020
    Const $TOKEN_QUERY = 0x0008
    Const $SE_PRIVILEGE_ENABLED = 0x0002
    Local $hToken, $SP_auxret, $SP_ret, $hCurrProcess, $nTokens, $nTokenIndex, $priv
    $nTokens = 1
    $LUID = DLLStructCreate("dword;int")
    If IsArray($privilege) Then $nTokens = UBound($privilege)
    $TOKEN_PRIVILEGES = DLLStructCreate("dword;dword[" & (3 * $nTokens) & "]")
    $NEWTOKEN_PRIVILEGES = DLLStructCreate("dword;dword[" & (3 * $nTokens) & "]")
    $hCurrProcess = DLLCall("kernel32.dll","hwnd","GetCurrentProcess")
    $SP_auxret = DLLCall("advapi32.dll","int","OpenProcessToken","hwnd",$hCurrProcess[0], _
    "int",BitOR($TOKEN_ADJUST_PRIVILEGES,$TOKEN_QUERY),"int*",0)
    If $SP_auxret[0] Then
    $hToken = $SP_auxret[3]
    DLLStructSetData($TOKEN_PRIVILEGES,1,1)
    $nTokenIndex = 1
    While $nTokenIndex <= $nTokens
    If IsArray($privilege) Then
    $ntokenvar=$ntokenindex-1
    $priv = $privilege[$ntokenvar]
    Else
    $priv = $privilege
    EndIf
    $ret = DLLCall("advapi32.dll","int","LookupPrivilegeValue","str","","str",$priv, _
    "ptr",DLLStructGetPtr($LUID))
    If $ret[0] Then
    If $bEnable Then
    DLLStructSetData($TOKEN_PRIVILEGES,2,$SE_PRIVILEGE_ENABLED,(3 * $nTokenIndex))
    Else
    DLLStructSetData($TOKEN_PRIVILEGES,2,0,(3 * $nTokenIndex))
    EndIf
    DLLStructSetData($TOKEN_PRIVILEGES,2,DllStructGetData($LUID,1),(3 * ($nTokenIndex-1)) + 1)
    DLLStructSetData($TOKEN_PRIVILEGES,2,DllStructGetData($LUID,2),(3 * ($nTokenIndex-1)) + 2)
    DLLStructSetData($LUID,1,0)
    DLLStructSetData($LUID,2,0)
    EndIf
    $nTokenIndex += 1
    WEnd
    $ret = DLLCall("advapi32.dll","int","AdjustTokenPrivileges","hwnd",$hToken,"int",0, _
    "ptr",DllStructGetPtr($TOKEN_PRIVILEGES),"int",DllStructGetSize($NEWTOKEN_PRIVILEGES), _
    "ptr",DllStructGetPtr($NEWTOKEN_PRIVILEGES),"int*",0)
    $f = DLLCall("kernel32.dll","int","GetLastError")
    EndIf
    $NEWTOKEN_PRIVILEGES=0
    $TOKEN_PRIVILEGES=0
    $LUID=0
    If $SP_auxret[0] = 0 Then Return 0
    $SP_auxret = DLLCall("kernel32.dll","int","CloseHandle","hwnd",$hToken)
    If Not $ret[0] And Not $SP_auxret[0] Then Return 0
    return $ret[0]
    EndFunc ;==>SetPrivilege

    [/autoit] [autoit][/autoit] [autoit]

    ;===================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    ; Function........: _MemoryGetBaseAddress($ah_Handle, $iHD)
    ;
    ; Description.....: Reads the 'Allocation Base' from the open process.
    ;
    ; Parameter(s)....: $ah_Handle - An array containing the Dll handle and the handle of the open
    ; process as returned by _MemoryOpen().
    ; $iHD - Return type:
    ; |0 = Hex (Default)
    ; |1 = Dec
    ;
    ; Requirement(s)..: A valid process ID.
    ;
    ; Return Value(s).: On Success - Returns the 'allocation Base' address and sets @Error to 0.
    ; On Failure - Returns 0 and sets @Error to:
    ; |1 = Invalid $ah_Handle.
    ; |2 = Failed to find correct allocation address.
    ; |3 = Failed to read from the specified process.
    ;
    ; Author(s).......: Nomad. Szhlopp.
    ; URL.............: http://www.autoitscript.com/forum/index.php?showtopic=78834
    ; Note(s).........: Go to http://Www.CheatEngine.org for the latest version of CheatEngine.
    ;===================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func _MemoryGetBaseAddress($ah_Handle, $iHexDec = 0)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iv_Address = 0x00100000
    Local $v_Buffer = DllStructCreate('dword;dword;dword;dword;dword;dword;dword')
    Local $vData
    Local $vType

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsArray($ah_Handle) Then
    SetError(1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    DllCall($ah_Handle[0], 'int', 'VirtualQueryEx', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer))

    [/autoit] [autoit][/autoit] [autoit]

    If Not @Error Then

    [/autoit] [autoit][/autoit] [autoit]

    $vData = Hex(DllStructGetData($v_Buffer, 2))
    $vType = Hex(DllStructGetData($v_Buffer, 3))

    [/autoit] [autoit][/autoit] [autoit]

    While $vType <> "00000080"
    DllCall($ah_Handle[0], 'int', 'VirtualQueryEx', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer))
    $vData = Hex(DllStructGetData($v_Buffer, 2))
    $vType = Hex(DllStructGetData($v_Buffer, 3))
    If Hex($iv_Address) = "01000000" Then ExitLoop
    $iv_Address += 65536

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    If $vType = "00000080" Then
    SetError(0)
    If $iHexDec = 1 Then
    Return Dec($vData)
    Else
    Return $vData
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Else
    SetError(2)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Else
    SetError(3)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_MemoryGetBaseAddress

    [/autoit] [autoit][/autoit] [autoit]

    Func _MemoryModuleGetBaseAddress($iPID, $sModule)
    If Not ProcessExists($iPID) Then Return SetError(1, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsString($sModule) Then Return SetError(2, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    Local $PSAPI = DllOpen("psapi.dll")

    [/autoit] [autoit][/autoit] [autoit]

    ;Get Process Handle
    Local $hProcess
    Local $PERMISSION = BitOR(0x0002, 0x0400, 0x0008, 0x0010, 0x0020) ; CREATE_THREAD, QUERY_INFORMATION, VM_OPERATION, VM_READ, VM_WRITE

    [/autoit] [autoit][/autoit] [autoit]

    If $iPID > 0 Then
    Local $hProcess = DllCall("kernel32.dll", "ptr", "OpenProcess", "dword", $PERMISSION, "int", 0, "dword", $iPID)
    If $hProcess[0] Then
    $hProcess = $hProcess[0]
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;EnumProcessModules
    Local $Modules = DllStructCreate("ptr[1024]")
    Local $aCall = DllCall($PSAPI, "int", "EnumProcessModules", "ptr", $hProcess, "ptr", DllStructGetPtr($Modules), "dword", DllStructGetSize($Modules), "dword*", 0)
    If $aCall[4] > 0 Then
    Local $iModnum = $aCall[4] / 4
    Local $aTemp
    For $i = 1 To $iModnum
    $aTemp = DllCall($PSAPI, "dword", "GetModuleBaseNameW", "ptr", $hProcess, "ptr", Ptr(DllStructGetData($Modules, 1, $i)), "wstr", "", "dword", 260)
    If $aTemp[3] = $sModule Then
    DllClose($PSAPI)
    Return Ptr(DllStructGetData($Modules, 1, $i))
    EndIf
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    DllClose($PSAPI)
    Return SetError(-1, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    #endregion

    [/autoit]


    Kompiliere Skript1.au3 und Skript2.au3 einfach und führe dann Skript1.exe aus.
    Es funktioniert soweit schon! ^^ Nur die korrekte Ausgabe des Strings von Skript1.exe in Skript2.exe will mir nicht gelingen.
    Aber andersrum funktioniert das...


    Vielleicht kann ja hier einer weiterhelfen! :P

    €dit:
    Hab eine falsche Variable verwendet im Skript. :whistling:
    Funktioniert nun einwandfrei!

    Ich hoffe ich konnte weiterhelfen!
    MfG. MG

    5 Mal editiert, zuletzt von Yjuq (11. März 2013 um 20:37)

  • ?( doch schon sehr geil .. !!!

    ich denk mich mal rein 8|

    aber erst versuche ich's mal mit

    Spoiler anzeigen
    [autoit]


    DllStructSetData($a, 1, 99999999)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"a",DllStructGetData($a, 1))
    $var = DllStructGetPtr($a)

    [/autoit] [autoit][/autoit] [autoit]

    ; §var wir jetzt als parameter übergeben ..

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,$var,VarGetType ( $a ))
    $b = DllStructCreate("int",$var)
    MsgBox(0,"b",DllStructGetData($b, 1))

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    gib mir mal n paar minuten ..