+ -
当前位置:首页 → 问答吧 → 写一段进程管理器代码,但是无法显示文件路径和ID,各位大爷帮下小弟

写一段进程管理器代码,但是无法显示文件路径和ID,各位大爷帮下小弟

时间:2011-01-04

来源:互联网

代码如下
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include advapi32.inc
includelib advapi32.lib
include shell32.inc
include psapi.inc
include shlwapi.inc
include debug.inc
includelib shell32.lib
includelib psapi.lib
includelib shlwapi.lib
includelib debug.lib
ICO_MAIN EQU 1000
DLG_MAIN EQU 1001
IDC_PROCESS EQU 1002
IDC_REFRESH EQU 1003
IDM_MENU EQU 1004
IDM_EXIT EQU 1005
IDM_LOGOUT EQU 1006
IDM_SHUTDOWN EQU 1007
IDM_REBOOT EQU 1008
IDM_SLEEP EQU 1009
.DATA?
hInstance dd ?
hWinList dd ?
hMenu dd ?
lpBuffer db 256 DUP (?)
szBuffer1 db 1024 dup(?)

.data
show db "%8d",0
.const
szErrTerminate db "无法结束该进程",0
szMenuExit dd "退出",0
szPrivlegName db "SeShutdownPrivilege",0
szErrFormat db '错误,错误代码为:%d',0

.code
_GetProcessInformation Proc uses edi row:DWORD,lpFind:DWORD
local lvi:LV_ITEM
local sfi:SHFILEINFO
local szBuff0[20]:BYTE, szBuff1[256],szPath[MAX_PATH]
LOCAL @_hProcess,hModule
mov edi,lpFind
  assume edi:ptr PROCESSENTRY32

invoke RtlZeroMemory,addr szBuff0,sizeof szBuff0
  invoke RtlZeroMemory,addr szBuff1,sizeof szBuff1
  invoke RtlZeroMemory,addr szPath,sizeof szPath
mov lvi.imask, LVIF_TEXT or LVIF_IMAGE
  push row
  pop lvi.iItem
  mov lvi.iSubItem, 0
  lea eax,[edi].szExeFile;这个是进程名
  mov lvi.pszText,eax
  mov lvi.iImage, 0
  invoke wsprintf,addr lpBuffer,addr show,[edi].th32ProcessID
  invoke OpenProcess,PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, [edi].th32ProcessID
  .if eax
  mov ebx,eax
  invoke GetModuleFileNameEx,ebx,0,addr szPath, sizeof szPath
  .endif
  .if eax
  invoke SHGetFileInfo,addr szPath, 0, addr sfi, sizeof SHFILEINFO,SHGFI_SYSICONINDEX or SHGFI_SMALLICON
  mov eax, sfi.iIcon
  mov lvi.iImage, eax
  .endif
  invoke SendMessage,hWinList, LVM_INSERTITEM, 0, addr lvi
  mov lvi.imask,LVIF_TEXT or LVCF_SUBITEM
  inc lvi.iSubItem
  lea eax,lpBuffer ;这个是进程PID
  mov lvi.pszText,eax
  invoke SendMessage,hWinList,LVM_SETITEM, 0,addr lvi
  mov lvi.imask,LVIF_TEXT or LVCF_SUBITEM
  inc lvi.iSubItem
  lea eax,szPath ;这个是进程路径
  mov lvi.pszText,eax
  invoke SendMessage,hWinList,LVM_SETITEM, 0,addr lvi
assume edi:nothing
invoke CloseHandle,@_hProcess
invoke CloseHandle,hModule
ret
_GetProcessInformation endp

_GetProcessList Proc _hWnd
LOCAL @stProcess:PROCESSENTRY32
LOCAL @hSnapShot
LOCAL @dwProcNum


invoke RtlZeroMemory,addr @stProcess,sizeof @stProcess
invoke SendMessage,hWinList,LB_RESETCONTENT,0,0
mov @stProcess.dwSize,sizeof @stProcess
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
mov @hSnapShot,eax
invoke Process32First,@hSnapShot,addr @stProcess
xor edi,edi
.while eax

invoke SendMessage,hWinList,LB_ADDSTRING,0,addr @stProcess.szExeFile
invoke SendMessage,hWinList,LB_SETITEMDATA,eax,@stProcess.th32ProcessID
invoke _GetProcessInformation,edi,addr @stProcess
inc edi
invoke Process32Next,@hSnapShot,addr @stProcess

.endw
mov @dwProcNum,edi
invoke CloseHandle,@hSnapShot
invoke wsprintf,addr szBuffer1,CTEXT("%d"),@dwProcNum;进程数
invoke GetDlgItem,_hWnd,IDOK
invoke EnableWindow,eax,FALSE
ret

_GetProcessList endp
InitListView proc
local sfi:SHFILEINFO
local lvc:LV_COLUMN
local lpidl:DWORD
  mov eax, LVS_EX_FULLROWSELECT or LVS_EX_HEADERDRAGDROP or LVS_EX_SUBITEMIMAGES or LVS_EX_GRIDLINES
  invoke SendMessage,hWinList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, eax
  invoke SHGetFileInfo,CTEXT("C:\"),0,addr sfi,sizeof SHFILEINFO,SHGFI_SYSICONINDEX or SHGFI_SMALLICON
  invoke SendMessage,hWinList,LVM_SETIMAGELIST,LVSIL_SMALL,eax
  mov lvc.imask, LVCF_TEXT or LVCF_WIDTH
  mov lvc.pszText,CTEXT("进程名")
  mov lvc.lx, 150
  invoke SendMessage,hWinList, LVM_INSERTCOLUMN, 0, addr lvc  
  mov lvc.imask, LVCF_TEXT or LVCF_WIDTH
mov lvc.pszText,CTEXT("进程ID")
mov lvc.lx, 80
invoke SendMessage,hWinList, LVM_INSERTCOLUMN, 1, addr lvc
mov lvc.imask, LVCF_TEXT or LVCF_WIDTH
mov lvc.pszText,CTEXT("文件路径")
mov lvc.lx, 400
invoke SendMessage,hWinList, LVM_INSERTCOLUMN, 3, addr lvc
ret
InitListView endp
_CloseComputer proc  
  local hToken
  local tmpLuid:LUID,tkp:TOKEN_PRIVILEGES; 这个结构 有两个元素,一个 是 PrivilegeCount 表示后面数组元素的个数,另外一个是LUID_AND_ATTRIBUTES 表示 luid和他状态
  local szBuffer[1024]:BYTE
   
  invoke GetCurrentProcess  
  lea ebx,hToken
  invoke OpenProcessToken,eax, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, EBX
  invoke LookupPrivilegeValue,NULL,addr szPrivlegName,addr tmpLuid
   
  mov tkp.PrivilegeCount,1
  push tmpLuid.LowPart
  pop tkp.Privileges[0].Luid.LowPart
  push tmpLuid.HighPart
  pop tkp.Privileges[0].Luid.HighPart
  mov tkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED;这一段就是说将luid传入TKP结构的luid中,再将SE_PRIVILEGE_ENABLED传入Attributes中

  invoke AdjustTokenPrivileges,hToken, FALSE, addr tkp, sizeof TOKEN_PRIVILEGES, NULL,NULL
  .if eax == NULL
  invoke GetLastError
invoke wsprintf,addr szBuffer,offset szErrFormat,eax
  invoke MessageBox,NULL,addr szBuffer,NULL,MB_OK or MB_ICONINFORMATION
  .endif
  ret
_CloseComputer Endp
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lparam
LOCAL @stRect:RECT
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
call InitListView
invoke GetDlgItem,hWnd,IDC_PROCESS
mov hWinList,eax

invoke _GetProcessList,hWnd
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == IDOK
invoke SendMessage,hWinList,LB_GETCURSEL,0,0
invoke SendMessage,hWinList,LB_GETITEMDATA,eax,0
invoke OpenProcess,PROCESS_TERMINATE,FALSE,eax
.if eax
mov ebx,eax
invoke TerminateProcess,ebx,-1
invoke CloseHandle,ebx
invoke Sleep,200
invoke _GetProcessList,hWnd

.endif
.elseif ax == IDC_REFRESH
invoke _GetProcessList,hWnd
.elseif ax == IDC_PROCESS
shr eax,16
.if ax == LBN_SELCHANGE
invoke GetDlgItem,hWnd,IDOK
invoke EnableWindow,eax,TRUE
.endif
.elseif ax == IDM_EXIT
invoke EndDialog,hWnd,NULL
.elseif ax == IDM_SHUTDOWN
call _CloseComputer
invoke ExitWindowsEx, EWX_SHUTDOWN OR EWX_POWEROFF OR EWX_FORCE ,NULL ;关机
.elseif ax == IDM_REBOOT
call _CloseComputer
invoke ExitWindowsEx,EWX_REBOOT or EWX_FORCE,NULL ;重启
.elseif ax == IDM_LOGOUT
call _CloseComputer
invoke ExitWindowsEx,EWX_LOGOFF or EWX_FORCE,NULL;注销
.elseif ax== IDM_SLEEP
call _CloseComputer
invoke SetSystemPowerState,FALSE,TRUE
.endif
.else
mov eax,FALSE
ret


.endif
mov eax,TRUE


ret

_ProcDlgMain endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke LoadMenu,hInstance,IDM_MENU
mov hMenu,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL

invoke ExitProcess,NULL
end start
  以下是资源文件
#include "F:\MASM32\INCLUDE\resource.h"

#define IDM_MENU 1004
#define ICO_MAIN 1000
#define DLG_MAIN 1001
#define IDC_PROCESS 1002
#define IDC_REFRESH 1003
#define IDM_EXIT 1005
#define IDM_LOGOUT 1006
#define IDM_SHUTDOWN 1007
#define IDM_REBOOT 1008
#define IDM_SLEEP 1009
ICON_MAIN ICON "2629.ico"
IDM_MENU MENU discardable
BEGIN
POPUP "文件"
begin
 
menuitem "退出",IDM_EXIT
  END
  popup "高级"
  begin
  menuitem "注销",IDM_LOGOUT
  MENUITEM "关闭",IDM_SHUTDOWN
  MENUITEM "重启",IDM_REBOOT
  menuitem "休眠",IDM_SLEEP
  END
END

DLG_MAIN DIALOG 76,95,185,200
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_SYSMENU | WS_CAPTION
CAPTION "进程列表"
FONT 9, "宋体"
MENU IDM_MENU
{
LISTBOX IDC_PROCESS ,8,5,173,190,LBS_STANDARD | LBS_SORT
PUSHBUTTON "刷新", IDC_REFRESH,90,185,45,14
DEFPUSHBUTTON "终止(&T)", IDOK, 137, 185, 45, 14, BS_DEFPUSHBUTTON | WS_DISABLED | WS_TABSTOP

}
  代码执行的 结果

作者: silenceof80   发布时间: 2011-01-04

不知道怎么搞,图片不能显示,反正就是 没有显示进程ID 和进程路径 不知道为啥,哪位仁义的大爷帮帮小弟我吧

作者: silenceof80   发布时间: 2011-01-04

看你代码的意思,似乎是想用 SysListView32 控件来显示的?但对话框里定义的却是 ListBox 。ListBox 不支持多列的。

作者: zara   发布时间: 2011-01-04

抱歉,看错了!

作者: zara   发布时间: 2011-01-04

哇,大哥又遇见你了

作者: silenceof80   发布时间: 2011-01-04

抱歉,快下班了,只看出来了 InitListView 子程进行初始化时,hWndList 还没有赋值,其中使用到的 CTEXT("...") 这样的,是对象模式,给的是对象的地址,而不是其中字符的纯粹的地址

作者: zara   发布时间: 2011-01-04

谢谢大哥

作者: silenceof80   发布时间: 2011-01-04