gpt4 book ai didi

c++ - 在 Windows 上识别程序的驱动器

转载 作者:太空狗 更新时间:2023-10-29 21:39:26 26 4
gpt4 key购买 nike

我有一个用 C++ 编写的 Windows 程序。为了获取计算机驱动器的驱动器序列号,我在程序中使用 _popen() 运行“wmic path win32_physicalmedia get SerialNumber”。

但是,运行该程序的计算机可能有很多驱动器,USB驱动器也会出现在列表中。

我怎样才能知道哪个驱动器有我正在运行的程序?谢谢!

最佳答案

假设您仍想使用 WMI 执行此操作:首先您需要一些代码来读取 C++ 中的 WMI 属性。这里不用赘述,可以在Getting CPU ID code from C# to be in C++中找到.

当您拥有该代码后,您就可以开始使用磁盘了。首先,您需要记住 Windows 是如何组织磁盘的:

  • 每个物理磁盘 (Win32_DiskDrive) 都是由分区 (Win32_DiskPartition) 组成的。
  • 每个分区 (Win32_DiskPartition) 都是一个逻辑磁盘 (Win32_LogicalDisk)。
  • 彼此之间的映射是通过 Win32_DiskDriveToDiskPartitionWin32_LogicalDiskToPartition 完成的。

你已经知道了 where you're running然后你可以做这个映射:

Win32_LogicalDisk 中获取 DeviceID 属性与您正在运行的驱动器匹配的驱动器:

DeviceID=C:

查询 Win32_LogicalDiskToPartition 并选择 AntecedentDependent 具有您之前找到的 ID:

\\REPETTI\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1"  \\REPETTI\root\cimv2:Win32_LogicalDisk.DeviceID="C:"

现在您应该查询 Win32_DiskPartition 中的分区,以找到 DeviceIDDisk #1, Partition #1 的分区,但也 Win32_DiskDriveToDiskPartition 使用 DeviceID 进行此映射,然后您可以直接查询 Win32_DiskDriveToDiskPartition 以匹配给定的 ID:

\\REPETTI\root\cimv2:Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE1"  \\REPETTI\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1"

现在您只需要查询 Win32_DiskDrive 搜索设备 ID \\.\PHYSICALDRIVE1:

WDC WDxxx ATA Device  \\.\PHYSICALDRIVE1  WDC WDxxx ATA Device

你可以获得它的序列号(在这种情况下,相同的属性在 Win32_PhysicalMediaWin32_DiskDrive 中都可用,否则你应该通过它的 Caption 搜索>).

没有 WMI

如果您必须在没有 WMI 的情况下执行此操作,那么它有点更棘手。

  • 首先你需要弄清楚哪个物理驱动器包含你的逻辑驱动器_你可以关注How to list physical disks? .
  • 当您有物理驱动器名称时,最简单的方法是 CreateFile() 打开驱动器并使用 DeviceIoControl() 发送 S.M.A.R.T. 获取信息。命令。不要认为这总是那么容易:许多驱动器都会出现故障,您需要管理权限。不幸的是,没有一个完美的解决方案,您需要尝试不同的方法。 AFAIK 处理此问题的最佳和最详尽的代码是由 Lynn McGuire 为其 DiskId32 编写的效用。

关于c++ - 在 Windows 上识别程序的驱动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32950927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com