获取 Explorer 进程 ID 的两种方式
由进程 ID 进而用 OpenProcess 函数获取句柄
1. 通过桌面类和名称
.data?
szDesktopClass db 'Progman',0 ; 桌面的窗口类
szDesktopWindow db 'Program Manager',0 ; 桌面的窗口名称
dwProcessID dd ? ; 保存进程 ID
dwThreadID dd ? ; 保存线程 ID
.code
invoke FindWindow,addr szDesktopClass,addr szDesktopWindow ; 获取桌面窗口句柄
invoke GetWindowThreadProcessId,eax,offset dwProcessID ; 获取进程 ID
mov dwThreadID,eax ; 线程 ID
2. 进程快照方式,比较可执行文件名
.data?
szExplorer db 'EXPLORER.EXE',0 ; 可执行文件名
dwExplorerID dd ? ; 保留 Explorer 进程 ID
.code
_ProcTest proc
local @stProcess:PROCESSENTRY32 ; 每一个进程的信息
local @hSnapShot ; 快照句柄
pushad
invoke RtlZeroMemory,addr @stProcess,sizeof @stProcess ; 0 初始化进程结构
mov @stProcess.dwSize,sizeof @stProcess ; 手工填写 结构大小
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0 ; 获取进程快照
mov @hSnapShot,eax ; 快照句柄
invoke Process32First,@hSnapShot,addr @stProcess ; 第一个进程
.while eax
invoke lstrcmp,addr @stProcess.szExeFile,addr szExplorer ; 比较文件名
.if eax == 0 ; 为 0 ,说明进程名相同
mov eax,@stProcess.th32ProcessID
mov dwExplorerID,eax
.endif
invoke Process32Next,@hSnapShot,addr @stProcess ; 下一个进程
.endw
invoke CloseHandle,@hSnapShot ; 关闭快照
popad
_ProcTest endp