windows内核情景分析学习笔记11

1、windows进程/线程相关函数

win32API中创建进程使用CreateProcess函数。

CreateProcess完成两件事:

①使用NtCreateProcess创建进程

②如果NtCreateProcess成功,则使用NtCreateThread创建此进程的第一个线程(主线程)

 

声明如下:

NTSTATUS NTAPI NtCreateProcess(OUT PHANDLE ProcessHandle, //返回进程的句柄(在当前进程中) IN ACCESS_MASK DesiredAccess, //对进程的访问权限 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, //所执行的可执行文件的路径名 IN HANDLE ParentProcess, //指定进程的父进程 IN BOOLEAN InheritObjectTable, //是否继承父进程的对象句柄表 IN HANDLE SectionHandle OPTIONAL, IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL)

 

NTSTATUS NTAPI NtCreateThread(OUT PHANDLE ThreadHandle, //返回线程的句柄 IN ACCESS_MASK DesiredAccess, //访问权限 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ProcessHandle, //指定此线程所属的进程 OUT PCLIENT_ID ClientId, IN PCONTEXT ThreadContext, //各寄存器的值(运行上下文) IN PINITIAL_TEB InitialTeb, //线程环境块 IN BOOLEAN CreateSuspended) //线程创建后是否被挂起(或立刻运行)

 

除了CreateProcess,API还提供了CreateThread来创建线程。此函数的系统调用亦是NtCreateThread。

 

2、windows进程相关数据结构

系统空间中:

①EPROCESS:管理层 进程控制块。代表着windows的一个进程。

②KPROCESS:核心层 进程控制块。EPROCESS的一个分量。

③W32PROCESS:窗口进程独有

因KPROCESS隶属于EPROCESS,所以内核中与进程相关的数据结构有两种,EPROCESS和W32PROCESS。前者是每个进程都有,后者是只有窗口进程(通过窗口与用户交互)才有。

 

用户空间中:

①进程环境块PEB:PEB记录进程的运行参数、映像装入地址等。位置处于0x7ffdf000。

 

下面看一下定义:

EPROCESS(部分):

typedef struct _EPROCESS { KPROCESS Pcb; //本进程的KPROCESS ... PHANDLE_TABLE ObjectTable; //对象句柄表 ... PVOID *Win32Process; //指向本进程的W32PROCESS结构 struct _EJOB *Job; PVOID SectionObject; //指向为可执行程序创建的文件映射区对象 PVOID SectionBaseAddress; ... PVOID DeviceMap; //指向本进程的磁盘设备位图 ... CHAR ImageFileName[16]; //程序文件名 LIST_ENTRY JobLinks; PVOID LockedPagesList; LIST_ENTRY ThreadListHead; //本进程的线程队列 ... ACCESS_MASK GrantedAccess; //所允许的访问方式 ... struct _PEB* Peb; //指向用户空间PEB ... UCHAR PriorityClass; //优先级 MM_AVL_TABLE VadRoot; //本进程的用户空间AVL树 ULONG Cookie; } EPROCESS;

 

KPROCESS(部分):

typedef struct _KPROCESS { DISPATCHER_HEADER Header; LIST_ENTRY ProfileListHead; ULONG DirectoryTableBase; //本进程页面映射表的物理地址 ... LIST_ENTRY ReadyListHead; //本进程的就绪线程队列 SINGLE_LIST_ENTRY SwapListEntry; PVOID VdmTrapcHandler; LIST_ENTRY ThreadListHead; //本进程的线程队列(节点为KTHREAD) KSPIN_LOCK ProcessLock; ... SCHAR BasePriority; //线程优先级 ... ULONG StackCount; LIST_ENTRY ProcessListEntry; //挂入内核的进程队列 } KPROCESS;

 

PEB(部分):

typedef struct _PEB { BOOLEAN InheritedAddressSpace; BOOLEAN ReadImageFileExecOptions; BOOLEAN BeingDebugged; ... HANDLE Mutant; PVOID ImageBaseAddress; //程序镜像的起点 PPEB_LDR_DATA Ldr; struct _RTL_USER_PROCESS_PARAMETERS *ProcessParameters; //指向进程参数块(其中有一些参数信息,如当前文件目录等) ... PVOID FastPebLock; PPEBLOCKROUTINE FastPebLockRoutine; PPEBLOCKROUTINE FastPebUnlockRoutine; ULONG EnvironmentUpdateCount; PVOID* KernelCallbackTable; //从内核回调用户空间的函数 PVOID EventLogSection; PVOID EventLog; ... } PEB, *PPEB;

 

3、windows线程相关数据结构

与进程的数据结构对应,线程也有ETHREAD/KTHREAD/W32THREAD/TEB。

 

ETHREAD:

typedef struct _ETHREAD { KTHREAD Tcb; //本线程的KTHREAD结构 ... LIST_ENTRY ThreadListEntry; //挂入EPROCESS中的线程队列 ... } ETHREAD;

 

KTHREAD:

typedef struct _KTHREAD { DISPATCHER_HEADER DispatcherHeader; ... PVOID KernelStack; //本线程的系统空间堆栈 KSPIN_LOCK ThreadLock; union { KAPC_STATE ApcState; //本线程的ACP状态 ... }; ... struct _TEB *Teb; //用户空间的线程环境块(TEB) ... PKTRAP_FRAME TrapFrame; //系统空间堆栈上的自陷框架 ... struct _KPROCESS *Process; //所属进程的KPROCESS结构 ... PVOID Win32Thread; //指向本线程的W32THREAD结构 PVOID StackBase; ... LIST_ENTRY ThreadListEntry; //挂入KPROCESS中的线程队列 ... } KTHREAD;

 

你可能感兴趣的:(数据结构,windows,struct,list,header,attributes)