c++ - 插入加密U盘后,如何使用WMI找到 'launcher'逻辑盘?

标签 c++ winapi wmi disk

我正在使用 WMI 来确定何时插入/放入各种形式的媒体(USB 驱动器、CD 等)。然而,诸如“SanDisk Enterprise FIPS USB”之类的加密驱动器做了一些奇怪的事情:它们看起来像是一个 CD 驱动器,可以从中启动解锁应用程序。解锁实用程序完成后,新的 USB 逻辑磁盘可用于读/写。所以我从 WMI 看到的事件顺序是:

  1. USB 已插入
  2. 创建了 Win32_DiskDrive 对象(参见下面的\.\PHYSICALDRIVE2)
  3. 创建了不同的 Win32_LogicalDisks,我在下面复制了一个 (G:),并保存了启动器,另一个(M:,在我的例子中)是最终可以访问的驱动器。

但是,在实用程序运行之前不存在 Win32_DiskDriveToDiskPartition 条目,这是从硬件 ID 定位卷的常用方法。经过多次谷歌搜索和some trial and error ,我一直没能找到一种将 PHYSICALDRIVE2 关联到 G: 的架构合理的方法。网上的普遍共识是你不应该期望这样的映射存在,因为物理媒体不需要分区或卷等,但在我的情况下我基本上知道它确实存在,并且会出错如果缺少预期的映射,则以某种有意义的方式。

在这一点上,我唯一的策略是枚举所有卷并在所有 CD 驱动器中查找适当的文件,也许在我的加密 USB 驱动器连接后跟踪已识别的任何此类设备。显然,这是一个丑陋的 hack。有什么建议吗?

TargetInstance = 
instance of Win32_LogicalDisk
{
    Caption = "G:";
    CreationClassName = "Win32_LogicalDisk";
    Description = "CD-ROM Disc";
    DeviceID = "G:";
    DriveType = 5;
    MediaType = 11;
    Name = "G:";
    SystemCreationClassName = "Win32_ComputerSystem";
};

instance of Win32_DiskDrive
{
    Caption = "SanDisk Enterprise FIPS USB Device";
    ConfigManagerErrorCode = 0;
    ConfigManagerUserConfig = FALSE;
    CreationClassName = "Win32_DiskDrive";
    Description = "Disk drive";
    DeviceID = "\\\\.\\PHYSICALDRIVE2";
    FirmwareRevision = "6.61";
    Index = 2;
    InterfaceType = "USB";
    Manufacturer = "(Standard disk drives)";
    MediaLoaded = TRUE;
    Model = "SanDisk Enterprise FIPS USB Device";
    Name = "\\\\.\\PHYSICALDRIVE2";
    Partitions = 0;
    SerialNumber = "u";
    Signature = 0;
    Status = "OK";
    SystemCreationClassName = "Win32_ComputerSystem";
};

最佳答案

我有一个以类似方式工作的 USB 3G 加密狗。

它以两个完全独立的设备呈现给计算机:一个 CD-ROM 驱动器和一个 3G 加密狗。在您的情况下,它是一个 CD-ROM 驱动器和一个硬盘驱动器。

Windows 认为 G: 实际上是一个物理光驱。 G: 不是 PHYSICALDISK2 的分区。

这就是为什么您找不到 G:PHYSICALDISK2 之间的直接连接:没有。

如果你深入研究,你可以发现 CD-ROM 和磁盘在同一 USB 总线上。我不知道您是否可以通过软件最终证明它们实际上是同一台设备。

关于c++ - 插入加密U盘后,如何使用WMI找到 'launcher'逻辑盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13123719/

相关文章:

c++ - 基于 wchar_t* 的 vector 的奇怪行为

C# WMI 远程程序无法正确执行

C++ - 检查 cin 是否有错误

c++ - 使用 Win API 确定可执行文件的实例是否已在运行

C++ Win32 - 窗口在启动时关闭

c++ - 操作HNet_ConnectionProperties的C++代码是什么

c# - 获取独立于文化(区域设置)的 WMI 属性

c++ - Windows 脚本宿主在关闭创建的窗口时终止

c++ - Qt - QTextStream - 如何将光标位置设置为一行的开头?

java - C/C++ 中 AES 加密的 PKCS#5 填充