2017-06-09 26 views
0

我正在編寫程序,並無法打印出進程的進程ID。我已成功檢索過程的名稱,但是當我打印出過程ID時。它顯示了一切。以下是我的代碼。MASM32如何使用PROCESSENTRY32打印出進程ID

include \masm32\include\masm32rt.inc 

.data 
    cFmt db "%d",0 
    cfr db 1024 dup(?) 

.code 
ProcessSearch proc 
LOCAL sHndl :DWORD 

    push 0 
    push TH32CS_SNAPPROCESS 
    call CreateToolhelp32Snapshot 

    mov sHndl, eax 

    mov pData.dwSize, sizeof pData 

    push offset pData 
    push sHndl 
    call Process32First 

    push offset pData 
    push sHndl 
    call Process32Next 

    process: 

    push offset pData.th32ProcessID 
    push offset cFmt 
    push offset cfr 
    call wsprintf 

    push offset cfr 
    call StdOut 

    push offset pData 
    push sHndl 
    call Process32Next 
    cmp eax, 0 
    jg process 

    push sHndl 
    call CloseHandle 

    ret 

    ProcessSearch endp 
start: 
     call ProcessSearch 
     call ExitProcess 
end start 

我想不通爲什麼我不能打印進程ID。

+1

即使我們想要,我們也無法爲您調試此代碼,因爲它不代表[mcve]。例如,「cFmt」和「cfr」是什麼?它也不清楚是什麼意思,*「它顯示的都是一樣的。」*您是否嘗試過使用調試器來遍歷代碼,並查看它會誤入歧途? Visual Studio包含一個出色的調試器。或者在SDK中免費包含WinDbg。不確定MASM32是否附帶調試器;它可能是,你不能沒有一個組裝開發! –

+0

由於您使用的是masm,爲什麼不使用'invoke'而不是'push/call'?這將簡化代碼很多。 – Michael

+0

我已經用cFmt和cfr的重載值更新了代碼。我很瞭解如何調用可以簡化我的代碼。但是,我需要練習這種基本的編碼風格。 – Pentagon

回答

0

如果您向我們展示完整的代碼,以便我們可以驗證您的字符串/數據是否正確,那將會很好。即使沒有,我可以看到一些問題:

Process32First檢索數據的第一個進程,你需要1)檢查返回值,並2)打印出數據,然後致電Process32Next

wsprintf不是stdcall,你應該在調用它之後用類似lea esp,[esp+12]的東西來恢復堆棧。

+0

當我在我的程序中使用stdout。它不輸出我想要輸出的內容。但是,使用wsprintf我可以指定我期待的數據類型。我相信這是一個DWORD,但我仍然無法弄清楚它是如何完成的。 – Pentagon