You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:26:23