0

我想使用此处描述的技术从微过滤器文件系统驱动程序内部提取 USB 存储设备序列号,在 InstanceSetup 回调中,唯一的区别是我在内核模式下执行此操作。
我用:

status = IoGetDeviceInterfaces( 
    &GUID_DEVINTERFACE_DISK, 
    NULL, 
    0, 
    &SymbolicLinkList
);

枚举可能的接口(示例结果):

\??\SCSI#Disk&Ven_VMware_&Prod_VMware_Virtual_S&Rev_1.0#4&5fcaafc&0&000#{53f56307 -b6bf-11d0-94f2-00a0c91efb8b}
\??\USBSTOR#Disk&Ven_Kingston&Prod_DataTraveler_C10&Rev_1.00#001D92AD7568F030E3CC 0AFC&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
\??\USBSTOR#Disk&Ven_USB_2.0&Prod_Flash_Disk&Rev_1100#AA04012700007777&0#{53f5630 7-b6bf-11d0-94f2-00a0c91efb8b}

我想通过 IOCTL_STORAGE_GET_DEVICE_NUMBER 找到其中哪一个是我的卷的接口。

我尝试了 ZwCreateFile 和 ZwDeviceIoControlFile 但 ZwCreateFile 返回一个 STATUS_OBJECT_NAME_INVALID。

如何将 IOCTLS 发送到这些接口?在用户模式下一切正常,但在内核模式下却失败了!

4

2 回答 2

0

您应该将设备名称中的 \??\ 更改为 \DosDevices\。它应该可以解决您的问题。

于 2010-07-13T13:13:25.690 回答
0

我通过将计算委托给用户模式服务并通过端口进行通信来解决这个讨厌的问题。蹩脚但真的很有用。

于 2010-07-15T15:29:29.473 回答