如何在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; }
关键说明:
GetSystemDirectory:通过系统目录路径确定系统盘,避免硬编码C盘导致的错误。- 卷设备路径:
\\.\X:是Windows访问卷设备的标准格式,能直接与内核交互获取底层信息。 IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS:内核控制码,用于获取卷关联的物理磁盘信息,其中DiskNumber字段就是目标编号。- 权限要求:代码需要以管理员权限运行,否则
CreateFile或DeviceIoControl会因权限不足调用失败。
内容的提问来源于stack exchange,提问作者raff
相关产品推荐
相关产品推荐

