阅读:3861回复:10
获取不同U盘的VID以及PID(内有获取函数),怎么都是一样的呢? 还是我用错地方了?
我是想区分不同的U盘,比如PID为111的可以使用,不是111的不能使用,于是在 SFILTER 中做了获取U盘信息的函数
NTSTATUS GetStorageDeviceBusType( IN PDEVICE_OBJECT StorageStackDeviceObject, ULONG* puType ) { PIRP NewIrp; PSTORAGE_DEVICE_DESCRIPTOR Descriptor; PSTORAGE_PROPERTY_QUERY pQuery; PSTORAGE_PROPERTY_QUERY pBuffer; KEVENT WaitEvent; NTSTATUS Status = STATUS_SUCCESS; IO_STATUS_BLOCK IoStatus; KIRQL CurrentIRQL; UNREFERENCED_PARAMETER(StorageStackDeviceObject); *puType = BusTypeUnknown; CurrentIRQL = KeGetCurrentIrql(); if(CurrentIRQL >= DISPATCH_LEVEL) { KdPrint(("GetStorageDeviceBusType1 CurrentIRQL != PASSIVE_LEVEL\n")); return Status; } pBuffer = (PSTORAGE_PROPERTY_QUERY)ExAllocatePool(NonPagedPool, sizeof(STORAGE_DEVICE_DESCRIPTOR) * 4); pQuery = (PSTORAGE_PROPERTY_QUERY)ExAllocatePool(NonPagedPool, sizeof(STORAGE_DEVICE_DESCRIPTOR)); // first set the query properties pQuery->PropertyId = StorageDeviceProperty; pQuery->QueryType = PropertyStandardQuery; // initialize the waitable event KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE); // we should build the query irp ourselves //发送irp对象,这里需要是真正的设备 NewIrp = IoBuildDeviceIoControlRequest( IOCTL_STORAGE_QUERY_PROPERTY, StorageStackDeviceObject, (PVOID)pQuery, sizeof(STORAGE_DEVICE_DESCRIPTOR), (PVOID)pBuffer, sizeof(STORAGE_DEVICE_DESCRIPTOR) * 4, 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__, StorageStackDeviceObject); return Status; } // send this irp to the storage device Status = IoCallDriver(StorageStackDeviceObject, 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__, StorageStackDeviceObject, Status); return Status; } Descriptor = (PSTORAGE_DEVICE_DESCRIPTOR)pBuffer; *puType = Descriptor->BusType; ExFreePool(pBuffer); ExFreePool(pQuery); return Status; } 函数返回设备类型。 经过测试可以运行,于是在 SfFsControlMountVolume 中使用了这个函数,返回的类型是对的,但是我在详细的打印所有的信息,包括PID ,VID ,VERSION,以及其他描述信息的时候,发现不同的U盘的信息都是一样的 比如:Vid = 72 pid = 81 ProductRevisionOffset = 98 ,我很纳闷。 如果我要获得真实的ID以及U盘的名称(比如 联想 的U盘 是Lenove/usb_flash 等等),该是怎么方式呢。 |
|
沙发#
发布于:2008-07-24 12:06
打印PID ,VID ,VERSION的函数呢?
用法是没有问题的 还有现在U盘很多都信息不全 |
|
板凳#
发布于:2008-07-24 12:10
打印都是这样的:
DbgPrint("uVid = %d",Descriptor->VendorIdOffset); DbgPrint("uPid = %d",Descriptor->ProductIdOffset); DbgPrint("uSer = %d",Descriptor->SerialNumberOffset); DbgPrint("Version:%d",Descriptor->Version); DbgPrint("RemovableMedia:%d",Descriptor->RemovableMedia); DbgPrint("CommandQueueing:%d",Descriptor->CommandQueueing); 用dbgview查看,以前我开发别的驱动的时候都是这样。 在获得的信息中没有U盘的物理name,正在想办法,就是想区别不同的U盘。 |
|
地板#
发布于:2008-07-24 12:21
果然。。。。。
哈哈哈 去看看DDK吧 或者 应用层调用的查询代码 提示:Descriptor->VendorIdOffset 为什么叫Offset呢? |
|
地下室#
发布于:2008-07-24 12:24
还有 区分不同的U盘 很困难
除非都是牌子货 不然几乎都没有SN 更离谱的是SN都一样 |
|
5楼#
发布于:2008-07-24 12:40
typedef struct _STORAGE_DEVICE_DESCRIPTOR {
ULONG Version; // 版本 ULONG Size; // 结构大小 UCHAR DeviceType; // 设备类型 UCHAR DeviceTypeModifier; // SCSI-2额外的设备类型 BOOLEAN RemovableMedia; // 是否可移动 BOOLEAN CommandQueueing; // 是否支持命令队列 ULONG VendorIdOffset; // 厂家设定值的偏移 ULONG ProductIdOffset; // 产品ID的偏移 ULONG ProductRevisionOffset; // 产品版本的偏移 ULONG SerialNumberOffset; // 序列号的偏移 STORAGE_BUS_TYPE BusType; // 总线类型 ULONG RawPropertiesLength; // 额外的属性数据长度 UCHAR RawDeviceProperties[1]; // 额外的属性数据(仅定义了象征性的1个字节) } STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR; 这些的定义可是标准的 , 即使是偏移,所有的都偏移成一样,也太巧了。 不过一般的USB设备的名称不包含在里面,除了使用ring3的程序查询,驱动中就不能获得设备名了吗? 比如我自己设计的USB的设备叫 My_usb, 在驱动中该怎么获得 |
|
6楼#
发布于:2008-07-24 13:07
为什么偏移就一定需要不一样呢?
这个里面又不是放的UNICODE_STRING 是肯定有'\0'作为结束的 不需要偏移来防止崩溃 ring3下查询 其实也是走的这条路,我的意思是老老实实通过偏移量将各项名称打印出来在来看是否是自己需要的 |
|
7楼#
发布于:2008-07-24 14:06
设备的信息里面没有设备名这一点,让我很是着急啊。
本来不想用应用层的查询,可是驱动中查询设备实在是有限制,翻遍了整个网站没有介绍的。难道不得不回到应用层?我讨厌应用层,太容易被破解了。 |
|
8楼#
发布于:2008-07-24 14:40
你打印的是偏移量,一样很正常,另外这种方法好像不是很好使
|
|
9楼#
发布于:2008-07-24 17:27
驱动不容易破解?
|
|
10楼#
发布于:2008-07-25 08:29
驱动的破解难度要比应用层好一些,毕竟可以做些手脚。 不像在应用层把软件捣鼓捣鼓就能找出接口来
|
|