⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb.txt

📁 是关于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 + -