Как завершить чужой Pending IRP в mouclass?

Тема в разделе "WASM.NT.KERNEL", создана пользователем assorted, 22 июн 2011.

  1. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Установил перехват на IRP_MJ_READ mouclass. Беда в том что IRP что уже ждет завершения и был порожден до установки моего хука. По сему, прежде чем мой обработчик IRP_MJ_READ будет вызван, нужно завершить IRP, например, подтолкнув мышку. Приемлимо любое хардкод решение.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А адрес IRP есть? Насколько я понимаю, ситуация такая: фильтр садится на драйвер мыши к тому времени, когда IRP на движение мыши уже выполнился и ждет прерывания от устройства. В этом случае будет вызвана только completion routine фильтра, когда движение произойдет. Можно попробовать найти адрес IRP и отменить, но поиск его будет, грязным хаком...

    Но это все размышления новичка, может быть есть более простые пути.
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Почему это беда?

    Зачем?
     
  4. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Да, забыл сказать что установленный мною обработчик на IRP_MJ_READ функционально должен не ловить MOUSE_INPUT_DATA, а формировать. Приходится подталкивать мышь чтобы завершился IRP находящийся в обработке. Все последущие IRP проходят уже через мой обработчик и я собственноручно завершаю процедуру асинхронного чтения с нужным мне MOUSE_INPUT_DATA.

    Быть может, можно вызвать MajorFunction какую то или особый IRP_MJ_PNP для PDO созданных драйвером mouclass, для достижения этих целей?
     
  5. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Вообще, такой вопрос - если мы подключили вторую клавиатуру, то каким образом RIT узнает об этом и пришлет еще один IRP_MJ_READ?
     
  6. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    Если будет два раза завершаться irp, то это 100% BSOD!!!
     
  7. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    По-моему, об этом речи не шло.
     
  8. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Напислал 2 варианта, оба имеют серьезные недостатки.
    1) WDM - для него создается новый PointerClass_N. Отлично работает, но в диспетчере устройств его видно.
    2) Legacy который цепляется к PointerClass. Не начнет работать пока от мышки не придут данные. Тогда рending IRP захватываю уже я и завершаю когда требуется.

    Возникают два вопроса:
    1) Как скрывать устройства в диспетчере задач?
    2) Как приаттачится к PointerClass0 до того как он пролучит первый IRP_MJ_READ от csrss.exe? Может хуком на создание процесса csrss.exe и ZwReadFile с параметром PointerClass0? Не очень пердставляю очередность загрузки драйвера и csrss.exe.
     
  9. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Здесь
    Подразумевается правильная установка драйвера через .inf-файл.
    По крайне мере, драйвер должен быть корректно прописан в реестре.

    Это не имеет особого значения. Главное помнить, что классовый драйвер клавиатуры или мыши всегда грузится до запуска первого процесса, коим обычно является SM (smss.exe). Зная этот факт, остальное лишь дело техники. А вообще, есть как минимум 3 способа сделать то, что ты хочешь. Первый подразумевает написание WDM-драйвера виртуального устройства, что ты уже и проделал, если я правильно понял. Способ громоздкий и мне лично не нравится. Второй, наиболее правильный способ, заключается в написании WDM драйвера-фильтра и установки его как верхнего фильтра (upper filter) для соответствующего класса (Pointer в твоём случае), при чём обязательно после mouclass, - порядок важен. Если этот метод по каким-либо причинам не нравится, то остаётся только ставить колбек на создание процессов, ловить там запуск SM или CSR и аттачиться к \Device\PointerClass0 как самый обычный legacy-фильтр. К сожалению, этот метод опасен, т.к. такой фильтр будет препятствовать автоматической выгрузке стека девайса в случае, например, когда железку физически вынули из разъёма, - смешивать в одном стеке WDM и legacy драйвера нежелательно.