阅读:3265回复:8
使用toaster\wdm\filter对U盘进行控制的几个问题
我是在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E967-E325-11CE-BFC1-08002BE10318}(Disk Driver)下面增加一个Lowerfilter。
1.对U盘的识别问题,有人在AddDevice例程进行判断,不过这个例程应该只是在驱动初始化的时候调用一次,那么在驱动初始化后再插入的U盘如何识别呢? 2.如何读取U盘的指定扇区,在哪里读取呢? |
|
沙发#
发布于:2012-03-02 10:04
你加的是类驱动 所有USB 能正常工作的流程下 都会被这个驱动过滤到 不是驱动初始化调用一次 而是每次有设备被过滤到 就ADDDEVICE一次 这个可以动手实验
读取磁盘扇区 获取磁盘的设备名或者设备指针或者设备句柄 使用READFILE 就可以 |
|
板凳#
发布于:2012-03-02 13:06
回 catface 的帖子
catface:你加的是类驱动 所有USB 能正常工作的流程下 都会被这个驱动过滤到 不是驱动初始化调用一次 而是每次有设备被过滤到 就ADDDEVICE一次 这个可以动手实验 Zwreadfile可以吗?我看到很多人都是自己构造SRB发送IRP啊 |
|
地板#
发布于:2012-03-02 16:39
如何判断U盘啊,在disk Lowerfilter下面如何判断啊
|
|
地下室#
发布于:2012-03-03 14:32
读取磁盘方法有很多
这个开源的代码应该有很多吧 找个代码引擎搜索下 RtlInitUnicodeString(&unDiskDeviceName, L"\\Device\\Harddisk0\\DR0"); InitializeObjectAttributes(&ObjectAttributes, &unDiskDeviceName, OBJ_CASE_INSENSITIVE, NULL, NULL); status = ZwCreateFile( status = ZwReadFile( 判断U盘的话 ZNSOFT版主有个查询BUSTYPE的代码 判断是否是U盘 论坛就有 |
|
5楼#
发布于:2012-03-03 14:38
// Create IRP Get The BusType
// 创建IRP 查询设备的BUSTYPE类型 为7 则说明是USB设备 // status = FltGetDiskDeviceObject(FltObjects->Volume, &DiskDeviceObject); if (status == STATUS_FLT_NO_DEVICE_OBJECT ) { return STATUS_SUCCESS; }else if(!NT_SUCCESS(status)) { return status; } KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE); Query.PropertyId = StorageDeviceProperty;//StorageDeviceType;// Query.QueryType = PropertyStandardQuery; NewIrp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, DiskDeviceObject, (PVOID)&Query, sizeof(STORAGE_DEVICE_DESCRIPTOR), (PVOID)pBuffer, sizeof(STORAGE_DEVICE_DESCRIPTOR) * 4, FALSE, &WaitEvent, &IoStatus); if (NULL == NewIrp) // can't create new irp { DbgPrint(" BusTypeUnknown \n"); return STATUS_SUCCESS; } status = IoCallDriver(DiskDeviceObject, NewIrp); if (status == STATUS_PENDING) { status = KeWaitForSingleObject(&WaitEvent, Executive, KernelMode, FALSE, NULL); status = IoStatus.Status; } if (!NT_SUCCESS(status)) { DbgPrint(" BusTypeUnknown \n"); return STATUS_SUCCESS; } Descriptor = (PSTORAGE_DEVICE_DESCRIPTOR)pBuffer; if(Descriptor->BusType == 7) { DbgPrint("GetStorageDeviceBusType SUCCEED: %d DevType:%x \n ", Descriptor->BusType, DiskDeviceObject->DeviceType); }else if (Descriptor->BusType == 3) { DbgPrint("GetStorageDeviceBusType SUCCEED: %d DevType:%x \n ", Descriptor->BusType, DiskDeviceObject->DeviceType); |
|
6楼#
发布于:2012-03-03 19:14
回 catface 的帖子
catface:// Create IRP Get The BusType 这个是在文件过滤驱动下用的吧。。。。我现在是disk lowerfilter。。 |
|
7楼#
发布于:2012-03-04 21:50
这个事文件驱动而且是MINIFILTER下
但是它的关键在于 创建irp询问设备的BUFTYPE 这种做法不仅仅只能在文件驱动下使用 它取决于你发送的IRP和发送的目的设备 我只是举个例子 ZNSOFT版主的例子在这个网站也能查得到 希望你能顺利找到并且能修改成符合自己要求的代码 |
|
8楼#
发布于:2012-03-04 21:57
这个是文件驱动MINIFILTER
但是我们只要得到设备的指针 内核句柄之类的 发送自建的查询IRP送的IRP和发送的目的设备 ZNSOFT版主的例子在这个网站也能查得到 毕竟完全符合你要求的代码很难找 还是要修改下 如果是练手的话 MINIFILTER获取后 传送过去也可以 多驱动合作么 更练手:) |
|