You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C/C++中获取Windows系统所在的PhysicalDrive编号?

获取Windows系统所在PhysicalDrive编号的C语言实现

要找到Windows系统对应的\\.\PhysicalDrivexxxx编号,核心是通过系统分区的卷信息关联到物理磁盘,具体步骤如下:

  • 获取系统根目录的盘符(系统盘不一定是C盘)
  • 打开该卷设备,通过Windows内核IO控制码读取卷对应的物理磁盘扩展信息
  • 从返回结果中提取物理磁盘编号

以下是完整实现代码:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int _tmain() {
    // 获取系统目录路径,提取系统盘盘符
    TCHAR systemDrive[MAX_PATH];
    if (!GetSystemDirectory(systemDrive, MAX_PATH)) {
        _tprintf(_T("GetSystemDirectory 调用失败,错误码:%d\n"), GetLastError());
        return 1;
    }
    // 截取盘符部分(如从C:\Windows\System32提取出C:\)
    systemDrive[3] = _T('\0');

    // 构造卷设备访问路径,格式为\\.\X:
    TCHAR volumePath[MAX_PATH];
    _stprintf_s(volumePath, MAX_PATH, _T("\\\\.\\%c:"), systemDrive[0]);

    // 打开卷设备
    HANDLE hVolume = CreateFile(
        volumePath,
        GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );

    if (hVolume == INVALID_HANDLE_VALUE) {
        _tprintf(_T("CreateFile 调用失败,错误码:%d\n"), GetLastError());
        return 1;
    }

    // 请求获取卷对应的物理磁盘扩展信息
    VOLUME_DISK_EXTENTS diskExtents;
    DWORD bytesReturned;
    BOOL result = DeviceIoControl(
        hVolume,
        IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
        NULL,
        0,
        &diskExtents,
        sizeof(diskExtents),
        &bytesReturned,
        NULL
    );

    if (!result) {
        _tprintf(_T("DeviceIoControl 调用失败,错误码:%d\n"), GetLastError());
        CloseHandle(hVolume);
        return 1;
    }

    // 输出结果
    if (diskExtents.NumberOfDiskExtents > 0) {
        DWORD diskNumber = diskExtents.Extents[0].DiskNumber;
        _tprintf(_T("系统所在物理驱动器编号:%d\n"), diskNumber);
        _tprintf(_T("对应的设备路径:\\\\.\\PhysicalDrive%d\n"), diskNumber);
    } else {
        _tprintf(_T("未找到对应的物理驱动器信息\n"));
    }

    CloseHandle(hVolume);
    return 0;
}

关键说明:

  1. GetSystemDirectory:通过系统目录路径确定系统盘,避免硬编码C盘导致的错误。
  2. 卷设备路径:\\.\X:是Windows访问卷设备的标准格式,能直接与内核交互获取底层信息。
  3. IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS:内核控制码,用于获取卷关联的物理磁盘信息,其中DiskNumber字段就是目标编号。
  4. 权限要求:代码需要以管理员权限运行,否则CreateFile或DeviceIoControl会因权限不足调用失败。

内容的提问来源于stack exchange,提问作者raff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:39:52