Установил перехват на IRP_MJ_READ mouclass. Беда в том что IRP что уже ждет завершения и был порожден до установки моего хука. По сему, прежде чем мой обработчик IRP_MJ_READ будет вызван, нужно завершить IRP, например, подтолкнув мышку. Приемлимо любое хардкод решение.
А адрес IRP есть? Насколько я понимаю, ситуация такая: фильтр садится на драйвер мыши к тому времени, когда IRP на движение мыши уже выполнился и ждет прерывания от устройства. В этом случае будет вызвана только completion routine фильтра, когда движение произойдет. Можно попробовать найти адрес IRP и отменить, но поиск его будет, грязным хаком... Но это все размышления новичка, может быть есть более простые пути.
Да, забыл сказать что установленный мною обработчик на IRP_MJ_READ функционально должен не ловить MOUSE_INPUT_DATA, а формировать. Приходится подталкивать мышь чтобы завершился IRP находящийся в обработке. Все последущие IRP проходят уже через мой обработчик и я собственноручно завершаю процедуру асинхронного чтения с нужным мне MOUSE_INPUT_DATA. Быть может, можно вызвать MajorFunction какую то или особый IRP_MJ_PNP для PDO созданных драйвером mouclass, для достижения этих целей?
Вообще, такой вопрос - если мы подключили вторую клавиатуру, то каким образом RIT узнает об этом и пришлет еще один IRP_MJ_READ?
Напислал 2 варианта, оба имеют серьезные недостатки. 1) WDM - для него создается новый PointerClass_N. Отлично работает, но в диспетчере устройств его видно. 2) Legacy который цепляется к PointerClass. Не начнет работать пока от мышки не придут данные. Тогда рending IRP захватываю уже я и завершаю когда требуется. Возникают два вопроса: 1) Как скрывать устройства в диспетчере задач? 2) Как приаттачится к PointerClass0 до того как он пролучит первый IRP_MJ_READ от csrss.exe? Может хуком на создание процесса csrss.exe и ZwReadFile с параметром PointerClass0? Не очень пердставляю очередность загрузки драйвера и csrss.exe.
Здесь Подразумевается правильная установка драйвера через .inf-файл. По крайне мере, драйвер должен быть корректно прописан в реестре. Это не имеет особого значения. Главное помнить, что классовый драйвер клавиатуры или мыши всегда грузится до запуска первого процесса, коим обычно является SM (smss.exe). Зная этот факт, остальное лишь дело техники. А вообще, есть как минимум 3 способа сделать то, что ты хочешь. Первый подразумевает написание WDM-драйвера виртуального устройства, что ты уже и проделал, если я правильно понял. Способ громоздкий и мне лично не нравится. Второй, наиболее правильный способ, заключается в написании WDM драйвера-фильтра и установки его как верхнего фильтра (upper filter) для соответствующего класса (Pointer в твоём случае), при чём обязательно после mouclass, - порядок важен. Если этот метод по каким-либо причинам не нравится, то остаётся только ставить колбек на создание процессов, ловить там запуск SM или CSR и аттачиться к \Device\PointerClass0 как самый обычный legacy-фильтр. К сожалению, этот метод опасен, т.к. такой фильтр будет препятствовать автоматической выгрузке стека девайса в случае, например, когда железку физически вынули из разъёма, - смешивать в одном стеке WDM и legacy драйвера нежелательно.