zoukankan      html  css  js  c++  java
  • windows的磁盘操作之五——获取物理磁盘上的所有逻辑分区号

    本节讨论与上一节相反的操作,根据物理驱动器号获取该磁盘上的所有分区号。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为物理磁盘号,例如012……。
    函数输出参数CHAR **letters为获得的逻辑分区号数组指针。由于一块物理盘上可能有多个分区,所以用数组存放求得的多个分区号。
    函数返回值为分区数量。
    1. 调用函数GetLogicalDrives获得所有分区号。注意函数GetLogicalDrives返回值为位图形时,例如第0位代表A:,第2位代表C: 等等。
    2. 对获得的逻辑分区逐个检测。
    调用函数GetDriveType获得分区类型,如果类型不为硬盘(driveType != DRIVE_FIXED),将此位清0
    调用函数GetPhysicalDriveFromPartitionLetter查询该逻辑分区所属的物理分区号,如果不为phyDriveNumber,将此位清0
    经过上两项条件过滤后的位图存储了我们所需的逻辑分区号。
    3. *letters分配空间,并将位图转换为盘符字母存储在数组中。

  • 相关阅读:
    PDA智能程序访问WebService,报告“未能建立与网络的连接”
    VS2008中开发智能设备程序的一些总结收藏
    Error: The INF file contains Unicode characters that could not be converted correctly
    在vs2008工程中制作cab包
    linux专题三之如何悄悄破解root密码(以redhat7.2x64为例)
    linux专题一之文件描述符、重定向、管道符、tee命令
    linux的计划
    如何安装RHEL7.2x64 即红帽7.2虚拟机?
    快速排序及查找第K个大的数。
    来来来,做道题,一起防老年痴呆
  • 原文地址:https://www.cnblogs.com/chaikefusibushiji/p/6775773.html
Copyright © 2011-2022 走看看