在 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 成员?的主要内容,如果未能解决你的问题,请参考以下文章