SETUPDI操作USB桥联线

 

    如果你想打开一个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;  
  }   
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值