Некорректное имя файла 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д