Добрый вечер всем. Я надеюсь, что сообщество, возможно, сможет помочь в моей маленькой проблеме программирования на 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);
}
}
До сих пор каждая попытка имела либо RetVal 87 «Неверный параметр» с GetLastWin32Error, сообщающий 1008 «Неверный токен», либо RetVal 2 «Файл не найден» с GetLastWin32Error, сообщающий об одном и том же.
Может кто-нибудь определить, где я иду не так?
Заранее спасибо.
Richie
N.B. Это часть пакета восстановления, который я создавал в 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,
[В] длинном OPEN_VIRTUAL_DISK_FLAG,
[In, Необязательно] ref OPEN_VIRTUAL_DISK_PARAMTERS POPEN_VIRTUAL_DISK_PARAMTERS,
[In] ref IntPtr pHandle);