Привет, нужен драйвер который мог бы: 1. отправлять сообщения активному окну (например для эмуляции клавиатуры) 2. читать пиксели, что-то вроде GetPixel Драйвер потому что есть защита, нужные user mode функции не работают, да и вообще интересно посмотреть что за ring0. Прошу знающих людей послать в нужном направлении По пункту 1 обнаружил пример: HWND KernelGetActiveWindow () { PUSER_MESSAGE_QUEUE ms; ms = (W32THREAD*)PsGetCurrentThread()->Tcb.Win32Thread->MessageQueue; return ( ms ? ms->ActiveWindow : 0); } вот только в ntddk.h и ntifs.h нет описания структур: W32THREAD PUSER_MESSAGE_QUEUE
Код драйвера всегда выполняется в контексте какого-то процесса, а не сам по себе. Просто с бОльшими привилегиями, чем процесс. Подразумевается, что драйвер будет кем-то вызван. Кем ? Твоим процессом ? Почему бы тогда не работать с окнами и пикселями из этого процесса ? Никак не могу понять, почему многих так тянет работать с гландами через зад, когда есть более простые и удобные способы...
Partner есть большая разница между тем, когда нужно что-то сделать ради результата (тут как говорится, на войне любые методы), а бывает, что нужно чт-то сделать ради процесса. в последнем случае предполагается что тебе нужно получить удовольствие и определенные знания от самого процесса. мне кажется последниц случай здесь более применим - сам так делал. pdbdump win32k.sys проблема в том что в винде нет таких полей. эти поля для React OS виндовая структура: Код (Text): struct _W32THREAD { /*<thisrel this+0x0>*/ /*|0x4|*/ struct _ETHREAD* pEThread; /*<thisrel this+0x4>*/ /*|0x4|*/ unsigned long RefCount; /*<thisrel this+0x8>*/ /*|0x4|*/ struct _TL* ptlW32; /*<thisrel this+0xc>*/ /*|0x4|*/ void* pgdiDcattr; /*<thisrel this+0x10>*/ /*|0x4|*/ void* pgdiBrushAttr; /*<thisrel this+0x14>*/ /*|0x4|*/ void* pUMPDObjs; /*<thisrel this+0x18>*/ /*|0x4|*/ void* pUMPDHeap; /*<thisrel this+0x1c>*/ /*|0x4|*/ unsigned long dwEngAcquireCount; /*<thisrel this+0x20>*/ /*|0x4|*/ void* pSemTable; /*<thisrel this+0x24>*/ /*|0x4|*/ void* pUMPDObj; }; // <size 0x28> (pdbdump win32k)
pdbdump win32k.sys отличная утилита, спасибо кстати по пункту 1 обнаружил статейку интересную: Window Messages as a Forensic Resource
сделал то что хотел, но немного по другому: драйвер Код (Text): pBuf = pIrp->AssociatedIrp.SystemBuffer; if(!pBuf) { return status; } ulBufSize = pStackLoc->Parameters.DeviceIoControl.InputBufferLength; if(ulBufSize < sizeof(BYTE)) { return status; } while(ulBufSize--) { WriteCommand8042(*pBuf); ++pBuf; } VOID WriteCommand8042( BYTE bCode) { __asm { WaitWhileFull: in al, 64h test al, 1 jnz WaitWhileFull TestCmdPort1: in al, 64h test al, 2 jnz TestCmdPort1 mov al, 0d2h out 64h, al TestCmdPort2: in al, 64h test al, 2 jnz TestCmdPort2 mov al, bCode out 60h, al } } в приложении в цикле получаю текущее окно с помощью GetForegroundWindow() и проверяю заголовок, если совпадает при необходимости заполняю массив и обращаюсь к драйверу: Код (Text): BOOL DrvEmulateKeyboard(BYTE *pData, BYTE byNumItems) { DWORD dwBytesReturned; BOOL bRes; bRes = DeviceIoControl( g_hDevice, IOCTL_EMULATE_KEYBOARD, pData, sizeof(BYTE) * byNumItems, 0, 0, &dwBytesReturned, NULL); return bRes; } для эмуляции удерживания кнопки отправляю с некоторой задержкой make скан код при длительной эмуляции появляется странный глюк, некоторые кнопки начинают работать с задержкой да и вооще система подтормаживает что это может быть?