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

In MASM, how to access the longValue member within the PDH_FMT_COUNTERVALUE struct?

正在处理一个项目以获得当前 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

不幸的是,我不知道有比这更干净的解决方案,但这应该可行:

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