📄 usb.txt
字号:
//*********************************************************************************DestroyUsbDisk.cpp
//子程序必需的头文件
#include <windows.h>
#include <devguid.h>
#define DWORD_PTR DWORD
#define ULONG_PTR DWORD
#define SLEEPTIME 3
extern "C" {
//#include "hidsdi.h"
}
// 需加入hid.lib
#include <setupapi.h>
#pragma comment(lib,"setupapi.lib")
#include <regstr.h>
#include <winbase.h>
#include <cfgmgr32.h>
//\#pragma comment(lib,"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
//*********************************************************************************
//*********************************************************************************
//条件编译:必需
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#ifndef _EXPORTING
#define _EXPORTING
#endif
//*********************************************************************************
//
// 注意!
//
// 如果此 DLL 动态链接到 MFC
// DLL,从此 DLL 导出并
// 调入 MFC 的任何函数在函数的最前面
// 都必须添加 AFX_MANAGE_STATE 宏。
//
// 例如:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
// }
//
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
//
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
//
// CDestroyUsbDiskApp
BEGIN_MESSAGE_MAP(CDestroyUsbDiskApp, CWinApp)
END_MESSAGE_MAP()
// CDestroyUsbDiskApp 构造
CDestroyUsbDiskApp::CDestroyUsbDiskApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的一个 CDestroyUsbDiskApp 对象
CDestroyUsbDiskApp theApp;
// CDestroyUsbDiskApp 初始化
BOOL CDestroyUsbDiskApp::InitInstance()
{
CWinApp::InitInstance();
return TRUE;
}
int UsbIsDestroy(DWORD LabelCntBefore)
//检测是否已经弹出了U盘,若有,返回0,否则返回-1;
//算法:由形参获得执行USB弹出函数前的盘符DWORD值,在本函数体中获得当前的盘符DWORD值,
//将它们异或,将得到的DWORD值存入一个数组中,该数组共有26个元素,每个元素的值或为0或
//为1,从第0个元素到第25个元素分别代表A:,B:,C:,.....Z:,元素值为0代表该元素对应的盘符
//不存在,若为1代表该盘符存在
{
//CString str;
// str.Format("%d",LabelCntBefore);
// AfxMessageBox(str);
int DiskLabelXOR[26];//元素下标0对应A:,1对应B:, 依次类推
for(int i=0;i<26;i++)
DiskLabelXOR[i]=0;
//获得当前系统盘符
DWORD LabelCntAfter=::GetLogicalDrives();
DWORD LabelXOR=LabelCntBefore^=LabelCntAfter;//^=异或运算符
//将LabelXOR的二进制形式分别存入DiskLabelXOR数组中
i=0;
//str.Format("XOR:%d",LabelXOR);
while(LabelXOR>0&&i<26)
{
DiskLabelXOR[i]=LabelXOR%2;
i++;
LabelXOR/=2;
}
//str.Format("%d,%d,%d",LabelXOR,LabelCntBefore,LabelCntAfter);
//AfxMessageBox(str);
//检测DiskLabelXOR中是否有等于1的元素
for(int j=0;j<26;j++)
{
if(DiskLabelXOR[j])
return 0;
}
return -1;
}
//**************************************************************************************
//下面是移除usb设备的主要代码
int extern "C" _stdcall DestroyUsb()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
DWORD LabelCntBefore;
//获得执行USB设备弹出函数前的盘符
LabelCntBefore=::GetLogicalDrives();
//--------------------------------------------------------------------------
// 获取设备信息
//获得所有由第一个参数指定类的设备信息
hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE );
if (hDevInfo == INVALID_HANDLE_VALUE) {
// 查询信息失败
{
//AfxMessageBox("错误!SetupDiGetClassDevs函数执行错误!");
return -1;
}
}
//--------------------------------------------------------------------------
// 枚举每个USB设备
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
SetupDiEnumDeviceInfo(hDevInfo,0, &DeviceInfoData);
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 )
{}
else
{
//AfxMessageBox("CM_Get_DevNode_Status函数执行错误");
return -1;
}
pnpvietotype = PNP_VetoDevice;
len = MAX_PATH;
cr = CM_Request_Device_Eject(
DeviceInfoData.DevInst,
&pnpvietotype,
vetoname,
len,
0
);
SetupDiDestroyDeviceInfoList(hDevInfo);
::Sleep(SLEEPTIME);
if(-1==UsbIsDestroy(LabelCntBefore))
return -1;
return 0;
}
//***************************************************************************************
/ DestroyUsbDisk.h : DestroyUsbDisk DLL 的主头文件
//
#pragma once
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
#include "resource.h" // 主符号
#ifdef _EXPORTING
#define _DECLSPEC extern"C" _declspec(dllexport)
#else
#define _DECLSPEC extern"C" _declspec(dllimport)
#endif
_DECLSPEC int _stdcall DestroyUsb();//安全删除usb设备,成功返回0,失败返回-1
// CDestroyUsbDiskApp
// 有关此类实现的信息,请参阅 DestroyUsbDisk.cpp
//
class CDestroyUsbDiskApp : public CWinApp
{
public:
CDestroyUsbDiskApp();
// 重写
public:
virtual BOOL InitInstance();
DECLARE_MESSAGE_MAP()
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -