在程序中移除U盘

来源:互联网 发布:年轮伴奏网络歌手 编辑:程序博客网 时间:2024/04/29 20:19
  #include        #include        #include            #define   DWORD_PTR   DWORD     #define   ULONG_PTR   DWORD             extern   "C"   {       #include   "hidsdi.h"       }     //   需加入hid.lib     #include     #include        #pragma comment(lib,"setupapi.lib")          #include        #include            #include        #pragma comment(lib,"cfgmgr32.lib")    #include        //#include        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;     }

  说明:

cr  = CM_Request_Device_Eject( DeviceInfoData.DevInst,   &pnpvietotype,   vetoname,  len,  0  ); //没有气泡提示
cr  = CM_Request_Device_Eject( DeviceInfoData.DevInst,   &pnpvietotype,   NULL,  0,  0  ); //这样就有气泡提示了。

对于CM_Request_Device_Eject这类在DDK中的函数,可以有如下几种方法
1.把DDK的头文件路径和库包含进来,但头文件包含必须使用 
extern   "C"  
{    
  #include   "hidsdi.h"    
}  
2. 把DDK里的相关文件拷到工程里来
3. 用GetProcAddress从相关DLL中取得函数来执行。

 

这种办法只能移除所有的U盘,没法移除某一盘符对应的U盘

原创粉丝点击