in cortado/rtas/collection_keylog_rawinputdevice.py [0:0]
def main():
from ctypes import WINFUNCTYPE # type: ignore
from ctypes import Union # type: ignore
from ctypes import WinError # type: ignore
from ctypes import sizeof # type: ignore
from ctypes import windll # type: ignore
from ctypes import Structure, byref, c_int, c_long, c_uint, c_ushort, pointer
from ctypes.wintypes import BYTE, DWORD, HANDLE, HINSTANCE, HWND, LONG, LPCSTR, LPVOID, UINT, ULONG, WPARAM
wndproc = WINFUNCTYPE(c_long, c_int, c_uint, c_int, c_int) # type: ignore
class WNDCLASS(Structure):
_fields_ = [ # type: ignore
("style", c_uint),
("lpfnWndProc", wndproc),
("cbClsExtra", c_int),
("cbWndExtra", c_int),
("hInstance", HINSTANCE),
("hIcon", HANDLE),
("hCursor", HANDLE),
("hbrBackground", HANDLE),
("lpszMenuName", LPCSTR),
("lpszClassName", LPCSTR),
]
class POINT(Structure):
_fields_ = [("x", c_long), ("y", c_long)]
class MSG(Structure):
_fields_ = [
("hwnd", c_int),
("message", c_uint),
("wparam", c_int),
("lparam", c_int),
("time", c_int),
("pt", POINT),
]
class RAWINPUTDEVICE(Structure):
_fields_ = [
("usUsagePage", c_ushort),
("usUsage", c_ushort),
("dwFlags", DWORD),
("hwndTarget", HWND),
]
class RAWINPUTHEADER(Structure):
_fields_ = [
("dwType", DWORD),
("dw_size", DWORD),
("hDevice", HANDLE),
("wparam", WPARAM),
]
class RAWMOUSE(Structure):
class _U1(Union):
class _S2(Structure):
_fields_ = [
("usButtonFlags", c_ushort),
("usButtonData", c_ushort),
]
_fields_ = [
("ulButtons", ULONG),
("_s2", _S2),
]
_fields_ = [
("usFlags", c_ushort),
("_u1", _U1),
("ulRawButtons", ULONG),
("lLastX", LONG),
("lLastY", LONG),
("ulExtraInformation", ULONG),
]
_anonymous_ = ("_u1",)
class RAWKEYBOARD(Structure):
_fields_ = [
("MakeCode", c_ushort),
("Flags", c_ushort),
("Reserved", c_ushort),
("VKey", c_ushort),
("Message", UINT),
("ExtraInformation", ULONG),
]
class RAWHID(Structure):
_fields_ = [
("dw_sizeHid", DWORD),
("dwCount", DWORD),
("bRawData", BYTE),
]
class RAWINPUT(Structure):
class _U1(Union):
_fields_ = [
("mouse", RAWMOUSE),
("keyboard", RAWKEYBOARD),
("hid", RAWHID),
]
_fields_ = [
("header", RAWINPUTHEADER),
("_u1", _U1),
("hDevice", HANDLE),
("wparam", WPARAM),
]
_anonymous_ = ("_u1",)
class RawInputReader:
def __init__(self):
pass
def start(self):
ws_overlapped_window = 0 | 12582912 | 524288 | 262144 | 131072 | 65536
cw_use_default = -2147483648
try:
createwindowex = windll.user32.CreateWindowExA # type: ignore
createwindowex.argtypes = [
DWORD,
LPCSTR,
LPCSTR,
DWORD,
c_int,
c_int,
c_int,
c_int,
HANDLE,
HANDLE,
HANDLE,
LPVOID,
]
createwindowex.restype = HANDLE
wndclass = self.get_window()
# Create Window
hwnd = createwindowex( # type: ignore
0,
wndclass.lpszClassName,
b"Python Window",
ws_overlapped_window,
cw_use_default,
cw_use_default,
cw_use_default,
cw_use_default,
0,
0,
wndclass.hInstance,
0,
)
if hwnd == 0:
print(WinError()) # type: ignore
# Register for raw input
raw_input_device = (2 * RAWINPUTDEVICE)()
self.Rid = raw_input_device
raw_input_device[0].usUsagePage = 0x01
raw_input_device[0].usUsage = 0x06
ridev_input_sink = 0x00000100 # Get events even when not focused
raw_input_device[0].dwFlags = ridev_input_sink
raw_input_device[0].hwndTarget = hwnd
raw_input_device[1].usUsagePage = 0x01
raw_input_device[1].usUsage = 0x02
raw_input_device[1].dwFlags = ridev_input_sink
raw_input_device[1].hwnTarget = hwnd
registerrawinputdevices = windll.user32.RegisterRawInputDevices # type: ignore
registerrawinputdevices(raw_input_device, 2, sizeof(RAWINPUTDEVICE))
self.hwnd = hwnd # type: ignore
except Exception as e:
print("error starting")
print(e)
def get_window(self):
cs_vredraw = 1
cs_hredraw = 2
idi_application = 32512
idc_arrow = 32512
white_brush = 0
# Define Window Class
wndclass = WNDCLASS()
self.wndclass = wndclass
wndclass.style = cs_hredraw | cs_vredraw
wndclass.lpfnWndProc = wndproc(lambda h, m, w, x: self.wndproc(h, m, w, x)) # type: ignore
wndclass.cbClsExtra = wndclass.cbWndExtra = 0
wndclass.hInstance = windll.kernel32.GetModuleHandleA(c_int(0)) # type: ignore
wndclass.hIcon = windll.user32.LoadIconA(c_int(0), c_int(idi_application)) # type: ignore
wndclass.hCursor = windll.user32.LoadCursorA(c_int(0), c_int(idc_arrow)) # type: ignore
wndclass.hbrBackground = windll.gdi32.GetStockObject(c_int(white_brush)) # type: ignore
wndclass.lpszMenuName = None
wndclass.lpszClassName = b"MainWin"
if not windll.user32.RegisterClassA(byref(wndclass)): # type: ignore
print("error in RegisterClassA")
raise WinError()
return wndclass
def poll_events(self):
# Pump Messages
msg = MSG()
pmsg = pointer(msg)
pm_remove = 1
while windll.user32.PeekMessageA(pmsg, self.hwnd, 0, 0, pm_remove) != 0: # type: ignore
windll.user32.DispatchMessageA(pmsg) # type: ignore
def __del__(self):
pass
def stop(self):
self.Rid[0].dwFlags = 0x00000001
windll.user32.DestroyWindow(self.hwnd) # type: ignore
def wndproc(self, hwnd, message, wparam, lparam): # type: ignore
try:
wm_input = 255
ri_mouse_wheel = 0x0400
wm_destroy = 2
if message == wm_destroy:
windll.user32.PostQuitMessage(0) # type: ignore
return 0
elif message == wm_input:
get_raw_input_data = windll.user32.get_raw_input_data # type: ignore
null = c_int(0)
dw_size = c_uint()
rid_input = 0x10000003
get_raw_input_data(lparam, rid_input, null, byref(dw_size), sizeof(RAWINPUTHEADER))
if dw_size.value == 40:
# Mouse
raw = RAWINPUT()
if (
get_raw_input_data(lparam, rid_input, byref(raw), byref(dw_size), sizeof(RAWINPUTHEADER))
== dw_size.value
):
rim_typemouse = 0x00000000
if raw.header.dwType == rim_typemouse:
if raw.mouse._u1._s2.usButtonFlags != ri_mouse_wheel:
return 0
return windll.user32.DefWindowProcA(c_int(hwnd), c_int(message), c_int(wparam), c_int(lparam)) # type: ignore
except Exception as e:
print("general exception in wndproc")
print(e)
rir = RawInputReader()
rir.start()
time.sleep(5)
rir.stop()