首页 > 系统相关 >windows的磁盘操作之五——获取物理磁盘上的所有逻辑分区号

windows的磁盘操作之五——获取物理磁盘上的所有逻辑分区号

时间:2024-09-04 11:27:57浏览次数:11  
标签:letters windows 分区 bmLetters 磁盘操作 CHAR 之五 DWORD 磁盘

引用:https://www.cnblogs.com/chaikefusibushiji/p/6775773.html

 

本节讨论与上一节相反的操作,根据物理驱动器号获取该磁盘上的所有分区号。DeviceIoControl函数并没有提供操作码来直接完成此操作,所以需要稍微绕个圈子来实现这项功能。

 

大体思路为,先通过GetLogicalDrives函数获得系统中所有分区号,然后过滤掉非硬盘分区(例如软驱、光驱),再过滤掉不属于指定物理磁盘的分区,最后剩下的就是我们所需要的分区号了。   代码如下 /****************************************************************************** * Function: get disk's drive letters from physical number *           e.g. 0-->{C, D, E} (disk0 has 3 drives, C:, D: and E:) * input: phyDriveNumber, disk's physical number * output: letters, letters array * return: Succeed, the amount of letters *         Fail, -1 ******************************************************************************/ DWORD GetPartitionLetterFromPhysicalDrive(DWORD phyDriveNumber, CHAR **letters) {     DWORD mask;     DWORD driveType;     DWORD bmLetters;     DWORD diskNumber;     CHAR path[DISK_PATH_LEN];      CHAR letter;     DWORD letterNum;     WORD i;     CHAR *p;       bmLetters = GetLogicalDrives();     if (0 == bmLetters)     {         return (DWORD)-1;     }       letterNum = 0;     for (i = 0; i < sizeof(DWORD) * 8; i++)     {         mask = 0x1u << i;         if ((mask & bmLetters) == 0)        //get one letter         {             continue;         }         letter = (CHAR)(0x41 + i);    //ASCII change         sprintf(path, "%c:\\", letter);         driveType = GetDriveType(path);         if (driveType != DRIVE_FIXED)         {             bmLetters &= ~mask;     //clear this bit             continue;         }         diskNumber = GetPhysicalDriveFromPartitionLetter(letter);         if (diskNumber != phyDriveNumber)         {             bmLetters &= ~mask;     //clear this bit             continue;         }         letterNum++;     }       //build the result     *letters = (CHAR *)malloc(letterNum);     if (NULL == *letters)     {         return (DWORD)-1;     }     p = *letters;     for (i = 0; i < sizeof(DWORD) * 8; i++)     {         mask = 0x1u << i;         if ((mask & bmLetters) == 0)         {             continue;         }         letter = (CHAR)(0x41 + i);    //ASCII change         *p = letter;         p++;     }         return letterNum; }   代码分析 函数输入参数DWORD phyDriveNumber为物理磁盘号,例如0,1,2……。 函数输出参数CHAR **letters为获得的逻辑分区号数组指针。由于一块物理盘上可能有多个分区,所以用数组存放求得的多个分区号。 函数返回值为分区数量。 1. 调用函数GetLogicalDrives获得所有分区号。注意函数GetLogicalDrives返回值为位图形时,例如第0位代表A:,第2位代表C: 等等。 2. 对获得的逻辑分区逐个检测。 调用函数GetDriveType获得分区类型,如果类型不为硬盘(driveType != DRIVE_FIXED),将此位清0。 调用函数GetPhysicalDriveFromPartitionLetter查询该逻辑分区所属的物理分区号,如果不为phyDriveNumber,将此位清0。 经过上两项条件过滤后的位图存储了我们所需的逻辑分区号。 3. 为*letters分配空间,并将位图转换为盘符字母存储在数组中。

 

 

 

 

 

 

 

 

 

 

https://www.cnblogs.com/chaikefusibushiji/p/6775773.html

标签:letters,windows,分区,bmLetters,磁盘操作,CHAR,之五,DWORD,磁盘
From: https://www.cnblogs.com/rebrobot/p/18396106

相关文章

  • 04 Windows批处理中的条件执行
    if命令在所有编程语言中都很常见,它只会在条件为真时执行一行或多行代码,而只有在条件为假时才会执行另一段代码。其基本原理很简单,但是在批处理中,条件子句为true或false的实体与其他语言中的类似子句有很大不同。大多数比较操作符都是批处理所独有的,在本文中,我们将学习确定路径或......
  • 《安装Windows 11 系统详细步骤》
    以下是安装Windows11系统的详细步骤: 准备工作: 1. 检查电脑是否满足Windows11的系统要求,包括处理器、内存、存储、TPM等。2. 备份重要的数据,因为安装过程中可能会导致数据丢失。3. 准备一个8GB或以上容量的U盘,并将其格式化为FAT32格式。4. 从微软官方......
  • windows 安装plyvel
    编译leveldbgitclonehttps://github.com/google/leveldb.gitcdleveldb#这里我用的是1.23版本gitcheckout1.23gitsubmoduleinitgitsubmoduleupdatemkdirbuildcdbuildcmake..-G"VisualStudio162019"-Ax64cmake--build.--configRelease编译ply......
  • Windows 下 Node.js 版本管理指南:不使用 NVM 与使用 NVM 的两种方案
    文章目录方案一:不使用nvm管理NODEJS版本方案二:使用nvm管理NODEJS版本其他配置方案一:不使用nvm管理NODEJS版本NodeJs官网,NodeJs下载索引页下载较慢,不推荐这里使用v18.16.0版本,下载注意需要注册一个flowus账号登录才能下载node-v18.16.0-win-x64.zip下......
  • windows11 搭建gitea服务器
    gitea。适用于个人或者小团队所有。 一:环境安装,需要先安装个mysql,如果有现成的可以直接使用。下载地址:https://downloads.mysql.com/archives/community/   二:下载gitea安装包:地址:https://dl.gitea.io/gitea这里直接下载最新的:gitea-1.15.7-windows-4.0-amd64.exe......
  • Windows下安装MySQL详细教程
    Windows下安装MySQL详细教程1、安装包下载  2、安装教程(1)配置环境变量(2)生成data文件(3)安装MySQL(4)启动服务(5)登录MySQL(6)查询用户密码(7)设置修改用户密码(8)退出 3、解决问题1、安装包下载。下载地......
  • Windows编程:绕过UAC弹窗获取管理员权限
    在早些年写一个桌面软件时,需要管理员权限,但是又不想UAC弹窗,所以一般是直接将UAC的级别拉到最低,或者直接禁用UAC的相关功能。 什么是UAC(UserAccountControl)用户帐户控制(UAC)是一项Windows安全功能,旨在保护操作系统免受未经授权的更改。当对系统的更改需要管理员级权......
  • Windows UWP应用无法联网 微软商店怎么不能联网了?
    因为日常需要在谷歌学术查阅一些文献以及上Github,因此梯子总是保持默认开启的状体。于是就发现一个问题是,Windows商城始终是无法联网的,翻了翻网上大家的记录,国内按理说是可以连上的,于是进行的相关搜索,最终发现了解决方法:如何为Windows10UWP应用设置代理-知乎(zhihu.c......
  • 远距离跨网络实现windows远程桌面连接
    1.保证已经打开被连接电脑---远程访问---权限。我的电脑--右键--属性--远程设置  2.选择允许连接(选择用户和高级没有特殊设置可以不动,被连接电脑当前登陆的账号就可以满足权限)    3.打开--控制面板    4.依次选择至当前位置,打开允许应用或功能通过防......
  • 03 Windows批处理的作用域和延迟扩展
    在前文中,我们学习了变量、如何设置它们以及如何解析它们的值。在本文中,我将重点介绍setlocal命令,它是批处理中非常重要的、具有不同特性的核心内容,它可以何时、何地以及如何处理变量。首先,它定义了作用域:在何处以及何时可以访问和操作这些变量。其次,它启用了一个称为延迟扩展的特......