2017-06-01 24 views
1

私はこのコードをデバッグしようとしています。私のProcess32First関数は無効な値を返すだけです。私は何が間違っているのか分からない。誰かがこの問題で私を助けることができますか?MASM32 Process32FirstW not working

include \masm32\include\masm32rt.inc 

.data 
    err db "Error!",0 

.data? 
    procData PROCESSENTRY32 <> 
    procH HANDLE ? 

.code 
start: 
    lea esi, procData 

    push 0 
    push TH32CS_SNAPPROCESS 
    call CreateToolhelp32Snapshot 

    mov procH, eax 

    mov procData.dwSize, sizeof PROCESSENTRY32 

    push offset procData 
    push procH 
    call Process32First 

    .if eax == 0 
    jmp _err 
    .endif 

    jmp _end 


_err: 
    push offset err 
    call StdOut 

_end: 
    push 0 
    call ExitProcess 
end start 

これは私の最新コードです。

答えて

1

あなたはProcess32FirstWというユニコード(ワイド文字)バージョンProcess32Firstを呼び出しています。したがって、PROCESSENTRY32のワイド文字バージョンが必要です。ここで、TCHARはWORDとして定義されています。 MASM32 SDKのwindows.incにはこのようなバージョンはなく、ANSIバージョン(TCHAR => BYTE)があります。私が見る限り、あなたはUnicodeバージョンは必要ありません。大文字の "W"をProcess32FirstWから削除します。私はそれを実行することで別のオプションを発見した

include \masm32\include\masm32rt.inc 

PROCESSENTRY32W STRUCT 
    dwSize    DWORD ? 
    cntUsage   DWORD ? 
    th32ProcessID  DWORD ? 
    th32DefaultHeapID DWORD ? 
    th32ModuleID  DWORD ? 
    cntThreads   DWORD ? 
    th32ParentProcessID DWORD ? 
    pcPriClassBase  DWORD ? 
    dwFlags    DWORD ? 
    szExeFile   dw MAX_PATH dup(?) 
PROCESSENTRY32W ENDS 

.data 
    err db "Error!",0 

.data? 
    procData PROCESSENTRY32W <> 
    procH HANDLE ? 

.code 
start: 
    lea esi, procData 

    push 0 
    push TH32CS_SNAPPROCESS 
    call CreateToolhelp32Snapshot 

    mov procH, eax 

    ;https://msdn.microsoft.com/de-de/library/windows/desktop/ms684834(v=vs.85).aspx 
    mov procData.dwSize, sizeof PROCESSENTRY32W 

    push offset procData 
    push procH 
    call Process32FirstW 

    .if eax == 0 
     jmp _err 
    .endif 

    printf ("%S\n", OFFSET procData.szExeFile) 

    jmp _end 


_err: 
    push offset err 
    call StdOut 

_end: 
    push 0 
    call ExitProcess 
end start 
+0

ありがとうございますrkhb!あなたは私のコーディングで大きな時間を私に助けています。 – Pentagon

0

:あなたは絶対にUnicodeバージョンを使用したい場合は

、あなたは特別な「PROCESSENTRY32W」構造を宣言する必要があります。私は、Process32FirstWとProcess32NextWを、Process32FirstとProcess32Nextの代わりに、masm32のインクルードフォルダ内のkernel32.incとkernel32p.incファイルに置き換えました。その後、私はmasm32フォルダ内のmakelibs.batを実行します。そして私のコードは動作します。

このオプションを参考にしても役に立ちます。