考虑以下程序
example.c
:
#include <windows.h>
#include <virtdisk.h>
int main() {
VIRTUAL_STORAGE_TYPE storageType = {VIRTUAL_STORAGE_TYPE_DEVICE_ISO, VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT};
HANDLE virtualDiskHandle;
OPEN_VIRTUAL_DISK_PARAMETERS openParameters;
ULONG result;
LPCWSTR isoPath = L"path_to_iso_file.iso";
result = OpenVirtualDisk(&storageType, isoPath, VIRTUAL_DISK_ACCESS_READ, OPEN_VIRTUAL_DISK_FLAG_NONE, &openParameters, &virtualDiskHandle);
if (result != ERROR_SUCCESS) {
return 1;
}
CloseHandle(virtualDiskHandle);
return 0;
}
我尝试使用 MinGW-w64 编译它,但出现此错误:
# gcc -Wall -Wextra example.c -lvirtdisk
C:/tools/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\tools\msys64\tmp\cciUwbcG.o:example.c:(.rdata$.refptr.VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT[.refpt
r.VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT]+0x0): undefined reference to `VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT'
collect2.exe: error: ld returned 1 exit status
我需要链接什么才能获得
VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT
? -lvirtdisk
对于 OpenVirtualDisk
来说已经足够了,但不起作用。
我尝试在
example.c
中手动定义GUID:
DEFINE_GUID(VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT, 0xec984aec, 0xa0f9, 0x47e9, 0x90, 0x1f, 0x71, 0x41, 0x5a, 0x66, 0x34, 0x5b);
但是我这样做仍然遇到同样的错误。
我意识到我的
OpenVirtualDisk
调用很可能是错误的,并且如果没有进一步的更改,可能无法工作。但我在这里问的只是让它链接起来。
gcc --version
说:
gcc.exe (Rev6, Built by MSYS2 project) 13.1.0
Copyright (C) 2023 Free Software Foundation, Inc.
我尝试了
clang
,但得到了同样的错误。
您将需要
-lvirtdisk
和 -luuid
链接器标志。
-lvirtdisk
对于OpenVirtualDisk
-luuid
对于VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT
我建议您可以按照以下步骤来解决问题:
1,您应该链接
virtdisk.lib
:#pragma comment(lib, "virtdisk.lib")
2, 根据文档:https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-virtual_storage_type
供应商ID
供应商唯一标识符。
VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT (EC984AEC-A0F9-47e9-901F-71415A66345B)
您应该提供
VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT
的标识符:
static const GUID VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT = { 0xEC984AEC, 0xA0F9, 0x47e9, 0x90, 0x1F, 0x71, 0x41, 0x5A, 0x66, 0x34, 0x5B };
您可以尝试使用下面的方法来使用
virtdisk.h
,我已经尝试过并且工作得很好。
#include <initguid.h>
#include <virtdisk.h>
#pragma comment(lib,"virtdisk.lib")
整个项目是这样的
#include "pch.h"
#include <Windows.h>
#include <initguid.h>
#include <virtdisk.h>
#pragma comment(lib,"virtdisk.lib")
using namespace winrt;
using namespace Windows::Foundation;
DWORD SimpleCreateVirtualDisk(
_In_ PCWSTR Path,
_In_ UINT64 Size,
_Out_ PHANDLE Handle)
{
VIRTUAL_STORAGE_TYPE StorageType;
StorageType.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN;
StorageType.VendorId = VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN;
CREATE_VIRTUAL_DISK_PARAMETERS Parameters;
std::memset(&Parameters, 0, sizeof(CREATE_VIRTUAL_DISK_PARAMETERS));
Parameters.Version = CREATE_VIRTUAL_DISK_VERSION_2;
Parameters.Version2.MaximumSize = Size;
return ::CreateVirtualDisk(
&StorageType,
Path,
VIRTUAL_DISK_ACCESS_NONE,
nullptr,
CREATE_VIRTUAL_DISK_FLAG_NONE,
0,
&Parameters,
nullptr,
Handle);
}
int main()
{
init_apartment();
}