swallowz
驱动牛犊
驱动牛犊
  • 注册日期2005-08-31
  • 最后登录2008-03-20
  • 粉丝0
  • 关注0
  • 积分163分
  • 威望21点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:1245回复:1

USB通信的问题,大牛来帮帮忙!(源码附上)

楼主#
更多 发布于:2007-01-09 08:19
  USB通信的问题,大牛来帮帮忙!(源码附上)
 

  原来我做USB通信一般找逻辑盘符得到设备的句柄,再用DeviceIoControl来发SCSI命令,相信同行们很多都用过.
  现在这个设备没有逻辑盘符(郁闷),看了网上资料用DDK,函数SetupDiGetClassDevs(),源码在后面,问题是现在我找不到设备的句柄,我想找到设备的句柄再用DeviceIoControl()来发SCSI命令,但是SetupDiGetClassDevs()得到的hDevInfo好像是所有USB设备列表,能找到单个USB设备的句柄吗?

  #include   <tchar.h>  
  #include   <stdio.h>  
  #include   <windows.h>  
  #include   <devguid.h>  
    
  #define   DWORD_PTR   DWORD  
  #define   ULONG_PTR   DWORD  
    
    
  extern   "C"   {    
  #include   "hidsdi.h"    
  }  
  //   需加入hid.lib  
    
  #include   <setupapi.h>  
  //   需加入setupapi.lib  
    
  #include   <regstr.h>  
  #include   <winbase.h>  
    
  #include   <cfgmgr32.h>  
  //   需要加入cfgmgr32.lib  
    
  #include   <initguid.h>  
  //#include   <usbiodef.h>  
  DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,  
      0xA5DCBF10L,   0x6530,   0x11D2,   0x90,   0x1F,   0x00,   0xC0,   0x4F,   0xB9,   0x51,   0xED);  
  #define   GUID_CLASS_USB_DEVICE                       GUID_DEVINTERFACE_USB_DEVICE  
    
  int   main(int   argc,   _TCHAR*   argv[])  
  {  
        HDEVINFO   hDevInfo;  
          
        SP_DEVINFO_DATA   DeviceInfoData;  
        DWORD   i;  
    
        //--------------------------------------------------------------------------  
        //   获取设备信息  
        hDevInfo   =   SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE,  
                0,   //   Enumerator  
                0,  
                DIGCF_PRESENT   |   DIGCF_DEVICEINTERFACE   );  
        if   (hDevInfo   ==   INVALID_HANDLE_VALUE)   {  
                //   查询信息失败  
                printf("ERROR   -   SetupDiGetClassDevs()");  
                return   1;  
        }  
        //--------------------------------------------------------------------------  
    
        //   枚举每个USB设备  
        DeviceInfoData.cbSize   =   sizeof(SP_DEVINFO_DATA);  
        for   (i=0;SetupDiEnumDeviceInfo(hDevInfo,   i,   &DeviceInfoData);i++)  
        {  
                  LPTSTR   buffer   =   NULL;  
                  PVOID   buffer2   =   NULL;  
                  DWORD   buffersize   =   0;  
                  ULONG   len;  
                  CONFIGRET       cr;  
                  PNP_VETO_TYPE   pnpvietotype;  
                  CHAR   vetoname[MAX_PATH];  
                  ULONG   ulStatus;  
                  ULONG   ulProblemNumber;  
    
                  cr   =   CM_Get_DevNode_Status(   &ulStatus,  
                                                                          &ulProblemNumber,  
                                                                          DeviceInfoData.DevInst,  
                                                                          0);  
                  if   (   CR_SUCCESS   ==   cr   )   {  
                          printf("OK   -   CM_Get_DevNode_Status()[%d]\n",   cr);  
                          printf("OK   -   CM_Get_DevNode_Status()   sts   [%x]\n",   ulStatus);  
                          printf("OK   -   CM_Get_DevNode_Status()   pro   [%x]\n",   ulProblemNumber);  
                  }   else   {  
                          printf("ERROR   -   CM_Get_DevNode_Status()[%d]\n",   cr);  
                          printf("ERROR   -   CM_Get_DevNode_Status()[%d]\n",   GetLastError());  
                  }  
                  //   DN_DISABLEABLE   or   DN_REMOVABLE  
                  if   ((DN_DISABLEABLE   &   ulStatus   )   !=   0   )   {  
                          printf("HAS   -   DN_DISABLEABLE()[%x]\n",   DN_DISABLEABLE   &   ulStatus);  
                  }   else   {  
                        continue;  
                  }  
                  if   ((DN_REMOVABLE   &   ulStatus   )   !=   0   )   {  
                          printf("HAS   -   DN_REMOVABLE()[%x]\n",   DN_REMOVABLE   &   ulStatus);  
                  }   else   {  
                        continue;  
                  }  
    
                  len   =   MAX_PATH;  
                  //   pnpvietotype   =   PNP_VetoDevice;    
                  cr   =   CM_Request_Device_Eject(  
                                                          DeviceInfoData.DevInst,  
                                                          &pnpvietotype,  
                                                          vetoname,  
                                                          len,  
                                                          0  
                                                          );  
                  if   (   CR_SUCCESS   ==   cr   )   {  
                          printf("OK   -   CM_Request_Device_Eject()[%d]\n",   cr);  
                  }   else   {  
                          printf("ERROR   -   CM_Request_Device_Eject()[%d]\n",   cr);  
                          printf("ERROR   -   CM_Request_Device_Eject()[%d]\n",   GetLastError());  
                  }  
    
        }  
                  
                  
        if   (   GetLastError()!=NO_ERROR   &&  
                  GetLastError()!=ERROR_NO_MORE_ITEMS   )  
        {  
                //   Insert   error   handling   here.  
                return   1;  
        }  
                  
        //     Cleanup  
        SetupDiDestroyDeviceInfoList(hDevInfo);  
    
        return   0;  
  }
gzmarshall
驱动牛犊
驱动牛犊
  • 注册日期2006-08-29
  • 最后登录2023-08-28
  • 粉丝0
  • 关注0
  • 积分62分
  • 威望28点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-01-09 16:18
我想可以用这个DDK函数SetupDiGetDeviceInterfaceDetail来获取你要的USB的HANDLE.
游客

返回顶部