- 因一些功能需求,需要以驱动器为条件进行USB的控制,然后WMI查询语句很不好查询并关联这方面的东西,所以研究的下面方案进行逆操作,可以达到目的,有想法的道友可以自行改进
#include <iostream>
#include <Windows.h>
#include <list>
#include <string>
//表达式函数,可在函数中直接定义,此处为拆出定义
//功能:盘符入参,返回驱动器名字
auto driveWhere = [](const char& letter)->std::string {
DWORD readed;
STORAGE_DEVICE_NUMBER number{};
std::string path = "//./";
path += letter;
path += ':';
//文件句柄
HANDLE hDevice = CreateFile(
path.data(),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
//句柄获取失败问题
if (INVALID_HANDLE_VALUE == hDevice) {
std::cout
<< "CreateFile Error Code is : "
<< GetLastError() << std::endl;
return "";
}
//控制指令
BOOL result = DeviceIoControl(
hDevice,
IOCTL_STORAGE_GET_DEVICE_NUMBER,
NULL,
0,
&number,
sizeof(number),
&readed,
NULL
);
if (!result) {
std::cout
<< "IOCTL_STORAGE_GET_DEVICE_NUMBER Error IS : "
<< GetLastError()
<< std::endl;
return "";
}
CloseHandle(hDevice);
if (number.DeviceNumber < 0) {
return "";
}
return std::string("//./PHYSICALDRIVE" + std::to_string(number.DeviceNumber));
};
//表达式函数,可在函数中直接定义,此处为拆出定义
//功能:获取所有盘符
auto getAllDrive = []()->std::list<std::string> {
char list[128]{};
DWORD re = GetLogicalDriveStrings(sizeof(list), list);
std::string lStr(list, re);
return [&lStr]()-> std::list<std::string> {
std::list<std::string> list;
std::string sub;
for (const char& i : lStr) {
if ('\0' == i) {
list.push_back(sub);
sub.clear();
continue;
}
sub += i;
}
return list;
}();
};
auto disabledPhysicaldrive(const std::string& physicaldrive)->std::list<HANDLE> {
std::list<std::string> pans = getAllDrive();
std::list<HANDLE> childs;
for (const std::string& pan : pans) {
std::string pd = driveWhere(pan[0]);
std::string path = "//./";
path += pan[0];
path += ':';
if (pd == physicaldrive) {
HANDLE file = CreateFileA(
path.data(),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
//0,
NULL,
OPEN_EXISTING,
0,
NULL
);
DWORD resize{};
OVERLAPPED over{};
BOOL re = DeviceIoControl(
file,
FSCTL_DISMOUNT_VOLUME,
NULL,
NULL,
NULL,
NULL,
&resize,
&over);
if (re != 0) {
//这个list需要在不再需要时进行元素释放,CloseHandle(ele)
childs.push_back(file);
std::cout << "操作成功" << std::endl;
}
else {
std::cout << "操作失败" << std::endl;
DWORD code = GetLastError();
std::cout << code << std::endl;
}
}
}
return childs;
}