代码之家  ›  专栏  ›  技术社区  ›  Owen

在哪里可以找到要传递到Windows API函数的数据

  •  1
  • Owen  · 技术社区  · 2 年前

    据我所知,在x86-64程序集中完成任务的最佳方法不是自己编程。相反,让窗户为你做这件事。比如打开一个新控制台或将文本打印到控制台窗口。但是,你不能直接调用windows系统调用,因为这些调用很容易被微软更改。因此,您可以通过调用命令调用Windows API。

    因此,我希望能够在Windows 10上用x86-64程序集编写完整的应用程序,但很难找到有关Windows API的信息。具体来说,在调用windows API函数之前,要将哪些信息/数据/数字传递到RCX、RDX、R8和R9?例如,我在互联网上找到的一个Hello World程序同时使用“GetStdHandle”和“WriteConsoleA”。我知道它们的作用,但我不知道所有的数字和寄存器操作意味着什么,也不知道它如何影响windows API。这是代码:

    extern GetStdHandle
    extern WriteConsoleA
    
    section .data
        msg: db "HelloWorld"
        msglen: equ $-msg
    
    section .bss
    
    section .text
    start:
    
        mov ECX, -11
        call GetStdHandle
    
        mov RCX, RAX
        mov RDX, msg
        mov R8, msglen
        lea R9, [RSP-16]
        call WriteConsoleA
    
        mov EAX, 0
    
        ret
    

    这是与NASM一起编译的,并与Golink链接。这是make文件:

    {NasmPath} -f win64 HelloWorld.asm
    {GoLinkPath} HelloWorld.obj /console kernel32.dll
    

    为了澄清,我没有通过控制台运行{NasmPath}或{GoLinkPath},我只是对其进行了编辑,因为实际路径中有我的名字。

    TLDR:在哪里可以找到有关哪些数据要通过寄存器RCX、RDX、R8和R9传递到Windows API函数的信息?

    1 回复  |  直到 2 年前
        1
  •  3
  •   Chuck Walbourn    2 年前

    Windows x64调用约定记录在 Microsoft Docs .

    的呼叫 GetStdHandle 很简单:它正在通过 STD_OUTPUT_HANDLE (-11)作为使用ECX的第一个参数;返回值以RAX为单位。

    的呼叫 WriteConsoleA 有点棘手。从技术上讲,该函数接受5个参数,最后一个参数是保留的,但代码只传递了4个。

    请记住,由于需要异常展开信息,因此编写完全“正确”的Windows x64程序集非常棘手。有一些MASM宏,但不了解NASM。