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