分析并理解ProcessInfo的结构和运行机制,学习:
Windows消息机制;
基本的图形编程;
进程管理的API;
Windows如何管理进程:
由Windows任务管理器入手,任务管理器不仅提供性能信息,还显示了计算机运行程序和进程,自获得管理员权限,能够以最高权限中断或者关闭指定的进程或应用程序。进程=程序+数据,是基本的处理机调度单位;作业是一个或以上的多个进程组成,是向计算机提交任务的实体对象。所以当Windows开始管理进程时,很多进程下面又有子进程,想要关闭一个应用程序,有时仅关闭一个子进程是不够的,不过能成功阻止进程继续占用资源并保持等待状态,而某些进程的机制会再次向计算机申请资源并再次从断点处继续原来的任务。
任务管理器窗口将系统服务和本地用户服务分开,为系统服务制定了保护,用普通用户的权限无法全部关闭,其目的是为了保证系统的正常运作;在Windows系统中能将用户提权到管理员,从而为进程的服务分配自定的优先级等。
Windows的消息处理控制分为三层结构,顶端的Windows内核管理着系统给予或外部输入的消息队列(GetMessage),二级控制中心获取消息,进行处理分配,循环保留程序的App对象并下放到第三级,第三级是Windows窗体对象,处理(Run)接受消息。具有接受和处理消息的控件必须要有句柄(handle),作为独立容器拥有内存空间和操作权限。在运行ProcessInfo例程后有可视化窗口,显示了提取的进程地址名称,所用空间,模块进程地址.dll文件位置,启用状态,选中指定进程后能在模块界面查看路径和进程基本信息,功能和外观相似度与任务管理器较高。
消息循环处理机制理解:
应用Application初始化,创建窗体,程序运行;
调用句柄,启用消息循环;
在窗口中处理消息。
#加载头文件##include // Windows内部声明#include // 访问控制链表管理#include // 字符串长度#include // API支持TOKEN_ELEVATION_TYPE s_elevationType = TokenElevationTypeDefault;BOOL s_bIsAdmin = FALSE;const int s_cchAddress = sizeof(PVOID) * 2; //枚举提取显示类型 //禁用UAC,获取访问权限#编辑框空间中增加文本,查找开始字符的位置#void AddText(HWND hwnd, PCTSTR pszFormat, ...) { va_list argList; va_start(argList, pszFormat); TCHAR sz[20 * 1024]; Edit_GetText(hwnd, sz, _countof(sz)); _vstprintf_s(_tcschr(sz, TEXT('\0')), _countof(sz) - _tcslen(sz), pszFormat, argList); //取文本字符串长度,返回第一个字符 Edit_SetText(hwnd, sz); va_end(argList);}//之后.cpp文件计算缓冲区大小,分配内存空间,利用管理员权限获取字符串ID,从而将进程进行分配。VOID ShowProcessInfo(HWND hwnd, DWORD dwProcessID) { //在这个函数定义下在窗口内显示进程信息SetWindowText(hwnd, TEXT("")); //清除输出区域CToolhelp th(TH32CS_SNAPALL, dwProcessID); //显示进程详细信息PROCESSENTRY32 pe = { sizeof(pe) };BOOL fOk = th.ProcessFirst(&pe);for (; fOk; fOk = th.ProcessNext(&pe)) {if (pe.th32ProcessID == dwProcessID) {TCHAR szCmdLine[1024]; //分配1024大小Tchar形式空间给进程显示TCHAR szOwner[MAX_PATH+1];if (GetProcessOwner(dwProcessID, szOwner, MAX_PATH)){ AddText(hwnd, TEXT("Owner: %s\r\n"), szOwner);}break;}}//跳出循环BOOL GetProcessElevation(TOKEN_ELEVATION_TYPE* pElevationType, BOOL* pIsAdmin)//得到当前进程的令牌,检索进程是否以管理员(SID)权限运行BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)//对话框(窗口)初始化INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)int WINAPI _tWinMain(HINSTANCE hInstanceExe, HINSTANCE, PTSTR pszCmdLine, int) //都是WINDOWS API接口函数,//在头文件中有shlobj.h调用//功能是取得Dlg Proc中的句柄参数,以及获取Windows调试权限查看服务INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) //回调About函数的参数类型{UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE; //返回回调之后的About值case WM_COMMAND:#自定义的获取进程策略GetProcessIntegrityLevel中,调用API自定义方法GetSecurityInfo获取限制的信息##在ProcessInfo例程中制定WINAPI的INT指针,打开权限允许程序查看服务,并允许显示主窗口。#BOOL GetProcessIntegrityLevel(HANDLE hProcess, PDWORD pIntegrityLevel, PDWORD pPolicy, PDWORD pResourceIntegrityLevel, PDWORD pResourcePolicy) { HANDLE hToken = NULL;#获取策略调用权限,获取参数为hProcess的句柄类型,在后面会取为类似于随后的HANDLE#HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, PID); if (hProcess == NULL) return(FALSE);#在hToken句柄(标识Handle Token,句柄获取)为空时,使用#CToolhelp::EnablePrivilege(SE_TCB_NAME, TRUE);#方法用于提权,从而获取进程即时状态快照##Toolhelp API是在Windows SDK 中定义的API函数库,用于获取状态快照,存于头文件##include "..\CommonFiles\Toolhelp.h"之中。