www.pudn.com > Process_Mo18292312142004.rar > Commands.cpp
/*******************************************************
This file is part of Process Monitor.
Copyright (c) 2004 by Michel van Kerkhof, ( michel000@planet.nl http://home.wxs.nl/~wijk0550/ )
For more information consult the Readme file.
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.,
59 Temple Place,
Suite 330, Boston,
MA 02111-1307 USA
*******************************************************
If you like my work and you have a job for me please contact me at: michel000@planet.nl
*******************************************************/
#include "includes.h"
extern NTAPIS NtApi;
extern CWindow CWnd;
/*
Function Description:
Callback function for the main window
*/
LRESULT CALLBACK mainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg)
{
case WM_CREATE:
CWnd.ProcessListView(hWnd);
break;
case WM_SIZE:
//to save cpu speed do nothing when minimized
if(wParam != SIZE_MINIMIZED) {
CWnd.SetSize();
CWnd.bUpdate=true;
}
else {
CWnd.bUpdate=false;
if (CWnd.GetHideWhenMinimizedState()) ShowWindow(hWnd,SW_HIDE);
}
break;
case WM_NOTIFY:
CWnd.Notify(hWnd,wParam,lParam);
break;
case WM_COMMAND:
CWnd.Commands(hWnd,wParam,lParam);
break;
case WM_TIMER:
CWnd.Timers(hWnd,wParam,lParam);
break;
case WM_LBUTTONDOWN:
CWnd.SplitterStart(true);
break;
case WM_LBUTTONUP:
CWnd.SplitterStart(false);
break;
case WM_MOUSEMOVE:
CWnd.SplitterSetSize();
break;
case WM_SHELLICON_NOTIFY:
CWnd.TrayIcon(hWnd,lParam,wParam);
break;
case WM_ENDSESSION:
CWnd.SaveSettings();
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
{
CWnd.SaveSettings();
NOTIFYICONDATA trayIcon;
trayIcon.cbSize=sizeof(NOTIFYICONDATA);
trayIcon.hWnd=hWnd;
trayIcon.uID=IDI_TRAY;
trayIcon.uFlags=0;
Shell_NotifyIcon(NIM_DELETE,&trayIcon);
}
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,Msg, wParam, lParam);
}
return 0;
}
/*
Function Description:
Terminates a process (and deletes the program)
Arguments:
IN hWnd, Owner window
IN ProcList, a PROCESSLIST struct
IN bDelete, if true Kill AND Delete the process
Returns:
void
*/
void CWindow::TerminateProc(HWND hWnd,PROCESSLIST *ProcList,bool bDelete)
{
char szBuffer[MAX_PATH];
char *pFile=szBuffer;
HANDLE hProc=NULL;
if (bDelete) {
//ask before we destroy the os....
if (MessageBox(hWnd,"Are you sure you want to Kill AND Delete this process from disk?","Process Monitor 1.0",MB_OKCANCEL | MB_ICONWARNING) != IDOK) return;
}
try {
hProc=OpenProcess(PROCESS_ALL_ACCESS,false,ProcList->dwPID);
if (!hProc) {
throw("Could not open process");
}
//get location of process on disk
if (bDelete) {
if (!HandleToName(hProc,szBuffer)) {
throw("Could not get full path from the process");
}
pFile=GetFileName(szBuffer);
}
if (!TerminateProcess(hProc,0)) {
throw("Could not terminate process");
}
if (bDelete) {
WaitForSingleObject(hProc,1000);
if (!DeleteFile(pFile)) throw("Could not delete file");
}
}
catch (char *szError)
{
ShowError(hWnd,szError);
}
if (hProc) CloseHandle(hProc);
return;
}
/*
Function Description:
Set Priority for a process
Arguments:
IN hWnd, Owner window
IN ProcList, a PROCESSLIST struct
IN dwPri, Priority to set
Returns:
void
*/
void CWindow::SetPriority(HWND hWnd,PROCESSLIST *ProcList,DWORD dwPri)
{
HANDLE hProc=NULL;
try {
hProc=OpenProcess(PROCESS_SET_INFORMATION,false,ProcList->dwPID);
if (!hProc) throw("Could not open process");
if (!SetPriorityClass(hProc,dwPri)) throw("Could not set priority");
}
catch(char *szError)
{
ShowError(hWnd,szError);
}
if (hProc) CloseHandle(hProc);
}
/*
Function Description:
Runs the default debugger
Arguments:
IN hWnd, Owner window
IN ProcList, a PROCESSLIST struct
Returns:
void
*/
void CWindow::DebugProc(HWND hWnd,PROCESSLIST *ProcList)
{
HKEY hKey;
try {
if (RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug",
0,
KEY_READ,
&hKey
) != ERROR_SUCCESS) throw("No default debugger installed");
char szData[MAX_PATH+10];
DWORD dwType,
dwDataSize=sizeof(szData)-10;
//get path to debugger
if (RegQueryValueEx(
hKey,
"Debugger",
NULL,
&dwType,
(LPBYTE)szData,
&dwDataSize) != ERROR_SUCCESS) {
RegCloseKey(hKey);
throw("No Default debugger installed");
}
RegCloseKey(hKey);
DWORD i;
char sep=' ';
if (szData[0] == '\"') sep='\"';
for(i=1;idwPID,sizeof(szData) - i - 5);
}
}
PROCESS_INFORMATION ProcInfo;
STARTUPINFO StartInfo;
memset(&StartInfo,0, sizeof(StartInfo));
StartInfo.cb = sizeof(StartInfo);
StartInfo.dwFlags = STARTF_USESHOWWINDOW;
StartInfo.wShowWindow = SW_SHOW;
if (!CreateProcess(0,szData,0, 0, TRUE, 0, 0, 0, &StartInfo, &ProcInfo)) throw("Could not execute debugger");
return;
}
catch(char *szError)
{
ShowError(hWnd,szError);
}
}
/*
Function Description:
Set clipboard text
Arguments:
IN szText, Pointer to a text string to set as the clipboard text
Returns:
void
*/
void CWindow::SetClipBoardText(char *szText)
{
if (OpenClipboard(NULL)) {
EmptyClipboard();
pClipBoard=GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,MAX_PATH * 2);
if (!pClipBoard) {
CloseClipboard();
return;
}
void *pMem=GlobalLock(pClipBoard);
if (pMem) {
strncpy((char *)pMem,szText,MAX_PATH * 2);
SetClipboardData(CF_TEXT,pMem);
}
CloseClipboard();
}
}
/*
Function Description:
Runs the file properties dialog
Arguments:
IN hWnd, Owner window
IN ProcList, Pointer to PROCESSLIST struct.
Returns:
void
*/
void CWindow::GetProperties(HWND hWnd,PROCESSLIST *ProcList)
{
HANDLE hProc;
char szFileName[MAX_PATH];
hProc=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,ProcList->dwPID);
if (hProc) {
if (HandleToName(hProc,szFileName)) OpenFileProperties(hWnd,szFileName);
CloseHandle(hProc);
}
}
void CWindow::Commands(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int iItem;
PROCESSLIST ProcList;
/*
look add the identifier of the menu item
to see where the command comes from
*/
if (LOWORD(wParam) >= PROC_KILL && LOWORD(wParam) <= PROC_DEBUG) {
iItem=SendMessage(hProcList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
if (iItem == -1) return;
if (CProc->GetProcessInfo(&ProcList,iItem) != ERR_SUCCESS) return;
}
else if (LOWORD(wParam) >= EXTRA_ACTIVE && LOWORD(wParam) <= EXTRA_GETWNDINFO) {
CExtra->Commands(hWnd,wParam,lParam);
return;
}
else if (LOWORD(wParam) >= DLL_PROPERTIES && LOWORD(wParam) <= DLL_UNLOAD) {
CModule->Commands(hWnd,wParam,lParam);
return;
}
else if (LOWORD(wParam) == HANDLE_CLIP) {
CHandle->Commands(hWnd,wParam,lParam);
return;
}
switch(LOWORD(wParam))
{
//file
case IDM_RUN:
if (NtApi.fOpenRunDlg) NtApi.fOpenRunDlg(hWnd,NULL,NULL,NULL,NULL,0);
break;
case IDM_SHUTDOWN_LOCK:
if (NtApi.fSetSuspendState) NtApi.fSetSuspendState(0,1,0);
break;
case IDM_SHUTDOWN_NORMAL:
ExitWindowsEx(EWX_SHUTDOWN,0);
break;
case IDM_SHUTDOWN_FORCE:
ExitWindowsEx(EWX_FORCE ,0);
break;
case IDM_SHUTDOWN_POWEROFF:
ExitWindowsEx(EWX_POWEROFF,0);
break;
case IDM_SHUTDOWN_REBOOT:
ExitWindowsEx(EWX_REBOOT,0);
break;
case IDM_SHUTDOWN_LOGOFF:
ExitWindowsEx(EWX_LOGOFF,0);
break;
case IDM_PROC_SAVE_ALL:
CWnd.StartLog(-1);
break;
case IDM_EXIT: case TRAY_EXIT:
DestroyWindow(hWnd);
break;
//options
case IDM_SPEED_500:
case IDM_SPEED_1000:
case IDM_SPEED_2000:
case IDM_SPEED_5000:
SetSpeed(LOWORD(wParam));
break;
case IDM_TASKMAN:
SetTaskMgr(true);
break;
case IDM_HIDE_MINIMIZED:
HideWhenMinimized(true);
break;
case IDM_FIND_DLL:
{
CModuleInfo *CTempModule;
CTempModule = new CModuleInfo(this);
if (CTempModule) {
m_iDataOption=MES_FIND_DLL;
CTempModule->FindDll(hWnd);
m_iDataOption=MES_NORMAL;
delete CTempModule;
}
break;
}
case IDM_FIND_WND:
{
bool bRet;
CFindWnd *CTempFindWnd;
CTempFindWnd = new CFindWnd(&bRet);
if (CTempFindWnd) {
if (bRet) CTempFindWnd->StartFindWndDlg(hWnd);
delete CTempFindWnd;
}
}
break;
//view
case IDM_SHOW_EXTRA_INFO:
ChangeSubWindow(NO_INFO);
break;
case IDM_EXTRA_INFO:
ChangeSubWindow(EXTRA_INFO);
break;
case IDM_DLL_INFO:
ChangeSubWindow(MODULE_INFO);
break;
case IDM_HANDLES_INFO:
ChangeSubWindow(HANDLE_INFO);
break;
//help
case IDM_ABOUT:
DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIALOG4),hWnd, AboutWndDlgProc);
break;
case TRAY_OPEN:
ShowWindow(hWnd,SW_RESTORE);
SetForegroundWindow(hWnd);
break;
case TRAY_MAXIMIZE:
ShowWindow(hWnd,SW_MAXIMIZE);
SetForegroundWindow(hWnd);
break;
case TRAY_MINIMIZE:
ShowWindow(hWnd,SW_MINIMIZE);
SetForegroundWindow(hWnd);
break;
case PROC_SAVE:
StartLog(iItem);
break;
case PROC_KILL:
TerminateProc(hWnd,&ProcList,false);
break;
case PROC_KILL_DEL:
TerminateProc(hWnd,&ProcList,true);
break;
case PROC_IDLE:
SetPriority(hWnd,&ProcList,IDLE_PRIORITY_CLASS);
break;
case PROC_BELOW:
SetPriority(hWnd,&ProcList,BELOW_NORMAL_PRIORITY_CLASS);
break;
case PROC_NORMAL:
SetPriority(hWnd,&ProcList,NORMAL_PRIORITY_CLASS);
break;
case PROC_ABOVE:
SetPriority(hWnd,&ProcList,ABOVE_NORMAL_PRIORITY_CLASS);
break;
case PROC_HIGH:
SetPriority(hWnd,&ProcList,HIGH_PRIORITY_CLASS);
break;
case PROC_REALTIME:
SetPriority(hWnd,&ProcList,REALTIME_PRIORITY_CLASS);
break;
case PROC_CLIP:
{
char szBuffer[MAX_PATH * 3];
sprintf(szBuffer,"%s %s Pid:%i Owner Pid:%i Cpu:%0.2f%% Ram:%i",
ProcList.pProcessName,ProcList.pOwnerName,
ProcList.dwPID,ProcList.dwOwnerPID,
ProcList.dCpu,ProcList.dwRam/1024
);
SetClipBoardText(szBuffer);
}
break;
case PROC_PROPERTIES:
GetProperties(hWnd,&ProcList);
break;
case PROC_DEBUG:
DebugProc(hWnd,&ProcList);
break;
default:
break;
}
}
void CWindow::Notify(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
static NMHDR xnmt;
NMHDR *nmt;
nmt=(NMHDR *)lParam;
if (nmt->hwndFrom == hProcList) {
int iItem=SendMessage(nmt->hwndFrom, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
if (iItem == -1) return;
switch(nmt->code)
{
case LVN_ITEMCHANGED:
{
NM_LISTVIEW *nml=(NM_LISTVIEW *)lParam;
if (nml->uChanged != LVIF_STATE) break;
if (!LOBYTE(GetAsyncKeyState(VK_UP)) && !LOBYTE(GetAsyncKeyState(VK_DOWN))) break;
xnmt.code=XNM_CLICK;
xnmt.hwndFrom=nmt->hwndFrom;
xnmt.idFrom=nmt->idFrom;
PostMessage(hWnd,WM_NOTIFY,wParam,(LPARAM)&xnmt);
break;
}
case NM_CLICK:
xnmt.code=XNM_CLICK;
xnmt.hwndFrom=nmt->hwndFrom;
xnmt.idFrom=nmt->idFrom;
PostMessage(hWnd,WM_NOTIFY,wParam,(LPARAM)&xnmt);
break;
case XNM_CLICK:
{
switch(Settings.SubListViewOption)
{
case EXTRA_INFO:
CExtra->SetInfo(iItem);
break;
case MODULE_INFO:
CModule->SetInfo(iItem);
break;
case HANDLE_INFO:
CHandle->SetInfo(iItem);
break;
}
break;
}
case NM_RCLICK:
{
if (!hProcPopup) hProcPopup=GetSubMenu(m_hListViewPopup,0);
PROCESSLIST ProcList;
if (CProc->GetProcessInfo(&ProcList,iItem) != ERR_SUCCESS) return;
POINT pt;
GetCursorPos(&pt);
int Item;
switch (GetPriority(ProcList.dwPID,ProcList.BasePriority))
{
case IDLE_PRIORITY_CLASS:
Item=PROC_IDLE;
break;
case BELOW_NORMAL_PRIORITY_CLASS:
Item=PROC_BELOW;
break;
case NORMAL_PRIORITY_CLASS:
Item=PROC_NORMAL;
break;
case ABOVE_NORMAL_PRIORITY_CLASS:
Item=PROC_ABOVE;
break;
case HIGH_PRIORITY_CLASS:
Item=PROC_HIGH;
break;
case REALTIME_PRIORITY_CLASS:
Item=PROC_REALTIME;
break;
default:
Item=PROC_NORMAL;
break;
}
//set Priority checked
SetItemState(hProcPopup,Item,true);
TrackPopupMenu(hProcPopup,TPM_LEFTALIGN ,pt.x,pt.y,0,hWnd,NULL);
//uncheck Priority
SetItemState(hProcPopup,Item,false);
break;
}
case NM_DBLCLK:
{
PROCESSLIST ProcList;
if (CProc->GetProcessInfo(&ProcList,iItem) != ERR_SUCCESS) return;
GetProperties(hWnd,&ProcList);
break;
}
}
}
else if (nmt->hwndFrom == hExtra) {
switch(Settings.SubListViewOption)
{
case EXTRA_INFO:
CExtra->Notify(hWnd,wParam,(LPARAM)nmt);
break;
case MODULE_INFO:
CModule->Notify(hWnd,wParam,(LPARAM)nmt);
break;
case HANDLE_INFO:
CHandle->Notify(hWnd,wParam,(LPARAM)nmt);
break;
}
}
return;
}
//trayicon
void CWindow::TrayIcon(HWND hWnd,LPARAM lParam,WPARAM wParam)
{
if (lParam == WM_RBUTTONDOWN) {
if (!hTrayPopup) {
HMENU hTray = LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDM_TRAY_POPUP));
hTrayPopup=GetSubMenu(hTray,0);
}
POINT pt;
GetCursorPos(&pt);
TrackPopupMenu(hTrayPopup,TPM_RIGHTALIGN,pt.x,pt.y,0,hWnd,NULL);
TrackPopupMenu(hTrayPopup,TPM_RIGHTALIGN,pt.x,pt.y,0,hWnd,NULL);
}
if (lParam == WM_LBUTTONDOWN) {
ShowWindow(hWnd,SW_RESTORE);
SetForegroundWindow(hWnd);
}
}
//timers
void CWindow::Timers(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
if (wParam == ID_PROC_TIMER && CWnd.bUpdate == true) {
CProc->UpdateProcList(this);
}
else if (wParam == ID_TITLEBAR_TIMER) {
GetTimeFormat(LOCALE_USER_DEFAULT,TIME_FORCE24HOURFORMAT,NULL,"'['HH':'mm']'",pTitleBar,40);
SendMessage(hWnd,WM_SETTEXT,0,(WPARAM)szTitleBar);
/*
Get Uptime
ERROR!! GetTickCount returns a DWORD so after 49.7 days it will be set to zero
Did Microsoft think that there product could not run longer than 49 days?
ULONG NtGetTickCount(); //i cant find it on XP ...... only win2k ?
use myNtGetTickCount
*/
ULONGLONG ulUptime=myNtGetTickCount();
if (ulUptime != 0) {
//to seconds.
ulUptime=ulUptime / 10000000;
char szBuffer[128];
sprintf(
szBuffer,
"Uptime: %id %ih %im",
(DWORD)ulUptime / 86400,
(DWORD)(ulUptime % 86400) / 3600,
(DWORD)((ulUptime % 86400) % 3600) / 60
);
SendMessage(hStatus,SB_SETTEXT,(LPARAM)3 | 0,(WPARAM)szBuffer);
}
}
#ifdef CHECK_LAG
else if (wParam == ID_CHECK_LAG) {
if (GetTickCount() - m_dwOldTickCount > LAG_CHECK_TIME + LAG_CHECK_MAX_DELTA_TIME) {
CProc->m_bLagging=true;
}
else CProc->m_bLagging=false;
m_dwOldTickCount=GetTickCount();
}
#endif
}