[分享]使用API通过SMBIOS获取内存信息
21天前 235

此处内容隐藏,登录后可见!立即登录  登录后请刷新页面!刷新

收藏
点赞 3
道具卡
分享
123
最新回复 (8)
  • avatar image
    anson4 21天前

    感谢分享!

    单机计算
  • avatar image
    爱心会员VIP会员
    527104427 21天前

    支持!!!

    https://www.123pan.com/s/NflRVv-Cm5Sh
  • avatar image
    xhzkp 15天前

    感谢大佬分享

  • avatar image
    wxinchun92 15天前

    感谢分享!

  • avatar image
    anson4 14天前

    请教楼主,Type 1 中的 UUID 项和 Type 4 中的 Processor Characteristics 项如何获取?

    这两个数据类型直接套进去得到的结果不对,不知道需要怎么处理。

    image.webp

    image.webp

    单机计算
  • avatar image
    123 14天前
    楼主   7
    anson4 请教楼主,Type 1 中的 UUID 项和 Type 4 中的 Processor Characteristics 项如何获取? 这两个数据类型直接套进去得到的结果不对,不知道需要怎么处理。 ...
    ENVI^ ENVIMODE=1
    ENVI$ &NL=0d 0a
    //转换RSMB为DWORD----开始
    CODE *,RSMB,*-ANSI,&FirmwareTableProviderSignatureHex
    SED -ex &FirmwareTableProviderSignature=0, 0x,,&FirmwareTableProviderSignatureHex
    //转换RSMB为DWORD----结束
    
    //第四个参数传入0,则返回获取RSMB结构长度
    CALL $--qd --ret:&GetSystemFirmwareTableRet Kernel32.dll,GetSystemFirmwareTable,#%&FirmwareTableProviderSignature%,#0,#0,#0
    
    //判断API是否成功
    IFEX #%&GetSystemFirmwareTableRet%=0,EXIT
    
    //设置RSMB长度
    ENVI &BufferSize=%&GetSystemFirmwareTableRet%
    
    //申请%&BufferSize%长度的&pFirmwareTableBuffer变量内存空间
    SET$# pFirmwareTableBuffer=*%&BufferSize% 0
    
    //获取&pFirmwareTableBuffer数据
    CALL $--qd --ret:&GetSystemFirmwareTableRet Kernel32.DLL,GetSystemFirmwareTable,#%&FirmwareTableProviderSignature%,#0,*&pFirmwareTableBuffer,#%&BufferSize%
    //MESS. %&GetSystemFirmwareTableRet%
    
    //SET?数据类型 源PE变量名或地址=变量名:偏移字节数      //取PE对象中指定类型2进制数据。
    SET?char pFirmwareTableBuffer=&&Used20CallingMethod:0
    CALC &Used20CallingMethod=%&Used20CallingMethod%  //16进制转10进制
    SET?char pFirmwareTableBuffer=&&SMBIOSMajorVersion:1
    CALC &SMBIOSMajorVersion=%&SMBIOSMajorVersion%
    SET?char pFirmwareTableBuffer=&&SMBIOSMinorVersion:2
    CALC &SMBIOSMinorVersion=%&SMBIOSMinorVersion%
    SET?char pFirmwareTableBuffer=&&DmiRevision:3
    CALC &DmiRevision=%&DmiRevision%
    SET?int pFirmwareTableBuffer=&&SMBIOSTableDataLength:4
    
    ENVI &&SMBIOS_Version=%&SMBIOSMajorVersion%.%&SMBIOSMinorVersion%
    
    //SET-make  PE变量名=[地址|&PE变量名[@[$]偏移]][;[*][[$]字节数]]  //创建PE变量。*为char串
    SET-make &SMBIOSTableData=&pFirmwareTableBuffer@(1 + 1 + 1 + 1 + 4);*%&SMBIOSTableDataLength%  //获取实际的SMBIOSTableData数据
    
    //把数据写入到一个文件中,方便用Winhex查看对比。
    //IFEX %&CurDir%\SMBIOSTableData.Bin,FILE %&CurDir%\SMBIOSTableData.Bin
    //GETF -bin &pFirmwareTableBuffer,(1 + 1 + 1 + 1 + 4)#%&SMBIOSTableDataLength%,&SMBIOSTableDataTemp
    //PUTF %&CurDir%\SMBIOSTableData.Bin,0#,%&SMBIOSTableDataTemp%
    
    SET$# &type=*1 0    //申请1个字节的内存空间,定义一个变量,作为类型变量
    SET$# &data_offset=*1 0    //申请1个字节的内存空间,定义一个变量,作为类型(格式区)长度
    ENVI &&Type_Start=0      //定义一个变量,作为当前类型的起始位置值的标记
    CODE *ANSI,0x00 0x00,**ANSI,&&TypeKeyWords
    CODE *ANSI,0x00,**ANSI,&&CharKeyWords
    LOOP #%&Type_Start%>=0,
    {*
    
        //SET-zero  PE变量名=[[$]数值][@[$]偏移]][;[$]数量]  //清除变量的内存,默认0  $:加宽,可多次
        SET-zero type=
        SET-zero data_offset=
        SET?char SMBIOSTableData=&type:%&&Type_Start%
        ENVI &&Type_Start_Last=%&Type_Start%        //上一个类型的结束位置
        SET?char SMBIOSTableData=&data_offset:(%&Type_Start% + 1)
        CALC &data_offset=%&data_offset%
        CALC &pdata_offset=%&data_offset%-1      //格式区结束地址,0x00为首地址
        GETF -find &SMBIOSTableData,(%&data_offset% + %&Type_Start%)###0#1#0,&&Type_End,*&&TypeKeyWords
        IFEX $%&Type_End%=-1,EXIT LOOP
        CALC &&Type_Start=%&Type_End% + 2   //尾部加上两个字节的0x00 0x00
        IFEX [ #%&type%=1 & $%&SMBIOS_Version%>=2.0 ],
        {*
            CALC &BIOS_INFO_Len=%&Type_Start% - %&data_offset% - %&Type_Start_Last%     //字符串区的长度
            GETF -find &SMBIOSTableData,(%&Type_Start_Last% + %&data_offset% )#%&BIOS_INFO_Len%##0#1#0,*&&BIOS_INFO_CharKeyWords,*&&CharKeyWords
            CALL UUID
        }
    }
    _SUB UUID *
        SET-make &&UUID=&SMBIOSTableData@(%&Type_Start_Last% + 0x08);*16
        SET?long@ &&UUID=&a1:0
        SET?short@ &&UUID=&a2:4
        SET?short@ &&UUID=&a3:( 4 + 2 )
        SET?char@ &&UUID=&a4:( 4 + 2 + 2 )
        SET?char@ &&UUID=&a5:( 4 + 2 + 2 + 1 )
        GETF &&UUID,10#6,&&Node
        SED -ex &&Node=0,0x,,&&Node
        SED -ex &&Node=0, ,,&&Node
        MESS %&a1%-%&a2%-%&a3%-%&a4%%&a5%-%&&Node%
    _END
    最后于 14天前 被123编辑 ,原因:
    123
  • avatar image
    123 14天前
    楼主   8

    这两个都要对着表解析

    Processor Characteristics要对着7.5.9这一节解析,你自己试试看吧,UUID应该没问题了

    123
  • avatar image
    anson4 13天前
    123 这两个都要对着表解析 Processor Characteristics要对着7.5.9这一节解析,你自己试试看吧,UUID应该没问题了

    好的,谢谢!

    文档其实看过好多遍了,只是没有编程基础,比较吃力。

    Processor Characteristics 似乎与 Memory Type 有点类似,我再努力一把,不行的话再上来请教。

    单机计算
返回