EPROCESS 结构体属性介绍

本文深入探讨了Windows操作系统中的核心进程数据结构EPROCESS,详细介绍了其包含的属性,如进程ID、令牌、虚拟地址空间、句柄表等,帮助读者理解进程管理的底层机制。
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;
    
    // 私有页面数量
    PFN_NUMBER NumberOfPrivatePages
MDL(Memory Descriptor List)即内存描述符列表,是由内存管理器定义的一个不透明结构体,使用物理页帧号数组来描述支持虚拟内存的页。它通过一系列物理页面描述在虚拟缓冲中的页面,使用一个PFN_NUMBER队列描述与缓冲区相关的页面,该队列的内存位置紧跟着MDL头结构之后。以下是Win10下`_MDL`结构体的定义: ```c //Win10下的定义 //0x1c bytes (sizeof) struct _MDL { struct _MDL* Next; //0x0 MDL队列中的下一个成员 SHORT Size; //0x4 整个MDL列表的长度,包括MDL结构体和物理页帧号所占的内存,物理页帧号起始地址紧跟在结构体后 SHORT MdlFlags; //0x6 标志,设置一些内存属性 struct _EPROCESS* Process; //0x8 缓冲区所属进程 VOID* MappedSystemVa; //0xc 映射之后的系统空间虚拟地址 VOID* StartVa; //0x10 缓冲区所在第一个页面的虚拟地址 ULONG ByteCount; //0x14 字节数,虚拟地址的大小 ULONG ByteOffset; //0x18 StartVa + ByteOffset缓冲区开始的地址 }; ``` 各成员的含义如下: - `Next`:用于挂入到一个队列中,如插入到驱动程序的IRP的MDL队列中,可将多个MDL连接成一个链表[^1][^2][^4]。 - `Size`:指定这个MDL所占的空间大小,等于MDL结构体的大小加上`sizeof(PFN_NUMBER)`乘以映射需要的页面数。该值减去`sizeof(MDL)`,等于存放物理页面编号区域的大小。例如,若该MDL需要三个物理页面来映射虚拟地址空间,则`Size - sizeof(MDL) == 4 * 3 == 12` [^1][^3]。 - `MdlFlags`:指明MDL的映射方式,用于设置一些内存属性 [^1][^2]。 - `Process`:指明此MDL属于哪个进程 [^1][^2]。 - `MappedSystemVa`:所描述的内存如果有映射到系统空间并锁定,那么这个成员指定了MDL在系统空间内的地址 [^1]。 - `StartVa`:所描述的内存映射后的虚拟地址的开始页面地址,这个地址总是页面对齐的地址 [^1]。 - `ByteCount`:此MDL所描述的内存块的字节数 [^1][^2]。 - `ByteOffset`:MDL映射的虚拟地址的首地址在`StartVa`页面中的偏移值 [^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值