📄 proclistwnd.c
字号:
/******************************************************************//* *//* Winpooch : Windows Watchdog *//* Copyright (C) 2004-2006 Benoit Blanchon *//* *//* This program is free software; you can redistribute it *//* and/or modify it under the terms of the GNU General Public *//* License as published by the Free Software Foundation; either *//* version 2 of the License, or (at your option) any later *//* version. *//* *//* This program is distributed in the hope that it will be *//* useful, but WITHOUT ANY WARRANTY; without even the implied *//* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR *//* PURPOSE. See the GNU General Public License for more *//* details. *//* *//* You should have received a copy of the GNU General Public *//* License along with this program; if not, write to the Free *//* Software Foundation, Inc., *//* 675 Mass Ave, Cambridge, MA 02139, USA. *//* *//******************************************************************//******************************************************************//* Build configuration *//******************************************************************/#define TRACE_LEVEL 2/******************************************************************//* Includes *//******************************************************************/// module's interface#include "ProcListWnd.h"// standard headers#include <windows.h>#include <windowsx.h>#include <commctrl.h>#include <tchar.h>// project's headers#include "Assert.h"#include "Language.h"#include "ProcList.h"#include "ProjectInfo.h"#include "Resources.h"#include "SpyServer.h"#include "Trace.h"/******************************************************************//* Internal constants *//******************************************************************/// column identifiers#define COL_NAME 0#define COL_PID 1#define COL_STATE 2#define COL_PATH 3// window class name#define WC_PROCWND TEXT("ProcListWnd")// messages#define WM_REFRESH (WM_USER+10)LPCTSTR g_szProcessMenu = TEXT("Process menu") ;LPCTSTR g_szKillProcess = TEXT("Kill selected process") ;LPCTSTR g_szHookProcess = TEXT("Hook selected process") ;LPCTSTR g_szUnhookProcess = TEXT("Unhook selected process") ;LPCTSTR g_szConfirmKillProcess = TEXT("Are you sure you do want to kill this process ?") ;LPCTSTR g_szConfirmKillProtectedProcess = TEXT("This process is protected, are you sure you do want to kill it ?") ;LPCTSTR g_szFailedToKillProcess = TEXT("Failed to kill process") ;/******************************************************************//* Internal functions *//******************************************************************/LRESULT CALLBACK _ProcListWnd_WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ;BOOL _ProcListWnd_AddProcess (void *, PROCSTRUCT *) ;VOID _ProcListWnd_UpdateProcessId (HWND hwndList, PROCADDR) ;VOID _ProcListWnd_UpdateProcess (HWND hwndList, PROCSTRUCT*) ;VOID _ProcListWnd_RemProcess (HWND hwndList, PROCADDR) ;int CALLBACK _ProcListWnd_ItemCompare (LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) ;/******************************************************************//* Exported function : RegisterClass *//******************************************************************/BOOL ProcListWnd_RegisterClass (HINSTANCE hInstance) { WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = _ProcListWnd_WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = WC_PROCWND ; return 0!=RegisterClass (&wndclass) ;}/******************************************************************//* Exported function : CreateWindow *//******************************************************************/HWND ProcListWnd_CreateWindow (HINSTANCE hInstance, HWND hwndParent){ return CreateWindow (WC_PROCWND, NULL, WS_CHILD, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwndParent, NULL, hInstance, NULL) ;}/******************************************************************//* Internal function : WndProc *//******************************************************************/LRESULT CALLBACK _ProcListWnd_WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ static HWND g_hwndList ; static HINSTANCE g_hInstance ; static HMENU g_hmenuProcess ; static PROCADDR g_nSelectedProcessAddr ; static int g_nSortParam ; int nWidth ; int nHeight ; LV_COLUMN lvc ; HIMAGELIST hImList ; switch (message) { case WM_CREATE: { g_hInstance = ((CREATESTRUCT*)lParam)->hInstance ; g_hwndList = CreateWindowEx (WS_EX_CLIENTEDGE, WC_LISTVIEW, NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|LVS_REPORT|LVS_SINGLESEL, 0,0,0,0, hwnd, (HMENU)IDC_PROCESSLIST, g_hInstance, NULL) ; ListView_SetExtendedListViewStyle (g_hwndList, LVS_EX_FULLROWSELECT|LVS_EX_SUBITEMIMAGES) ; // // Init image list for process list // hImList = ImageList_Create (16,16,ILC_COLOR32,16,8) ; ListView_SetImageList (g_hwndList, hImList, LVSIL_SMALL) ; g_nSelectedProcessAddr = 0 ; g_nSortParam = -1 ; // menu will be created by WM_LANGUAGECHANGED g_hmenuProcess = NULL ; hImList = ImageList_Create (8, 8, ILC_COLOR|ILC_MASK, 2, 16) ; ImageList_AddIcon (hImList, LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_COLUMN_UP))) ; ImageList_AddIcon (hImList, LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_COLUMN_DOWN))) ; Header_SetImageList (ListView_GetHeader(g_hwndList), hImList) ; // clear LVC struct ZeroMemory (&lvc, sizeof(lvc)) ; lvc.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM | LVCF_IMAGE | LVCF_FMT; lvc.fmt = LVCFMT_BITMAP_ON_RIGHT ; lvc.pszText = TEXT("") ; lvc.iImage = -1 ; // add process name column lvc.cx = 100 ; lvc.iSubItem = COL_NAME ; ListView_InsertColumn (g_hwndList, lvc.iSubItem+1, &lvc) ; // add PID column lvc.cx = 60 ; lvc.iSubItem = COL_PID ; ListView_InsertColumn (g_hwndList, lvc.iSubItem+1, &lvc) ; // add state column lvc.cx = 150 ; lvc.iSubItem = COL_STATE ; ListView_InsertColumn (g_hwndList, lvc.iSubItem+1, &lvc) ; // add path lvc.cx = 500 ; lvc.iSubItem = COL_PATH ; ListView_InsertColumn (g_hwndList, lvc.iSubItem+1, &lvc) ; SendMessage (hwnd, WM_LANGUAGECHANGED, 0, 0) ; } return 0 ; // case WM_CREATE: case WM_LANGUAGECHANGED: // clear LVC struct ZeroMemory (&lvc, sizeof(lvc)) ; lvc.mask = LVCF_TEXT ; // add process name column lvc.pszText = (LPTSTR) STR_DEF (_PROCESS, TEXT("Process")) ; ListView_SetColumn (g_hwndList, COL_NAME, &lvc) ; // add PID column lvc.pszText = (LPTSTR) STR_DEF (_PID, TEXT("PID")) ; ListView_SetColumn (g_hwndList, COL_PID, &lvc) ; // add state column lvc.pszText = (LPTSTR) STR_DEF (_STATE, TEXT("State")) ; ListView_SetColumn (g_hwndList, COL_STATE, &lvc) ; // add path lvc.pszText = (LPTSTR) STR_DEF (_PATH, TEXT("Path")) ; ListView_SetColumn (g_hwndList, COL_PATH, &lvc) ; // create processes menu DestroyMenu (g_hmenuProcess) ; g_hmenuProcess = CreatePopupMenu () ; AppendMenu (g_hmenuProcess, MF_STRING|MF_GRAYED, 0, STR_DEF(_PROCESS_MENU,g_szProcessMenu)) ; AppendMenu (g_hmenuProcess, MF_SEPARATOR, 0, NULL) ; AppendMenu (g_hmenuProcess, MF_STRING, IDM_PROCESS_HOOK, STR_DEF(_HOOK_SELECTED_PROCESS,g_szHookProcess)) ; AppendMenu (g_hmenuProcess, MF_STRING, IDM_PROCESS_UNHOOK, STR_DEF(_UNHOOK_SELECTED_PROCESS,g_szUnhookProcess)) ; AppendMenu (g_hmenuProcess, MF_STRING, IDM_PROCESS_KILL, STR_DEF(_KILL_SELECTED_PROCESS,g_szKillProcess)) ; PostMessage (hwnd, WM_REFRESH, 0, 0) ; return 0 ; case WM_DESTROY: return 0 ; case WM_SIZE: nWidth = LOWORD (lParam) ; nHeight = HIWORD (lParam) ; MoveWindow (g_hwndList, 0, 0, nWidth, nHeight, TRUE) ; return 0 ; case WM_REFRESH: // ======== Refresh process list ======== { LVFINDINFO lvfi ; int iItem ; HIMAGELIST hImageList ; hImageList = ListView_GetImageList (g_hwndList, LVSIL_SMALL) ; ListView_DeleteAllItems (g_hwndList) ; ImageList_RemoveAll (hImageList) ; ImageList_AddIcon (hImageList, LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_STATE_UNKNOWN))) ; ImageList_AddIcon (hImageList, LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_STATE_DISABLED))) ; ImageList_AddIcon (hImageList, LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_STATE_HOOKED))) ; ProcList_Lock () ; ProcList_Enum (_ProcListWnd_AddProcess, g_hwndList) ; ProcList_Unlock () ; if( g_nSortParam >= 0 ) ListView_SortItems (g_hwndList, _ProcListWnd_ItemCompare, g_nSortParam) ; if( g_nSelectedProcessAddr ) { lvfi.flags = LVFI_PARAM ; lvfi.lParam = g_nSelectedProcessAddr ; iItem = ListView_FindItem (g_hwndList, -1, &lvfi) ; if( iItem>=0 ) ListView_SetItemState (g_hwndList, iItem, LVIS_SELECTED, LVIS_SELECTED) ; } } return 0 ; // ======== Refresh process list ======== case WM_SPYNOTIFY: { switch( wParam ) { case SN_PROCESSCREATED: // ==== Process Created ==== { PROCSTRUCT *pProc ; ProcList_Lock () ; pProc = ProcList_Get (lParam) ; if( pProc ) _ProcListWnd_AddProcess (g_hwndList, pProc) ; else TRACE_ERROR (TEXT("ProcList_Get failed (PID=%u)\n"), lParam) ; ProcList_Unlock () ; } return 0 ; // ==== Process Created ==== case SN_PIDCHANGED: // ==== Process ID changed ==== { _ProcListWnd_UpdateProcessId (g_hwndList, lParam) ; } return 0 ; // ==== Process ID chanegd ==== case SN_PROCESSCHANGED: // ==== Process info changed ==== { PROCSTRUCT * pProc ; ProcList_Lock () ; pProc = ProcList_Get (lParam) ; if( pProc ) _ProcListWnd_UpdateProcess (g_hwndList, pProc) ; ProcList_Unlock () ; } return 0 ; // ==== Process info chanegd ==== case SN_PROCESSTERMINATED: // ==== Process terminated ==== { _ProcListWnd_RemProcess (g_hwndList, lParam) ; } return 0 ; // ==== Process terminated ==== } } return 0 ; case WM_COMMAND: switch( LOWORD(wParam)) { case IDM_PROCESS_HOOK: // ======== 'Hook selected process' command ======== { SpySrv_IgnoreProcess (g_nSelectedProcessAddr, FALSE) ; } return 0 ; // ======== 'Hook selected process' command ======== case IDM_PROCESS_UNHOOK: // ======== 'Unhook selected process' command ======== { SpySrv_IgnoreProcess (g_nSelectedProcessAddr, TRUE) ; } return 0 ; // ======== 'Unhook selected process' command ======== case IDM_PROCESS_KILL: // ======== 'Kill selected process' command ======== { BOOL bSuccess ; UINT n ; PROCADDR nProcessAddress = g_nSelectedProcessAddr ; g_nSelectedProcessAddr = 0 ; // no process selected ? no need to go on. if( ! nProcessAddress ) return 0 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -