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