typedef struct _KPROCESS
{
DISPATCHER_HEADER Header;
LIST_ENTRY ProfileListHead;
ULONG DirectoryTableBase;
ULONG Unused0;
KGDTENTRY LdtDescriptor;
KIDTENTRY Int21Descriptor;
WORD IopmOffset;
UCHAR Iopl;
UCHAR Unused;
ULONG ActiveProcessors;
ULONG KernelTime;
ULONG UserTime;
LIST_ENTRY ReadyListHead;
SINGLE_LIST_ENTRY SwapListEntry;
PVOID VdmTrapcHandler;
LIST_ENTRY ThreadListHead;
ULONG ProcessLock;
ULONG Affinity;
union
{
ULONG AutoAlignment: 1;
ULONG DisableBoost: 1;
ULONG DisableQuantum: 1;
ULONG ReservedFlags: 29;
LONG ProcessFlags;
};
CHAR BasePriority;
CHAR QuantumReset;
UCHAR State;
UCHAR ThreadSeed;
UCHAR PowerState;
UCHAR IdealNode;
UCHAR Visited;
union
{
KEXECUTE_OPTIONS Flags;
UCHAR ExecuteOptions;
};
ULONG StackCount;
LIST_ENTRY ProcessListEntry;
UINT64 CycleTime;
} KPROCESS, *PKPROCESS;
Header:
表明是分发器对象,可用于等待。进程退出时,此对象为有信号状态。
ProfileListHead:
进程参与性能分析时,作为节点加入全局性能分析进程链表。
DirectoryTableBase:
两个成员的数组,第一个指向页目录表地址,第二个指向超空间的页目录表地址。
LdtDescriptor:
LDT的描述符
Int21Descriptor:
为了兼容DOS,通过int 21h调用系统功能。
IopmOffset:
指定IOPM(IO权限表,IO Privilege Map)位置。控制进程的用户模式IO访问权限。
Iopl:
IO优先级(IO Privilege Level)。
ActiveProcessors:
记录进程正在哪些处理器上运行。
KernelTime:
在内核模式运行所花时间。
UserTime:
在用户模式运行所花时间。
ReadyListHead:
一个双向链表的表头。保存进程中处于就绪状态但未被加入全局就绪链表的线程。每一项是KTHREAD的WaitListEntry域。
SwapListEntry:
单链表项,进程要被换出时,通过此域加入到KiProcessOutSwapListHead为头的单链表。要被换入内存时,通过此域加入KiProcessInSwapListHead为头的单链表。
VdmTrapcHandler:
VDM环境下运行16位程序时,处理Ctrl+C中断的函数。
ThreadListHead:
指向一个链表头,链表中包含该进程的所有线程。
ProcessLock:
一个自旋锁对象。保证对进程数据结构中成员的互斥访问。
Affinity:
指定该进程的线程可以在哪些处理器上运行。
BasePriority:
该进程的线程的基本优先级。
QuantumReset:
进程中线程的基本时限重置值。
State:
说明进程是否在内存中。
ThreadSeed:
该进程的下一个创建线程的理想处理器。创建一个线程后,该值会改变。
PowerState:
电源状态。
IdealNode:
进程优先选择的处理器节点。这里是NUMA(非一致的内存访问)。
ExecuteOptions:
NX执行选项。
StackCount:
当前进程中有多少个线程的栈位于内存中。
ProcessListEntry:
当前系统中所有具有活动线程的进程通过这个域串成一个链表。(执行体中EPROCESS有一个总进程链表)
欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。