Assembly MASM32如何使用PROCESSENTRY32打印进程id
我正在编写一个程序,打印进程的进程id时遇到问题。我已成功检索到进程的名称,但当我打印进程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
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可以指定所需的数据类型。我相信这是一个德沃德,但我仍然不知道如何做到这一点。