Assembly MASM32如何使用PROCESSENTRY32打印进程id

Assembly MASM32如何使用PROCESSENTRY32打印进程id,assembly,masm,msdn,masm32,Assembly,Masm,Msdn,Masm32,我正在编写一个程序,打印进程的进程id时遇到问题。我已成功检索到进程的名称,但当我打印进程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 CreateToolhelp32S

我正在编写一个程序,打印进程的进程id时遇到问题。我已成功检索到进程的名称,但当我打印进程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。

如果您向我们展示完整的代码,以便我们可以验证您的字符串/数据是否正确,那就太好了。即使没有这些,我也能看到一些问题:

Process32First
检索第一个进程的数据,在调用
Process32Next
之前,需要1)检查返回值,2)打印数据


wsprintf
不是stdcall,调用它之后,您可能应该使用类似
lea esp[esp+12]
的东西来恢复堆栈。

即使我们愿意,我们也无法为您调试此代码,因为它不代表一个错误。例如,什么是
cFmt
cfr
?也不清楚“它仍然显示”是什么意思。您是否尝试过使用调试器来逐步检查代码并查看其误入歧途?VisualStudio包含一个优秀的调试器。或者,SDK中免费包含WinDbg。不确定MASM32是否附带调试器;它可能是这样的,没有它你就无法进行汇编开发!既然您使用的是masm,为什么不使用
invoke
而不是
push/call
?这将大大简化代码。我已经用代表性的cFmt和cfr值更新了代码。我很清楚invoke如何简化我的代码。然而,当我在程序中使用stdout时,我需要练习这种基本的编码风格。它没有输出我希望它输出的内容。但是,使用wsprintf可以指定所需的数据类型。我相信这是一个德沃德,但我仍然不知道如何做到这一点。