文档章节

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

CHONGCHEN
 CHONGCHEN
发布于 01/09 12:58
字数 503
阅读 15
收藏 0
  • 因一些功能需求,需要以驱动器为条件进行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;
}

© 著作权归作者所有

CHONGCHEN
粉丝 5
博文 40
码字总数 20154
作品 0
武汉
后端工程师
私信 提问
Windows Server 2012修改光驱盘符

Windows Server 2012修改光驱盘符,可通过下面的步骤完成: windows+R ,输入diskmgmt.msc 这时可以看到我们熟悉的磁盘管理界面: 右击盘符,选择“更改驱动器号和路径”或“Change Drive Le...

赮毕钵罗帝
2016/12/06
0
0
windows10升级后bug出现小硬盘的解决方法

windows总有着各种明显的让人难以忍受的bug,比如升级到1709之后,或者升级到1803之后(我是升级1803之后出现的),发现会多出一个磁盘来。此硬盘有的是256MB,有的是500MB,有的是800MB,大...

晴难自控
2018/09/22
0
0
用环境变量快速访问windows目录

今天看同事在我机器上远程调试的过程,他在地址栏上输入%appdata%,就打开了C:Users用户名AppDataRoaming。 用了这么久的windows,我还不知道用环境变量的方法访问目录,由于系统之间有些路径...

7分04秒
2014/02/20
1K
0
迁移到 Linux:磁盘、文件、和文件系统

在你的主要桌面计算机上安装和使用 Linux 将帮你快速熟悉你需要的工具和方法。 这是我们的迁移到 Linux 系列文章的第二篇。如果你错过了第一篇,你可以在这里找到它。就如之前提到过的,为什...

作者: John Bonesio
2018/01/10
0
0
Windows 8/Windows 8.1镜像安装Microsoft .NET Framework 3.5的方法

1.使用ISO镜像来安装Microsoft .NET Framework 3.5属于离线部署安装法,需要Windows 8/Windows 8.1的ISO镜像文件. 2.右键ISO镜像-打开方式-选择使用Windows资源管理器打开ISO镜像,Windows 8...

Pig-man
2016/08/29
41
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot初探---spring-boot-starter-web究竟干了啥

上一篇已经简单介绍了启动类的部分,这一篇主要讨论一下springboot引入的哪些依赖 我们都知道想用springboot做一个web应用,首先要做的是引入相关依赖,两步操作: 1、添加spring-boot-start...

计算机狼
30分钟前
5
0
基于Rocket.chat搭建内网聊天系统(使用docker,本机不需要安装meteor)

您可能不希望使用标准的Docker命令,而是希望对部署进行更多的自动化管理。这就是使用Docker-compose可能会派上用场的地方。 确保您已安装Docker和Docker-compose并且可以正常运行。 docker...

吴伟祥
32分钟前
6
0
conda 更新源

更新conda 源为阿里源 conda config --add channels http://mirrors.aliyun.com/pypi/simple conda config --set show_channel_urls yes 阿里云: http://mirrors.aliyun.com/pypi/simple/ 豆......

Mr_Tea伯奕
32分钟前
4
0
java 泛型使用

每次写泛型方法都翻下百度,还是自己记录下把。 1、定义一个泛型方法,使用传入参数类型来传递泛型。这种用法在封装json序列化工具类应该会用到。 List<xxx> aa = getList(xxx.class);pr...

朝如青丝暮成雪
36分钟前
6
0
深入了解Java模板引擎Freemarker

前言 常用的Java模板引擎包括:JSP、Freemarker、Thymeleaf、Velocity,从Github上查阅到这几款主流的模板引擎的性能的对比,总体上看,JSP、Freemarker、Thymeleaf、Velocity在性能上差别不...

code-ortaerc
37分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部