首页  编辑  

弹出USB设备

Tags: /超级猛料/Hardware.硬件相关/USB/   Date Created:

作者:AndyXia

 #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;  

 }