Некорректное имя файла CreateFile(Win32 API) - C#
Формулировка задачи:
Приветствую.
Стоит задача:открыть устройство, подключенное по USB, на чтение/запись. Есть драйвер, знаю GUID.
Для получения пути использую SetupDi функции. Вот код:
Все классно, но SetupDiGetDeviceInterfaceDetail возвращает странное DeviceName, а именно
Соответственно, CreateFile выдает INVALID_FILENAME.
Подскажите, что делаю не так?
З.Ы. Или подскажите функцию, чтоб открыть девайс по VID и PID.
Guid ClassGuid = new Guid(0xc32079a6, 0x2663, 0x4647, 0xb0, 0xa4, 0xa2, 0xc2, 0x4, 0xa9, 0x34, 0x1);
int err;
IntPtr hDev;
IntPtr hDevinfo;
int reqSize = 0;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData = new SP_DEVICE_INTERFACE_DATA();
hDevinfo = SetupDiGetClassDevs(ref ClassGuid,
IntPtr.Zero,
IntPtr.Zero,
(uint)DiGetClassFlags.DIGCF_DEVICEINTERFACE | (uint)DiGetClassFlags.DIGCF_PRESENT);
if (hDevinfo.ToInt32() == -1)
{
err = Marshal.GetLastWin32Error();
return IntPtr.Zero;
}
DeviceInterfaceData.cbSize = Marshal.SizeOf(DeviceInterfaceData);
if (!SetupDiEnumDeviceInterfaces(hDevinfo,
IntPtr.Zero,
ref ClassGuid,
0,
ref DeviceInterfaceData))
{
err = Marshal.GetLastWin32Error();
return IntPtr.Zero;
}
SetupDiGetDeviceInterfaceDetail(hDevinfo,
ref DeviceInterfaceData,
IntPtr.Zero,
0,
ref reqSize,
IntPtr.Zero);
err = Marshal.GetLastWin32Error();
IntPtr pBuff = Marshal.AllocHGlobal(reqSize);
Marshal.WriteInt32(pBuff, 6);
int DataSize = reqSize;
if(!SetupDiGetDeviceInterfaceDetail(
hDevinfo,
ref DeviceInterfaceData,
pBuff,
DataSize,
ref reqSize,
IntPtr.Zero)
)
{
err = Marshal.GetLastWin32Error();
return IntPtr.Zero;
}
string DeviceName = Marshal.PtrToStringAuto(pBuff + 6);
SetupDiDestroyDeviceInfoList(hDevinfo);
hDev = CreateFile(
DeviceName,
FileAccess.ReadWrite,
FileShare.Read | FileShare.Write,
IntPtr.Zero,
FileMode.Open,
FileAttributes.Normal,
IntPtr.Zero);
if (hDev.ToInt32() == -1)
{
err = Marshal.GetLastWin32Error();
return IntPtr.Zero;
}"\\?\\usb#vid_04b4&pid_8613#11169#{c32079a6-2663-4647-b0a4-a2c204a93401}"
Решение задачи: «Некорректное имя файла CreateFile(Win32 API)»
textual
Листинг программы
string DeviceName = Marshal.PtrToStringAuto(pBuff + 6);