MASM32 Process32FirstW无法正常工作

时间:2017-06-01 08:16:50

标签: assembly x86 msdn masm32

我一直在尝试调试此代码。我的Process32First函数只是继续返回一个无效的值。我不知道它有什么问题。有人可以帮我解决这个问题吗?

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

这是我的最新代码。

2 个答案:

答案 0 :(得分:1)

您正在调用Process32FirstWProcess32First的Unicode(宽字符)版本。所以你需要一个宽字符版本的PROCESSENTRY32,其中TCHAR被定义为WORD。 MASM32 SDK的windows.inc没有这样的版本,但ANSI版本(TCHAR =&gt; BYTE)。据我所知,你不需要Unicode版本。取下大写&#34; W&#34;来自Process32FirstW

如果你绝对想要使用Unicode版本,你必须声明一个特殊的&#34; PROCESSENTRY32W&#34;结构:

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

答案 1 :(得分:0)

我找到了让它运行的另一种选择。我将process32FirstW和Process32NextW替换为了mas3232的include文件夹中的kernel32.inc和kernel32p.inc文件中的Process32First和Process32Next。之后我在masm32文件夹中运行makelibs.bat。我的代码可以运行。

希望这个选项也有帮助!