⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbsample.txt

📁 USB驱动协议的简化版。如果你想打开一个USB管道
💻 TXT
字号:
如果你想打开一个USB管道,你首先要知道这种USB设备的GUID和管理道名称,
获取句柄以后就可以使用ReadFile/WriteFile进行读写了!
以下是代码,请参考!!

// filename是管道名称,如pipe01等
int CUSBImpObject::open_file( char *filename)
{

 int successOpened = 0,i;
 int NumOpened;
 HANDLE h;
 NumOpened=OpenAllUsbDevices((LPGUID) &GUID_CLASS_I82930_BULK);
    if(NumOpened<=0)
  return 0;
    for(i=0;i<NumOpened;i++){
        strcat (outnamebuf[i],
       "\\"
          );

        strcat (outnamebuf[i],
       filename
       );


     h= CreateFile(outnamebuf[i],
                  GENERIC_WRITE | GENERIC_READ,
                  FILE_SHARE_WRITE | FILE_SHARE_READ,
                  NULL,
                  OPEN_EXISTING,
                  0,
                  NULL);
     if (h == INVALID_HANDLE_VALUE) {
   handUsbArray[i]=NULL;
  } else {
    handUsbArray[i]=h;
    successOpened++;
  }
 }
 return successOpened;
}


int CUSBImpObject::OpenAllUsbDevices(LPGUID pGuid)     //打开所有的GUID为
pGuid的USB器件
{                //输出名存在outnamebuf中
 ULONG NumberDevices;
 HANDLE hOut = INVALID_HANDLE_VALUE;       //HANDLE Phout[8];
 HDEVINFO                 hardwareDeviceInfo;
 SP_INTERFACE_DEVICE_DATA deviceInfoData;
 ULONG                    i,flag=1,j;
 ULONG       NumDevicesOpened=0;
 BOOLEAN                  done;
 PUSB_DEVICE_DESCRIPTOR   usbDeviceInst;
 PUSB_DEVICE_DESCRIPTOR *UsbDevices = &usbDeviceInst;
 char DeviceName[256]="";         //器件名

 *UsbDevices = NULL;
    UsbDevicesOpened = 0;          //打开器件数置零

 hardwareDeviceInfo = SetupDiGetClassDevs (
  pGuid,
  NULL,             // Define no enumerator (global)
  NULL,             // Define no
  (DIGCF_PRESENT |          // Only Devices present
  DIGCF_INTERFACEDEVICE));        // Function class devices.

 NumberDevices = 4;
 done = FALSE;
 deviceInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
 i=0  ;
 while (!done) {
  NumberDevices *= 2;

  if (*UsbDevices) {
   *UsbDevices =
    (struct _USB_DEVICE_DESCRIPTOR *)realloc (*UsbDevices, (NumberDevices *
sizeof (USB_DEVICE_DESCRIPTOR)));
  } else {
   *UsbDevices = (struct _USB_DEVICE_DESCRIPTOR *)calloc (NumberDevices,
sizeof (USB_DEVICE_DESCRIPTOR));
  }

  if (NULL == *UsbDevices) {
   SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);
   return 0 ;
  }

  usbDeviceInst = *UsbDevices + i;

  for (; i < NumberDevices; i++) {
   if (SetupDiEnumDeviceInterfaces (hardwareDeviceInfo,
    0,
    pGuid,
    i,
    &deviceInfoData))
   {
    hOut = OpenOneDevice (hardwareDeviceInfo, &deviceInfoData, DeviceName);
    if ( hOut != INVALID_HANDLE_VALUE )
    {
     handUsbArray[UsbDevicesOpened]=hOut;

     if(!outnamebuf[UsbDevicesOpened])
     {
      return 0;
     }
     for(j=0;j<256;j++)
     {
      *(outnamebuf[UsbDevicesOpened]+j)=*(DeviceName+j);
      *(DeviceName+j)=0;
     }
     UsbDevicesOpened++;
    }
   }
   else
   {
    if(ERROR_NO_MORE_ITEMS == GetLastError())
    {
     done = TRUE;
     break;
    }
   }

  }    //end for
 }       //end while
 SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);
 free ( *UsbDevices );
 return UsbDevicesOpened ;

 }

//--------------------------------------------------------------------
//
//
//
//--------------------------------------------------------------------
HANDLE CUSBImpObject::OpenOneDevice (
    IN       HDEVINFO                    HardwareDeviceInfo,
    IN       PSP_INTERFACE_DEVICE_DATA   DeviceInfoData,
 IN   char *devName
    )
{
    PSP_INTERFACE_DEVICE_DETAIL_DATA     functionClassDeviceData = NULL;
    ULONG                                predictedLength = 0;
    ULONG                                requiredLength = 0;
    HANDLE              hOut = INVALID_HANDLE_VALUE;
    SetupDiGetInterfaceDeviceDetail (
            HardwareDeviceInfo,
            DeviceInfoData,
            NULL,            // probing so no output buffer yet
            0,             // probing so output buffer length of zero
            &requiredLength,
            NULL);            // not interested in the specific dev-node


    predictedLength = requiredLength;

    functionClassDeviceData =(struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A *)
malloc (predictedLength);
    functionClassDeviceData->cbSize = sizeof
(SP_INTERFACE_DEVICE_DETAIL_DATA);

    if (! SetupDiGetInterfaceDeviceDetail (
               HardwareDeviceInfo,
               DeviceInfoData,
               functionClassDeviceData,
               predictedLength,
               &requiredLength,
               NULL)) {
  free( functionClassDeviceData );
        return INVALID_HANDLE_VALUE;
    }

 strcpy( devName,functionClassDeviceData->DevicePath) ;

    hOut = CreateFile (
                  functionClassDeviceData->DevicePath,
                  GENERIC_READ | GENERIC_WRITE,
                  FILE_SHARE_READ | FILE_SHARE_WRITE,
                  NULL,           // no SECURITY_ATTRIBUTES structure
                  OPEN_EXISTING,        // No special create flags
                  0,           // No special attributes
                  NULL);          // No template file

    if (INVALID_HANDLE_VALUE == hOut) {

    }
 free( functionClassDeviceData );
 return hOut;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -