在 MASM 中,如何访问 PDH_FMT_COUNTERVALUE 结构中的 longValue 成员?

Posted

技术标签:

【中文标题】在 MASM 中,如何访问 PDH_FMT_COUNTERVALUE 结构中的 longValue 成员?【英文标题】:In MASM, how to access the longValue member within the PDH_FMT_COUNTERVALUE struct? 【发布时间】:2021-11-09 03:01:00 【问题描述】:

处理项目以获取当前的 CPU 负载。 我在访问此结构中的 longvalue 时遇到困难:(sizeof 为 16 字节)

   PDH_FMT_COUNTERVALUE STRUCT 8
                   CStatus                        DWORD ?
                   UNION                         
                   longValue                      DWORD ?
                   doubleValue                    QWORD ?
                   largeValue                     QWORD ?
                   pAnsiStringValue               QWORD ?
                   pWideStringValue               QWORD ?
                   ENDS                          
   PDH_FMT_COUNTERVALUE ENDS

最初,我尝试使用此 MASM 代码,但 CPU 使用率始终为 0。 (我认为它是在 CStatus 的前 4 个字节之后查看成员填充)

              LOCAL           value:PDH_FMT_COUNTERVALUE
              ...
              LEA             R9,value
              MOV             EAX,DWORD PTR [R9+PDH_FMT_COUNTERVALUE.longValue]
              MOV             cput,RAX

但是,通过添加 4,它正确地找到了 longvalue

              LOCAL           value:PDH_FMT_COUNTERVALUE
              ...
              LEA             R9,value
              MOV             EAX,DWORD PTR [R9+PDH_FMT_COUNTERVALUE.longValue+4] ;; <-- +4 added here
              MOV             cput,RAX

请注意,以下偏移量解析为整体 +8

PDH_FMT_COUNTERVALUE.longValue+4 ;; dword ptr [r9+8]

为了比较,MSVC 编译器生成正确的 +8 偏移量: (它取消引用一个字节,即使它被定义为一个 DWORD)

cput = value.longValue;
movzx       eax,byte ptr [value+8h]  
mov         byte ptr [cput],al  

问题

这段代码看起来很黑 [R9+PDH_FMT_COUNTERVALUE.longValue+4],那么有没有更合法的方法可以直接在 MASM 中引用 longvalue 成员?

编辑

可能的解决方案,手动填充结构允许访问 longValue

   PDH_FMT_COUNTERVALUE STRUCT 8
                   CStatus                        DWORD ?
                   padding                        BYTE 4 DUP (?)
                   UNION                         
                   longValue                      DWORD ?
                   doubleValue                    QWORD ?
                   largeValue                     QWORD ?
                   pAnsiStringValue               QWORD ?
                   pWideStringValue               QWORD ?
                   ENDS                          
   PDH_FMT_COUNTERVALUE ENDS

【问题讨论】:

【参考方案1】:

不幸的是,我不知道比这更清洁的解决方案,但这应该可以工作:

COUNTERVALUE UNION                    
    longValue                      DWORD ?
    doubleValue                    QWORD ?
    largeValue                     QWORD ?
    pAnsiStringValue               QWORD ?
    pWideStringValue               QWORD ?
COUNTERVALUE ENDS                          

PDH_FMT_COUNTERVALUE STRUCT 8
    CStatus                        DWORD ?
    COUNTERVALUE                   <>
PDH_FMT_COUNTERVALUE ENDS

【讨论】:

以上是关于在 MASM 中,如何访问 PDH_FMT_COUNTERVALUE 结构中的 longValue 成员?的主要内容,如果未能解决你的问题,请参考以下文章

在 MASM 中访问数组

访问段寄存器 MASM

在 MASM 8086 程序集中读取多个文件

x86 MASM - 传递和访问二维数组

有没有办法防止 MASM 更改指令?

运行循环时 MASM x86 访问冲突