sharkmouse
禁止发言
禁止发言
  • 注册日期2003-05-05
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1355分
  • 威望7163点
  • 贡献值1点
  • 好评度24点
  • 原创分0分
  • 专家分0分
阅读:1716回复:3

怎样可以自己编程卸载USB设备呢?

楼主#
更多 发布于:2005-03-29 12:09
用户被禁言,该主题自动屏蔽!
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
沙发#
发布于:2005-03-29 22:36
所谓
外事不决问google嘛
#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    &brvbar;  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;  
}
sharkmouse
禁止发言
禁止发言
  • 注册日期2003-05-05
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1355分
  • 威望7163点
  • 贡献值1点
  • 好评度24点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-31 13:01
用户被禁言,该主题自动屏蔽!
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
地板#
发布于:2005-04-01 21:51
windows的实现

跟踪一下呗
文件名字叫stobject.dll

获取名字的方法其实没有一个固定的

每一个volume会有一个interface GUID_DEVINTERFACE_VOLUME被注册

使用
CM_Get_Device_Interface_List_Size跟
CM_Get_Device_Interface_List
就能得到这个volume所有注册了的symbolic link strings

关键的函数就是他
GetVolumeNameForVolumeMountPoint
从A到Z一一获取其volume name,然后和symbolic link string list里面的所有string作比较找到一样的就行了

当然..你获取的那个removable设备不一定是个volume
但是他的某个child或者其child的child也就是说他的子孙也许有某个是volume..要是找到了就显示出来
要是没有找到当然就不显示出来了

中国有句古话.自己动手.丰衣足食
游客

返回顶部