【问题标题】:Getting BIOS Serial Number without WMI在没有 WMI 的情况下获取 BIOS 序列号
【发布时间】:2012-03-23 07:26:53
【问题描述】:

我正在尝试从 Win32 用户模式应用程序(MFC,如果这会产生任何差异)获取 WinXP Embedded 32 位系统的 BIOS 序列号。

我正在尝试从成员“SerialNumber”的“Win32_BIOS”类中获取您可以通过 WMI 获取的相同序列号。问题是我不能使用 WMI,因为它必须在没有安装 WMI 的旧系统上运行。

我们基本上有一系列机器,数据在这个 BIOS 字段中编码,因此用户无法更改,有时我们需要将此信息输出到文件并发送给我们。

我找到了“GetSystemFirmwareTable”,但最低 Win 版本是 WinXP 64 位。 WMI 是不可能的,我们已经有了从直接映射的物理地址读取它的代码,但问题是我们使用的允许我们映射这些物理地址的软件与我们的软件绑定在一起,我们的软件无法运行在这个特定用例的这个阶段(许可)。

据我所知,从用户模式应用程序映射物理硬件地址的唯一其他方法是深入研究驱动程序领域并将一些驱动程序库集成到应用程序中以允许它映射物理地址。

是否存在操作系统制作的某种卷影副本,无需大量配置即可访问?

【问题讨论】:

    标签: windows-xp bios serial-number


    【解决方案1】:

    Windows XP 中的 NTVDM 映射物理内存的第一个 MiB,因此您应该能够在第一个 MB 中找到 SMBIOS blob 并从中获取 BIOS 序列号。如需进一步参考,请参阅PDF specification

    【讨论】:

    • 我不太确定我是否理解。按照规范,我仍然要访问 0x000f0000 的硬件地址,这意味着我的用户模式应用程序需要能够将其映射到虚拟地址,而我目前无法做到这一点(据我所知)因为我上面说的。 ntvdm 不是在当前版本的 Windows 上运行 16 位 DOS 应用程序的进程吗?您是否建议我编写一个 16 位 DOS 应用程序,以便我可以读取它的 SMBIOS 数据副本?
    • 是的,我就是这么想的。删除一个 MS-DOS COM 文件并从您的 Windows 应用程序运行它,并将 SMBIOS 数据写入使用 INT 0x21 的文件,然后您可以从您的用户模式应用程序收集该文件。
    • 嗯,一个好主意,但我实际上找到了 sysinternals.com 的应用程序示例代码来映射物理内存:nah6.com/~itsme/cvs-xdadevtools/itsutils/src/sysint-physmem.cpp 我能够很容易地调整它来做我想做的事.但它只适用于 XP,这对我来说很好,这就是我所需要的,因为在更高的系统上,我们可能最终会使用 WMI,因为它更容易并且随操作系统一起提供。
    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2011-01-23
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多