从盘符查找未分区磁盘的物理驱动器

问题描述 投票:0回答:1

我需要在 Windows10 上自动初始化 microSD(物理清理、特殊分区、格式化...)。我拥有的初始信息是操作系统分配给驱动器的驱动器号,我想找到相关的磁盘号和物理设备。许多文章都讨论了这个问题(例如根据驱动器号识别物理驱动器),但是当磁盘未格式化且未分区时,我尝试过的所有解决方案都会失败。这是一个非常特殊的情况:设备注册为物理驱动器,字母分配给卷,但我找不到在这些命名空间之间获取链接的方法。常用函数(例如 powershell get-ciminstance / get-cimlinkedinstance)无法检测磁盘和卷之间的关联。唯一知道该连接的工具是 Windows 的磁盘管理器,因为它显示空磁盘并用相应的驱动器号对其进行标记。 有没有办法以编程方式执行相同的操作(例如在 powershell 中)?

powershell windows-10 disk
1个回答
0
投票

这是我最终找到的解决方案。 Raymond Chen 的博客是信息来源 (https://devblogs.microsoft.com/oldnewthing/20201019-00/?p=104380)。我希望它能有所帮助。 这是一个最小的示例(删除了错误检查,仅多字节......):

// 1) Convert a path (F:\) in a volume path

char volpath[MAX_PATH];
volpath[0] = '\0';
GetVolumePathName("f:\\", volpath, sizeof(volpath));

// 2) Get volume name from volume path
char name[MAX_PATH];
name[0] = '\0';
GetVolumeNameForVolumeMountPoint(volpath, name, sizeof(name));

// 3) Remove trailing \ to get volume objct name
int l = strlen(name);
if (name[l - 1] == '\\') {
    name[l - 1] = '\0';
}

// 4) Open volume object
HANDLE handle = CreateFile(name,
    0,
    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    NULL,
    OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS,
    NULL);

// 5) Get the list of underlying physical drives
// NOTE: we assume to be in the simplest case:
// a volume covering a single drive. In general, the
// service would fill an array of disk descriptors.

VOLUME_DISK_EXTENTS singleExtent;
memset(&singleExtent, 0, sizeof(singleExtent));

DWORD bytesWritten = 0;
DeviceIoControl(handle, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
    NULL, 0,
    &singleExtent, sizeof(singleExtent),
    &bytesWritten,
    NULL);

// 6) Enjoy the result.

printf("ndrive=%u, drive=%u len=%llu off=%llu\n",
    singleExtent.NumberOfDiskExtents,
    singleExtent.Extents[0].DiskNumber,
    singleExtent.Extents[0].ExtentLength,
    singleExtent.Extents[0].StartingOffset);
printf("Physical device is \\\\.\\PhysicalDrive%u\n",
    singleExtent.Extents[0].DiskNumber);
© www.soinside.com 2019 - 2024. All rights reserved.