关于C#:使用Win32 API安全删除USB驱动器?

关于C#:使用Win32 API安全删除USB驱动器?

Safely remove a USB drive using the Win32 API?

如何使用Win32 API移除USB驱动器? 我在嵌入式系统上做了很多工作,在其中一个系统上,我必须将程序复制到USB记忆棒上并将其插入目标硬件。

由于我主要在控制台上工作,所以我不喜欢使用鼠标每天单击数百次单击任务栏上的小图标。

我很想编写一个小程序来完成该操作,以便可以将其放入我的makefile中,但是我还没有找到任何执行相同操作的API调用。

有任何想法吗?


您可以使用CM_Request_Device_Eject()函数以及其他一些可能性。
请参阅以下项目和文章:

DevEject:直截了当。
http://www.withopf.com/tools/deveject/

有用的CodeProject文章:
http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx


看起来Sync使您可以指定-e弹出可移动驱动器。尽管不是win32 API,您可能只需要从makefile中调用sync -e [drive_letter]


这是有关可移动存储介质的Technet文章。寻找DismountNtmsMedia


这是Delphi中的一个解决方案,我已经对其进行了修改并将其投入服务以供大型企业使用。转到:链接文本

查找" scapi(安装和配置管理器API)",然后下载。将有一个名为USBView的演示程序,它将带您上路。如果您有Delphi,它还包含一个TUSBDeviceTree组件,您可以在该组件时收集有关USB设备的信息。

问候


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include<SetupAPI.h>
#include <windows.h>  
#include<initguid.h>
#include <newdev.h>
#include <Cfgmgr32.h>

#pragma comment(lib,"Cfgmgr32.lib")
#pragma comment(lib,"Setupapi.lib")
#pragma comment(lib,"Newdev.lib")

int RemoveDevice(const GUID *guid, const wchar_t *hwID) {
    HDEVINFO m_hDevInfo;
    SP_DEVICE_INTERFACE_DATA         spdid;
    SP_DEVINFO_DATA                  spdd;
    DWORD                            dwSize;
    BYTE Buf[1024];
    PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd =
        (PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;

    printf("try to remove device::%ws\
"
, hwID);

    m_hDevInfo = SetupDiGetClassDevs(guid, NULL, NULL, DIGCF_PRESENT| DIGCF_DEVICEINTERFACE);
    if (m_hDevInfo == INVALID_HANDLE_VALUE)
    {
        printf("GetClassDevs Failed!\
"
);
        return 0;
    }
    spdid.cbSize = sizeof(spdid);
    for (int i = 0; SetupDiEnumDeviceInterfaces(m_hDevInfo, NULL, guid, i, &spdid); i++) {
        dwSize = 0;
        SetupDiGetDeviceInterfaceDetail(m_hDevInfo,
            &spdid, NULL, 0, &dwSize, NULL);
        if (dwSize != 0 && dwSize <= sizeof(Buf)) {
            pspdidd->cbSize = sizeof(*pspdidd); // 5 Bytes!

            ZeroMemory((PVOID)&spdd, sizeof(spdd));
            spdd.cbSize = sizeof(spdd);

            long res =
                SetupDiGetDeviceInterfaceDetail(m_hDevInfo, &
                    spdid, pspdidd,
                    dwSize, &dwSize,
                    &spdd);
            if (res) {
                OLECHAR* guidString;
                OLECHAR* guidString2;
                StringFromCLSID(&spdd.ClassGuid, &guidString);
                StringFromCLSID(&spdid.InterfaceClassGuid, &guidString2);
                printf("%d, %ws, %ws, %ws\
"
, spdd.DevInst, pspdidd->DevicePath, guidString, guidString2);
                CoTaskMemFree(guidString);
                CoTaskMemFree(guidString2);
                if (!memcmp(pspdidd->DevicePath, hwID, 2 * lstrlenW(hwID))) {
                    DEVINST DevInstParent = 0;
                    res = CM_Get_Parent(&DevInstParent, spdd.DevInst, 0);
                    for (long tries = 0; tries < 10; tries++) {
                        // sometimes we need some tries...
                        WCHAR VetoNameW[MAX_PATH];
                        PNP_VETO_TYPE VetoType = PNP_VetoTypeUnknown;
                        VetoNameW[0] = 0;

                        res = CM_Request_Device_EjectW(DevInstParent,
                            &VetoType, VetoNameW, MAX_PATH, 0);
                        if ((res == CR_SUCCESS &&
                            VetoType == PNP_VetoTypeUnknown)) {
                            printf("remove %ws success!\
"
, pspdidd->DevicePath);
                            SetupDiDestroyDeviceInfoList(m_hDevInfo);
                            return 1;
                        }
                        Sleep(500); // required to give the next tries a chance!
                    }
                    break;
                }
            }
        }
    }
    printf("Remove Device Failed!\
"
);
    SetupDiDestroyDeviceInfoList(m_hDevInfo);
    return 0;
}

int main(){
    GUID GUID_DEVINTERFACE_USB_HUB;
    CLSIDFromString(L"F18A0E88-C30C-11D0-8815-00A0C906BED8", &GUID_DEVINTERFACE_USB_HUB);

    RemoveDevice(&GUID_DEVINTERFACE_USB_HUB, L"\\\\\\\\?\\\\usb#root_hub30");
    return 0;
}

引用:

如何准备USB驱动器以安全移除

GUID_DEVINTERFACE


推荐阅读

    linux关闭系统的命令?

    linux关闭系统的命令?,系统,工作,命令,时间,用户,指令,通知,目的,终端,表示,

    linux系统nl命令?

    linux系统nl命令?,系统,工作,命令,信息,文件,标准,工具,单位,公式,内容,nl是

    linux系统常用命令表?

    linux系统常用命令表?,系统,基础,工作,工具,管理,网络,命令,数据,标准,地址,l

    linux命令行删除网卡?

    linux命令行删除网卡?,地址,网络,系统,工具,信息,设备,名字,管理,服务,网卡,l

    linux系统查版本命令?

    linux系统查版本命令?,系统,信息,名称,状态,设备,命令,软件,工具,版本,终端,l

    强大系统linux命令?

    强大系统linux命令?,系统,工作,地址,信息,命令,管理,名称,位置,目录,控制台,l

    linux删除整个命令?

    linux删除整个命令?,命令,文件夹,不了,名称,通用,系统,数据,文件,目录,格式,l

    退出linux系统命令?

    退出linux系统命令?,系统,状态,工作,档案,命令,电脑,工具,基础,信息,时间,lin

    linux系统cmp命令?

    linux系统cmp命令?,系统,工作,标准,信息,命令,一致,目录,指令,功能,文件,请问

    linux系统命令行工具?

    linux系统命令行工具?,工具,系统,工作,状态,命令,地方,标准,信息,环境,基础,L

    linux系统进入后命令?

    linux系统进入后命令?,系统,密码,工程,电脑,位置,软件,传播,代码,工作,一致,l

    linux系统的命令功能?

    linux系统的命令功能?,系统,管理,数字,地址,工作,环境,命令,第一,增长,信息,l

    linux系统刷新命令?

    linux系统刷新命令?,系统,工具,情况,最新,单位,工作,管理,信息,软件,服务,Lin

    linux系统sed命令?

    linux系统sed命令?,资料,系统,工作,跨行,代理,时间,简介,命令,文件,都会,Linu

    linux命令对系统分区?

    linux命令对系统分区?,系统,管理,信息,情况,工具,电脑,单位,分区,环境,位置,

    linux系统维护命令?

    linux系统维护命令?,系统,工作,信息,策略,发展,网络,时间,情况,工具,服务,系

    linux如何命令删除?

    linux如何命令删除?,档案,系统,命令,文件,目录,通用,文件夹,终端,选项,参数,l

    linux系统下载的命令?

    linux系统下载的命令?,系统,工作,管理,工具,软件,网络,信息,命令,目录,文件,l

    linux系统安装命令集?

    linux系统安装命令集?,系统,软件,工作,工具,在线,信息,数据,官方网站,基础,

    linux系统kp命令?

    linux系统kp命令?,设备,网络,数据,地址,系统,检测,环境,传播,电脑,一致,配置l