2011-05-10 68 views
4

我需要用匯編訪問WinMain參數,但我似乎並沒有能夠儘管我理應知道這樣做的,他們是在棧(DWORD偏移量爲0〜 16和0到20時,在操作前推動EBP)。下面還有用於顯示lpszCmdline字符串包含該程序的命令行的例子,但它似乎總是包含0,所以什麼也不顯示。如果我嘗試在彙編代碼中使用其他參數,則不會出現有效的字符串指針,並且/或者程序會按預期崩潰。彙編程序:獲得的Win32的WinMain函數的棧參數


;[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[[email protected]] 
pop ebp 

但是,如果我用​​我能得到一個有效的指針到命令行字符串,並顯示。


call dword[[email protected]] 
    push dword 0x00001030    ;UINT uType 
    push eax       ;LPCTSTR lpCaption 
    push eax       ;LPCTSTR lpText 
    push dword 0      ;HWND hWnd 
    call dword[[email protected]] 

哪裏的第一個代碼塊中的錯誤?我需要做什麼來獲取參數,並能夠實現我自己的代碼返回一個有效的指針lpszCmdLine就像​​,因此,其他WinMain參數?如果我不能從堆棧獲取命令行指針,那麼我想大概無法獲得其他重要初始化參數,如nCmdShow

請讓我知道如果你需要比上面提供了更多的代碼。如果它對你有用,知道了,我沒有使用鏈接器,但是完全手動的EXE生成(WinMain有什麼不同,像進一步的堆棧參數一樣?),但基本上它只是一個程序,Windows自動調用它的入口點而上述將是它將包含什麼程序的兩個不同選項。

+0

StackOverflow不是論壇;如果您需要添加更多詳細信息,請[編輯您的問題](http://stackoverflow.com/posts/5951081/edit)或使用評論與已回答的人交流。答案應該是答案,而不是關於問題的附加信息。 – Will 2011-05-11 13:25:15

回答

6
#include <Windows.h> 

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 
    __asm { 
    mov eax, [ebp+16] 
    push 0 
    push eax 
    push eax 
    push 0 
    call dword ptr ds:[MessageBoxA] 
    } 

    return ERROR_SUCCESS; 
} 

這對我來說在Visual Studio中運行得很好。在調試器中單調地運行它,單個步進會在調用MessageBox時導致訪問衝突。我不確定這是爲什麼,但在沒有單步調試的情況下運行,以及運行最終的二進制文件給出了預期的結果,即。以標題/消息爲參數的消息框