Ох... Слишком много всего объяснять тут придётся, так что только в общих чертах. Остальное постарайся вкурить по докам. Когда в систему приходит 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 может ставить фильтр только на уже побывавшие в системе девайсы. Долго куришь не знаю что. Уфф... Пойду тоже покурю что-нибудь.
Four-F Great respect!!! Огромное спасибо за консультацию=) Пойду возьму много бамбука и буду долго разбираться...
Спасибо...Покурил... Имею следующий *.inf файл, для своего драйвера: Код (Text): [Manufacturer] %Generic% = Generic [Generic] "My Usb Filter" = My_Install_Section, USB\[b]Class_08&SubClass_02&Prot_50 [/b]; ... [MyUsbFilter_AddReg] ; HKLM, SYSTEM\CurrentControlSet\Enum\USB\[b]Vid_1005&Pid_b113[/b]\[b]574B16001054[/b], LowerFilter, , MyUsbFilter ; [MyUsbFilter_Install_Section.NT.Services] AddService = MyUsbFilter,,Filter_Service_Inst [MyUsbFilter_HW_AddReg] 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 -прокатит?=) Верным ли путем идем?=)
Да. Никогда не писАл инф для 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-файлов - удовольвствие значительно ниже среднего http://www.wd-3.com/archive/InfFiles.htm
Вот ещё может помочь. Пример инф-файла из DDK\src\wdm\usb\filter. Точнее это не полный инф, а только необходимые добавления/изменения в стандартный инф-файл. Код (Text): ; ; INF.TXT ; ; This file is part of the FILTER sample filter driver in the ; Windows XP DDK. It is not a complete INF file. ; It lists the sections of your INF file that you need to ; change in order to have a filter driver loaded for your device. ; [Manufacturer] "ThisVendor"=THIS_VENDOR [THIS_VENDOR] ; ; Generic HID Interface (HidUsb as service) ; "My device description" = My_Install_Section, INSERT_PNP_ID_HERE [My_Install_Section.NT] ; ; This section name's prefix matches 'My_Install_Section' above. ; The appended ".NT" indicates Windows NT -specific processing. ; Copyfiles = MyCopyFiles AddReg = MyAddReg [My_Install_Section.NT.HW] ; ; Because of the ".HW" suffix, ; the 'AddReg' entries in this section apply to the device's ; hardware key (rather than the software key, as usual). ; AddReg = My_HW_AddReg [MyCopyFiles] ; mydriver.sys filter.sys [MyAddReg] ; ; Insert regular (software-branch) registry entries here ; [My_Install_Section.NT.Services] ; ; The inf should already include a service entry for the device class. ; It'll look something like the line below. Keep that line in the inf. ; ; AddService = MyDriver,2,My_Service ; This is the filter service we're adding. AddService = FilterService,,Filter_Service_Inst [My_HW_AddReg] ; ; This HW-branch AddReg section adds values to the hardware-branch ; registry key of the device (under HKLM\System\CurrentControlSet\Enum). ; ; "LowerFilters" and "UpperFilters" are special values that indicate ; to the kernel that one or more filter drivers should be loaded along ; with the driver for this device. ; ; You may also include other values here. These values can be read ; by the driver. The 'SampleFilterParam' value is read by the filter.sys ; sample driver as an example. ; HKR,,"LowerFilters",0x00010000,"FilterService" ; or HKR,,"UpperFilters",0x00010000,"FilterService" HKR,,"SampleFilterParam",0x00010001,512 [Filter_Service_Inst] DisplayName = "Filter Service" ServiceType = 1 ;%SERVICE_KERNEL_DRIVER% StartType = 3 ;%SERVICE_DEMAND_START% ErrorControl = 0 ;%SERVICE_ERROR_IGNORE% ServiceBinary = %12%\filter.sys LoadOrderGroup = extended base
=))) с него я и начал=) + Солдатов. Я только одного не понял как вычисляется HKR? (в Солдатове написано что он зависит от секции и для [MyUsbFilter_HW_AddReg] равено "HKLM\...\CurrentControlSet\Enum"
Кусок инф файла (тупо нашёл гуглом): Код (Text): [Motorola] %USBCDMA% = USBCDMA, USB\VID_22B8&PID_0005 [USBCDMA.NT.HW] AddReg=LowerFilterAddReg [LowerFilterAddReg] 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): [Motorola] %USBCDMA% = USBCDMA, USB\CLASS_08&SUBCLASS_02&PROT_50 то во-первых, я не знаю бедет ли создана ветка HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + USB\CLASS_08&SUBCLASS_02&PROT_50 и во-вторых не знаю будет ли она использоваться для загрузки драйверов. Кури дальше Если получиться, было бы очень интересно глянуть на инф.
Four-F Покурил Солдатова (у него кстати оч. неплохо расписано про INF фалйы) и ту статью на английском, что ты мне давал. (там где про медведя и драйвер фильтр для меда=)... кому-то на этой теме крышу сорвало=))... Получил такой вот файлик: Код (Text): ; [Version] Signature="$CHICAGO$" Class=USB ClassGUID={36FC9E60-C465-11CF-8056-444553540000} provider=%My_company% DriverVer=03/15/2007,1.0.0.0 [Manufacturer] %Generic.Mfg% = Generic [Generic] ; ; Generic HID Interface (HidUsb as service) ; "MyUsbFilter" = My_Install_Section, USB\vid_9999&pid_6666 ; *************************** [DestinationDirs] MyCopyFiles = 12 DefaultDestDir = 12 [SourceDisksNames] 1="MyUsbFilterFiles",,, [SourceDisksFiles] filter.sys=1 [My_Install_Section.NT] ; ; This section name's prefix matches 'My_Install_Section' above. ; The appended ".NT" indicates Windows NT -specific processing. ; CopyFiles = MyCopyFiles AddReg = MyAddReg [My_Install_Section.NT.HW] ; AddReg = My_HW_AddReg [My_Install_Section.NT.Services] ; This is the filter service we're adding. AddService = MyUsbFilter,,MyUsbFilterInst [MyAddReg] ; ; Insert regular (software-branch) registry entries here HKLM, \SYSTEM\CurrentControlSet\Enum\USB\Vid_0ea0&Pid_2168\,LowerFilters,,MyUsbFilter ; [My_HW_AddReg] ; HKR,,"LowerFilters",0x00010000,"MyUsbFilter" ; or HKR,,"UpperFilters",0x00010000,"MyUsbFilter" HKR,,"SampleFilterParam",0x00010001,512 ; Я пока пытаюсь установить простой пример из DDK ;(это от туда) [MyUsbFilterInst] DisplayName = "MyUsbFilter" ServiceType = 1 ;%SERVICE_KERNEL_DRIVER% StartType = 3 ;%SERVICE_DEMAND_START% ErrorControl = 0 ;%SERVICE_ERROR_IGNORE% ServiceBinary = %12%\filter.sys LoadOrderGroup = extended base [MyCopyFiles] filter.sys [Strings] My_company="MyCompanyName" Generic.Mfg = "Generic" Копирую его (он у меня называется MyUsbFilter.sys, может в этом косяк) и соответственно filter.sys в корень диска C:, кликаю правой кнопкой мыши и прошу "установить"... ноль реакции... Захожу в "Мастера установки оборудования" и указываю ему этот файл, как инфу о новом устройстве... он отвечает что "в данном файле сведения об оборудовании отсутствуют"... Не понимаю в чем проблема? p.s. Я даже утилитой CHKINF, из состава DDK, его проверил... Одна ошибка из за отсутствия файла цифровой подписи (но это вроде как не критично) и 2 предупреждения... тоже не критичные.
Ну я тоже дня три назад ради спортивного интереса попробовал сделать инф для установки 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 ... и ничего у меня не вышло Вобщем, вся надежда на тебя PS: пусть Modem не сбивает с толку. Просто в DDK только в этих разделах фигурирует параметр LowerFilters.
...вот ещё в чём хреновина может быть (наверняка даже в этом)... Твой и мой инф вайлы валидны, но т.к. мы пытаемся инстальнуть их через rundll32.exe (именно он инсталлит по правому клику), то ничего не выходит потому, что в инфе нет секции DefaultInstall, а именно её ищет rundll32. Проверять нет времени. См. в DDK "Using an INF File to Install a File System Filter Driver".
Попробовал создать раздел [DefaultInstall], установка запустилась, .sys файл скопировался в директорию System32\drivers, НО в реестр информация о моем драйвере не появилась. "Ну нафиг эти inf-файлы" - подумал я - "Дай ручками все пропишу"... прописал свое устройство в HKLM\...\Services. Но когда попытался добавить параметр LowerFilters к конкретному экземпляру USB устройства (...\VIDxxxx&PIDyyyy\MagicCode\) , то получил интересное сообщение от системы "Не удается создать параметр. Ошибка записи в реестр". Не могу понять что не так? Я же под Админом сижу... типа root... мне же вроде как все можно...
Из-под аккаунта LocalSystem. Но перейти туда большой гемор. К тому же установка через инф намного более универсальна, т.к. система сама знает, что куда пихнуть. Скорее надо было попробовать заставить rundll использовать секцию .HW, если это вообще возможно. Или разбираться с SetupAPI. IMHO, пора уже в драйверной конфе на osronline.com или у ms спросить для начала про вообще можно ли имея инф и голый драйвер поставить его как lower-device filter. Может там какие-нибудь специфические косяки есть. А так ты в своём собственном соку ещё очень долго можешь вариться.
Marik Разрешил себе "все" и все заработало=) спасибо. Пока что драйвер получилось установить только ручками.
И так, подключил я свой драйвер фильтр... Посмотрел какие IRP запросы шлет драйвер флэшки, это оказался запрос MajorFunction = 0x15, сначала я подумал (почитав левую доку в yandex, что это SET_SECURITY). Установив перехват на все MajorFunctions определил что это IRP_MJ_INTERNAL_DEVICE_CONTROL... Теперь возник другой вопрос, как связан вызов INTERNAL_DEVICE_CONTROL с USB-пакетами которые я перехватываю на шине?... Я полагаю что пакет должен формироваться в буфере, но следующий код: Код (Text): DBGOUT(("Buffer:%s", Irp->AssociatedIrp.SystemBuffer)); Выдает:"Buffer: (null)" Это я такой тупой, или тут не используется метод BUFFERED?=) p.s. помогите разобраться.
А если быть по подробнее, то в (IO_STACK_LOCATION PTR [esi]).Parameters.DeviceIoControl.IoControlCode передается контр. код IOCTL_INTERNAL_USB_SUBMIT_URB, а в параметре (IO_STACK_LOCATION PTR [esi]).Parameters.Others.Argument1 передается структура _URB, В DDK все расписано