Untitled

 avatar
unknown
plain_text
5 months ago
2.1 kB
22
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