Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Фильтр мыши  (Прочитано 18329 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Anfet
Новенький

md
Offline Offline

« : 14-08-2011 19:42 » 

Вечер добрый.

Нужна ваша помощь в попытке написания фильтр-драйвера к мыши. Попытался перерыть что можно, но в итоге многое отправляется на moufilt.c из DDK, а до wdf я еще не добрался. Хоть бы просто NT написать. Попробую описать задачу и вопросы вставшие. Может хоть чем-то сможете помочь.

Задача. Написать драйвер - работающий в режиме ядра, который может отсылать "наверх к системе" сгенерированные IRP пакеты (данные приходят из usermode - приложения).

Как я понял, мне нужен фильтр которые должен аттачится к девайсу.
 - Как достать имя нужного девайса в системе? (Для IoAttachDevice нужно имя. А где взять имя именно мыши?)

Мне не нужно обрабатывать получаемые пакеты
 - Нужно ли что-то перекрыть чтобы отослать собственно созданный пакет?

Далее, нужно перекрыть IRP_MR_WRITE, получать данные от программы, создавать пакет, и как-то его посылать вверх системе.
 - Создать IRP, вроде понятно.
 - Структура IRP пакета вроде тоже ясна.
 - А вот как послать, и куда послать ... совсем не ясно.

Я понимаю что тут, на 99% где-то есть провалы, вот только не могу их понять.
Например: По идее я должен послать IRP пакет выше к системе. Но как система его обработает, и связано ли это с тем драйвером мыши? (например, нужно ли писать фильтр, или есть какой-то другой способ? Например просто отдельно стоящий драйвер).
Что нужно перекрывать? Есть такие функции как MouFilter_IsrHook, MouFilter_ServiceCallback, InternalDeviceControl.
Можно ли на них забить большой больщой болт?

(Пробовал прочесть Комиссарову (но так "это и так ясно", "это уже понятно") и Солдатова (но там тоже не ок для новичков в драйверном деле. Подвернулись хорошие статьи http://www.codeproject.com/KB/system/driverdev4asp.aspx, но тут под ntddk. Осваиваю что могу.

Вот. Если куда-то сможете направить поток мыслей - огромное спасибо.
Олег.
 
ЗЫ. драйвер писать надо, т.к. mouse_event, и SendInput очень часто стали блокироваться... так что выхода нет.


Добавлено через 22 минуты и 16 секунд:
Забыл дописать.
 - Где тот конец, когда PMOUSE_INPUT_DATA, превращается в реальное перемещение мыши в системе?
« Последнее редактирование: 15-08-2011 08:54 от Ochkarik » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 15-08-2011 13:02 » 

доброго!
0. попытаться вкурить  раздел msdn Human Input Devices Design Guide
и в частности
Driver Stacks for USB Keyboard, Mouse, and Joystick Devices
Driver Stacks for Non-HIDClass Keyboard and Mouse Devices


1. как достать имя.
имя вам наверное доставать не надо).  драйвер \src\input\Moufiltr ставится через inf как UpperFilters (с использованием стандартного msmouse.inf)
путем добавления секции
  [moufiltr.HW.AddReg]
  HKR,,"UpperFilters",0x00010000,"moufiltr"
в реестр.
если доставать самому - то видимо это делается через ClassGUID={4D36E96F-E325-11CE-BFC1-08002BE10318} видимо он же GUID_CLASS_MOUSE .... можно что то подобное провернуть.
посмотрите раздел msdn


2. как отсылать.
надо подумать.... сгоряча чуть не напредлагал всякого. но опомнился)
быть может, стоит покопать в сторону МouseClass.... либо через HID...
я с ходу не вижу как через фильтр можно новые данные слать, если реальных нет. там вроде только через калбэк все фильтруется. но вы посмотрите на всякий случай его IOCTL. и что там в IOCTL_INTERNAL_MOUSE_CONNECT передается.
... ааа. вот. там же процедура сервиса задается PSERVICE_CALLBACK_ROUTINE devExt->UpperConnectData.ClassService().
если ее можно вызывать самостоятельно, не дожидаясь прихода реальных сообщений... то почему бы и нет?

3. что позволит сделать фильтр.
он позволит помимо отправки новых событий, еще и фильтровать реальные.
отдельно стоящий драйвер фильтровать соответственно не сможет. но отправлять - можно.

но я все таки рекомендовал бы начать с имеющегося примера фильтра:
1. он уже написан, его только скомпилировать (заодно научитесь).
2. вашу задачу он ТОЖЕ может решить (помимо фильтрации).
3. в общем то вы ничего не потеряете, даже если пример вам не понравится) но зато сможете посмотреть отладчиком(DbgPrint-ом) что и когда там происходит)

далее.... если решите смотреть фильтры - рекомендую еще смотреть исходники CPNMouse(если не найдете - выложу). он решает обратную задачу, но до кучи, мельком посмотреть стоит, там наглядно сама процедура перехвата расписана - что где находится видно.

второй вариант. начать не с фильтра а с драйвера... в принципе возможно наверное. если тот драйвер более чем один открытый хендл позволяет сделать.
тогда получить ссылку на девайс (через GUID)... а вот как сообщения вставить пока не соображу. тут msdn еще покопать надо, а у меня сейчас времени - совсем опаньки)
может быть через HID...
в любом случае - посмотрите сначала msdn)
будут еще вопросы - постараюсь ответить...


PS PMOUSE_INPUT_DATA - что значит в реальные? реальными вы называете мышиный курсор на экране? тогда, тот, кто его выводит на экран) честно говоря кто выводит - не интересовался.... посмотрите по стеку кто там вверху...
« Последнее редактирование: 15-08-2011 13:09 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakielpel
Интересующийся

ru
Offline Offline

« Ответ #2 : 13-07-2014 10:01 » 

и чем же все закончилось?

Можно ли из приложения посылать команды стандартному драйверу мыши? без использования дополнительного драйвера фильтра? Т.е. если задача не получать события от мыши, а только их отправлять.

нашел вот это, но я так понимаю это для MS-DOS? (
http://www.borlpasc.narod.ru/docym/farpract/gl4/g4.htm
Записан
zubr
Гость
« Ответ #3 : 13-07-2014 10:36 » 

SendInput или mouse_event
Записан
Shakielpel
Интересующийся

ru
Offline Offline

« Ответ #4 : 13-07-2014 11:27 » 

вообще то речь шла про драйвер, API вообще не катит.

Добавлено через 7 минут и 7 секунд:
или вот, драйвер откуда то же забирает данные получаемые от устройства, можно туда чего нибудь свое подсунуть и чтобы он забрал?
« Последнее редактирование: 13-07-2014 11:34 от Shakielpel » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 15-07-2014 13:35 » 

1. зачем из приложения слать именно драйверу, цель действий какая?
2. почему не устраивает API - SendInput или mouse_event?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakielpel
Интересующийся

ru
Offline Offline

« Ответ #6 : 15-07-2014 15:44 » new

емае) вы как будто начало темы не читали и не отвечали в нем ) потому что SendInput блокируется защитой.
Записан
Shakielpel
Интересующийся

ru
Offline Offline

« Ответ #7 : 25-07-2014 15:11 » 

Код: (C)

    PMOUSE_INPUT_DATA Str = NULL;
   
   
     deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
     
      if  (
                (deviceExtension->pdx->UpperConnectData.ClassService != 0)
        && (deviceExtension->pdx->UpperConnectData.ClassService != NULL)
        && (deviceExtension->pdx->UpperConnectData.ClassDeviceObject != NULL)
        && (deviceExtension->pdx->UpperConnectData.ClassDeviceObject != 0)
        )
      {
           Str = (PMOUSE_INPUT_DATA) ExAllocatePoolWithTag(NonPagedPool,2*sizeof(MOUSE_INPUT_DATA),POOL_TAG) ;
           if (Str != NULL) {
        Str->LastX = 0;
        Str->ButtonFlags                                                = MOUSE_LEFT_BUTTON_DOWN;
         Str->LastY                                                                             = 0;
   
         Str->Flags                                                      = MOUSE_MOVE_RELATIVE;
              Str->ExtraInformation    = 0;
                Str->RawButtons                          = 0;
                        Str->UnitId                                                         = 0;
                        Str->ButtonData                             = 0;       
                        Consume = 0;
          //ASSERT(KeGetCurrentIrql()<=DISPATCH_LEVEL);
          //KeRaiseIrql(DISPATCH_LEVEL,&oldirql)        ;
         (*(PSERVICE_CALLBACK_ROUTINE) deviceExtension->pdx->UpperConnectData.ClassService)(
        deviceExtension->pdx->UpperConnectData.ClassDeviceObject,
        Str,
       Str+1,
        &Consume
        );
        ExFreePool (Str);
   // KeLowerIrql(oldirql) ;  
        }
        };
блин, как создать эту долбанную структуру PMOUSE_INPUT_DATA, чтобы ее проглотил этот долбанный колбек маус класса? это какая то мега табу тема? нигде невозможно ничего об этом найти (
« Последнее редактирование: 26-07-2014 01:45 от Shakielpel » Записан
Shakielpel
Интересующийся

ru
Offline Offline

« Ответ #8 : 25-07-2014 23:24 » 

 Должен же быть выход!!!
« Последнее редактирование: 26-07-2014 01:40 от Shakielpel » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 28-07-2014 09:47 » 

а как ругается?

Добавлено через 4 минуты:
PS маускласс в DDK в примерах же есть. и калбэк соответственно.

Добавлено через 2 минуты и 14 секунд:
скомпили отладочный класс - там отладочных сообщений море в том калбэке
« Последнее редактирование: 28-07-2014 09:53 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakielpel
Интересующийся

ru
Offline Offline

« Ответ #10 : 01-08-2014 03:22 » 

ругается бсодами ) я уже разобрался, дело было не в структуре, драйвер работает..

ладно попробую спросить:

не удается сие чудо автоматически установить

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

Код: (Bash)
[Version]
Signature="$Windows NT$"
Provider=%VMUsbMouse.Mfg%
ClassGUID={4D36E96F-E325-11CE-BFC1-08002BE10318}
Class=Mouse
DriverVer=03/26/2012, 12.5.2.0
DriverPackageType=PlugAndPlay

[DestinationDirs]
DefaultDestDir = 12

[Manufacturer]
%VMUsbMouse.Mfg% = VMware, NTx86, NTia64, NTamd64

[ControlFlags]
ExcludeFromSelect = *

[VMware]

%VMUsbMouse.SvcDesc% = VMUsbMouse, HID\VID_0E0F&PID_0003&MI_00
%VMUsbMouse.SvcDesc% = VMUsbMouse, HID\VID_0E0F&PID_0003&MI_01
%VMUsbMouse.SvcDesc% = VMUsbMouse, HID\VID_0458&PID_003A&MI_02


[VMware.NTx86]

%VMUsbMouse.SvcDesc% = VMUsbMouse, HID\VID_0E0F&PID_0003&MI_00
%VMUsbMouse.SvcDesc% = VMUsbMouse, HID\VID_0E0F&PID_0003&MI_01
%VMUsbMouse.SvcDesc% = VMUsbMouse, HID\VID_0458&PID_003A&MI_02


[VMware.NTamd64]





[VMware.NTia64]

[VMUsbMouse]
Include=msmouse.inf
Needs=HID_Mouse_Inst
CopyFiles=VMUsbMouse.CopyFiles

[VMUsbMouse.CopyFiles]
LaserPU.sys

[VMUsbMouse.Services]
AddService=LaserPU,  , LaserPU_Service_Inst
Include=msmouse.inf
Needs=HID_Mouse_Inst.NT.Services

[LaserPU_Service_Inst]
DisplayName    = %VMUsbMouse.SvcDesc%
ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER
StartType      = 3                  ; SERVICE_DEMAND_START
ErrorControl   = 0                  ; SERVICE_ERROR_IGNORE
LoadOrderGroup = Pointer Port
ServiceBinary  = %12%\LaserPU.sys

[VMUsbMouse.HW]
AddReg=VMUsbMouse.HW.AddReg
Needs=HID_Mouse_Inst.NT.HW

[VMUsbMouse.HW.AddReg]
HKR,,"UpperFilters",0x00010008,"LaserPU"

[SourceDisksNames]
1 = %VMUsbMouse.Disk%,,,

[SourceDisksFiles]
LaserPU.sys = 1,,

[VMwarePathInfo]
OriginalInfSourcePath = %1%

[Strings]
VMUsbMouse.Disk    = "LaserUSB Pointing Device Driver Disk"
VMUsbMouse.Mfg     = "Laser Inc."
VMUsbMouse.SvcDesc = "Laser USB Pointing Device"

выполняю батник:
Код: (Bash)
%SystemRoot%\System32\rundll32.exe setupapi,InstallHinfSection VMUsbMouse 132 C:\lastVM\FireDDK\objchk_wxp_x86\i386\LaserPU.inf
pause


в HKLM\System\CurrentControlSet\Services мой драйвер есть, в HKLM\System\CurrentControlSet\Enum мой фильтр не указан, а вмВаровский указан ( почему не добавляется?
в HKLM\System\CurrentControlSet\Control\Class в DriverKey моего нету, там ВмВаровский...причем вроде как сюда коинсталеры записывают чтото, а в inf нет раздела коинсталеры....


но хоть ты тресни, не запускается он, появляется в службах но не запущенный, не появляется в диспетчере устройств, в реестре в тех местах где прописан фильтр от оригинального inf файла, мой не добавляется ( в setupapi.log единственная жалоба на его неподписанность. Он даже есть в списке совместимых устройств если его вручную устанавливать, и вручную заменить им существующий фильтр получается. Но как установить его парралельно с существующим и программно?

« Последнее редактирование: 01-08-2014 04:10 от Shakielpel » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 01-08-2014 09:36 » 

ClassGUID от другого файла остался? попробуйте свой?

Добавлено через 8 минут и 49 секунд:
и еще. в DDK где то была утилита проверки корректности INF... может некритичная ошибка которая влияет при такой установке.
« Последнее редактирование: 01-08-2014 09:45 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakielpel
Интересующийся

ru
Offline Offline

« Ответ #12 : 01-08-2014 11:38 » 

Цитата
ClassGUID от другого файла остался? попробуйте свой?

какой такой свой? это же гуид мыши, а мой драйвер фильтр, поэтому мне кажется такой и должен быть, свой это какой?

там суть в том, что к инфе об mouhid добавляется параметр в реестре, что верхний фильтр такой то, так вот мой фильтр туда  не добавляется (

Цитата
и еще. в DDK где то была утилита проверки корректности INF... может некритичная ошибка которая влияет при такой установке.

я пробовал ей прогонять, она только варнинги по поводу хардваре ID выдает, и то это было на infе с левыми ID, а эти срисованы с девайсов. Попробовал еще раз, ошибка только про то что нет cat файла, но setupapi говорит что политика = игнорировать у этой ошибки....блин неужели из за этого что ли...но это winxp по идее без подписи должно же вставать
« Последнее редактирование: 01-08-2014 12:33 от Shakielpel » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 04-08-2014 10:24 » 

с GUID - да, эт я неправ...
в DDK есть пример moufiltr. там же inf и сам драйвер.
попробуйте его использовать. в целом очень похож. но ставится не на HID а на PS2.
DDK\3790.1830\src\input\moufiltr\moufiltr.inf
; moufiltr.inf
;
; Installation inf for the Device that needs flitering adapter.
;
; (c) Copyright 1999 Microsoft
;

[Version]
Signature="$Windows NT$"
Provider=%DDK_Ex%
ClassGUID={4D36E96F-E325-11CE-BFC1-08002BE10318}
Class=Mouse
; Uncomment the following line when you have a valid catalog file.
;         If you use bogus catalog file installation will fail.
;CatalogFile=moufiltr.cat
DriverVer=07/20/1999

[DestinationDirs]
DefaultDestDir   = 12

;
; Driver information
;

[Manufacturer]
%DDK_Ex%   = DDK_Ex.Mfg, NTia64, NTamd64

[DDK_Ex.Mfg]
%DDK_Ex% = moufiltr, *PNP0FAKE


[DDK_Ex.Mfg.NTia64]
%DDK_Ex% = moufiltria64, *PNP0FAKE


[DDK_Ex.Mfg.NTamd64]
%DDK_Ex% = moufiltramd64, *PNP0FAKE


;
; General installation section
;

[moufiltr]
; perform port related actions from msmouse.inf
Include=msmouse.inf
Needs=PS2_Inst

[moufiltria64]
; perform port related actions from msmouse.inf
Include=msmouse.inf
Needs=PS2_Inst

[moufiltramd64]
; perform port related actions from msmouse.inf
Include=msmouse.inf
Needs=PS2_Inst

; Copy the driver over
CopyFiles=moufiltr.CopyFiles


;
; File sections
;

[moufiltr.CopyFiles]
moufiltr.sys


;
; Service Installation
;

[moufiltr.Services]
AddService = moufiltr,  , moufiltr_Service_Inst
; Install the port driver and mouclass from msmouse.inf
Include=msmouse.inf
Needs=PS2_Inst.Services

[moufiltria64.Services]
AddService = moufiltr,  , moufiltr_Service_Inst
; Install the port driver and mouclass from msmouse.inf
Include=msmouse.inf
Needs=PS2_Inst.Services

[moufiltramd64.Services]
AddService = moufiltr,  , moufiltr_Service_Inst
; Install the port driver and mouclass from msmouse.inf
Include=msmouse.inf
Needs=PS2_Inst.Services

[moufiltr_Service_Inst]
DisplayName    = %moufiltr.SvcDesc%
ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER
StartType      = 3                  ; SERVICE_DEMAND_START
ErrorControl   = 0                  ; SERVICE_ERROR_IGNORE
LoadOrderGroup = Pointer Port
ServiceBinary  = %12%\moufiltr.sys

[moufiltr.HW]
; Add the device upper filter
AddReg = moufiltr.HW.AddReg

[moufiltria64.HW]
; Add the device upper filter
AddReg = moufiltr.HW.AddReg

[moufiltramd64.HW]
; Add the device upper filter
AddReg = moufiltr.HW.AddReg

; run the directives need by the port driver
Include=msmouse.inf
Needs=PS2_Inst.HW

[moufiltr.HW.AddReg]
HKR,,"UpperFilters",0x00010000,"moufiltr"


;
; Source file information
;

; use [SourceDisksNames.x86] for x86 only installs
; use [SourceDisksNames.alpha] for alpha only installs

[SourceDisksNames]
1 = %DiskId1%,,,

[SourceDisksFiles]
moufiltr.sys = 1,,


[Strings]

;
; Non-Localizable Strings
;

REG_SZ         = 0x00000000
REG_MULTI_SZ   = 0x00010000
REG_EXPAND_SZ  = 0x00020000
REG_BINARY     = 0x00000001
REG_DWORD      = 0x00010001
SERVICEROOT    = "System\CurrentControlSet\Services"

;
; Localizable Strings
;

DiskId1 = "DDK Example Installation Disk #1 (Mouse)"
DDK_Ex = "DDK Example Device that needs flitering"
moufiltr.SvcDesc="Mouse Filter Example"


PS там в AddReg другие флаги немного... вдург
« Последнее редактирование: 04-08-2014 10:28 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines