阅读:1715回复:3
怎样可以自己编程卸载USB设备呢?用户被禁言,该主题自动屏蔽! |
|
沙发#
发布于: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 ¦ 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; } |
|
板凳#
发布于:2005-03-31 13:01
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于: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..要是找到了就显示出来 要是没有找到当然就不显示出来了 中国有句古话.自己动手.丰衣足食 |
|