windows_获取系统盘所在的磁盘号

通过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;
}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值