写一段进程管理器代码,但是无法显示文件路径和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
作者: silenceof80 发布时间: 2011-01-04
作者: zara 发布时间: 2011-01-04
作者: zara 发布时间: 2011-01-04
作者: silenceof80 发布时间: 2011-01-04
作者: zara 发布时间: 2011-01-04
作者: silenceof80 发布时间: 2011-01-04
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28