windows的磁盘操作,如何根据逻辑分区号获得物理磁盘号

本文详细介绍了如何在Windows环境下通过编程方式获取物理磁盘号与逻辑分区字母之间的映射关系,提供了使用C/C++语言的具体示例代码,包括如何打开物理驱动器和逻辑磁盘,以及如何通过设备I/O控制来获取存储设备号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于物理驱动器x,形式为 \.\PhysicalDriveX,编号从0开始,例如

名称含义
\.\PhysicalDrive0打开第一个物理驱动器
\.\PhysicalDrive1打开第二个物理驱动器

分区(卷),形式为 \.\X: ,例如

名称含义
\.\A:打开A盘(软驱)
\.\D:打开D盘(磁盘逻辑分区)

Tips:
打开逻辑磁盘的时候,\ 注意要转义,并且与物理驱动相比多了个冒号:,
如下所示:

 //硬盘文件名
   LPCSTR DiskFileName="\\\\.\\PhysicalDrive2";
   handle = CreateFile(QString("\\\\.\\PhysicalDrive2").toStdWString().data(), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
   handle = CreateFile(QString("\\\\.\\H:").toStdWString().data(), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
  

参考自:
https://blog.csdn.net/weixin_34343308/article/details/91754123

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





根据逻辑分区号获得物理磁盘号,代码示例:

#include <stdio.h>
#include <Windows.h>
#define DISK_PATH_LEN 128
/******************************************************************************
* Function: get disk's physical number from its drive letter
*           e.g. C-->0 (C: is on disk0)
* input: letter, drive letter
* output: N/A
* return: Succeed, disk number
*         Fail, -1
******************************************************************************/
DWORD GetPhysicalDriveFromPartitionLetter(char letter)
{
    HANDLE hDevice;               // handle to the drive to be examined
    BOOL result;                 // results flag
    DWORD readed;                   // discard results
    STORAGE_DEVICE_NUMBER number;   //use this to get disk numbers
 
    CHAR path[DISK_PATH_LEN];
    sprintf(path, "\\\\.\\%c:", letter);
    hDevice = CreateFile(path, // drive to open
                         GENERIC_READ | GENERIC_WRITE,    // access to the drive
                         FILE_SHARE_READ | FILE_SHARE_WRITE,    //share mode
                         NULL,             // default security attributes
                         OPEN_EXISTING,    // disposition
                         0,                // file attributes
                         NULL);            // do not copy file attribute
    if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
    {
        fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError());
        return DWORD(-1);
    }
 
    result = DeviceIoControl(
                hDevice,                // handle to device
                IOCTL_STORAGE_GET_DEVICE_NUMBER, // dwIoControlCode
                NULL,                            // lpInBuffer
                0,                               // nInBufferSize
                &number,           // output buffer
                sizeof(number),         // size of output buffer
                &readed,       // number of bytes returned
                NULL      // OVERLAPPED structure
            );
    if (!result) // fail
    {
        fprintf(stderr, "IOCTL_STORAGE_GET_DEVICE_NUMBER Error: %ld\n", GetLastError());
        (void)CloseHandle(hDevice);
        return (DWORD)-1;
    }
    //printf("%d %d %d\n\n", number.DeviceType, number.DeviceNumber, number.PartitionNumber);
 
    (void)CloseHandle(hDevice);
    return number.DeviceNumber;
}


int main(int argc, char *argv[], char *envp[])
{

	int i = 0;
	for (i = 0; i < argc; i++)
	{
		printf("%d:%s\n", i, argv[i]);
	}
	//system("pause");
    char disk_name = argv[1][0];
    printf("disk_name:%c\n", disk_name);

    int disk_num;
    disk_num = GetPhysicalDriveFromPartitionLetter(disk_name);
    printf("disk_num:%d\n", disk_num);

	return 0;
}




注意:要 管理员权限 运行,才能获取正常

结果

C盘的物理磁盘号为0,
D,E,F盘的物理磁盘号为1,
G盘的物理磁盘号为2
H盘,没有H盘,返回-1

在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值