2017-06-09 11 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には優れたデバッガが含まれています。または、WinDbgにはSDKと共に無料で含まれています。 MASM32にデバッガが付属しているかどうかは不明です。それはおそらく、あなたは1つなしでアセンブリの開発を行うことはできません! –

+0

あなたはmasmを使っているので、 'push/call'の代わりに' invoke'を使わないのはなぜですか?それは、コードを単純化するでしょう。 – Michael

+0

私はcFmtとcfrのrepsective値でコードを更新しました。私は、呼び出しがどのようにして自分のコードを単純化できるかをよく知っています。しかし、私はこの種のコーディングスタイルを基本に練習する必要がありました。 – Pentagon

答えて

0

文字列/データが正しいことを確認できるように完全なコードを表示していただければ幸いです。それがなくても、

Process32Firstは、最初のプロセスのデータを取得するため、戻り値をチェックし、2)データを印刷してからProcess32Nextを呼び出す必要があります。

wsprintfはstdcallではありませんので、おそらくlea esp,[esp+12]のようなものでスタックを復元してください。

+0

私のプログラムでstdoutを使うとき。私はそれが出力したいものを出力しません。しかし、wsprintfを使って、私が期待しているデータの種類を指定することができます。私はそれがDWORDだと信じていますが、私はまだそれがどのように行われたか把握できません。 – Pentagon

関連する問題