16,372
社区成员




BOOL NUsb::GetDiskProp(HANDLE hDisk, _LogDiskInfo &Info)
{
STORAGE_PROPERTY_QUERY PropQuery;
DWORD dwSize, dwRead;
BOOL bRetVal;
int nError;
memset(&PropQuery, 0, sizeof(PropQuery));
PropQuery.PropertyId = StorageDeviceProperty;
PropQuery.QueryType = PropertyStandardQuery;
dwSize = sizeof(Info.DevDescrip) + sizeof(Info.bzDevDescripEx);
bRetVal = ::DeviceIoControl(hDisk, IOCTL_STORAGE_QUERY_PROPERTY, &PropQuery, sizeof(PropQuery), &Info.DevDescrip, dwSize, &dwRead, NULL);
if(bRetVal == FALSE)
{
nError = GetLastError();
if(nError != ERROR_INVALID_FUNCTION)
assert(0);
}
if(Info.DevDescrip.VendorIdOffset)
strcpy(Info.szVendorId, (CHAR *)&Info.DevDescrip + Info.DevDescrip.VendorIdOffset);
if(Info.DevDescrip.ProductIdOffset)
strcpy(Info.szProductId, (CHAR *)&Info.DevDescrip + Info.DevDescrip.ProductIdOffset);
if(Info.DevDescrip.ProductRevisionOffset)
strcpy(Info.szProductRevision, (CHAR *)&Info.DevDescrip + Info.DevDescrip.ProductRevisionOffset);
if(Info.DevDescrip.SerialNumberOffset)
strcpy(Info.szSerialNumber, (CHAR *)&Info.DevDescrip + Info.DevDescrip.SerialNumberOffset);
memset(&PropQuery, 0, sizeof(PropQuery));
PropQuery.PropertyId = StorageAdapterProperty;
PropQuery.QueryType = PropertyStandardQuery;
dwSize = sizeof(Info.AdpDescrip) + sizeof(Info.bzAdpDescripEx);
bRetVal = ::DeviceIoControl(hDisk, IOCTL_STORAGE_QUERY_PROPERTY, &PropQuery, sizeof(PropQuery), &Info.AdpDescrip, dwSize, &dwRead, NULL);
if(bRetVal == FALSE)
{
nError = GetLastError();
if(nError != ERROR_INVALID_FUNCTION)
assert(0);
}
memset(&PropQuery, 0, sizeof(PropQuery));
PropQuery.PropertyId = StorageDeviceIdProperty;
PropQuery.QueryType = PropertyStandardQuery;
dwSize = sizeof(Info.DevIdDescrip) + sizeof(Info.bzDevIdDescripEx);
Info.DevIdDescrip.NumberOfIdentifiers = sizeof(Info.bzDevIdDescripEx);
bRetVal = ::DeviceIoControl(hDisk, IOCTL_STORAGE_QUERY_PROPERTY, &PropQuery, sizeof(PropQuery), &Info.DevIdDescrip, dwSize, &dwRead, NULL);
if(bRetVal == FALSE)
{
nError = GetLastError();
if(nError != ERROR_NOT_SUPPORTED &&
nError != ERROR_INVALID_PARAMETER &&
nError != ERROR_INVALID_FUNCTION)
assert(0);
}
return TRUE;
}