Untitled
unknown
plain_text
a year ago
2.1 kB
34
Indexable
__forceinline uint32_t IsStorageDevicePropertyValid(HANDLE Device)
{
STORAGE_PROPERTY_QUERY Query;
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery;
STORAGE_DESCRIPTOR_HEADER Header = { 0 };
DWORD ReturnedBytes = 0;
if (!DeviceIoControl(Device,
IOCTL_STORAGE_QUERY_PROPERTY,
&Query,
sizeof(STORAGE_PROPERTY_QUERY),
&Header,
sizeof(STORAGE_DESCRIPTOR_HEADER),
&ReturnedBytes,
NULL))
{
return 2;
}
if (Header.Size == 0)
{
return 2;
}
BYTE *Descriptor = (BYTE *)malloc(Header.Size);
if (!Descriptor)
{
return 2;
}
ZeroMemory(Descriptor, Header.Size);
if (!DeviceIoControl(Device,
IOCTL_STORAGE_QUERY_PROPERTY,
&Query,
sizeof(STORAGE_PROPERTY_QUERY),
Descriptor,
Header.Size,
&ReturnedBytes,
NULL))
{
return 2;
}
STORAGE_DEVICE_DESCRIPTOR *Desc = (STORAGE_DEVICE_DESCRIPTOR *)Descriptor;
if (Desc->Size < sizeof(STORAGE_DEVICE_DESCRIPTOR))
{
free(Descriptor);
return 2;
}
uint32_t bValid = 1;
if (!Desc->RemovableMedia && (Desc->BusType == BusTypeSata))
{
if ((Desc->VendorIdOffset < Desc->Size)
&& (Desc->ProductIdOffset < Desc->Size)
&& (Desc->SerialNumberOffset < Desc->Size))
{
if (((!*(uint8_t *)Descriptor + Desc->VendorIdOffset) || !Desc->VendorIdOffset)
&& (!*(uint8_t *)(Descriptor + Desc->ProductIdOffset) || !Desc->ProductIdOffset)
&& (!*(uint8_t *)(Descriptor + Desc->SerialNumberOffset) || !Desc->SerialNumberOffset))
{
bValid = 0;
}
}
}
free(Descriptor);
return bValid;
}Editor is loading...
Leave a Comment