gpt4 book ai didi

c - 使用 IOCTL_STORAGE_QUERY_PROPERTY 获取序列号

转载 作者:行者123 更新时间:2023-11-30 19:33:20 28 4
gpt4 key购买 nike

因此,我尝试编写一个仅附加到特定 USB 设备的微过滤器驱动程序,以区分我使用产品 ID + 供应商 ID + 序列号组合的所述设备。

我可以成功地将 IOCTL_STORAGE_QUERY_PROPERTY 发送到返回产品 ID、供应商 ID、序列号的设备。

我遇到的问题是返回到我的微型过滤器的序列号对于某些 USB 是正确的,但不是全部。

例如:当我打电话时

C:\Windows\system32>wmic diskdrive 获取 pnpdeviceid
PNP设备ID
USBSTOR\DISK&VEN_SONY&PROD_STORAGE_MEDIA&REV_PMAP\5C3000637C2070A595&0
USBSTOR\DISK&VEN_BM&PROD_&REV_1.10\070007AA1F02CF40063F&0

这些是从我的迷你过滤器返回的序列号:

找到序列号 57C03A050905。
找到序列号 070007AA1F02CF400630。

可以看出,第二个设备的序列号已成功返回,但第一个设备的序列号未返回。那么我的微型过滤器收到的序列号是多少?它是否存储在可以查询的地方?

如果需要,我可以附加代码,但由于我正确地获得了一些序列号,我怀疑我的代码是错误的。

编辑:代码

STORAGE_PROPERTY_QUERY query;
pQuery.PropertyId = StorageDeviceProperty;
pQuery.QueryType = PropertyStandardQuery

KeInitializeEvent(&event, NotificationEvent, FALSE);
Irp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, pDeviceObject, (PVOID)&query, sizeof(query), infoBuffer,
sizeof(infoBuffer), FALSE, &event, &ioStatusBlock);
if (Irp) {
if(!NT_SUCCESS(IoCallDriver(pDeviceObject, Irp)))
return STATUS_FLT_DO_NOT_ATTACH;
}
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
pDescriptor = (PSTORAGE_DEVICE_DESCRIPTOR)infoBuffer;

ULONG offset = pDescriptor->SerialNumberOfffset;
size_t size;
if (offset == 0)
return;

PCHAR c = offset + &buffer[0];
size = strlen(c);
*dest = ExAllocatePoolWithTag(PagedPool, size + 1, 'DIcI');
RtlZeroMemory(*dest, size + 1);
RtlCopyMemory(*dest, c, size + 1);

DbgPrint("Serial Number Found %s \n", *dest);
// String comparison of serial number and more processing

在我的外部硬盘上进行了测试,这是我从设备管理器中得到的

575834314137363534565656 

以及我的迷你过滤器:

WX41A7654VVV 

设备管理器中的序列号似乎是我从微型过滤器获得的序列号的十六进制表示

57 58 34 31 41 37 36 35 34 56 56 56 

W X 4 1 A 7 6 5 4 V V V

所以对于某些设备,它以十六进制格式表示,而其他设备则以字符格式表示?

那么有没有办法从内核级别获取序列号,或者调用用户应用程序会更容易?

最佳答案

STORAGE_DEVICE_DESCRIPTOR是变长结构。成功后调用IOCTL_STORAGE_QUERY_PROPERTY需要

check its Size member to determine the number of bytes the structure actually requires.

但在您的代码中,我查看了 infoBuffer, sizeof(infoBuffer) - 这意味着您对 STORAGE_DEVICE_DESCRIPTOR 使用硬编码大小。

确实需要发送IOCTL_STORAGE_QUERY_PROPERTY并将Size成员与您的OutputBufferLength进行比较,如果它更大 - 再次发送IOCTL_STORAGE_QUERY_PROPERTY具有更大的 OutputBufferLength

void PrintSerial(PDEVICE_OBJECT DeviceObject)
{
STORAGE_PROPERTY_QUERY spq = { StorageDeviceProperty, PropertyStandardQuery };

union {
PVOID buf;
PSTR psz;
PSTORAGE_DEVICE_DESCRIPTOR psdd;
};

ULONG size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 0x100;

NTSTATUS status;

do
{
status = STATUS_INSUFFICIENT_RESOURCES;

if (buf = ExAllocatePool(PagedPool, size))
{
switch (status = IoControlDevice(DeviceObject, IOCTL_STORAGE_QUERY_PROPERTY, &spq, sizeof(spq), buf, size))
{
case STATUS_SUCCESS:
case STATUS_BUFFER_OVERFLOW:

if (psdd->Version == sizeof(STORAGE_DEVICE_DESCRIPTOR))
{
if (psdd->Size > size)
{
size = psdd->Size;
status = STATUS_BUFFER_OVERFLOW;
}
else
{
if (psdd->SerialNumberOffset)
{
DbgPrint("SerialNumber = %s\n", psz + psdd->SerialNumberOffset);
}
else
{
DbgPrint("SerialNumberOffset==0\n");
}
}
}
else
{
status = STATUS_INVALID_PARAMETER;
}
break;
}

ExFreePool(buf);
}
} while (status == STATUS_BUFFER_OVERFLOW);
}

NTSTATUS IoControlDevice(
PDEVICE_OBJECT DeviceObject,
ULONG IoControlCode,
PVOID InputBuffer,
ULONG InputBufferLength,
PVOID OutputBuffer,
ULONG OutputBufferLength,
BOOLEAN InternalDeviceIoControl = FALSE
)
{
KEVENT Event;
KeInitializeEvent(&Event, NotificationEvent, FALSE);

IO_STATUS_BLOCK IoStatusBlock;

if (PIRP Irp = IoBuildDeviceIoControlRequest(IoControlCode, DeviceObject, InputBuffer, InputBufferLength,
OutputBuffer, OutputBufferLength, InternalDeviceIoControl, &Event, &IoStatusBlock))
{
NTSTATUS status = IofCallDriver(DeviceObject, Irp);

if (status == STATUS_PENDING)
{
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, 0);

status = IoStatusBlock.Status;
}

return status;
}

return STATUS_INSUFFICIENT_RESOURCES;
}

关于c - 使用 IOCTL_STORAGE_QUERY_PROPERTY 获取序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45999572/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com