9.进程/线程/模块信息 在此我们使用工具帮助函数(ToolHelp32)和系统 OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY │ TOKEN_ADJUST_PRIVILEGES,&hToken); //打开进程的令牌,提升权限; AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL); //将进程的权限提升到支持调试(Debug); CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建进程的快照; Process32First(hProcessSnap,&ProcessEntry32); Process32First(hProcessSnap,&ProcessEntry32); //枚举所有进程; OpenProcess(PROCESS_QUERY_INformATION,FALSE,ProcessEntry32.th32ProcessID); //打开特定进程,以查询进程相关信息; GetProcessTimes(hProcess,&CreateTime,&ExitTime,&KernelTime,&UserTime); //获取进程的时间信息; GetProcessMemoryInfo(hProcess,&PMCounter,sizeof(PMCounter)); //获取进程的存储区信息; GetPriorityClass(hProcess); //获取进程的优先权; GetProcessIoCounters(hProcess,&IoCounters); //获取进程的IO使用情况; CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID); //创建模块快照; Module32First(hModuleSnap, &ModuleEntry32); Module32Next(hModuleSnap, &ModuleEntry32); //枚举进程模块信息; CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); //创建线程快照; Thread32First(hThreadSnap, &ThreadEntry32); Thread32Next(hThreadSnap, &ThreadEntry32); //枚举线程信息; OpenThread(THREAD_ALL_ACCESS,FALSE,ThreadEntry32.th32ThreadID); //打开线程,须自己获得此函数地址; TerminateProcess(hProcess,0); //终止进程; SuspendThread(hThread); //悬挂线程; ResumeThread(hThread); //激活线程;
10.关机 AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL); //调整进程令牌,使其支持关机; ExitWindowXXX(EWX_LOGOFF,0); //注销系统; LockWorkStation(); //锁定系统; InitiateSystemShutdown(NULL,szMessage,dwTimeout,FALSE,bSig); //支持到记时和消息显示的关机/重启; SetSystemPowerState(bSig,FALSE); //系统休眠/冬眠;
11.用户信息 NetUserEnum(NULL,dwLevel,FILTER_NORMAL_ACCOUNT,(LPBYTE*)&pBuf, dwPrefMaxLen,&dwEntriesRead,&dwTotalEntries,&dwResumeHandle); //枚举系统用户信息; NetUserDel(NULL,lpUserNameW); //删除指定用户; 12.系统版本信息 GetVersionEx((LPOSVERSIONINFO)&osviex); //获取操作系统的版本信息; 我们也可以通过注册表(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion)获取相关信息: GetTickCount(); //获取开机时间; GetComputerName(szInfo,&dwInfo); //获取计算机名称; GetUserName(szInfo,&dwInfo); //获取计算机用户名; GetWindowsDirectory(szInfo,MAX_PATH+1); //获取Windows目录; GetSystemDirectory(szInfo,MAX_PATH+1); //获取系统目录;
小结: 虽然我们现在已经实现了任务管理器的各项功能,甚至比Windows自带的功能还要强大,不过却没有什么兴奋的感觉。因为看看我们的代码,您就会发现那些都是直接调用的Win32API函数,但是我们清楚系统底层究竟是怎么实现的吗?不管我们是否只是为了实现一个功能,还是对操作系统感兴趣,我们都应该更多的对系统底层进行研究,而不仅仅是只会使用高层函数的程序员。虽然微软为我们隐藏了很多的内部细节,但正是这种底层的秘密激发了我们对其进行深入研究的兴趣和动力。
出处:蓝色理想
责任编辑:蓝色
上一页 剖析Windows任务管理器开发原理与实现<2> 下一页
|