阅读:3977回复:6
想写一只让任何入插USB Port的USB Flash Disk无作用的Driver
三天前问,没人回,再贴一次
我现已有写一只LowerFilter,是安装在USB Class之下,我把全部的Irp全部 dump出来看(用KdPrint),只能看到Urb等资讯,并无USB SETUP 之类的东西 我想阻止USB Bus的enum行为,就是在查看Device Descriptor后,若他是 属于mass storage类型时,就cancel Irp,这样做能做到阻止USB Bus enum吗? 还有我抓不到USB SETUP的资料,但我用Driver Studio的WDM Sniffer时,有看到 1.是我的filter driver装错位置了吗?(应该装在哪边?PCI吗?) 2.我的这种方式可行吗?让某些特定class 的device插入后USB BUS 不会enum (就是说在device manager也看不到Unknow Device或Mass Storage等) 拜托各位大师,我已经用try error的方式试到快疯了.... 宇宙无敌初学者 留.... square690410@yahoo.com.tw msn:square690410@msn.com |
|
沙发#
发布于:2007-04-30 18:11
現在就是inf裝不起來....若要裝在usbhub之下的話....(後面會附上inf 內容)
我現在是想這樣做.... 1.寫兩隻filter Driver分別為usbohci/usbehci filter,usbhub filter 2.前者用來阻止enum,後者用來查usb class id(由usbohci/usbehci filter送IOCTL給usbhub filter) 現在就是要裝在指定function driver的filter driver裝不起來,我的inf file內容如下,請各位大師指教 要怎麼改才能裝得起來 [Version] Signature = "$Windows NT$" Class = USB ClassGUID = {36fc9e60-c465-11cf-8056-444553540000} Provider = %ABCD% DriverVer = 04/20/2007, 0.0.0.1 ; ; General installation section ; [DefaultInstall] CopyFiles = usb_filter.sys AddReg = USBFilter.AddReg [DestinationDirs] DefaultDestDir = 12 ; ; Service installation section ; [DefaultInstall.Services] AddService=usbhub,0x00000002,usbhub_ServiceInstallSection ; fdo filter AddService=usb_filter,,USBFilter.Service.Install [usbhub_ServiceInstallSection] ; fdo filter [USBFilter.AddReg] HKR,,"UpperFilters",0x00010000,"usb_filter" ; fdo filter [USBFilter.Service.Install] DisplayName = %service_desc% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %12%\usb_filter.sys [SourceDisksFiles] usb_filter.sys=1 ; WinXP and later [SourceDisksNames] 1 = %DiskID%,,,, [DiskCopyfiles] usb_filter.sys [DiskInstall.NT] CopyFiles = DiskCopyfiles [DiskInstall.NT.WdfSection] USE_WDF_DYNAMIC COMPONENTS = WdfDynam ; ; Localizable Strings ; [Strings] ABCD = "ABCD" service_desc = "ABCD USB Filter Driver" DiskID = "USB Filter Driver Installation" USB_CLASS_REG = "SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}" |
|
板凳#
发布于:2007-04-30 17:13
樓上的大哥說的對,我可以籍由IRP_MN_QUERY_DEVICE_RELATIONS傳回Error
來讓他enum失敗,但現在的新的問題出現了.... 1.無法得知現在插入的是什麼類型的USB Device 2.想透過抓pdo的driver name來判斷,在什麼時候被call (因為用class filter會安裝在usbhub,usbohci, usbehci.....) 第1點是因為送出GET DESCRIPTOR REQUEST時,若是在usbohci或usbehci的filter,會直接在usbhub 的pdo就回來了,而傳為device class 9 (USB HUB),而沒辦法得知接上來的設備是哪種class的 第2點是不知可否直接把filter裝在usbhub,設定成UpperFilters,但我裝不起來..... inf檔不知如何撰寫...參考許多sample但仍試不出來 希望大哥繼續support我一下....^^ |
|
地板#
发布于:2007-04-30 14:08
usb drive的stack tree是:usbuhci/usbehci->usbhub->usbstor
既然你能filter uhci/ehci,那就拦截它的pnp/BusRelations看看,也许有效 |
|
|
地下室#
发布于:2007-04-27 13:49
我用device tree去看,發現我的filter是在usbuhci跟ushehci的pdo (USBPDO-X)之上
有攔到一堆的IRP_MJ_INTERNAL_DEVICE_CONTROL,我本是單純的以為只要在一開 始USB Host Control發出SETUP時,由Device傳回Host時,從中攔到Device Descriptor 去判斷class是否為8 (mass storage),若是修改USBD Status或把Irp cancel,讓USB Host 誤認為fail,使enum flow不能進行..... |
|
5楼#
发布于:2007-04-27 13:35
如果记忆没错的话,你加在usb class下的filter实际是在filter那个disk的controller DO,它拿不到各个SCSI URB。
一般都是在IRP_MJ_PNP/IRP_MN_START_DEVICE中返回ERROR,来阻止flash disk的使用。 如果你要它在Device Manager里面都看不到,我没有做过,但猜测可能可以在usb stack中做到。因为一个USB设备的发现,其实是USB Hub driver调用IoInvalidateDeviceRelations/BusRelations,然后在回应PnP Manager下发的IRP_MN_QUERY_DEVICE_RELATIONS中报告自己的child DO的。如果你filter USB Hub DO,在IRP_MN_QUERY_DEVICE_RELATIONS中藏掉那个child DO,似乎可以做到。不过在此时如何判断那个插入的设备是usb flash disk是个问题,可能此时连address都没有分配 |
|
|
6楼#
发布于:2007-04-26 12:00
这是找之前的帖子的内容
USB枚举的过程3步曲如下: 1.pc->usb function: SETUP packet(eg: get device descriptor). 2.pc->usb function: pc send IN packet, usb funciton back 18 bytes data. 3.pc->usb function: pc send OUT packet, usb functio response zero length packet. 也就是说我的过滤驱动程序,只要让第3点没办法达成,就可以了吗? 利用2取得device descriptor 但我要怎么拦SETUP packet....filter driver要装在什么之下,要拦哪种Irp....跟一般的 URB一样是在IRP_MJ_INTERNAL_DEVICE_CONTROL里吗? |
|