Некорректное имя файла CreateFile(Win32 API) - C#

Узнай цену своей работы

Формулировка задачи:

Приветствую. Стоит задача:открыть устройство, подключенное по USB, на чтение/запись. Есть драйвер, знаю GUID. Для получения пути использую SetupDi функции. Вот код:
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;
            }
Все классно, но SetupDiGetDeviceInterfaceDetail возвращает странное DeviceName, а именно
"\\?\\usb#vid_04b4&pid_8613#11169#{c32079a6-2663-4647-b0a4-a2c204a93401}"
Соответственно, CreateFile выдает INVALID_FILENAME. Подскажите, что делаю не так? З.Ы. Или подскажите функцию, чтоб открыть девайс по VID и PID.

Решение задачи: «Некорректное имя файла CreateFile(Win32 API)»

textual
Листинг программы
string DeviceName = Marshal.PtrToStringAuto(pBuff + 6);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5