1.概念
进程是执行程序的实例,每个进程拥有自己的虚拟地址空间和控制线程。线程是操作系统调度器,分配处理器时间的基础单元。每个进程都有自己的地址空间和一个控制线程。
2.解释进程模型
系统初始化
正在运行的进程执行创建进程的系统调用
用户要求创建新进程
启动批处理作业
3.进程的三个状态
运行
就绪
阻塞
以下例子展示了创建一个打开记事本进程的例子
#incldue "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
STARTUPINFO startupInfo={0};
PROCESS_INFORMATION processInformation={0};
BOOL bSuccess=CreateProcessA(
TEXT("C:\\Windows\\System32\\notepad.exe"),NULL,NULL,
NULL,FALSE,NULL,NULL,NULL,&startupInfo,
&processInformation );
if(bSuccess)
{
cout<<"Process started."<<endl
<<"Process ID:\t"
<<processInformation.dwProcessId<<endl;
}
else
{
cout<<"Cannot start process!"<<endl
<<"Error code :\t"<<GetLastError()<<endl;
}
return 0;
}
通过CreateProcess()函数创建进程,了解该函数可以查看MSDN:https://docs.microsoft.com/zh-cn/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createprocessa,操作系统会为进程分配进程标识符,用于标识进程,对于一些API如OpenProcess函数,进程标识符用于获取进程的句柄。最终线程标识符由进程分配,该标识符可用于在OpenThread中打开一个线程的句柄。这些标识符都返回在PROCESS_INFORMATION结构中。
4.进程的实现
进程控制块(Process Control Block ,PCB),是操作系统为了管理进程在内核中设置的一种数据结构,储存了高效管理进程所需的许多不同数据项。一般分为:
进程标识数据;
进程状态数据;
进程控制数据。
指针 | 进程状态 |
进程数量 | |
命令指针 | |
寄存器 | |
内存限制 | |
已打开文件列表 | |
. . . |
如何获取一个进程基本信息结构地址,其中主要特征就是PCB地址和ID
方法:
1.通过LoadLibrary()加载ntdll.dll;
2.通过GetProcAddress()从该dll中获取NTQueryInformationProcess函数地址;
3.通过访问PROCESS_BASIC_INFORMATION结构体中UniqueprocessId和pebBaseAddress参数便可访问该PCB的ID和地址