阅读:3994回复:8
怎样在设备管理中的磁盘驱动器中正确显示出硬盘的VendorId和ProductId的信息?(急)
我在WIN2K下的WDM驱动程序中编写了对硬盘的读写的驱动(RAID卡),我现无法把硬盘的VendorId和ProductId的信息在设备管理中的磁盘驱动器中正确显示出来(如SAMSUNG SV2011H),只是出现disk drive的名称,我在DeviceControl中加了IOCTL_STORAGE_QUERY_PROPERTY的IOCTL下来的PropertyId == StorageDeviceProperty处理,我认为写的没错,而且MSDN中也说的是在此处得到查询的信息,可就是报不上来,请各位大侠指点一下,老板逼的紧呀!非常感谢!
处理此函数的代码如下函数,希望指导指导: typedef struct { STORAGE_DEVICE_DESCRIPTOR Descriptor; UCHAR VendorId[8]; UCHAR ProductId[16]; UCHAR ProductRevisionLevel[4]; UCHAR SerialNumber[4]; }St_DeviceDescriptor; NTSTATUS IoCtl_QueryDeviceProperty(PDEVICE_OBJECT DeviceObject, PVOID pDescriptor,PULONG pLength ) { PPDO_DEVICE_EXTENSION pdoDevEx = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; St_DeviceDescriptor Descriptor; RtlZeroMemory( &Descriptor, sizeof(Descriptor) ); Descriptor.Descriptor.Version = sizeof(STORAGE_DEVICE_DESCRIPTOR); Descriptor.Descriptor.Size = sizeof(Descriptor); Descriptor.Descriptor.DeviceType = DIRECT_ACCESS_DEVICE; Descriptor.Descriptor.RemovableMedia = 0; Descriptor.Descriptor.CommandQueueing = TRUE; Descriptor.Descriptor.VendorIdOffset = FIELD_OFFSET( St_DeviceDescriptor, VendorId); Descriptor.Descriptor.ProductIdOffset = FIELD_OFFSET( St_DeviceDescriptor, ProductId); Descriptor.Descriptor.ProductRevisionOffset = FIELD_OFFSET( St_DeviceDescriptor, ProductRevisionLevel ); Descriptor.Descriptor.SerialNumberOffset = FIELD_OFFSET( St_DeviceDescriptor, SerialNumber ); Descriptor.Descriptor.BusType = BusTypeScsi; RtlCopyMemory( Descriptor.VendorId, \"HPT_NMA\", 7 ); RtlCopyMemory( Descriptor.ProductId,\"RAID Disk\", 9); RtlCopyMemory( Descriptor.ProductRevisionLevel, \"1.00\",4); RtlCopyMemory( Descriptor.SerialNumber,\"__0_\", 4); if( *pLength > sizeof(Descriptor) ) *pLength = sizeof(Descriptor); RtlCopyMemory( pDescriptor, &Descriptor, *pLength ); return STATUS_SUCCESS; } |
|
沙发#
发布于:2003-10-22 17:24
怎么没有哪位师兄师姐帮我一把呀!望给小第指点指点,一定给分!
|
|
板凳#
发布于:2003-10-23 17:41
你的代码是基于miniport的吗? 呵呵,我只知道kernal mode下的miniport driver设备的Identify信息是通过填写INQUIRY命令附带的data buff实现的。
|
|
论坛版主
![]() |
地板#
发布于:2003-10-23 22:15
我没弄过磁盘的,但是我看你的这个函数好项就是向上层报告vid和pid的,如果我刚才说的没错,你把pDescriptor指向的区域传上去不对?不可能吧!不就是要上层显
VendorId \"HPT_NMA\" ProductId \"RAID Disk\" ?这个不会是这儿的问题吧,实在不行你自己定义一各ioctl传算了 |
|
论坛版主
![]() |
地下室#
发布于:2003-10-23 22:29
你再看看写的那几个offset是相对什么的offset,你在上面解释的时候用的是自己写的函数还是系统的?自己写的不太可能出问题,系统的可能有时候把它的参数意思弄错了
|
|
5楼#
发布于:2003-10-27 17:47
首先谢谢各位的建议!miniport中的我也会,而且相当的熟练。但是在WDM中因为没有port driver的处理,好多事情就变的复杂多了;我详细地看了MSDN,上面讲的就是自己定义的变量的offset,即这个数据结构中的每个变量在此结构中的偏移量!上面的函数是我自己写的,这个IOCTL是肯定要被处理的!这个IOCTL是系统自动发下来的!
|
|
6楼#
发布于:2003-10-28 13:45
#define FIELD_OFFSET(type, field) ((LONG)(LONG_PTR)&(((type *)0)->field))
|
|
|
7楼#
发布于:2003-10-28 13:49
我没有整明白你说的在DeviceIoControl中添加IOCTL_STORAGE_QUERY_PROPERTY的处理,我想,应该是你用IoBuildDeviceIoControlRequest的方法,构造一个IoControlCode 为IOCTL_STORAGE_QUERY_PROPERTY的IRP向系统查询,应该就可以得到吧。至于你给出的那段程序我看好像和你要得到id没有什么太大关系。
|
|
|
8楼#
发布于:2003-10-28 17:23
sub-system id & sub-vender id is writen by BIOS when system boot up. it is read by bus(PCI) driver. and you can pass down some IRP to query you lower bus driver for these 2 ID.
ggod lucy. |
|