【问题标题】:In MASM, how to access the longValue member within the PDH_FMT_COUNTERVALUE struct?在 MASM 中,如何访问 PDH_FMT_COUNTERVALUE 结构中的 longValue 成员?
【发布时间】: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

【问题讨论】:

    标签: c masm


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 2023-03-22
      • 2022-01-04
      • 1970-01-01
      • 2022-09-22
      相关资源
      最近更新 更多