C 当我们强制转换描述符+;描述符->;serialnumberofset
我有一个内核驱动程序,用于查找存储设备的序列号,但驱动程序有一个问题。C 当我们强制转换描述符+;描述符->;serialnumberofset,c,filesystems,kernel,driver,wdk,C,Filesystems,Kernel,Driver,Wdk,我有一个内核驱动程序,用于查找存储设备的序列号,但驱动程序有一个问题。 描述符->serialnumberofset是103 但是(LPCSTR)(UINT_PTR)描述符+(DWORD32)描述符->serialnumberofset为空 这是我的代码 请分享如何解决这个问题您在OutputBufferLength中犯了错误-为什么您认为sizeof(存储设备描述符)*4就足够了?例如,为什么不5*sizeof(存储设备描述符)?实际上,OutputBufferLength必须是什么是未知的-
描述符->serialnumberofset
是103
但是(LPCSTR)(UINT_PTR)描述符+(DWORD32)描述符->serialnumberofset
为空
这是我的代码
请分享如何解决这个问题您在
OutputBufferLength
中犯了错误-为什么您认为sizeof(存储设备描述符)*4就足够了?例如,为什么不5*sizeof(存储设备描述符)
?实际上,OutputBufferLength
必须是什么是未知的-您需要在循环中调用此查询,并将当前的OutputBufferLength
与STORAGE\u DEVICE\u DESCRIPTOR.Size
-如果OutputBufferLength
,则必须再次发送IOCTL\u STORAGE\u query\u属性OutputBufferLength=STORAGE\u DEVICE\u DESCRIPTOR.Size
。代码可以是这样的
STORAGE_PROPERTY_QUERY spq = { StorageDeviceProperty, PropertyStandardQuery };
union {
PVOID buf;
PSTR psz;
PSTORAGE_DEVICE_DESCRIPTOR psdd;
};
ULONG size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 0x100;
NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;
do
{
status = STATUS_INSUFFICIENT_RESOURCES;
if (buf = ExAllocatePool(PagedPool, size))
{
switch (status = (NtDeviceIoControlFile(hFile, 0, 0, 0, &iosb,
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
{
status = STATUS_INVALID_PARAMETER;
}
break;
}
ExFreePool(buf);
}
} while (status == STATUS_BUFFER_OVERFLOW);
我们当然可以使用IoBuildDeviceIoControlRequest
+IoCallDriver
-这没有任何变化,与问题无关
STORAGE_PROPERTY_QUERY spq = { StorageDeviceProperty, PropertyStandardQuery };
union {
PVOID buf;
PSTR psz;
PSTORAGE_DEVICE_DESCRIPTOR psdd;
};
ULONG size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 0x100;
NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;
do
{
status = STATUS_INSUFFICIENT_RESOURCES;
if (buf = ExAllocatePool(PagedPool, size))
{
switch (status = (NtDeviceIoControlFile(hFile, 0, 0, 0, &iosb,
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
{
status = STATUS_INVALID_PARAMETER;
}
break;
}
ExFreePool(buf);
}
} while (status == STATUS_BUFFER_OVERFLOW);