读取SMBIOS信息

dag617712 2015-08-19 10:01:37
我是新人,可不可以发我一份读取SMBIOS信息的源程序代码参考一下,谢谢!
...全文
1121 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2015-08-20
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#define INITGUID
#include <windows.h>
#include <wmistr.h>

LONG WINAPI WmiOpenBlock(
    const GUID *DataBlockGuid,  // __in
    ULONG DesiredAccess,        // __in
    PVOID *DataBlockObject      // __inout
);

typedef LONG (WINAPI *PFN_WMI_OPEN_BLOCK)(LPCGUID, ULONG, PVOID *);

LONG WINAPI WmiQueryAllDataA(
    PVOID DataBlockObject,      // __in
    ULONG *InOutBufferSize,     // __inout
    PVOID OutBuffer             // __out_opt
);

typedef LONG (WINAPI *PFN_WMI_QUERY_ALL_DATAA)(PVOID, PULONG, PVOID);

LONG WINAPI WmiQueryAllDataW(
    PVOID DataBlockObject,      // __in
    ULONG *InOutBufferSize,     // __inout
    PVOID OutBuffer             // __out_opt
);

typedef LONG (WINAPI *PFN_WMI_QUERY_ALL_DATAW)(PVOID, PULONG, PVOID);

#ifndef UNICODE
#define WmiQueryAllData WmiQueryAllDataA
#else
#define WmiQueryAllData WmiQueryAllDataW
#endif

LONG WINAPI WmiCloseBlock(
    PVOID DataBlockObject       // __in
);

typedef LONG (WINAPI *PFN_WMI_CLOSE_BLOCK)(PVOID);

/*
 * wmidata.h
 */
DEFINE_GUID(MSSmBios_RawSMBiosTables_GUID, 0x8f680850,0xa584,0x11d1,0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10);

#define MSSmBios_RawSMBiosTables_Used20CallingMethod_SIZE sizeof(BOOLEAN)
#define MSSmBios_RawSMBiosTables_Used20CallingMethod_ID 1
#define MSSmBios_RawSMBiosTables_SmbiosMajorVersion_SIZE sizeof(UCHAR)
#define MSSmBios_RawSMBiosTables_SmbiosMajorVersion_ID 2
#define MSSmBios_RawSMBiosTables_SmbiosMinorVersion_SIZE sizeof(UCHAR)
#define MSSmBios_RawSMBiosTables_SmbiosMinorVersion_ID 3
#define MSSmBios_RawSMBiosTables_DmiRevision_SIZE sizeof(UCHAR)
#define MSSmBios_RawSMBiosTables_DmiRevision_ID 4
#define MSSmBios_RawSMBiosTables_Size_SIZE sizeof(ULONG)
#define MSSmBios_RawSMBiosTables_Size_ID 5
#define MSSmBios_RawSMBiosTables_SMBiosData_ID 6

typedef struct _MSSmBios_RawSMBiosTables {
    BOOLEAN Used20CallingMethod;
    UCHAR SmbiosMajorVersion;
    UCHAR SmbiosMinorVersion;
    UCHAR DmiRevision;
    ULONG Size;
    UCHAR SMBiosData[];
} MSSmBios_RawSMBiosTables, *PMSSmBios_RawSMBiosTables;

/*
 * main
 */
int main(int argc, char *argv[])
{
    HMODULE hinstDLL = LoadLibrary(_T("advapi32.dll"));
    if (hinstDLL != NULL) {
        PFN_WMI_OPEN_BLOCK pfnWmiOpenBlock = (PFN_WMI_OPEN_BLOCK)GetProcAddress(hinstDLL, "WmiOpenBlock");
#ifndef UNICODE
        PFN_WMI_QUERY_ALL_DATAA pfnWmiQueryAllData = (PFN_WMI_QUERY_ALL_DATAA)GetProcAddress(hinstDLL, "WmiQueryAllDataA");
#else
        PFN_WMI_QUERY_ALL_DATAW pfnWmiQueryAllData = (PFN_WMI_QUERY_ALL_DATAW)GetProcAddress(hinstDLL, "WmiQueryAllDataW");
#endif
        PFN_WMI_CLOSE_BLOCK pfnWmiCloseBlock = (PFN_WMI_CLOSE_BLOCK)GetProcAddress(hinstDLL, "WmiCloseBlock");

        if (pfnWmiOpenBlock != NULL && pfnWmiQueryAllData != NULL && pfnWmiCloseBlock != NULL) {
            LPVOID *lpBlock = NULL;
            LONG lResult = pfnWmiOpenBlock(&MSSmBios_RawSMBiosTables_GUID, WMIGUID_QUERY, (void **)&lpBlock);
            if (lResult == ERROR_SUCCESS) {
                DWORD dwSize = 0;
                pfnWmiQueryAllData(lpBlock, &dwSize, NULL);
                WNODE_ALL_DATA *wmiSMBiosInfo = (WNODE_ALL_DATA *)LocalAlloc(LPTR, dwSize);
                if (wmiSMBiosInfo != NULL) {
                    lResult = pfnWmiQueryAllData(lpBlock, &dwSize, wmiSMBiosInfo);
                    if (lResult == ERROR_SUCCESS) {
                        MSSmBios_RawSMBiosTables *lpSMBios = (MSSmBios_RawSMBiosTables *)((BYTE *)wmiSMBiosInfo + wmiSMBiosInfo->DataBlockOffset);
                        printf( "Used20CallingMethod:   %u\n"
                                "SmbiosMajorVersion:    %u\n"
                                "SmbiosMinorVersion:    %u\n"
                                "DmiRevision:           %u\n"
                                "Size:                  %u\n"
                                "\n",
                                lpSMBios->Used20CallingMethod,
                                lpSMBios->SmbiosMajorVersion,
                                lpSMBios->SmbiosMinorVersion,
                                lpSMBios->DmiRevision,
                                lpSMBios->Size );
                        // 写入 SMBIOS 数据到文件
                        HANDLE hFile = CreateFile(_T("smbios.bin"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
                        if (hFile != INVALID_HANDLE_VALUE) {
                            DWORD dwBytesWritten = 0;
                            WriteFile(hFile, lpSMBios->SMBiosData, lpSMBios->Size, &dwBytesWritten, NULL);
                            CloseHandle(hFile);
                        }
                    }
                    LocalFree(wmiSMBiosInfo);
                }
                pfnWmiCloseBlock(lpBlock);
            }
        }
        FreeLibrary(hinstDLL);
    }
    return 0;
}
BurnellLiu 2015-08-19
  • 打赏
  • 举报
回复
#pragma pack(1)

/// @brief SMBIOS EPS表结构
struct S_SM_EPS
{
    BYTE SMKey[4]; ///< 固定是"_SM_"
    BYTE CheckSum; ///< 检验和
    BYTE EPSSize; ///< EPS表的长度
    BYTE MajorVersion; ///< SMBIOS主版本
    BYTE MinorVersion; ///< SMBIOS次版本
    BYTE Other[22];
};
#pragma pack()

/// @brief 查找EPS(Entry Point Structure)表地址
///  
/// @return 成功返回地址, 失败返回(0)
DWORD FindEPSAddress()
{
    const DWORD StartAddress = 0x000F0000; // EPS表所在的物理内存起始地址
    const DWORD EndAddress = 0x000FFFFF; // EPS表所在的物理内存结束地址

    BYTE _SM_[4] = {0};
    BYTE _DMI_[5] = {0};
    DWORD count = 0;
    for (DWORD address = StartAddress; address < EndAddress; address++)
    {
        count = ReadPhysicalMemory(address, _SM_, 4, 1);
        if (count != 4)
            continue;

        if (_SM_[0] != '_' || _SM_[1] != 'S' || _SM_[2] != 'M' || _SM_[3] != '_')
            continue;

        count = ReadPhysicalMemory(address + 16, _DMI_, 5, 1);
        if (count != 5)
            continue;

        if (_DMI_[0] != '_' || _DMI_[1] != 'D' || _DMI_[2] != 'M' || _DMI_[3] != 'I' || _DMI_[4] != '_')
            continue;

        return address;
    }

    return 0;
}

bool FillSMBiosEPS(DWORD address, S_SM_EPS* pEPS)
{
    DWORD count = ReadPhysicalMemory(address, (PBYTE)pEPS, sizeof(S_SM_EPS), 1);
    if (count != sizeof(S_SM_EPS))
    {
        return false;
    }

    return true;
}

int main()
{
    DWORD address = FindEPSAddress();
    if (address != 0)
    {
        printf("Find EPS Address Success\n");
    }

    S_SM_EPS eps;
    bool bRet = FillSMBiosEPS(address, &eps);
    if (bRet)
    {
        printf("Fill SMBios Success\n");
    }
    system("pause");
    return 0;
}
SMBIOS内容的解析需要你自己做 以上代码需要用到ReadPhysicalMemory方法 ReadPhysicalMemory在WinRing0中(重新编译,开启读写物理内存) 你也可以使用其他库来进行读取物理内存
获取硬件信息的控件,支持delphi10.3 rio TMiTeC_SystemInfo将以下所有组件收集在一起,以方便使用 TMiTeC_AD探索ActiveDirectory TMiTeC_APM提供有关高级电源管理的信息 TMiTeC_BT使用本机蓝牙枚举器检测蓝牙设备) TMiTeC_CPU提供详细的CPU信息 TMiTeC_Devices提供Windows设备管理器之类的设备信息 TMiTeC_Disk提供逻辑驱动器信息 TMiTeC_Display提供显示适配器信息 TMiTeC_DMA提供直接的内存访问权限 TMiTeC_DriveContent扫描并保存指定的驱动器内容 TMiTeC_Engines提供有关各种已安装引擎的信息 TMiTeC_EventLog从Windows EventLog中提取信息 TMiTeC_Firewall枚举Windows防火墙中的设置和规则,规则管理功能 TMiTeC_Machine提供有关计算机或虚拟机,BIOS,TPM等的信息。 TMiTeC_Media提供媒体设备信息 TMiTeC_Memory提供内存信息 TMiTeC_Monitor提供所有已连接的监视器信息 TMiTeC_MSProduct检测到已安装的某些Microsoft产品及其产品密钥 TMiTeC_MUS检测可用的Windows更新(MicrosoftUpdateSession) TMiTeC_Network提供网卡信息,TCP / IP广告Winsock配置,已安装的协议,客户端和服务。 TMiTeC_OperatingSystem提供OS详细信息,区域设置,时区,NT特定信息,修补程序,Internet设置等。 TMiTeC_Printers检测已安装的打印机及其属性 TMiTeC_ProcessList收集正在运行的进程,服务,驱动程序和窗口及其属性的列表 TMiTeC_Security检测已安装的防病毒,防间谍软件和防火墙 TMiTeC_SMBIOS从内存中读取SMBIOS信息 TMiTeC_Software提供已安装软件的列表 TMiTeC_Startup提供在系统启动期间启动的应用程序的列表 TMiTeC_Storage可检测S-ATA,ATA,ATAPI,RAID,SCSI,USB,Firewire存储设备及其参数 TMiTeC_USB检测USB端口和设备及其参数 TMiTeC_WIFI会检测所有可用参数的可用Wi-Fi网络 每当将任何USB,火线等设备或卷连接到计算机或与计算机断开连接时,TMiTeC_DeviceMonitor都会检测并触发事件。 TMiTeC_DiskMonitor监视指定的驱动器或路径,并在发生指定事件时触发事件 TProcMonThread 通过其进程IDentifier监视给定的进程,并提供基本的进程属性,内存,CPU和I / O进程使用率,并枚举进程线程及其运行时属性。 TProcListMonThread 实时监视正在运行的进程,并提供进程属性,内存和CPU进程使用率等。 TSysMonThread监视系统并提供基本属性以及CPU,内存和磁盘使用情况 TSysModListMonThread实时监视系统模块并提供其属性 TNetConMonThread通过进程实时监视网络连接并提供其属性 TPerfMonThread实时监视性能计数器并提供其属性 THndListMonThread实时监视系统句柄并提供其属性 TMiTeC_NetCreds提供缓存的网络凭据枚举。 TMiTeC_USBHistory USB使用率检测组件 TMiTeC_WLANC已知的Wi-Fi网络枚举(包括网络密钥)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧