【发布时间】: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
【问题讨论】: