USB Communication DLL

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

}

<article from : http://www.xici.net/d11718892.htm>

posted @ 2013-05-09 19:02  MMLoveMeMM  阅读(373)  评论(0)    收藏  举报