typedef struct _EPROCESS {
// KPROCESS 和 EPROCESS 地址相同
KPROCESS Pcb;
//
// Lock used to protect:
// The list of threads in the process.
// Process token.
// Win32 process field.
// Process and thread affinity setting.
//
// 推锁对象,用于保护 EPROCESS 的数据成员
EX_PUSH_LOCK ProcessLock;
// 进程的创建和退出时间
LARGE_INTEGER CreateTime;
LARGE_INTEGER ExitTime;
//
// Structure to allow lock free cross process access to the process
// handle table, process section and address space. Acquire rundown
// protection with this if you do cross process handle table, process
// section or address space references.
//
// 进程的停止保护锁,进程销毁时,要等到所有其他进程和线程已经释放此锁,才能继续进行
EX_RUNDOWN_REF RundownProtect;
// 进程唯一编号,进程创建时指定
HANDLE UniqueProcessId;
//
// Global list of all processes in the system. Processes are removed
// from this list in the object deletion routine. References to
// processes in this list must be done with ObReferenceObjectSafe
// because of this.
//
// 所有进程都挂入了全局链表 PsActiveProcessHead 中,ActiveProcessLinks 就是
// 当前进程的挂入点。可通过此成员遍历所有进程。
LIST_ENTRY ActiveProcessLinks;
//
// Quota Fields.
//
// 下面两个数组的长度均为3,分别对应非换页内存池,换页内存池和交换文件中的内存使用情况。
// 这两个数组是在 PspChargeQuota 函数内计算的。
// 进程内存使用量
SIZE_T QuotaUsage[PsQuotaTypes];
// 进程内存使用量峰值
SIZE_T QuotaPeak[PsQuotaTypes];
// 进程的虚拟内存已提交的页面数量
SIZE_T CommitCharge;
//
// VmCounters.
//
// 进程虚拟内存大小峰值
SIZE_T PeakVirtualSize;
// 进程虚拟内存大小
SIZE_T VirtualSize;
// 当进程加入到一个系统会话中时,通过 SessionProcessLinks 挂入该会话的进程链表中
LIST_ENTRY SessionProcessLinks;
// 当进程中的线程发生用户模式异常时,内核的异常处理例程在异常处理过程中,将向该进程的异常
// 端口或调试端口发送消息,从而使这些端口的接收方(调试器或windows子系统)能够处理该异常。
// 5.2.7节将介绍异常分发过程。
// 调试端口
PVOID DebugPort;
// 异常端口
PVOID ExceptionPort;
// 句柄表,存储了所有被该进程打开的内核对象的句柄
PHANDLE_TABLE ObjectTable;
//
// Security.
//
// 指向该进程的访问令牌,用于该进程的安全访问检查
EX_FAST_REF Token;
// 工作集页面
PFN_NUMBER WorkingSetPage;
// 守护互斥体锁(guarded mutex),用于保护对地址空间的操作。
// 当内核代码需要对虚拟地址空间进行操作时,必须在 AddressCreationLock 上执行锁操作,
// 完成以后再解锁。LOCK_ADDRESS_SPACE 和 UNLOCK_ADDRESS_SPACE 宏用于简化代码。
KGUARDED_MUTEX AddressCreationLock;
// 自旋锁对象,用于保护进程的超空间
KSPIN_LOCK HyperSpaceLock;
// 指向正在复制地址空间的那个线程,仅当在地址空间复制的过程中,此值才有值,其他情况为 NULL
// 详见 MiCloneProcessAddressSpace 函数
struct _ETHREAD *ForkInProgress;
ULONG_PTR HardwareTrigger;
// 指向进程的物理VAD树根,并不总是存在,只有确实需要映射物理内存时才会被创建。
PMM_AVL_TABLE PhysicalVadRoot;
// 指向一个平衡树的根,当进程地址空间复制时创建此树,创建后直到进程退出时才销毁
PVOID CloneRoot;
// 私有页面数量
EPROCESS 结构体属性介绍
最新推荐文章于 2023-05-08 09:53:07 发布