Windows x64汇编中内存管理函数的参数栈位置计算方法
Windows x64汇编中函数参数栈位置计算问题
我对用于文件操作的x64汇编代码(如CreateFileA、WriteFile、ReadFile)的参数栈位置计算存在困惑。
CreateFileA示例
汇编代码中定义了以下参数栈位置:
.dwCreationDisposition equ 32 .dwFlagsAndAttributes equ 36 .hTemplateFile equ 40
对应的CreateFileA函数原型:
HANDLE CreateFileA( [in] LPCSTR lpFileName, // 8字节 [in] DWORD dwDesiredAccess, // 4字节 [in] DWORD dwShareMode, // 4字节 [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 8字节 [in] DWORD dwCreationDisposition, // 4字节 [in] DWORD dwFlagsAndAttributes, // 4字节 [in, optional] HANDLE hTemplateFile // 8字节 );
我了解x86调用约定是所有参数推入栈传递,而Windows x64调用约定是前4个参数通过寄存器(RCX、RDX、R8、R9)传递,从第5个参数开始才推入栈。但我能理解CreateFileA的栈参数位置计算,却搞不懂WriteFile和ReadFile的:
WriteFile示例
汇编代码中定义的参数栈位置:
.lpNumberOfBytesWritten equ 52 .lpOverlapped equ 0 .fileHandle equ 40
对应的WriteFile函数原型:
BOOL WriteFile( [in] HANDLE hFile, // 8字节 [in] LPCVOID lpBuffer, // 8字节 [in] DWORD nNumberOfBytesToWrite, // 4字节 [out, optional] LPDWORD lpNumberOfBytesWritten, // 8字节 [in, out, optional] LPOVERLAPPED lpOverlapped // 8字节 );
ReadFile示例
汇编代码中定义的参数栈位置:
.lpOverlapped2 equ 0 .lpNumberOfBytesRead equ 32 .lpBuffer equ 40
对应的ReadFile函数原型:
BOOL ReadFile( [in] HANDLE hFile, [out] LPVOID lpBuffer, [in] DWORD nNumberOfBytesToRead, [out, optional] LPDWORD lpNumberOfBytesRead, [in, out, optional] LPOVERLAPPED lpOverlapped );
现咨询:如何计算Windows x64汇编中需要推入栈的参数位置?
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

