MASM32 Process32FirstW 不工作

MASM32 Process32FirstW not working

我一直在尝试调试这段代码。我的 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

这是我最新的代码。

您正在调用 Process32FirstWProcess32First. So you need a wide character version of PROCESSENTRY32 的 Unicode(宽字符)版本,其中 TCHAR 被定义为 WORD。 MASM32 SDK的windows.inc没有这样的版本,而是ANSI版本(TCHAR => BYTE)。据我所知,您不需要 Unicode 版本。从 Process32FirstW.

中删除大写 "W"

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

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

我找到了另一种选择 运行。我在 masm32 的包含文件夹内的文件 kernel32.inc 和 kernel32p.inc 中用 Process32First 和 Process32Next 替换了 Process32FirstW 和 Process32NextW。之后,我在 masm32 文件夹中 运行 makelibs.bat。我的代码有效。

希望这个选项也能有所帮助!