Frage zu einer Struktur in masm32



  • Hallo,

    ich hab eben geguckt wie man in masm32 die SendInput Funktion benutzen kann.
    Als ich es nach mehreren versucht nicht hinbekommen habe habe ich gegoogelt.
    Ich verstehe alles von dem Code nur was soll hier das:

    dummy1 db 8 dup (?)

    In der Struktur ?

    Warum muss da ein Array angelegt werden o_O

    Wenn ich z.b. mit C++ so etwas mache dann lege ich ja auch kein Array an und in der MSDN habe ich auch nichts gefunden was sagt das dort ein Array angelegt werden muss in der Struktur. ( Wenn man es nicht anlegt dann wird der Tastendruck nicht simuliert )

    Weiss jemand was das mit dem Array in der Struktur soll ?

    .486                   
        .model flat, stdcall      
        option casemap :none       
    
        include \masm32\include\windows.inc
        include \masm32\include\masm32.inc
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
    
        includelib \masm32\lib\masm32.lib
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
    
    .data
    
    .data?
    
    	KEYBOARDINPUT struc
              dtype        DWORD ?
              wVk          WORD  ?
              wScan        WORD  ?
              dwFlags      DWORD ?
              time         DWORD ?
              dwExtraInfo  DWORD ?  
              dummy1 db 8 dup (?)
         KEYBOARDINPUT ends
    
    keys KEYBOARDINPUT <>
    
    .code
    
    start:
    
    	invoke Sleep, 2000
    
        mov [keys.dtype],1
        mov [keys.wVk],41h
        mov [keys.wScan],28
        mov [keys.dwFlags],0h
        mov [keys.time],0h
        mov [keys.dwExtraInfo],0h
    
        invoke SendInput,
    	1,
        OFFSET keys,                        ;pointer to an array of input structures
        SIZEOF KEYBOARDINPUT
    
    invoke ExitProcess,NULL
    
    end start
    


  • das ist ein kleiner Trick, da eigentlich die INPUT-Struktur übergeben werde muss, die wiederum eine Union enthält. Diese Struktur kann man sich im Übrigen auch selbst und korrekt deklarieren - das würde dann diese Trickserei ersparen 😉

    MOUSEINPUT struct 
        dx_         SDWORD  ?
        dy          SDWORD  ?
        mouseData   DWORD   ?
        dwFlags     DWORD   ?
        time        DWORD   ?
        dwExtraInfo DWORD   ?
    MOUSEINPUT ends
    
    KEYBDINPUT struct 
        wVk         WORD    ?
        wScan       WORD    ?
        dwFlags     DWORD   ?
        time        DWORD   ?
        dwExtraInfo DWORD   ?
    KEYBDINPUT ends
    
    HARDWAREINPUT struct 
        uMsg        DWORD   ?
        wParamL     WORD    ?
        wParamH     WORD    ?
    HARDWAREINPUT ends
    INPUT struct 
        type_       DWORD   ?
        union
            mi      MOUSEINPUT      <>
            ki      KEYBDINPUT      <>
            hi      HARDWAREINPUT   <>
        ends
    INPUT ends
    


  • Hallo ich habe mal versucht mithilfe der MSDN das ganze ohne das Array in der Struktur umzusetzen.

    Aber leider ohne Erfolg. 😞

    .486                   
        .model flat, stdcall      
        option casemap :none       
        include \masm32\include\windows.inc
        include \masm32\include\masm32.inc
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        includelib \masm32\lib\masm32.lib
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
    
    .data
    
    .data?
    tagKEYBDINPUT struct 
    
             wVk WORD ? 
             wScan WORD ?
             dwFlags DWORD ?
             time DWORD ? 
    		 dwExtraInfo DWORD ?   ; <-- Falsch     ULONG_PTR  in MASM ??
    tagKEYBDINPUT ends
    
    ki tagKEYBDINPUT <>
    
    INPUT struct 
         type_       DWORD   ? 
         union 	 
             ki  tagKEYBDINPUT  <> 
         ends 
    INPUT ends
    
    data INPUT <>
    
    .code
    start:
    
    	 invoke Sleep, 2000
    
    	 mov [data.type_],1 
         mov [data.ki.wVk],41h 
         mov [data.ki.wScan],28 
         mov [data.ki.dwFlags],0h 
         mov [data.ki.time],0h 
    
    	invoke SendInput, 1, OFFSET ki, SIZEOF tagKEYBDINPUT
    
    	invoke ExitProcess,0
    
    end start
    


  • SendInput() verlangt die Größe einer INPUT Struktur, die eine Union aus drei Strukturen enthält. Die Größe wird durch das größte Member der Union, MOUSEINPUT, bestimmt. Benutzt einfach die richtige Strukturdefinition.
    (BTW: x86-32: ULONG_PTR == unsigned long == DWORD
    ~x86-64: ULONG_PTR == unsigned __int64 == QWORD~)



  • Wie benutzt man den die richtige Strukturdefinition ?

    So geht es:

    .486                   
         .model flat, stdcall       
         option casemap :none       
         include \masm32\include\windows.inc 
         include \masm32\include\masm32.inc 
         include \masm32\include\user32.inc 
         include \masm32\include\kernel32.inc 
         includelib \masm32\lib\masm32.lib 
         includelib \masm32\lib\user32.lib 
         includelib \masm32\lib\kernel32.lib 
    
     .data 
    
     .data? 
    
     KEYBDINPUT struct 
    
    	 var 		 DWORD   ?	 ; <-- Wofür ?  In der MSDN sieht die struktur anders aus.
         wVk         WORD    ? 
         wScan       WORD    ? 
         dwFlags     DWORD   ? 
         time        DWORD   ? 
         dwExtraInfo DWORD   ? 
     KEYBDINPUT ends 
     ki KEYBDINPUT <>
    
     .code 
     start: 
    
          invoke Sleep, 2000 
    
          mov [ki.var],1 
          mov [ki.wVk],41h 
          mov [ki.wScan],28 
          mov [ki.dwFlags],0h 
          mov [ki.time],0h 
    
         invoke SendInput, 1, OFFSET ki, 28
    
         invoke ExitProcess,0 
    
     end start
    

    Aber so nicht -.-

    Laut der MSDN müssen die Strukturen ja noch aussehen wie du schon gepostet hast MASM.

    Aber wieso funktioniert das bei mir nicht ?

    Und warum braucht die Struktur im ersten Beispiel 6 Variablen ?
    In der MSDN steht die auch nur mit 5.

    .486                   
         .model flat, stdcall       
         option casemap :none       
         include \masm32\include\windows.inc 
         include \masm32\include\masm32.inc 
         include \masm32\include\user32.inc 
         include \masm32\include\kernel32.inc 
         includelib \masm32\lib\masm32.lib 
         includelib \masm32\lib\user32.lib 
         includelib \masm32\lib\kernel32.lib 
    
     .data 
    
     .data? 
    
     MOUSEINPUT struct 
         dx_         SDWORD  ? 
         dy          SDWORD  ? 
         mouseData   DWORD   ? 
         dwFlags     DWORD   ? 
         time        DWORD   ? 
         dwExtraInfo DWORD   ? 
     MOUSEINPUT ends 
     mi MOUSEINPUT <>
    
     KEYBDINPUT struct 
         wVk         WORD    ? 
         wScan       WORD    ? 
         dwFlags     DWORD   ? 
         time        DWORD   ? 
         dwExtraInfo DWORD   ? 
     KEYBDINPUT ends 
     ki KEYBDINPUT <>
    
     HARDWAREINPUT struct 
         uMsg        DWORD   ? 
         wParamL     WORD    ? 
         wParamH     WORD    ? 
     HARDWAREINPUT ends 
     hi HARDWAREINPUT <>
    
     INPUT struct 
         type_       DWORD   ? 
         union 
             mi      MOUSEINPUT      <> 
             ki      KEYBDINPUT      <> 
             hi      HARDWAREINPUT   <> 
         ends 
     INPUT ends
    
     inp INPUT <> 
    
     .code 
     start: 
    
          invoke Sleep, 2000 
    
          mov [inp.type_],1 
          mov [ki.wVk],41h 
          mov [ki.wScan],28 
          mov [ki.dwFlags],0h 
          mov [ki.time],0h 
    
         invoke SendInput, 1, OFFSET inp, 28
    
         invoke ExitProcess,0 
    
     end start
    


  • Wie gesagt, es ist ein Trick - ich bin sicher du kommst allein darauf. Hier wie man es Richtig macht:

    include masm32rt.inc
    MOUSEINPUT struct 
        dx_         SDWORD  ? 
        dy          SDWORD  ? 
        mouseData   DWORD   ? 
        dwFlags     DWORD   ? 
        time        DWORD   ? 
        dwExtraInfo DWORD   ? 
    MOUSEINPUT ends 
    
    KEYBDINPUT struct 
        wVk         WORD    ? 
        wScan       WORD    ? 
        dwFlags     DWORD   ? 
        time        DWORD   ? 
        dwExtraInfo DWORD   ? 
    KEYBDINPUT ends 
    
    HARDWAREINPUT struct 
        uMsg        DWORD   ? 
        wParamL     WORD    ? 
        wParamH     WORD    ? 
    HARDWAREINPUT ends 
    INPUT struct 
        type_       DWORD   ? 
        union 
            mi      MOUSEINPUT      <> 
            ki      KEYBDINPUT      <> 
            hi      HARDWAREINPUT   <> 
        ends 
    INPUT ends
    
    INPUT_MOUSE     EQU     0
    INPUT_KEYBOARD  EQU     1
    INPUT_HARDWARE  EQU     2
    
    KEYEVENTF_EXTENDEDKEY   EQU     1
    KEYEVENTF_KEYUP         EQU     2
    KEYEVENTF_UNICODE       EQU     4
    KEYEVENTF_SCANCODE      EQU     8
    
    .code
    main proc
    LOCAL inp:INPUT
    
            mov inp.type_,INPUT_KEYBOARD
            mov inp.ki.wVk,VK_A
            invoke MapVirtualKey,VK_A,0
            mov inp.ki.wScan,ax
            mov inp.ki.dwFlags,KEYEVENTF_SCANCODE
            mov inp.ki.time,0
            mov inp.ki.dwExtraInfo,0
            invoke SendInput,1,ADDR inp,SIZEOF INPUT
    
            exit
    main endp
    end main
    

Anmelden zum Antworten