阅读:2007回复:1
过滤驱动中.什么地方可以最早判断设备是否是移动介质?
大家好.我有这样一个问题.因为自己刚学不到一星期...所以不太清楚.想请大家帮帮忙.
过滤驱动中.什么地方可以最早判断设备是否是移动介质 我用了sfilter做为开发起点 我做文件过滤驱动主要是想针对所有移动储存设备透明加解密.. 所以想在驱动中判断是不是U盘等... 虽然有Device Type,但是只能得到FILE_DEVICE_DISK_FILE_SYSTEM...而不能区分. |
|
|
沙发#
发布于:2008-06-13 16:16
这个问题捆扰我了好些时间,不过今天在群里朋友的帮助下得已解决.
现在分享出来. 凌云(904692) 10:19:58 我做文件过滤驱动主要是想针对所有移动储存设备.. 所以想在驱动中判断是不是U盘等... 虽然有Device Type,但是只能得到FILE_DEVICE_DISK_FILE_SYSTEM...而不能区分. qi(616768725) 10:22:53 晕 你看看系统的api的那个getdisktype的是什么逻辑 qi(616768725) 10:23:05 这个可以得到分区的属性 Jack Daniel(340211173) 10:23:28 你也可以在上层检测移动存储设备,然后把盘符传到驱动。 晴天(19775156) 10:23:46 内核中应该有判断方法 qi(616768725) 10:23:59 内核中 肯定有 qi(616768725) 10:24:25 0环得从总线上判断 qi(616768725) 10:24:39 这个是一个瑞星的开发的人说的 晴天(19775156) 10:25:29 杀毒软件的那帮人,微软公开了不少资料给他们 晴天(19775156) 10:25:58 你44看在mount的历程里能不能做判断 qi(616768725) 10:26:04 据我所知 他们没有 晴天(19775156) 10:26:22 有也不会说的 qi(616768725) 10:26:31 我写的usb 的filter 倒是可以区分 qi(616768725) 10:27:11 如果是在mount 的时候去判断的话,这个时候以后晚了 他的devicetype 已经是disk的了 qi(616768725) 10:28:02 这个device好像是 usb 的一个总线的functional device 来创建的 晴天(19775156) 10:29:10 哈,能搞到getdrivertype的源码就能搞定了 qi(616768725) 10:40:26 ULONG GetStorageDeviceBusType(IN PDEVICE_OBJECT DeviceObject) { PIRP NewIrp; PSTORAGE_DEVICE_DESCRIPTOR Descriptor; STORAGE_PROPERTY_QUERY Query; CHAR Buffer[BUFFER_SIZE]; KEVENT WaitEvent; NTSTATUS Status; IO_STATUS_BLOCK IoStatus; // first set the query properties Query.PropertyId = StorageDeviceProperty; Query.QueryType = PropertyStandardQuery; // initialize the waitable event KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE); // we should build the query irp ourselves NewIrp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, DeviceObject, (PVOID)&Query, sizeof(Query), (PVOID)Buffer, NAME_BUFFER_SIZE, FALSE, &WaitEvent, &IoStatus); if (NULL == NewIrp) // can't create new irp { DbgPrint("[%s] [%u] I can't create a new irp to query the property of device (%p)!\n", __FILE__, __LINE__, DeviceObject); return BusTypeUnknown; } // send this irp to the storage device Status = IoCallDriver(DeviceObject, NewIrp); if (Status == STATUS_PENDING) { Status = KeWaitForSingleObject(&WaitEvent, Executive, KernelMode, FALSE, NULL); Status = IoStatus.Status; } if (!NT_SUCCESS(Status)) { DbgPrint("[%s] [%u] Query IOCTL_STORAGE_QUERY_PROPERTY of device (%p) failed, Status=0x%08X!\n", __FILE__, __LINE__, DeviceObject, Status); return BusTypeUnknown; } Descriptor = (PSTORAGE_DEVICE_DESCRIPTOR)Buffer; return Descriptor->BusType; } qi(616768725) 10:40:54 凌云你 要的东西 凌云(904692) 10:41:51 我仔细看看 qi(616768725) 10:42:34 呵呵很简单的就是自己发送一个irp 请求类型就是特定的code 就可以了 |
|
|