Speicheradresse auslesen (noch immer: Game-Port)

  • Hallo,

    mein Problem mit einem Game-Port einen Schalter abzufragen habe ich noch immer nicht lösen können. Neuer Ansatz:

    Wie kann ich die Speicheradresse 200 auslesen (analog zum Assembler-Bsp)?

    Spoiler anzeigen

    Die Programmierung:
    Der Gameport hat nur ein Register, wo dieses liegt, zeigt der Gerätemanager in den Ressourcen des Gameports. Im Beispiel liegt der E/A Bereich bei 0200-0207. D.h., bei $200 liegt das Byte des Gameports.
    Der Gameport muß nicht geöffnet werden, jedoch sollte ein Joystick im Betriebssystem installiert werden. Folgender Code fragt das Register des Gameports auf die Tasten ab:

    ..
    var
    Wert:byte; //Wert aus Gameport-Register

    asm // inline Assembler
    mov dx,$200; // Lade die Adresse 200 in DX
    in al,dx; // Lade Wert aus 200 in al
    mov Wert, al; // Lade Wert aus al in VAR Wert
    end; // Ende inline Assembler

    Wert nimmt nun 16 verschiedene Werte bei 4 Joysticktasten an (je zwei Tasten pro Joystick), ...
    Quelle: http://www.delphi-roboter.de/3game.htm

    Mit den Memory-Beispielen hier im Forum
    (z.B. Speicheradresse (ReadProcessMemory) auslesen?

    komme ich nicht weiter, weil ich hier keinen Prozessnamen habe, oder????

    In der Anlage nochmal die Speicheradresse über den Gerätemanager, die ich gerne auslesen würde.

    Vielen Dank
    viele Grüsse
    Carsten

  • Kann mir jemand sagen, ob ich die Info für das englische Forum richtig formuliert habe?

    ------------------------------------------
    Hello,

    I want to read the memory position 200 (gameport, see jpg) with autoit.

    Maybe this?
    > Func _MemOpen($i_Pid, $i_Access, $i_Inherit)
    But which PID-ID should I use?

    Thanks
    Carsten

    (Anhang Bild)

  • yo wird jeder dort verstehen ;)

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]
  • Hallo,

    im englischen Forum habe ich zwei Links bekommen, aber da geht es um Speicherprogrammierung - und das auch noch in Englisch..... puhhhh

    HIER (engl.Forum)[LINK] wird folgendes diskutiert:

    Zitat

    noticed AutoHotkey added RegisterCallback(), which creates a machine-code address that when called, redirects the call to a function in the script.
    This could be usefull adition to Autoit.


    Der Verweis ging allerdings auf diesen Beitrag[LINK] der eine Funktion enthält (komplett siehe Spoiler):

    Spoiler anzeigen

    Global $gp_DllCallBack_SendMessage = 0
    Global $gh_DllCallBack_hUser32 = 0
    Global $gi_DllCallBack_StubCount = 0

    ;===============================================================================
    ;
    ; Function Name: _DllCallBackAlloc
    ; Description: Allocates memory on global heap and creates a procedure
    ; which forwards a pointer to its arguments to a Window
    ; Parameter(s): $nParameters - number of parameters
    ; $hWnd - handle of receiving window
    ; $msg - Window Message
    ; $wParam, Optional - wParam to pass to the handler procedure
    ; $fCedecl, Optional - use cdecl calling convention (default is stdcall)
    ; Requirement(s):
    ; Return Value(s): Pointer to created stub or NULL on error
    ; @error Value(s): 1 = Error allocating memory from global heap
    ; 2 = Error Loading User32.dll
    ; 3 = Failed to get the address of SendMessage
    ;
    ; Author(s):
    ;
    ;===============================================================================
    ;
    Func _DllCallBackAlloc($nParameters, $hWnd, $msg, $wParam = 0, $fcdecl = False)
    Local $hGlobal, $hUser32, $pSendMessage_RelAddr, $vStub
    $hGlobal = DllCall("kernel32.dll", "ptr", "GlobalAlloc", "uint", 0, "dword", 86) ; 86 = Size of stub
    If @error Then Return SetError(1, 0, 0)
    If $hGlobal[0] = 0 Then Return SetError(1, 0, 0)
    $hGlobal = $hGlobal[0]
    If $gp_DllCallBack_SendMessage = 0 Then
    $hUser32 = DllCall("kernel32.dll", "ptr", "LoadLibrary", "str", "user32.dll")
    If @error Then Return SetError(2, 0, 0)
    If $hUser32[0] = 0 Then SetError(2, 0, 0)
    $gh_DllCallBack_hUser32 = $hUser32[0]
    $pSendMessage = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", $gh_DllCallBack_hUser32, "str", "SendMessageA")
    If @error Then Return SetError(3, 0, 0)
    If $pSendMessage = 0 Then Return SetError(3, 0, 0)
    $gp_DllCallBack_SendMessage = $pSendMessage[0]
    EndIf
    $pSendMessage_RelAddr = $gp_DllCallBack_SendMessage - ($hGlobal + 0x21)
    $vStub = DllStructCreate("ubyte[29];" _ ; 1 Stub Part 1
    & "ptr;" _ ; 2 Address of SendMessage relative to $+21 (pTo - $+21)
    & "ubyte[9];" _ ; 3 Stub Part 2
    & "byte[6];" _ ; 4 6 bytes nothing
    & "long;" _ ; 5 nParams
    & "hwnd;" _ ; 6 hwnd
    & "uint;" _ ; 7 msg
    & "uint;", $hGlobal) ; 8 wparam
    #cs Stub Part 1
    $ ==> > E8 00000000 CALL 0015B4BD
    $+5 > 58 POP EAX
    $+6 > 8D90 2B000000 LEA EDX,DWORD PTR DS:[EAX+2B]
    $+C > 8D4424 04 LEA EAX,DWORD PTR SS:[ESP+4]
    $+10 > FF32 PUSH DWORD PTR DS:[EDX]
    $+12 > 50 PUSH EAX
    $+13 > FF72 0C PUSH DWORD PTR DS:[EDX+C]
    $+16 > FF72 08 PUSH DWORD PTR DS:[EDX+8]
    $+19 > FF72 04 PUSH DWORD PTR DS:[EDX+4]
    $+1C > E8 !!!!!!!! CALL USER32.SendMessageA ; $pSendMessage_RelAddr
    #ce
    DllStructSetData($vStub, 1, Binary("0xE800000000588D902B0000008D442404FF3250FF720CFF7208FF7204E8"))
    DllStructSetData($vStub, 2, $pSendMessage_RelAddr)
    If $fcdecl Then
    #cs Stub Part 2 - cdecl
    $+21 > 90 NOP
    $+22 > 5A POP EDX
    $+23 > 59 POP ECX
    $+24 > 90 NOP
    $+25 > 90 NOP
    $+26 > 90 NOP
    $+27 > FFE1 JMP ECX
    $+29 > 90 NOP
    #ce
    DllStructSetData($vStub, 3, Binary("0x905A59909090FFE190"))
    Else
    #cs Stub Part 2 - stdcall
    $+21 > 90 NOP
    $+22 > 5A POP EDX
    $+23 > 59 POP ECX
    $+24 > 8D2494 LEA ESP,DWORD PTR SS:[ESP+EDX*4]
    $+27 > FFE1 JMP ECX
    $+29 > 90 NOP
    #ce
    DllStructSetData($vStub, 3, Binary("0x905A598D2494FFE190"))
    EndIf
    ;~ $+2A > 000000000000
    DllStructSetData($vStub, 4, Binary("0x000000000000"))
    ;~ $+30 > 00000000
    DllStructSetData($vStub, 5, $nParameters)
    ;~ $+34 > 00000000
    DllStructSetData($vStub, 6, $hWnd)
    ;~ $+38 > 00000000
    DllStructSetData($vStub, 7, $msg)
    ;~ $+3C > 00000000
    DllStructSetData($vStub, 8, $wParam)
    $gi_DllCallBack_StubCount += 1
    Return $hGlobal
    EndFunc ;==>_DllCallBackAlloc


    ;===============================================================================
    ;
    ; Function Name: _DllCallBackFree
    ; Description: Frees memory from global heap allocated by _DllCallBackAlloc
    ; Parameter(s): $hStub - Pointer to stub
    ; Requirement(s):
    ; Return Value(s): On Success: True
    ; On Failure: False
    ; @error Value(s): 1 - Error freeing memory
    ; 2 - Error freeing User32.dll
    ; Author(s):
    ;
    ;===============================================================================
    ;
    Func _DllCallBackFree(ByRef $hStub)
    Local $aTmp
    If $hStub > 0 Then
    $aTmp = DllCall("kernel32.dll", "ptr", "GlobalFree", "ptr", $hStub)
    If @error Then Return SetError(1, 0, False)
    If $aTmp[0] = $hStub Then Return SetError(1, 0, False)
    If $aTmp[0] = 0 Then
    $hStub = 0
    $gi_DllCallBack_StubCount -= 1
    If $gi_DllCallBack_StubCount < 1 Then
    $gi_DllCallBack_StubCount = 0
    $aTmp = DllCall("kernel32.dll", "int", "FreeLibrary", "ptr", $gh_DllCallBack_hUser32)
    If @error Then Return SetError(2, 0, False)
    If $aTmp[0] = 0 Then Return SetError(2, 0, False)
    $gh_DllCallBack_hUser32 = 0
    EndIf
    Return True
    EndIf
    Return False
    EndIf
    Return True
    EndFunc ;==>_DllCallBackFree

    Zusammen mit dem Link auf eine Assembler Abfrage des Game-Ports[LINK] könnte ich evtl. meinem Ziel näher kommen.

    Aber..... kann mir jemand sagen, was ich damit machen kann???? (Blöde Frage... mal schauen ob auch eine blöde Antwort kommt *grins*)

    Vielen Dank
    viele Grüße
    Carsten

    Nachtrag [WERBUNG EIN]:
    Warum erkennt eigentlich niemand, was man für tolle Sachen machen könnte, wenn man den Game-Port über AutoIt ansteuern könnte??? Alle möglichen Geräte könnte man über den PC ein/ausschalten (mit Relais), Programme per 'Klingelknopf' starten, Lautstärke am PC per Kabelfernbedienung, Prüfen wann jemand im Zimmer war, etc., etc, etc.
    [WERBUNG AUS] *lacht*

    2 Mal editiert, zuletzt von Carsten (26. Juli 2007 um 14:05)

  • Ok, alles kann ich halt doch nicht mit AutoIt lösen........

    Ich denke ich kaufe mir bei einem Elektronikversender eine externe Schnittstelle mit Software, die ich dann ja ggf. auch mit AutoIt 'veredeln' kann.