一 Windows进程 1. Windows进程 进程一个容器,包含了应用程序实例的各种资源。Windows多任务操作系统,因此可以同时执行多个进程。 2. Windows进程的一些特点 2.1 进程中包含了执行代码等资源。 2.2 进程都具有私有的地址空间。 2.3 每个进程都有一个ID,表示进程。 2.4 每个进程都有自己的安全属性。 2.5 至少要包含一个可以执行的线程。 二 进程的环境 1. 环境信息的获取 获取: GetEnvironmentStrings(VOID) 返回值是获取到的所有环境信息 释放: FreeEnvironmentStrings
void EnvString() { //获取所有环境信息 LPTSTR pszEnv = GetEnvironmentStrings() ; LPTSTR pszTemp = pszEnv; while (0 != *pszTemp) { wprintf(_T("%s\n"), pszTemp) ; pszTemp += wcslen(pszTemp) + 1 ; } //释放环境信息字符串 FreeEnvironmentStrings(pszEnv) ; }
2. 环境变量的获取和设置 获取: GetEnvironmentVariable 设置: SetEnvironmentVariable 三 进程信息 1. 进程ID和句柄 GetProcessID 获取进程的ID GetCurrentProcess 获取进程的句柄 返回值为-1,是当前进程的伪句柄。 如果想获取当前进程的实际句柄需要使用OpenProcess() 2. 打开进程 OpenProcess 获取进程的真实句柄 3. 获取进程的所有模块(EXE, DLL) 获取进程的详细信息使用PSAPI EnumProcessModulses
void ProcModule() { //获取进程句柄 DWORD dwModuleNeeded ; HANDLE hHandle = GetCurrentProcess() ; //获取所需大小 EnumProcessModules(hHandle, NULL, 0, &dwModuleNeeded) ; DWORD dwCount = dwModuleNeeded/sizeof(HMODULE) ; HMODULE *pModule = new HMODULE[dwCount] ; //获取进程模块 EnumProcessModules(hHandle, pModule, dwModuleNeeded, 0) ; //枚举模块名称 for (DWORD dwIndex = 0 ; dwIndex < dwCount; ++dwIndex) { TCHAR pszBuff[MAX_PATH] = {0} ; GetModuleFileNameEx(hHandle, pModule[dwIndex], pszBuff, MAX_PATH) ; wprintf(_T("%d : %s \t: %p\n"), dwIndex+1, pszBuff, pModule[dwIndex]) ; } delete pModule ; };
四 进程的使用 1. 创建进程 WinExec(已淘汰) ShellExecute(一般用来打开带命令行的文件) CreateProcess (执行一个EXE可执行文件) 当进程创建成功,可以从进程信息中获取创建好的进程句柄ID等。 2. 打开进程 OpenProcess() 3. 结束进程 ExitProcess() TerminateProcess() ; 4. 等候进程结束 WaitForSingleObject() ; 阻塞函数,当运行时,会在等候的时间内,待等句柄信号。 五 Windows作业 1. Windows作业 实际是一个进程组。可以对作业设置权限,一旦进程加入到作业之内,进程的权限将被作业限制。 2. 作业的使用 2.1 创建一个作业 CreateJobObject 2.2 设置作业权限 SetInfomationJobObject 2.3 将进程加入作业 AssignProcessToJobObject 2.4 关闭作业 CloseHandle 2.5 结束作业 使用TerminateJobObject结束作业 但是并不是所有情况下,作业内的进程都能被结束。
void Job() { //创建JOB对象 HANDLE hJob = CreateJobObject(NULL, _T("")) ; //设置权限 JOBOBJECT_BASIC_UI_RESTRICTIONS ui = {0} ; ui.UIRestrictionsClass = JOB_OBJECT_UILIMIT_READCLIPBOARD | JOB_OBJECT_UILIMIT_WRITECLIPBOARD ; SetInformationJobObject(hJob, JobObjectBasicUIRestrictions, &ui, sizeof(ui)) ; //创建进程 HANDLE hProcess = Create(_T("C:\\WINDOWS\\system32\\notepad.exe")) ; //将进程加入作业 AssignProcessToJobObject(hJob, hProcess) ; getch() ; //结束作业 TerminateJobObject(hJob, 0) ; CloseHandle(hProcess) ; CloseHandle(hJob) ; }