PPH_STRING TrimString( _In_ PPH_STRING String ) { static PH_STRINGREF whitespace = PH_STRINGREF_INIT(L" \t\r\n"); PH_STRINGREF sr = String->sr; PhTrimStringRef(&sr, &whitespace, 0); return PhCreateString2(&sr); }
BOOLEAN DiskDriveQueryDeviceInformation( _In_ HANDLE DeviceHandle, _Out_opt_ PPH_STRING* DiskVendor, _Out_opt_ PPH_STRING* DiskModel, _Out_opt_ PPH_STRING* DiskRevision, _Out_opt_ PPH_STRING* DiskSerial ) { static PH_STRINGREF whitespace = PH_STRINGREF_INIT(L" "); ULONG bufferLength; IO_STATUS_BLOCK isb; STORAGE_PROPERTY_QUERY query; PSTORAGE_DESCRIPTOR_HEADER buffer = NULL; query.QueryType = PropertyStandardQuery; query.PropertyId = StorageDeviceProperty; bufferLength = sizeof(STORAGE_DESCRIPTOR_HEADER); buffer = PhAllocate(bufferLength); memset(buffer, 0, bufferLength); if (!NT_SUCCESS(NtDeviceIoControlFile( DeviceHandle, NULL, NULL, NULL, &isb, IOCTL_STORAGE_QUERY_PROPERTY, // https://msdn.microsoft.com/en-us/library/ff800830.aspx &query, sizeof(query), buffer, bufferLength ))) { PhFree(buffer); return FALSE; } bufferLength = buffer->Size; buffer = PhReAllocate(buffer, bufferLength); memset(buffer, 0, bufferLength); if (!NT_SUCCESS(NtDeviceIoControlFile( DeviceHandle, NULL, NULL, NULL, &isb, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), buffer, bufferLength ))) { PhFree(buffer); return FALSE; } PSTORAGE_DEVICE_DESCRIPTOR storageDescriptor = (PSTORAGE_DEVICE_DESCRIPTOR)buffer; if (DiskVendor && storageDescriptor->VendorIdOffset != 0) { PPH_STRING diskVendor; diskVendor = PhConvertMultiByteToUtf16((PBYTE)storageDescriptor + storageDescriptor->VendorIdOffset); PhTrimStringRef(&diskVendor->sr, &whitespace, 0); *DiskVendor = diskVendor; } if (DiskModel && storageDescriptor->ProductIdOffset != 0) { PPH_STRING diskModel; diskModel = PhConvertMultiByteToUtf16((PBYTE)storageDescriptor + storageDescriptor->ProductIdOffset); PhTrimStringRef(&diskModel->sr, &whitespace, 0); *DiskModel = diskModel; } if (DiskRevision && storageDescriptor->ProductRevisionOffset != 0) { PPH_STRING diskRevision; diskRevision = PhConvertMultiByteToUtf16((PBYTE)storageDescriptor + storageDescriptor->ProductRevisionOffset); PhTrimStringRef(&diskRevision->sr, &whitespace, 0); *DiskRevision = diskRevision; } if (DiskSerial && storageDescriptor->SerialNumberOffset != 0) { PPH_STRING diskSerial; diskSerial = PhConvertMultiByteToUtf16((PBYTE)storageDescriptor + storageDescriptor->SerialNumberOffset); PhTrimStringRef(&diskSerial->sr, &whitespace, 0); *DiskSerial = diskSerial; } if (buffer) { PhFree(buffer); } return TRUE; }