Взаимодействие драйвера с окном

Тема в разделе "WASM.NT.KERNEL", создана пользователем baga, 17 дек 2008.

  1. baga

    baga New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    16
    Привет, нужен драйвер который мог бы:
    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
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Код драйвера всегда выполняется в контексте какого-то процесса, а не сам по себе. Просто с бОльшими привилегиями, чем процесс.
    Подразумевается, что драйвер будет кем-то вызван. Кем ? Твоим процессом ?
    Почему бы тогда не работать с окнами и пикселями из этого процесса ?
    Никак не могу понять, почему многих так тянет работать с гландами через зад, когда есть более простые и удобные способы...
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Partner
    есть большая разница между тем, когда нужно что-то сделать ради результата (тут как говорится, на войне любые методы), а бывает, что нужно чт-то сделать ради процесса. в последнем случае предполагается что тебе нужно получить удовольствие и определенные знания от самого процесса. мне кажется последниц случай здесь более применим - сам так делал.

    pdbdump win32k.sys

    проблема в том что в винде нет таких полей. эти поля для React OS
    виндовая структура:
    Код (Text):
    1. struct _W32THREAD {
    2.   /*<thisrel this+0x0>*/ /*|0x4|*/ struct _ETHREAD* pEThread;
    3.   /*<thisrel this+0x4>*/ /*|0x4|*/ unsigned long RefCount;
    4.   /*<thisrel this+0x8>*/ /*|0x4|*/ struct _TL* ptlW32;
    5.   /*<thisrel this+0xc>*/ /*|0x4|*/ void* pgdiDcattr;
    6.   /*<thisrel this+0x10>*/ /*|0x4|*/ void* pgdiBrushAttr;
    7.   /*<thisrel this+0x14>*/ /*|0x4|*/ void* pUMPDObjs;
    8.   /*<thisrel this+0x18>*/ /*|0x4|*/ void* pUMPDHeap;
    9.   /*<thisrel this+0x1c>*/ /*|0x4|*/ unsigned long dwEngAcquireCount;
    10.   /*<thisrel this+0x20>*/ /*|0x4|*/ void* pSemTable;
    11.   /*<thisrel this+0x24>*/ /*|0x4|*/ void* pUMPDObj;
    12. };
    13. // <size 0x28>
    (pdbdump win32k)
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Сам люблю
    но чтение пикселей из драйвера, по моему, перебор...

    Если это, конечно, не видеодрайвер :)
     
  5. baga

    baga New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    16
    pdbdump win32k.sys
    отличная утилита, спасибо

    кстати по пункту 1 обнаружил статейку интересную:
    Window Messages as a Forensic Resource
     
  6. baga

    baga New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    16
    сделал то что хотел, но немного по другому:

    драйвер
    Код (Text):
    1.     pBuf = pIrp->AssociatedIrp.SystemBuffer;
    2.     if(!pBuf)
    3.     {
    4.         return status;
    5.     }
    6.  
    7.     ulBufSize = pStackLoc->Parameters.DeviceIoControl.InputBufferLength;
    8.     if(ulBufSize < sizeof(BYTE))
    9.     {
    10.         return status;
    11.     }
    12.  
    13.     while(ulBufSize--)
    14.     {
    15.         WriteCommand8042(*pBuf);
    16.         ++pBuf;
    17.     }
    18.  
    19. VOID
    20. WriteCommand8042(
    21.     BYTE bCode)
    22. {
    23.     __asm
    24.     {
    25.         WaitWhileFull:
    26.             in al, 64h
    27.             test al, 1
    28.             jnz WaitWhileFull
    29.  
    30.         TestCmdPort1:
    31.             in al, 64h
    32.             test al, 2
    33.             jnz TestCmdPort1
    34.  
    35.             mov al, 0d2h
    36.             out 64h, al
    37.  
    38.         TestCmdPort2:
    39.             in al, 64h
    40.             test al, 2
    41.             jnz TestCmdPort2
    42.  
    43.             mov al, bCode
    44.             out 60h, al
    45.     }
    46. }
    в приложении в цикле получаю текущее окно с помощью GetForegroundWindow() и проверяю заголовок, если совпадает при необходимости заполняю массив и обращаюсь к драйверу:
    Код (Text):
    1. BOOL DrvEmulateKeyboard(BYTE *pData, BYTE byNumItems)
    2. {
    3.     DWORD dwBytesReturned;
    4.     BOOL bRes;
    5.  
    6.     bRes = DeviceIoControl(
    7.         g_hDevice, IOCTL_EMULATE_KEYBOARD,
    8.         pData, sizeof(BYTE) * byNumItems,
    9.         0, 0,
    10.         &dwBytesReturned, NULL);
    11.  
    12.     return bRes;
    13. }
    для эмуляции удерживания кнопки отправляю с некоторой задержкой make скан код

    при длительной эмуляции появляется странный глюк, некоторые кнопки начинают работать с задержкой да и вооще
    система подтормаживает

    что это может быть?