+BOOL VentoyPhydriveMatch(PHY_DRIVE_INFO* pPhyDrive)\r
+{\r
+ BOOL bRet = FALSE;\r
+ DWORD dwBytes;\r
+ HANDLE Handle = INVALID_HANDLE_VALUE;\r
+ CHAR PhyDrive[128];\r
+ GET_LENGTH_INFORMATION LengthInfo;\r
+ STORAGE_PROPERTY_QUERY Query;\r
+ STORAGE_DESCRIPTOR_HEADER DevDescHeader;\r
+ STORAGE_DEVICE_DESCRIPTOR* pDevDesc = NULL;\r
+ STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR diskAlignment;\r
+ CHAR VendorId[128] = { 0 };\r
+ CHAR ProductId[128] = { 0 };\r
+ CHAR ProductRev[128] = { 0 };\r
+ CHAR SerialNumber[128] = { 0 };\r
+\r
+\r
+ safe_sprintf(PhyDrive, "\\\\.\\PhysicalDrive%d", pPhyDrive->PhyDrive);\r
+ Handle = CreateFileA(PhyDrive, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);\r
+ if (Handle == INVALID_HANDLE_VALUE)\r
+ {\r
+ Log("Create file Handle:%p %s status:%u", Handle, PhyDrive, LASTERR);\r
+ return FALSE;\r
+ }\r
+\r
+ bRet = DeviceIoControl(Handle,\r
+ IOCTL_DISK_GET_LENGTH_INFO, NULL,\r
+ 0,\r
+ &LengthInfo,\r
+ sizeof(LengthInfo),\r
+ &dwBytes,\r
+ NULL);\r
+ if (!bRet)\r
+ {\r
+ Log("DeviceIoControl IOCTL_DISK_GET_LENGTH_INFO failed error:%u", LASTERR);\r
+ return FALSE;\r
+ }\r
+\r
+ if (pPhyDrive->SizeInBytes != (ULONGLONG)LengthInfo.Length.QuadPart)\r
+ {\r
+ Log("PHYSICALDRIVE%d size not match %llu %llu", pPhyDrive->PhyDrive, (ULONGLONG)LengthInfo.Length.QuadPart,\r
+ (ULONGLONG)pPhyDrive->SizeInBytes);\r
+ CHECK_CLOSE_HANDLE(Handle);\r
+ return FALSE;\r
+ }\r
+\r
+ Query.PropertyId = StorageDeviceProperty;\r
+ Query.QueryType = PropertyStandardQuery;\r
+\r
+ bRet = DeviceIoControl(Handle,\r
+ IOCTL_STORAGE_QUERY_PROPERTY,\r
+ &Query,\r
+ sizeof(Query),\r
+ &DevDescHeader,\r
+ sizeof(STORAGE_DESCRIPTOR_HEADER),\r
+ &dwBytes,\r
+ NULL);\r
+ if (!bRet)\r
+ {\r
+ Log("DeviceIoControl1 error:%u dwBytes:%u", LASTERR, dwBytes);\r
+ CHECK_CLOSE_HANDLE(Handle);\r
+ return FALSE;\r
+ }\r
+\r
+ if (DevDescHeader.Size < sizeof(STORAGE_DEVICE_DESCRIPTOR))\r
+ {\r
+ Log("Invalid DevDescHeader.Size:%u", DevDescHeader.Size);\r
+ CHECK_CLOSE_HANDLE(Handle);\r
+ return FALSE;\r
+ }\r
+\r
+ pDevDesc = (STORAGE_DEVICE_DESCRIPTOR*)malloc(DevDescHeader.Size);\r
+ if (!pDevDesc)\r
+ {\r
+ Log("failed to malloc error:%u len:%u", LASTERR, DevDescHeader.Size);\r
+ CHECK_CLOSE_HANDLE(Handle);\r
+ return FALSE;\r
+ }\r
+\r
+ bRet = DeviceIoControl(Handle,\r
+ IOCTL_STORAGE_QUERY_PROPERTY,\r
+ &Query,\r
+ sizeof(Query),\r
+ pDevDesc,\r
+ DevDescHeader.Size,\r
+ &dwBytes,\r
+ NULL);\r
+ if (!bRet)\r
+ {\r
+ Log("DeviceIoControl2 error:%u dwBytes:%u", LASTERR, dwBytes);\r
+ free(pDevDesc);\r
+ goto out;\r
+ }\r
+\r
+\r
+\r
+ memset(&Query, 0, sizeof(STORAGE_PROPERTY_QUERY));\r
+ Query.PropertyId = StorageAccessAlignmentProperty;\r
+ Query.QueryType = PropertyStandardQuery;\r
+ memset(&diskAlignment, 0, sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR));\r
+\r
+ bRet = DeviceIoControl(Handle,\r
+ IOCTL_STORAGE_QUERY_PROPERTY,\r
+ &Query,\r
+ sizeof(STORAGE_PROPERTY_QUERY),\r
+ &diskAlignment,\r
+ sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR),\r
+ &dwBytes,\r
+ NULL);\r
+ if (!bRet)\r
+ {\r
+ Log("DeviceIoControl3 error:%u dwBytes:%u", LASTERR, dwBytes);\r
+ }\r
+\r
+ if (pPhyDrive->DeviceType != pDevDesc->DeviceType ||\r
+ pPhyDrive->RemovableMedia != pDevDesc->RemovableMedia ||\r
+ pPhyDrive->BusType != pDevDesc->BusType ||\r
+ pPhyDrive->BytesPerLogicalSector != diskAlignment.BytesPerLogicalSector ||\r
+ pPhyDrive->BytesPerPhysicalSector != diskAlignment.BytesPerPhysicalSector\r
+ )\r
+ {\r
+ Log("Some properties not match DeviceType[%u %u] Removable[%u %u] BusType[%u %u] LogSec[%u %u] PhySec[%u %u]", \r
+ pPhyDrive->DeviceType, pDevDesc->DeviceType,\r
+ pPhyDrive->RemovableMedia, pDevDesc->RemovableMedia,\r
+ pPhyDrive->BusType, pDevDesc->BusType,\r
+ pPhyDrive->BytesPerLogicalSector, diskAlignment.BytesPerLogicalSector,\r
+ pPhyDrive->BytesPerPhysicalSector, diskAlignment.BytesPerPhysicalSector\r
+ );\r
+ goto out;\r
+ }\r
+\r
+ if (pDevDesc->VendorIdOffset)\r
+ {\r
+ safe_strcpy(VendorId, (char*)pDevDesc + pDevDesc->VendorIdOffset);\r
+ TrimString(VendorId);\r
+\r
+ if (strcmp(pPhyDrive->VendorId, VendorId))\r
+ {\r
+ Log("VendorId not match <%s %s>", pPhyDrive->VendorId, VendorId);\r
+ goto out;\r
+ }\r
+ }\r
+\r
+ if (pDevDesc->ProductIdOffset)\r
+ {\r
+ safe_strcpy(ProductId, (char*)pDevDesc + pDevDesc->ProductIdOffset);\r
+ TrimString(ProductId);\r
+\r
+ if (strcmp(pPhyDrive->ProductId, ProductId))\r
+ {\r
+ Log("ProductId not match <%s %s>", pPhyDrive->ProductId, ProductId);\r
+ goto out;\r
+ }\r
+ }\r
+\r
+ if (pDevDesc->ProductRevisionOffset)\r
+ {\r
+ safe_strcpy(ProductRev, (char*)pDevDesc + pDevDesc->ProductRevisionOffset);\r
+ TrimString(ProductRev);\r
+\r
+ if (strcmp(pPhyDrive->ProductRev, ProductRev))\r
+ {\r
+ Log("ProductRev not match <%s %s>", pPhyDrive->ProductRev, ProductRev);\r
+ goto out;\r
+ }\r
+ }\r
+\r
+ if (pDevDesc->SerialNumberOffset)\r
+ {\r
+ safe_strcpy(SerialNumber, (char*)pDevDesc + pDevDesc->SerialNumberOffset);\r
+ TrimString(SerialNumber);\r
+\r
+ if (strcmp(pPhyDrive->SerialNumber, SerialNumber))\r
+ {\r
+ Log("ProductRev not match <%s %s>", pPhyDrive->SerialNumber, SerialNumber);\r
+ goto out;\r
+ }\r
+ }\r
+\r
+ Log("PhyDrive%d ALL match, now continue", pPhyDrive->PhyDrive);\r
+\r
+ bRet = TRUE;\r
+\r
+out:\r
+ if (pDevDesc)\r
+ {\r
+ free(pDevDesc);\r
+ }\r
+\r
+ CHECK_CLOSE_HANDLE(Handle);\r
+\r
+ return bRet;\r
+}\r