java 开发硬件驱动_通过盘符获取硬件驱动器名字(Windows)

#include

#include

#include

#include

//表达式函数,可在函数中直接定义,此处为拆出定义

//功能:盘符入参,返回驱动器名字

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<:string> {

char list[128]{};

DWORD re = GetLogicalDriveStrings(sizeof(list), list);

std::string lStr(list, re);

return [&lStr]()-> std::list<:string> {

std::list<: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<:shared_ptr>> {

std::list<:string> pans = getAllDrive();

std::list<:shared_ptr>> 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) {

childs.push_back(std::make_shared(file,[](auto handle){

CloseHandle(handle);

}));

std::cout << "操作成功" << std::endl;

}

else {

std::cout << "操作失败" << std::endl;

DWORD code = GetLastError();

std::cout << code << std::endl;

}

}

}

return childs;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值