C++ 使用Windows虚拟磁盘服务时,ISO文件将不会打开,错误代码50:错误\u不受支持

C++ 使用Windows虚拟磁盘服务时,ISO文件将不会打开,错误代码50:错误\u不受支持,c++,windows,virtualization,mount,iso,C++,Windows,Virtualization,Mount,Iso,我正在尝试在我的程序中加载一个ISO文件,并使用Windows 8.1虚拟磁盘服务装载它。在加载ISO之前,我先加载一个游戏所在的VHD文件。然后我想挂载ISO以使游戏正常工作(ISO驻留在VHD上,但当ISO驻留在程序目录中时也会出现问题) 现在,我不知道为什么该操作“不受支持”(错误代码50),但我知道windows能够挂载ISO,因为当我双击它们时,它们由windows资源管理器挂载(它显然使用虚拟磁盘服务,因为虚拟服务的KB表示windows 7及更高版本支持ISO挂载) 现在,我如何尝

我正在尝试在我的程序中加载一个ISO文件,并使用Windows 8.1虚拟磁盘服务装载它。在加载ISO之前,我先加载一个游戏所在的VHD文件。然后我想挂载ISO以使游戏正常工作(ISO驻留在VHD上,但当ISO驻留在程序目录中时也会出现问题)

现在,我不知道为什么该操作“不受支持”(错误代码50),但我知道windows能够挂载ISO,因为当我双击它们时,它们由windows资源管理器挂载(它显然使用虚拟磁盘服务,因为虚拟服务的KB表示windows 7及更高版本支持ISO挂载)

现在,我如何尝试加载iso文件如下:

GUID GUID_TEST = { 12345678 - 1234 - 5678 - 1234 - 000000000000 };

//convert string to wstring
std::wstring s2ws(const std::string& str)
{
    typedef std::codecvt_utf8<wchar_t> convert_typeX;
    std::wstring_convert<convert_typeX, wchar_t> converterX;

    return converterX.from_bytes(str);
}

DWORD OpenISO(const char* isoFilePath, HANDLE *handle)
{
    VIRTUAL_STORAGE_TYPE storageType =
    {
        VIRTUAL_STORAGE_TYPE_DEVICE_ISO,
        GUID_TEST
    };

    OPEN_VIRTUAL_DISK_PARAMETERS parameters =
    {
        OPEN_VIRTUAL_DISK_VERSION_1
    };

    return ::OpenVirtualDisk(
        &storageType,
        s2ws(std::string(isoFilePath)).c_str(),
        VIRTUAL_DISK_ACCESS_READ,
        OPEN_VIRTUAL_DISK_FLAG_NONE,
        &parameters,
        handle);
}

void main()
{
    //load VHD here, do some program setup, etc etc
    //then load iso:

    //makesure VHD is mounted and ready
    UINT dtype = GetDriveTypeA(Config.MountPoint.c_str());
    while (dtype == 1 || dtype == 0)
    {
        dtype = GetDriveTypeA(Config.MountPoint.c_str());
        Sleep(10);
    }
    std::cout << "OK" << std::endl;
    //just a bit more waiting to be sure it is really loaded correctly
    Sleep(2500);
    //now load the iso our game needs to run
    HANDLE  isohandle;
    if (FileExists(Config.ISO_location.c_str()))
    {
        std::cout << "Mounting ISO... " << std::flush;
        if (OpenISO(Config.ISO_location.c_str(), &isohandle) == ERROR_SUCCESS)
        {
            if (AttachVirtualDisk(isohandle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY, 0, 0, NULL) == ERROR_SUCCESS)
            {
                std::cout << "ISO mounted.\r\n";
            }
            else
            {
                std::cout << "ISO NOT mounted (" << GetLastError() << ").\r\n";
            }
        }
        else
        {
            std::cout << "Cannot open ISO file, skipping (" << GetLastError() << ").\r\n";
        }
    }
    //launch the game process here
    //wait til game ends
    //cleanup
    //shutdown
}
GUID GUID_TEST={12345678-1234-5678-1234-000000000000};
//将字符串转换为wstring
std::wstring s2ws(常量std::string和str)
{
typedef std::codevt_utf8 convert_typeX;
std::wstring_转换转换器x;
返回converterX.from_字节(str);
}
DWORD OpenISO(常量字符*isoFilePath,句柄*HANDLE)
{
虚拟存储类型存储类型=
{
虚拟存储类型设备ISO,
GUID_测试
};
打开虚拟磁盘参数=
{
打开虚拟磁盘版本1
};
return::OpenVirtualDisk(
&存储类型,
s2ws(std::string(isoFilePath)).c_str(),
虚拟磁盘访问读取,
打开虚拟磁盘标志无,
&参数,
手柄);
}
void main()
{
//在这里加载VHD,进行一些程序设置,等等
//然后加载iso:
//确保VHD已安装并准备就绪
UINT dtype=GetDriveTypeA(Config.MountPoint.c_str());
while(dtype==1 | | dtype==0)
{
dtype=GetDriveTypeA(Config.MountPoint.c_str());
睡眠(10);
}

std::cout解决方案是确保指定了ATTACH\u VIRTUAL\u DISK\u FLAG\u PERMANENT\u life标志,然后还要确保ISO文件大小是2048字节的倍数。现在它可以工作了。

您应该在失败的函数调用后立即调用GetLastError(),否则它可能会因中间调用而无效(例如通过cout实现)。std::cout前后给出的相同错误您是否尝试在Windows 7上附加ISO文件?这似乎是不可能的,因为它应该仅在Windows 8及更高版本中可用。
DWORD OpenVDisk(const char* virtualDiskFilePath, HANDLE *handle)
{
    VIRTUAL_STORAGE_TYPE storageType =
    {
        VIRTUAL_STORAGE_TYPE_DEVICE_VHD,
        VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT
    };

    OPEN_VIRTUAL_DISK_PARAMETERS parameters =
    {
        OPEN_VIRTUAL_DISK_VERSION_1
    };

    parameters.Version1.RWDepth = 1024;

    return ::OpenVirtualDisk(
        &storageType,
        s2ws(std::string(virtualDiskFilePath)).c_str(),
        VIRTUAL_DISK_ACCESS_ALL,
        OPEN_VIRTUAL_DISK_FLAG_NONE,
        &parameters,
        handle);
}

    //somewhere else
HANDLE  handle;
DWORD   result;
ULONG   bytesUsed;

result = OpenVDisk(Config.VHD_location.c_str(), &handle);
if (result != ERROR_SUCCESS)
{
    std::cout << "Unable to open virtual disk '" << Config.VHD_location << "'" << std::endl;
    return (int)pressanykey("Hit any key to quit the application\r\n");
}
std::cout << "OK" << std::endl;
std::cout << "Attaching Game Disk..." << std::flush;
result = AttachVirtualDisk(handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER, 0, 0, NULL);
if (result != ERROR_SUCCESS)
{
    std::cout << "Unable to attach virtual disk (did you forget to run this program with administrative rights? -- " << GetLastError() << ")" << std::endl;
    return (int)pressanykey("Hit any key to quit the application\r\n");
}
std::cout << "OK" << std::endl;