通过Windows API获取操作系统所在的盘符,再根据盘符获取物理磁盘的序号
#include<windows.h>
#include<stdio.h>
#include <winioctl.h>
#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
int GetSystemDiskNo() {
char szSystemDir[MAX_PATH];
UINT ret = GetSystemDirectory(
szSystemDir,
MAX_PATH
);
if (ret == 0) {
return -1;
}
char szDrvName[] = "\\\\.\\C:";
szDrvName[4] = szSystemDir[0];
HANDLE hDevice = CreateFile(szDrvName, // drive to open
0, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL);
if (hDevice == INVALID_HANDLE_VALUE) {
return -1;
}
typedef struct _DISK_EXTENT {
ULONG DiskNumber;
LARGE_INTEGER StartingOffset;
LARGE_INTEGER ExtentLength;
} DISK_EXTENT, *PDISK_EXTENT;
typedef struct _VOLUME_DISK_EXTENTS {
ULONG NumberOfDiskExtents;
DISK_EXTENT Extents[1];
} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS;
VOLUME_DISK_EXTENTS vde;
ULONG rtn;
BOOL ok = DeviceIoControl(hDevice,
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
NULL,
0,
&vde,
sizeof(vde),
&rtn,
NULL);
if (!ok) {
DWORD e = GetLastError();
e = e;
CloseHandle(hDevice);
return -1;
}
PDISK_EXTENT pdisk = vde.Extents;
printf("DiskID:%d\n", pdisk->DiskNumber);
printf("NumberOfDiskExtents:%d\n", vde.NumberOfDiskExtents);
printf("start:%I64d\n", pdisk->StartingOffset.QuadPart / 512);
printf("ExtentLength:%I64d\n", pdisk->ExtentLength.QuadPart / 512);
printf("\n");
CloseHandle(hDevice);
return pdisk->DiskNumber;
}
int main() {
int diaskNo = GetSystemDiskNo();
printf("DiskNumber:%d\n", diaskNo);
return 0;
}