**用戶態應用程序無法直接通過 CreateFile("\\\\.\\PNPDeviceID...") 打開 USB 設備驅動程序對象**。Windows 內核禁止非驅動程序代碼打開設備對象 (\\Device\\...),INVALID_HANDLE_VALUE (-1) 即此意。
User App (C#)
│ WinUSB / libusb / HID API / SerialPort
▼
User-mode Driver Framework (UMDF) / Kernel Driver (KMDF)
│ IRP_MJ_READ / WRITE / DEVICE_CONTROL
▼
USB Device Hardware
| 方案 | 適用場景 | 關鍵組件 | C# 調用方式 |
|---|---|---|---|
| WinUSB | 自定義 USB 設備 (無標準類驅動) | WinUSB.dll, WinUSB.sys | P/Invoke WinUSB API 或 Microsoft.WinUSB NuGet |
| libusbK / libusb-win32 | 跨平台、開源驅動 | libusbK.sys, libusb.dll | LibUsbDotNet NuGet |
| HID Class | 鍵鼠、游戲手柄、自定義 HID | hid.dll (系統自帶) | HidD_GetHidGuid + CreateFile 路徑為 \\\\?\\hid#... |
| CDC/ACM (虛擬串口) | Arduino、模塊、調試口 | usbser.sys | SerialPort 類 (COMx) |
Guid guid = WinUSB_GUID; // 從 INF 獲取devicePath = GetDevicePath(guid); // SetupDiGetDeviceInterfaceDetailSafeFileHandle handle = CreateFile(devicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, IntPtr.Zero);WinUsb_Initialize(handle, out winUsbHandle);WinUsb_WritePipe(winUsbHandle, 0x01, buffer, length, out transferred, IntPtr.Zero);uiAccess。