我百度了很久,还是没解决,所以不好意思占用下大家的时间,这是一段用来查询U盘序列号的代码:
PSTORAGE_DEVICE_DESCRIPTOR Descriptor;
.....
// 设置查询参数
// DeviceIoControl(hDevice, // 设备句柄
// IOCTL_STORAGE_QUERY_PROPERTY, // 设备属性信息
// &Query, sizeof(STORAGE_PROPERTY_QUERY), // 输出buffer
// outBuf, 512, // 输出buffer
// &dwOutBytes, // 输出长度
// (LPOVERLAPPED)NULL);
但是在DDK好像没DeviceIoControl,我用的是这个:
NewIrp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, DeviceObject, (PVOID)&Query, sizeof(Query), (PVOID)Buffer, 1024, FALSE, &WaitEvent, &IoStatus);
IoCallDriver(DeviceObject, NewIrp);
Descriptor = (PSTORAGE_DEVICE_DESCRIPTOR)Buffer;
DbgPrint("DeviceType:%X\n",Descriptor->DeviceType);
DbgPrint("VendorIdOffset:%X\n",Descriptor->VendorIdOffset);
DbgPrint("ProductIdOffset:%X\n",Descriptor->ProductIdOffset);
但是得到的是序列号的偏移 怎么才能得到长度啊?
//// 查询属性输出的数据结构
//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;
[课程]Linux pwn 探索篇!