对于物理驱动器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