大家晚上好。我希望社区能够帮助解决我的小 C# 编程问题。我在这里要说的是,我对 C# 编程非常陌生,而且从 Borland Pascal 那里学习它是一个非常陡峭的学习曲线!
我目前正在尝试使用虚拟磁盘 API(如 MSDN 网站上的此处所述),转换为 c#(希望保持在托管上下文中)。
我已经设法让 OpenVirtualDisk() 接受第一个参数,但它在第二个参数上失败(我想打开并附加的上述 ISO 的文件路径。)从大量研究中,我声明了参数“路径”作为字符串,以允许 CLR 最适合函数签名。
该应用程序当前正在提升权限下运行(通过 Visual Studio 2017)
以下是我的 dllImport:
[DllImport("VirtDisk.dll", EntryPoint = "OpenVirtualDisk", CharSet = CharSet.Ansi, ThrowOnUnmappableChar = true ,SetLastError = true)]
public extern static Int64 OpenVirtualDisk(
[In] ref _VIRTUAL_STORAGE_TYPE PVIRTUAL_STORAGE_TYPE,
string Path,
_VIRTUAL_DISK_ACCESS_MASK LVIRTUAL_DISK_ACCESS_MASK,
long OPEN_VIRTUAL_DISK_FLAG,
[In, Optional] ref OPEN_VIRTUAL_DISK_PARAMTERS POPEN_VIRTUAL_DISK_PARAMTERS,
ref IntPtr pHandle);
所有其他常量、枚举和结构都被声明为由 VirtDisk.h 提供,如果需要,可以提供。
这是我用来调用 OpenVirtualDisk 的所有代码(如您所见,我使用 File.Exists() 来确保文件在开始任何工作之前存在):
private void button1_Click(object sender, EventArgs e)
{
IntPtr pHandle = IntPtr.Zero;
Int64 RetVal = 0;
string VirtualDiskPath = @"F:\Images\Windows10.ISO";
_VIRTUAL_DISK_ACCESS_MASK VIRTUAL_DISK_ACCESS;
Int64 VIRTUAL_DISK_FLAG;
_VIRTUAL_STORAGE_TYPE VIRTUAL_STORAGE_TYPE;
if (File.Exists(VirtualDiskPath))
{
VIRTUAL_DISK_ACCESS = _VIRTUAL_DISK_ACCESS_MASK.VIRTUAL_DISK_ACCESS_ATTACH_ALL;
VIRTUAL_DISK_FLAG = OPEN_VIRTUAL_DISK_FLAG_NONE;
VIRTUAL_STORAGE_TYPE.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_ISO;
VIRTUAL_STORAGE_TYPE.VendorId = VENDORMICROSOFT;
IntPtr VirtualStorPtr = IntPtr.Zero;
VirtualStorPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VIRTUAL_STORAGE_TYPE));
Marshal.StructureToPtr(VIRTUAL_STORAGE_TYPE, VirtualStorPtr, true);
IntPtr VirtualDiskVer = IntPtr.Zero;
OPEN_VIRTUAL_DISK_PARAMTERS OPEN_VIRTUAL_DISK_PARAM;
OPEN_VIRTUAL_DISK_PARAM = new OPEN_VIRTUAL_DISK_PARAMTERS
{
version = OPEN_VIRTUAL_DISK_VERSION.OPEN_VIRTUAL_DISK_VERSION_1,
version1 = new OPEN_VIRTUAL_DISK_PARAMTERS1
{
RWDepth = 0
}
};
VirtualDiskVer = Marshal.AllocHGlobal(Marshal.SizeOf(OPEN_VIRTUAL_DISK_PARAM));
Marshal.StructureToPtr(OPEN_VIRTUAL_DISK_PARAM, VirtualDiskVer, true);
RetVal = OpenVirtualDisk(ref VIRTUAL_STORAGE_TYPE,
VirtualDiskPath,
VIRTUAL_DISK_ACCESS,
VIRTUAL_DISK_FLAG,
ref OPEN_VIRTUAL_DISK_PARAM,
ref pHandle);
if ((RetVal == 0))
{
MessageBox.Show("OpenVirtualDisk() has succeded in opening the file: \r\n" +
VirtualDiskPath + "\r\nWith the file Handle: " + pHandle.ToString());
}
else
{
MessageBox.Show("OpenVirtualDisk() failed to open the file: " +
VirtualDiskPath + ",\r\nWith Error Code: " + Marshal.GetLastWin32Error().ToString() +
"\r\nReturn Value: " + RetVal.ToString());
}
Marshal.FreeHGlobal(VirtualStorPtr);
}
}
到目前为止,每次尝试要么有一个 87“无效参数”的 RetVal,GetLastWin32Error 报告 1008“无效令牌”,要么有 2 个“未找到文件”的 RetVal,GetLastWin32Error 报告相同。
谁能发现我哪里出错了?
提前致谢。
里奇
注意,这是我在 c# 中构建的恢复套件的一部分,基于 Windows Imaging API (Wimgapi.h)。如果需要,这是为了允许安装 Windows(任何版本,只要是 64 位)。它将在 WinPE(Windows 10,.Net 版本 5.4.2)上运行我什至尝试使用 FileIOPermssion 来允许该进程完全访问文件。
故障已排序,如下评论。FILE_ACCESS_MASK 需要更改为 FILE_ACCESS_MASK_RO,但 DLLimport 声明也需要修改。DLLImport 现在显示为:
[DllImport("virtdisk.dll" CharSet = CharSet.UNICODE, ThrowOnUnmappableChar = true ,SetLastError = true)] public extern static Int64 OpenVirtualDisk( [In] ref _VIRTUAL_STORAGE_TYPE PVIRTUAL_STORAGE_TYPE, 字符串路径, [In] _VIRTUAL_DISK_ACCESS_MASK LVIRTUAL_DISK_ACCESS_MASK, [In] long OPEN , [输入, 可选] ref OPEN_VIRTUAL_DISK_PARMTERS POPEN_VIRTUAL_DISK_PARTERS, [输入] ref IntPtr pHandle);