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

  • 因一些功能需求,需要以驱动器为条件进行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;
}

转载于:https://my.oschina.net/mistylinux/blog/2999174

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值