我需要WinMain
使用程序集访问参数,但我似乎无法这样做,尽管我应该知道它们在堆栈中的位置(DWORD 偏移量为 0 到 16,在操作前推送 EBP 时为 0 到 20)。下面有一个示例显示包含程序命令行lpszCmdline
的字符串,但它似乎总是包含 0,因此没有显示任何内容。如果我尝试在汇编代码中使用其他参数,则似乎不存在有效的字符串指针和/或程序崩溃,如预期的那样。
;[esp+20]==nCmdShow
;[esp+16]==lpszCmdLine
;[esp+12]==0 in win32
;[esp+8]==hInst
;[esp+4]==EIP
;[esp+0]==EBP
push ebp
mov ebp,esp
mov eax,[ebp+16]
push dword 0x00001030 ;UINT uType
push eax ;LPCTSTR lpCaption
push eax ;LPCTSTR lpText
push dword 0 ;HWND hWnd
call dword[MessageBoxA@USER32.DLL]
pop ebp
但是,如果我使用,GetCommandLine
我可以获得一个指向命令行字符串的有效指针,它会显示出来。
call dword[GetCommandLineA@KERNEL32.DLL]
push dword 0x00001030 ;UINT uType
push eax ;LPCTSTR lpCaption
push eax ;LPCTSTR lpText
push dword 0 ;HWND hWnd
call dword[MessageBoxA@USER32.DLL]
第一个代码块的错误在哪里?我需要什么来获取参数,并能够实现我自己的代码来返回一个有效的指针,lpszCmdLine
就像返回GetCommandLine
其他WinMain
参数一样?如果我无法从堆栈中获取命令行指针,那么我可能无法获取其他参数,例如nCmdShow
用于其他重要初始化的 。
如果您需要比上面提供的更多的代码,请告诉我。如果它对您有用,我没有使用链接器,而是完全手动生成 EXE(它是否有任何区别WinMain
,比如进一步的堆栈参数?),但基本上它只是一个 Windows 自动调用其入口点的程序和上面的将是它包含的程序的 2 个不同选项。