+static int VentoyMountAnywhere(HANDLE Handle)\r
+{\r
+ DWORD Status;\r
+ ATTACH_VIRTUAL_DISK_PARAMETERS AttachParameters;\r
+\r
+ Log("VentoyMountAnywhere");\r
+\r
+ memset(&AttachParameters, 0, sizeof(AttachParameters));\r
+ AttachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1;\r
+\r
+ Status = AttachVirtualDisk(Handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, 0, &AttachParameters, NULL);\r
+ if (Status != ERROR_SUCCESS)\r
+ {\r
+ Log("Failed to attach virtual disk ErrorCode:%u", Status);\r
+ return 1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int VentoyMountY(HANDLE Handle)\r
+{\r
+ int i;\r
+ BOOL bRet = FALSE;\r
+ DWORD Status;\r
+ DWORD physicalDriveNameSize;\r
+ CHAR *Pos = NULL;\r
+ WCHAR physicalDriveName[MAX_PATH];\r
+ CHAR physicalDriveNameA[MAX_PATH];\r
+ CHAR cdromDriveName[MAX_PATH];\r
+ ATTACH_VIRTUAL_DISK_PARAMETERS AttachParameters;\r
+\r
+ Log("VentoyMountY");\r
+\r
+ memset(&AttachParameters, 0, sizeof(AttachParameters));\r
+ AttachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1;\r
+\r
+ Status = AttachVirtualDisk(Handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER | ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, 0, &AttachParameters, NULL);\r
+ if (Status != ERROR_SUCCESS)\r
+ {\r
+ Log("Failed to attach virtual disk ErrorCode:%u", Status);\r
+ return 1;\r
+ }\r
+\r
+ memset(physicalDriveName, 0, sizeof(physicalDriveName));\r
+ memset(physicalDriveNameA, 0, sizeof(physicalDriveNameA));\r
+\r
+ physicalDriveNameSize = MAX_PATH;\r
+ Status = GetVirtualDiskPhysicalPath(Handle, &physicalDriveNameSize, physicalDriveName);\r
+ if (Status != ERROR_SUCCESS)\r
+ {\r
+ Log("Failed GetVirtualDiskPhysicalPath ErrorCode:%u", Status);\r
+ return 1;\r
+ }\r
+\r
+ for (i = 0; physicalDriveName[i]; i++)\r
+ {\r
+ physicalDriveNameA[i] = toupper((CHAR)(physicalDriveName[i]));\r
+ }\r
+\r
+ Log("physicalDriveNameA=<%s>", physicalDriveNameA);\r
+\r
+ Pos = strstr(physicalDriveNameA, "CDROM");\r
+ if (!Pos)\r
+ {\r
+ Log("Not cdrom phy drive");\r
+ return 1;\r
+ }\r
+\r
+ sprintf_s(cdromDriveName, sizeof(cdromDriveName), "\\Device\\%s", Pos);\r
+ Log("cdromDriveName=<%s>", cdromDriveName);\r
+\r
+ for (i = 0; i < 3 && (bRet == FALSE); i++)\r
+ {\r
+ Sleep(1000);\r
+ bRet = DefineDosDeviceA(DDD_RAW_TARGET_PATH, "Y:", cdromDriveName);\r
+ Log("DefineDosDeviceA %s", bRet ? "success" : "failed");\r
+ }\r
+\r
+ return bRet ? 0 : 1;\r
+}\r
+\r
+static BOOL VentoyNeedMountY(const char *IsoPath)\r
+{\r
+ /* TBD */\r
+ return FALSE;\r
+}\r
+\r
+static int VentoyAttachVirtualDisk(HANDLE Handle, const char *IsoPath)\r
+{\r
+ int DriveYFree;\r
+ DWORD Drives;\r
+ \r
+ Drives = GetLogicalDrives();\r
+ if ((1 << 24) & Drives)\r
+ {\r
+ Log("Y: is occupied");\r
+ DriveYFree = 0;\r
+ }\r
+ else\r
+ {\r
+ Log("Y: is free now");\r
+ DriveYFree = 1;\r
+ }\r
+\r
+ if (DriveYFree && VentoyNeedMountY(IsoPath))\r
+ {\r
+ return VentoyMountY(Handle);\r
+ }\r
+ else\r
+ {\r
+ return VentoyMountAnywhere(Handle);\r
+ }\r
+}\r
+\r