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