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
这是我最新的代码。
您正在调用 Process32FirstW
,Process32First
. 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。我的代码有效。
希望这个选项也能有所帮助!
我一直在尝试调试这段代码。我的 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
这是我最新的代码。
您正在调用 Process32FirstW
,Process32First
. So you need a wide character version of PROCESSENTRY32
的 Unicode(宽字符)版本,其中 TCHAR 被定义为 WORD。 MASM32 SDK的windows.inc
没有这样的版本,而是ANSI版本(TCHAR => BYTE)。据我所知,您不需要 Unicode 版本。从 Process32FirstW
.
如果你绝对想使用 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。我的代码有效。
希望这个选项也能有所帮助!