Подключение драйвера фильтра

Тема в разделе "WASM.NT.KERNEL", создана пользователем wint, 4 фев 2007.

  1. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Ох... Слишком много всего объяснять тут придётся, так что только в общих чертах. Остальное постарайся вкурить по докам.

    Когда в систему приходит USB девайс, то PnP менеджера интересуют только две вещи: VID (Vendor ID) и PID (Product ID). Эти две хрени драйвер хаба берет из полей idVendor и idProduct стандартного Device Descriptor, который зашит в сам девайс. PnP менеджер строит Hardware ID вида USB\VID_XXXX&PID_YYYY, где XXXX и YYYY - значения idVendor и idProduct, соответственно. См. раздел DDK "Standard USB Identifiers". Ещё используется номер ревизии девайса из поля bcdDevice, но это детали. Поимев Hardware ID, PnP менеджер начинает шустрить по inf файлам в каталоге %SystemRoot%\inf\ на предмет поиска inf-файла с совпадающим Hardware ID. Если он его находит, прописывает в реестр нужную инфу и загружает дрова. Если не находит, дёргает юзера, чтоб тот ткнул его в нужный inf. Если юзер не тыкает, то тогда PnP менеджер пытается подобрать нужный драйвер, используя так называемый Compatible ID. Для флешек он имеет вид USB\CLASS_XX&SUBCLASS_YY&PROT_ZZ, где XX - значение поля bInterfaceClass стандартного Interface Descriptor (для флешек должно быть равно 08 - класс "Mass Storage"), XX и YY - значения полей bInterfaceSubClass и bInterfaceProtocol стандартного Interface Descriptor, который зашит в сам девайс. Поимев Compatible ID, PnP менеджер пытается подобрать нужный драйвер, а это стандартный системный usbstor.sys.

    На самом деле Hardware ID и Compatible ID - это не одна сущность, а целая иерархия от более специфичного к менее специфичному, но в данном случае тебе это всё равно. Кури "Device Identification Strings", "Identifiers for USB Devices" и "Identifiers Generated by USBSTOR.SYS".

    Теперь про реестр. Поимев inf, PnP менеджер, среди прочих, создает в реестре так называемый hardware key (ещё его зовут device key). Для USB девайсов он имеет вид HKLM\System\CurrentControlSet\Enum\USB\<deviceID>, где deviceID имеет вид Vid_XXXX&Pid_YYYY, где XXXX и YYYY - значения idVendor и idProduct, соответственно (см. выше). Может ещё добавляться номер ревизии девайса из поля bcdDevice, но это детали. Под hardware key PnP менеджер создает ключ Instance ID такого вида: 5&1ba9e9ae&0&1 (формируется по секретной формуле ;)). Это если у девайса поле iSerialNumber из стандартного Device Descriptor равно нулю. Если ты будешь тыкать такой (без серийника) девайс в разные порты, то для каждого втыка создается свой ключ Instance ID. Если серийник есть, то это будет отражено в ключе Instance ID и при перетыкивании новых ключей не будет, т.к. серийник однозначно идентифицирует девайс. Кури "Driver Information in the Registry".

    К чему я так много говорил... Т.к. тебе надо установить фильтр для конкретной флешки, то тебе нужно прописаться (создать если нет) в ключ LowerFilters, который должен находится в ключах Instance ID. Это нужно сделать для всех ключей Instance ID для данной флешки.

    Чтоб тебе врубиться в это, возьми свою флешку, открой редактор реестра, тыкай флешку в разные порты и смотри как в реестре добавляются новые ключи Instance ID. Только повторяю, это если у девайса нет серийника. Затем в SnoopyPro жмёш F2 и находишь список всех этих ключей. Тыкаешь в любой правой мышой и выбираешь "Install" (именно Install и ничего другое). Идешь в реестр и видишь, что во все ключи Instance ID добавился ключ LowerFilters. Куришь исходники SnoopyPro, не забыв сделать Uninstall.

    Как быть с теми девайсами, которые ещё ни разу не были в системе или не тыкались в конкретный порт, я не знаю, т.к. соотв. ключей Instance ID ещё не существует и какими они будут неизвестно. Именно поэтому SnoopyPro может ставить фильтр только на уже побывавшие в системе девайсы. Долго куришь не знаю что.

    Уфф... Пойду тоже покурю что-нибудь.
     
  2. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Four-F
    Great respect!!!
    Огромное спасибо за консультацию=)

    Пойду возьму много бамбука:) и буду долго разбираться...
     
  3. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Спасибо...Покурил...

    Имею следующий *.inf файл, для своего драйвера:

    Код (Text):
    1. [Manufacturer]
    2. %Generic% = Generic
    3.  
    4. [Generic]
    5. "My Usb Filter" = My_Install_Section, USB\[b]Class_08&SubClass_02&Prot_50 [/b];
    6.  
    7. ...
    8.  
    9. [MyUsbFilter_AddReg]
    10. ;
    11. HKLM, SYSTEM\CurrentControlSet\Enum\USB\[b]Vid_1005&Pid_b113[/b]\[b]574B16001054[/b], LowerFilter, , MyUsbFilter
    12. ;
    13.  
    14. [MyUsbFilter_Install_Section.NT.Services]
    15. AddService = MyUsbFilter,,Filter_Service_Inst
    16.  
    17. [MyUsbFilter_HW_AddReg]
    18. HKR,,"LowerFilters",0x00010000,"MyUsbFilter"
    Если я правильно понимаю раздел [MyUsbFilter_HW_AddReg] добавляет в HKLM\...\CurrentControlSet\Enum - информацию о моем виртуальном устройстве?

    В [MyUsbFilter_AddReg] необходимо добавить, что-то вроде:
    HKLM, SYSTEM\CurrentControlSet\Enum\USB\Vid_1005&Pid_b113\574B16001054, LowerFilter, , MyUsbFilter, где:
    Vid_1005&Pid_b113 - deviceID - моей флехи.
    574B16001054 - InstanceID - присвоенный на конкретном порту.
    ,для всех возможных значений InstanceID?

    Class_08&SubClass_02&Prot_50 - Я скопировал deviceID - из USTORK -прокатит?=)

    Верным ли путем идем?=)
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Да.

    Никогда не писАл инф для device-specific filter, поэтому что именно нужно прописать не скажу. Но [MyUsbFilter_AddReg] тебе наверное не нужна (HKLM - это абсолютный путь). Вместо неё [MyUsbFilter_HW_AddReg] (а HKR относительный).

    [Generic]
    "My Usb Filter" = My_Install_Section, USB\VID_vvvv&PID_pppp
    "USB\VID_vvvv&PID_pppp" - ветка в hardware key ключе реестра для конкретной флешки. Она будет использована как коренной путь для добавления того, что у тебя в HKR....

    InstanceID вроде определять не надо. Система кажется пропишет фильтр во все существующие на данный момент подключи.

    Не знаю. Идея такая, что ставить фильтр на все девайсы, у которых Class=08, SubClass=02 а Protocol=50, но это Compatible ID и используется для поиска подходящего драйвера если по Hardware ID не удается найти точно соответствующий драйвер для устройства. В реестре такой ветки нет. Поэтому будет ли это работать я не знаю.

    По-моему направление верное ;) Копаться в inf-файлов - удовольвствие значительно ниже среднего :dntknw:

    http://www.wd-3.com/archive/InfFiles.htm
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Вот ещё может помочь. Пример инф-файла из DDK\src\wdm\usb\filter. Точнее это не полный инф, а только необходимые добавления/изменения в стандартный инф-файл.

    Код (Text):
    1. ;
    2. ; INF.TXT
    3. ;
    4. ; This file is part of the FILTER sample filter driver in the
    5. ; Windows XP DDK. It is not a complete INF file.
    6. ; It lists the sections of your INF file that you need to
    7. ; change in order to have a filter driver loaded for your device.
    8. ;
    9.  
    10.  
    11. [Manufacturer]
    12. "ThisVendor"=THIS_VENDOR
    13.  
    14. [THIS_VENDOR]
    15. ;
    16. ; Generic HID Interface (HidUsb as service)
    17. ;
    18. "My device description" = My_Install_Section, INSERT_PNP_ID_HERE
    19.  
    20.  
    21.  
    22. [My_Install_Section.NT]
    23. ;
    24. ; This section name's prefix matches 'My_Install_Section' above.
    25. ; The appended ".NT" indicates Windows NT -specific processing.
    26. ;
    27. Copyfiles = MyCopyFiles
    28. AddReg = MyAddReg
    29.  
    30.  
    31. [My_Install_Section.NT.HW]
    32. ;
    33. ; Because of the ".HW" suffix,
    34. ; the 'AddReg' entries in this section apply to the device's
    35. ; hardware key (rather than the software key, as usual).
    36. ;
    37. AddReg = My_HW_AddReg
    38.  
    39.  
    40. [MyCopyFiles]
    41. ; mydriver.sys
    42. filter.sys
    43.  
    44.  
    45. [MyAddReg]
    46. ;
    47. ; Insert regular (software-branch) registry entries here
    48. ;
    49.  
    50.  
    51. [My_Install_Section.NT.Services]
    52. ;
    53. ; The inf should already include a service entry for the device class.
    54. ; It'll look something like the line below. Keep that line in the inf.
    55. ;
    56. ; AddService = MyDriver,2,My_Service
    57.  
    58. ; This is the filter service we're adding.
    59. AddService = FilterService,,Filter_Service_Inst
    60.  
    61.  
    62.  
    63. [My_HW_AddReg]
    64. ;
    65. ; This HW-branch AddReg section adds values to the hardware-branch
    66. ; registry key of the device (under HKLM\System\CurrentControlSet\Enum).
    67. ;
    68. ; "LowerFilters" and "UpperFilters" are special values that indicate
    69. ; to the kernel that one or more filter drivers should be loaded along
    70. ; with the driver for this device.
    71. ;
    72. ; You may also include other values here. These values can be read
    73. ; by the driver. The 'SampleFilterParam' value is read by the filter.sys
    74. ; sample driver as an example.
    75. ;
    76. HKR,,"LowerFilters",0x00010000,"FilterService"
    77. ; or HKR,,"UpperFilters",0x00010000,"FilterService"
    78. HKR,,"SampleFilterParam",0x00010001,512
    79.  
    80.  
    81. [Filter_Service_Inst]
    82. DisplayName = "Filter Service"
    83. ServiceType = 1 ;%SERVICE_KERNEL_DRIVER%
    84. StartType = 3 ;%SERVICE_DEMAND_START%
    85. ErrorControl = 0 ;%SERVICE_ERROR_IGNORE%
    86. ServiceBinary = %12%\filter.sys
    87. LoadOrderGroup = extended base
     
  6. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    =))) с него я и начал=) + Солдатов.
    Я только одного не понял как вычисляется HKR? (в Солдатове написано что он зависит от секции и для [MyUsbFilter_HW_AddReg] равено "HKLM\...\CurrentControlSet\Enum"
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Кусок инф файла (тупо нашёл гуглом):

    Код (Text):
    1. [Motorola]
    2. %USBCDMA% = USBCDMA, USB\VID_22B8&PID_0005
    3.  
    4. [USBCDMA.NT.HW]
    5. AddReg=LowerFilterAddReg
    6.  
    7. [LowerFilterAddReg]
    8. HKR,,"LowerFilters",0x00010000,"usbser"
    В DDK-доках в разделе "INF Models Section" написано.

    Формат элемента в INF Models Section:

    device-description=install-section-name,hw-id[,compatible-id...]

    , где

    hw-id
    Specifies a vendor-defined hardware ID string that identifies a device, which the PnP Manager uses to find an INF-file match for this device. Such a hardware ID has one of the following formats:

    enumerator\enumerator-specific-device-id
    Is the typical format for individual PnP devices reported to the PnP Manager by a single enumerator. For example, USB\VID_045E&PID_00B identifies the Microsoft HID keyboard device on a USB bus.


    Например, для вышеприведенного инфа hw-id = USB\VID_22B8&PID_0005.


    Note that a single device can have more than one hw-id value. The PnP Manager uses each such hw-id value, which is usually provided by the underlying bus when it enumerates its child devices, to create a subkey for each such device in the registry Enum branch. For manually installed devices, the system's setup code uses their hw-id values as specified in their respective INF files to create each such registry subkey.

    registry Enum branch - это HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\

    Т.о. ключ LowerFilters будет прописываться во все подразделы ветки HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + USB\VID_22B8&PID_0005.


    compatible-id
    Specifies a vendor-defined compatible ID string identifying compatible devices. Any number of compatible-id values can be specified for an entry in the Models section, each separated from the next by a comma (,). All such compatible devices and/or device models are controlled by the same driver as the device designated by the initial hw-id.


    Но если мы пропишем в инф любой стандартный USB compatible ID (см в DDK "Standard USB Identifiers")
    USB\CLASS_c(2)&SUBCLASS_s(2)&PROT_p(2)
    USB\CLASS_c(2)&SUBCLASS_s(2)
    USB\CLASS_c(2)
    например, так:

    Код (Text):
    1. [Motorola]
    2. %USBCDMA% = USBCDMA, USB\CLASS_08&SUBCLASS_02&PROT_50
    то во-первых, я не знаю бедет ли создана ветка HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + USB\CLASS_08&SUBCLASS_02&PROT_50 и во-вторых не знаю будет ли она использоваться для загрузки драйверов.

    Кури дальше ;) Если получиться, было бы очень интересно глянуть на инф.
     
  8. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Four-F
    Покурил Солдатова (у него кстати оч. неплохо расписано про INF фалйы) и ту статью на английском, что ты мне давал. (там где про медведя и драйвер фильтр для меда=)... кому-то на этой теме крышу сорвало=))...
    Получил такой вот файлик:
    Код (Text):
    1. ;
    2.  
    3. [Version]
    4. Signature="$CHICAGO$"
    5. Class=USB
    6. ClassGUID={36FC9E60-C465-11CF-8056-444553540000}
    7. provider=%My_company%
    8.  
    9. DriverVer=03/15/2007,1.0.0.0
    10.  
    11. [Manufacturer]
    12. %Generic.Mfg% = Generic
    13.  
    14. [Generic]
    15. ;
    16. ; Generic HID Interface (HidUsb as service)
    17. ;
    18. "MyUsbFilter" = My_Install_Section, USB\vid_9999&pid_6666 ; ***************************
    19.  
    20. [DestinationDirs]
    21. MyCopyFiles = 12
    22. DefaultDestDir = 12
    23.  
    24.  
    25. [SourceDisksNames]
    26. 1="MyUsbFilterFiles",,,
    27.  
    28. [SourceDisksFiles]
    29. filter.sys=1
    30.  
    31.  
    32. [My_Install_Section.NT]
    33. ;
    34. ; This section name's prefix matches 'My_Install_Section' above.
    35. ; The appended ".NT" indicates Windows NT -specific processing.
    36. ;
    37. CopyFiles = MyCopyFiles
    38. AddReg = MyAddReg
    39.  
    40.  
    41. [My_Install_Section.NT.HW]
    42. ;
    43. AddReg = My_HW_AddReg
    44.  
    45. [My_Install_Section.NT.Services]
    46. ; This is the filter service we're adding.
    47. AddService = MyUsbFilter,,MyUsbFilterInst
    48.  
    49.  
    50. [MyAddReg]
    51. ;
    52. ; Insert regular (software-branch) registry entries here
    53. HKLM, \SYSTEM\CurrentControlSet\Enum\USB\Vid_0ea0&Pid_2168\,LowerFilters,,MyUsbFilter
    54. ;
    55.  
    56.  
    57.  
    58. [My_HW_AddReg]
    59. ;
    60. HKR,,"LowerFilters",0x00010000,"MyUsbFilter"
    61. ; or HKR,,"UpperFilters",0x00010000,"MyUsbFilter"
    62. HKR,,"SampleFilterParam",0x00010001,512 ; Я пока пытаюсь установить простой пример из DDK
    63.                                                          ;(это от туда)
    64.  
    65.  
    66. [MyUsbFilterInst]
    67. DisplayName     = "MyUsbFilter"
    68. ServiceType     = 1         ;%SERVICE_KERNEL_DRIVER%
    69. StartType    = 3        ;%SERVICE_DEMAND_START%
    70. ErrorControl      = 0       ;%SERVICE_ERROR_IGNORE%
    71. ServiceBinary    = %12%\filter.sys
    72. LoadOrderGroup  = extended base
    73.  
    74.  
    75. [MyCopyFiles]
    76. filter.sys
    77.  
    78. [Strings]
    79. My_company="MyCompanyName"
    80. Generic.Mfg = "Generic"
    Копирую его (он у меня называется MyUsbFilter.sys, может в этом косяк) и соответственно filter.sys в корень диска C:, кликаю правой кнопкой мыши и прошу "установить"... ноль реакции... Захожу в "Мастера установки оборудования" и указываю ему этот файл, как инфу о новом устройстве... он отвечает что "в данном файле сведения об оборудовании отсутствуют"... Не понимаю в чем проблема?
    p.s. Я даже утилитой CHKINF, из состава DDK, его проверил... Одна ошибка из за отсутствия файла цифровой подписи (но это вроде как не критично) и 2 предупреждения... тоже не критичные.
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Ну я тоже дня три назад ради спортивного интереса попробовал сделать инф для установки lower фильтра...

    Очень внимательно вкуривал в DDK:
    "WDM Device INF Files for Modems"
    "WDM Modem INF Entries for Windows 2000 and Later Operating Systems"
    В разделе "Installing a Filter Driver" вообще конкретно написано про "Installing a Device-Specific Filter Driver".
    Есть пример инф-файла для lower фильтра DDK\src\network\modem\fakemodem

    ... и ничего у меня не вышло :dntknw:

    Вобщем, вся надежда на тебя ;)

    PS: пусть Modem не сбивает с толку. Просто в DDK только в этих разделах фигурирует параметр LowerFilters.
     
  10. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    ...вот ещё в чём хреновина может быть (наверняка даже в этом)...

    Твой и мой инф вайлы валидны, но т.к. мы пытаемся инстальнуть их через rundll32.exe (именно он инсталлит по правому клику), то ничего не выходит потому, что в инфе нет секции DefaultInstall, а именно её ищет rundll32. Проверять нет времени. См. в DDK "Using an INF File to Install a File System Filter Driver".
     
  11. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Попробовал создать раздел [DefaultInstall], установка запустилась, .sys файл скопировался в директорию System32\drivers, НО в реестр информация о моем драйвере не появилась. "Ну нафиг эти inf-файлы" - подумал я - "Дай ручками все пропишу"... прописал свое устройство в HKLM\...\Services. Но когда попытался добавить параметр LowerFilters к конкретному экземпляру USB устройства (...\VIDxxxx&PIDyyyy\MagicCode\) , то получил интересное сообщение от системы "Не удается создать параметр. Ошибка записи в реестр". Не могу понять что не так? Я же под Админом сижу... типа root... мне же вроде как все можно...
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    не всё )
     
  13. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Ну хорошо пусть не все... Но это же как-то делается=)
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ... [del] ...

    чушь сморозил=\
     
  15. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Из-под аккаунта LocalSystem. Но перейти туда большой гемор. К тому же установка через инф намного более универсальна, т.к. система сама знает, что куда пихнуть.

    Скорее надо было попробовать заставить rundll использовать секцию .HW, если это вообще возможно. Или разбираться с SetupAPI.

    IMHO, пора уже в драйверной конфе на osronline.com или у ms спросить для начала про вообще можно ли имея инф и голый драйвер поставить его как lower-device filter. Может там какие-нибудь специфические косяки есть. А так ты в своём собственном соку ещё очень долго можешь вариться.
     
  16. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Надо просто добавить в разрешения для себя полный доступ и будет тебе счастье))))
     
  17. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Marik
    Разрешил себе "все" и все заработало=) спасибо.
    Пока что драйвер получилось установить только ручками.
     
  18. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    И так, подключил я свой драйвер фильтр... Посмотрел какие IRP запросы шлет драйвер флэшки, это оказался запрос MajorFunction = 0x15, сначала я подумал (почитав левую доку в yandex, что это SET_SECURITY). Установив перехват на все MajorFunctions определил что это IRP_MJ_INTERNAL_DEVICE_CONTROL... Теперь возник другой вопрос, как связан вызов INTERNAL_DEVICE_CONTROL с USB-пакетами которые я перехватываю на шине?...
    Я полагаю что пакет должен формироваться в буфере, но следующий код:
    Код (Text):
    1. DBGOUT(("Buffer:%s", Irp->AssociatedIrp.SystemBuffer));
    Выдает:"Buffer: (null)"
    Это я такой тупой, или тут не используется метод BUFFERED?=)

    p.s. помогите разобраться.
     
  19. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    IOCTL_INTERNAL_USB_SUBMIT_URB
     
  20. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    А если быть по подробнее, то в (IO_STACK_LOCATION PTR [esi]).Parameters.DeviceIoControl.IoControlCode передается контр. код IOCTL_INTERNAL_USB_SUBMIT_URB,
    а в параметре (IO_STACK_LOCATION PTR [esi]).Parameters.Others.Argument1 передается структура _URB,
    В DDK все расписано;)