我在 winapi (sysinfoapi.h) 中内置了一个 GetSystemInfo 函数,我该如何调用它?
然后将函数调用的响应放入内存位置。
C++:
void GetSystemInfo(
LPSYSTEM_INFO lpSystemInfo
);
官方文档:https ://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsysteminfo
这就是我能找到的。
我在 winapi (sysinfoapi.h) 中内置了一个 GetSystemInfo 函数,我该如何调用它?
然后将函数调用的响应放入内存位置。
C++:
void GetSystemInfo(
LPSYSTEM_INFO lpSystemInfo
);
官方文档:https ://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsysteminfo
这就是我能找到的。
尽可能少的 fasm 示例,结果是一个 32 位控制台 exe 文件:
这里例如只输出前两个字段的值——
wProcessorArchitecture和dwPageSize。在 32 位版本中,它输出:
0对应
PROCESSOR_ARCHITECTURE_INTEL,见结构说明SYSTEM_INFO如果您将 PE 代码更改为 PE64 和
include 'win32a.inc',include 'win64a.inc'您将获得一个 64 位可执行文件,输出将如下所示:9 对应
PROCESSOR_ARCHITECTURE_AMD64。“魔术”字符串
system_info SYSTEM_INFO是一个宏,在编译时,它会扩展为一组相应结构的字段,例如,对于 32 位可执行文件(取自文件fasm/include/equates/kernel32.inc):对于 64 位版本,一切都相同,只是指针字段(以 开头的
lp)的大小不同 - 64 位 (dq) 而不是 32 位 (dd)。还应该说
invoke,cinvoke宏是在编译时根据程序开头包含的文件转换为不同代码的宏 -win32a.inc或win64a.inc.对于 32 位版本
invoke,它变成 0 或更多push,call最后是约定stdcall。因为cinvoke顺序是push相反的,然后call堆栈与传递的参数的大小对齐push- 一个协议cdecl(用于具有可变数量参数的函数,就像同一个printf)。请参阅在 x86 上使用 32 位寻址的调用约定。对于 64 位版本,一切都有些复杂,可以参考这里:Calling convention for 64-bit systems
PS或多或少等效的C代码: