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 
}