【内核篇】Windows内核重要变量
======================================================
LIST_ENTRY PsLoadedModuleList;
[定 义] wrk\wrk-v1.2\base\ntos\mm\Sysload.c
[初始化] wrk\wrk-v1.2\base\ntos\mm\Sysload.c [MiInitializeLoadedModuleList()]
[引 用]
l NtQuerySystemInformation() 查询系统所有内核模块
l MiReleaseAllMemory() 释放所有内核模块
l MiProcessLoaderEntry() 从全局链表中插入或删除一个模块
[描 述]
内核加载的所有驱动对象链表。链表所连接结构为KLDR_DATA_TABLE_ENTRY。
使用NtQuerySystemInformation()查询系统模块信息和进程信息时内部就是在对这个链表进行遍历。
======================================================
LIST_ENTRY PsActiveProcessHead;
[定 义] wrk\wrk-v1.2\base\ntos\ps\Psinit.c
[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c [PspInitPhase0()]
[引 用]
l PsEnumProcesses() 遍历所有进程
l PsGetNextProcess() 获取下一个进程
l PspCreateProcess() 创建一个新进程插入到链表中
[描 述]
内核所有进程EPROCESS对象链表,所有获取进程列表的函数都是从这里出发遍历的。
该全局变量通过EPROCESS中的ActiveProcessLinks把所有进程链接在一起。
======================================================
PEPROCESS PsIdleProcess;
[定 义] wrk\wrk-v1.2\base\ntos\ps\Psinit.c
[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c [PspInitPhase0()]
[引 用]
[描 述]
空闲进程的进程对象
======================================================
PEPROCESS PsInitialSystemProcess; //导出
[定 义] wrk\wrk-v1.2\base\ntos\ps\Psinit.c
[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c [PspInitPhase0()]
[引 用]
[描 述]
系统进程(SYSTEM)的进程对象,被内核导出,驱动程序使用它可以遍历全局进程链表。
======================================================
KSERVICE_TABLE_DESCRIPTOR
KeServiceDescriptorTable[NUMBER_SERVICE_TABLES]; //导出
[定 义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c
[初始化] wrk\wrk-v1.2\base\ntos\ke\keinit.c [KiSystemStartup ()]
[引 用]
l KeInitThread() 线程初始化使用SSDT表
l KeAddSystemServiceTable() 增加系统调用表
[描 述]
著名的SSDT表,包含了Windows NT内核的基本系统服务,供Ring3调用。其中宏NUMBER_SERVICE_TABLES随不同系统不一样。WRK中定义为2。
======================================================
KSERVICE_TABLE_DESCRIPTOR
KeServiceDescriptorTableShadow [NUMBER_SERVICE_TABLES];
[定 义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c
[初始化] wrk\wrk-v1.2\base\ntos\ke\ keinit.c [KiInitSystem ()]
[引 用]
l KeAddSystemServiceTable() 增加系统调用表
l PsConvertToGuiThread() GUI线程使用Shadow表
l NtQuerySystemInformation() 查询系统调用数量
[描 述]
著名的Shadow SSDT表,包含了Windows NT内核基本服务和Win32子系统内核的基本系统服务,供Ring3调用。其中宏NUMBER_SERVICE_TABLES随不同系统不一样。WRK中定义为2。
======================================================
LIST_ENTRY IopNotifyShutdownQueueHead;
[定 义] wrk\wrk-v1.2\base\ntos\io\iomgr\Iodata.c
[初始化] wrk\wrk-v1.2\base\ntos\io\iomgr\Ioinit.c [IoInitSystem()]
[引 用]
l IoRegisterShutdownNotification() 添加关机回调
l IoUnregisterShutdownNotification() 删除关机回调
l IoShutdownSystem() 遍历链表发送关机消息
[描 述]
关机回调驱动对象链表,使用IoRegisterShutdownNotification()注册的驱动会在这里。链表链接结构为:SHUTDOWN_PACKET
详情查看WRK源码中IoRegisterShutdownNotification()函数实现向该结构添加新的关机回调, IoUnregisterShutdownNotification从该结构中删除回调。在函数IoShutdownSystem()中会遍历这个链表,向它们分别发送IRP_MJ_SHUTDOWN消息。
======================================================
LIST_ENTRY IopNotifyLastChanceShutdownQueueHead;
[定 义] wrk\wrk-v1.2\base\ntos\io\iomgr\Iodata.c
[初始化] wrk\wrk-v1.2\base\ntos\io\iomgr\Ioinit.c [IoInitSystem()]
[引 用]
l IoRegisterLastChanceShutdownNotification() 添加关机回调
l IoUnregisterShutdownNotification() 删除关机回调
l IoShutdownSystem() 遍历链表发送关机消息
[描 述]
关机回调驱动对象链表,使用IoRegisterLastChanceShutdownNotification()注册的驱动会在这里。链表链接结构为:SHUTDOWN_PACKET
注意和IoRegisterShutdownNotification()不同的是,这里从名字中可以看出LastChance——最后机会,WDK中给出了说明,这里注册的关机回调被调用时所有的文件系统已经关闭了,所以不能执行关于文件IO的相关操作。看WRK也可以印证这一点。
======================================================
LIST_ENTRY IopDriverReinitializeQueueHead;
[定 义] wrk\wrk-v1.2\base\ntos\io\iomgr\Iodata.c
[初始化] wrk\wrk-v1.2\base\ntos\io\iomgr\Ioinit.c [IoInitSystem()]
[引 用]
l IopCallDriverReinitializationRoutines() 调用驱动二次初始化例程
l IoRegisterDriverReinitialization() 注册驱动为此初始化例程
[描 述]
驱动二次初始化链表头
======================================================
LIST_ENTRY IopBootDriverReinitializeQueueHead;
[定 义] wrk\wrk-v1.2\base\ntos\io\iomgr\Iodata.c
[初始化] wrk\wrk-v1.2\base\ntos\io\iomgr\Ioinit.c [IoInitSystem()]
[引 用]
l IopCallBootDriverReinitializationRoutines() 调用0级驱动二次初始化例程
l IoRegisterBootDriverReinitialization() 注册0级驱动二次初始化例程
[描 述]
0级驱动二次初始化链表头
======================================================
EX_CALLBACK CmpCallBackVector [CM_MAX_CALLBACKS] = {0};
ULONG CmpCallBackCount = 0;
[定 义] wrk\wrk-v1.2\base\ntos\config\Cmhook.c
[初始化] wrk\wrk-v1.2\base\ntos\config\Cmhook.c [CmpInitCallback()]
[引 用]
l CmRegisterCallback 注册注册表回调
l CmUnRegisterCallback 撤销注册表回调
l CmpCallCallBacks 调用注册表回调
[描 述]
XP系统上用于保存所有注册表回调的数据结构。驱动程序使用CmRegisterCallback注册的回调函数就保存在这里。通过对该数据结构进行处理将可以增加和删除注册表回调。注意,从Vista开始使用CM_CALLBACK_CONTEXT_BLOCKEX结构,使用CallbackListHead全局变量来保存节点。
======================================================
EX_CALLBACK
PspCreateProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
ULONG PspCreateProcessNotifyRoutineCount;
[定 义] wrk\wrk-v1.2\base\ntos\ps\psp.h
[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c [PspInitPhase0()]
[引 用]
l PspCreateThread 创建第一个线程时调用回调函数
l PsSetCreateProcessNotifyRoutine 添加或删除进程创建/退出回调
l PspExitProcess 进程退出调用回调函数
[描 述]
驱动程序使用PsSetCreateProcessNotifyRoutine添加和删除进程创建/退出回调函数,用于对进程诞生和消亡事件进行捕获。其添加的回调函数保存在这个全局数组中,WRK中宏PSP_MAX_CREATE_PROCESS_NOTIFY定义为8,最多支持8个回调。
======================================================
EX_CALLBACK
PspCreateThreadNotifyRoutine [PSP_MAX_CREATE_THREAD_NOTIFY];
ULONG PspCreateThreadNotifyRoutineCount;
[定 义] wrk\wrk-v1.2\base\ntos\ps\psp.h
[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c [PspInitPhase0()]
[引 用]
l PspCreateThread 线程创建时调用回调函数
l PsSetCreateThreadNotifyRoutine 添加线程创建/退出回调
l PsRemoveCreateThreadNotifyRoutine 移除线程创建/退出回调
l PspExitThread 线程退出时调用回调函数
[描 述]
驱动程序使用PsSetCreateThreadNotifyRoutine添加和使用PsRemoveCreateThreadNotifyRoutine删除线程创建/退出回调函数,用于对线程诞生和消亡事件进行捕获。其添加的回调函数保存在这个全局数组中,WRK中宏PSP_MAX_CREATE_THREAD_NOTIFY定义为8,最多支持8个回调。
======================================================
EX_CALLBACK
PspLoadImageNotifyRoutine [PSP_MAX_LOAD_IMAGE_NOTIFY];
ULONG PspLoadImageNotifyRoutineCount;
[定 义] wrk\wrk-v1.2\base\ntos\ps\psp.h
[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c [PspInitPhase0()]
[引 用]
l PsSetLoadImageNotifyRoutine 添加模块加载回调
l PsRemoveLoadImageNotifyRoutine 移除模块加载回调
l PsCallImageNotifyRoutines 调用所有模块加载回调
[描 述]
驱动程序使用PsSetLoadImageNotifyRoutine添加和使用PsRemoveLoadImageNotifyRoutine删除模块加载回调函数,用于对模块加载事件进行捕获。其添加的回调函数保存在这个全局数组中,WRK中宏PSP_MAX_LOAD_IMAGE_NOTIFY定义为8,最多支持8个回调。
======================================================
PHANDLE_TABLE PspCidTable;
[定 义] wrk\wrk-v1.2\base\ntos\ps\ Psinit.c
[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c [PspInitPhase0()]
[引 用]
l PspCreateThread() 创建线程插入全局句柄表
l PspCreateProcess() 创建进程插入全局句柄表
l PsLookupThreadByThreadId () 查找线程内核对象ETHREAD
l PsLookupProcessByProcessId() 查找进程内核对象EPROCESS
l PsLookupProcessThreadByCid() 根据ID同时查进程和线程
l PspProcessDelete() 删除一个进程
l PspThreadDelete() 删除一个线程
[描 述]
全局进程内核对象句柄表。PspCidTable是一个句柄表,其格式与普通的句柄表是完全一样的.但它与每个进程私有的句柄表有以下不同:
1.PspCidTable中存放的对象是系统中所有的进线程对象指针,其索引就是PID和CID
2.PspCidTable中存放是对象体(指向EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头(OBJECT_HEADER)
3.PspCidTable是一个独立的句柄表,而每个进程私有的句柄表以一个双链连接起来
======================================================
LIST_ENTRY HandleTableListHead;
[定 义] wrk\wrk-v1.2\base\ntos\ex\Handle.c
[初始化] wrk\wrk-v1.2\base\ntos\ex\Handle.c [ExInitializeHandleTablePackage ()]
[引 用]
l
ExCreateHandleTable() 创建进程时调用创建句柄表链入全局链表头
l
ExDupHandleTable()
l
ExSnapShotHandleTables()
[描 述]
系统所有进程的句柄表构成一个链表,链表节点为HANDLE_TABLE,而上面的PspCidTable是个例外。
======================================================
PHANDLE_OBJECT ObpKernelHandleTable;
[定 义] wrk\wrk-v1.2\base\ntos\ob\obp.h
[初始化] wrk\wrk-v1.2\base\ntos\ob\obinit.c [ObInitSystem ()]
[引 用]
l
ObpCloseHandle() 关闭句柄(内核句柄)
l
ObpCreateHandle() 创建句柄(内核句柄)
l
ObpCreateUnnamedHandle() 创建匿名句柄(内核句柄)
l
ObSetHandleAttributes() 设置句柄属性(内核句柄)
l
ObReferenceObjectByHandle() 通过句柄引用对象(内核句柄)
[描 述]
系统进程System的句柄表,也是内核全局句柄表。内核驱动程序所打开的句柄都存储在这里。内核句柄最高位为1。
======================================================
CCHAR KeNumberProcessors; //导出
[定 义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c
[初始化] wrk\wrk-v1.2\base\ntos\ke\newsysbg.c [KiSystemStartup ()]
[引 用]
[描 述]
处理器数量
======================================================
PKPRCB KiProcessorBlock[MAXIMUM_PROCESSORS];
[定 义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c
[初始化] wrk\wrk-v1.2\base\ntos\ex\obinit.c [KiSystemStartup ()]
[引 用]
l
KiSwapThread() 线程调度
l
KiSetAffinityThread() 设置线程亲和性
[描 述]
系统核心数据结构,与线程调度密切相关。所有KPRCB的指针数组,往前拨偏移可以得到对应KPCR。MAXIMUM_PROCESSORS定义为32。而实际数组的元素个数由上面KeNumberProcessors决定,每个处理器对应一个KPRCB结构体。
======================================================
ULONG_PTR KiSystemSharedData =KI_USER_SHARED_DATA;
[定 义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c
[初始化] wrk\wrk-v1.2\base\ntos\ke\ kernldat.c
[引 用]
[描 述]
常量指针,指向Ring0与Ring3共享的一个页面地址,宏KI_USER_SHARED_DATA定义为:0xFFDF0000,即内核态地址,用户态地址为:0x7FFE0000。该页面存储的数据结构是:KUSER_SHARED_DATA。
======================================================
PVOID KeUserExceptionDispatcher;
[定 义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c
[初始化] wrk\wrk-v1.2\base\ntos\ps\kulookup.c [PspLookupKernelUserEntryPoints
()]
[引 用]
l
KiDispatchException() 异常分发
[描 述]
函数指针,指向了用户模式异常处理入口:位于ntdll.dll中的KiUserExceptionDispatcher函数。用于系统在进行异常分发过程中向用户态分发异常。
To be update…
轩辕之风http://www.cnblogs.com/xuanyuan/
【内核篇】Windows内核重要变量的更多相关文章
- Linux 内核和 Windows 内核有什么区别?
Windows 和 Linux 可以说是我们比较常见的两款操作系统的. Windows 基本占领了电脑时代的市场,商业上取得了很大成就,但是它并不开源,所以要想接触源码得加入 Windows 的开发团 ...
- windows内核基础与异常处理
前两日碰到了用异常处理来做加密的re题目 所以系统学习一下windows内核相关 windows内核基础 权限级别 内核层:R0 零环 核心态工作区域 大多数驱动程序 应用层:R3 用户态工作区域 只 ...
- Windows内核原理系列01 - 基本概念
1.Windows API Windows 应用编程接口(API)是针对WIndwos操作系统用户模式的系统编程接口,包含在WindwosSDK中. 2.关于.NET .NET由一个被称为FCL的类库 ...
- [5]windows内核情景分析---进程线程
本篇主要讲述进程的启动过程.线程的调度与切换.进程挂靠 进程的启动过程: BOOL CreateProcess ( LPCTSTR lpApplicationName, ...
- [4]Windows内核情景分析---内核对象
写过Windows应用程序的朋友都常常听说"内核对象"."句柄"等术语却无从得知他们的内核实现到底是怎样的, 本篇文章就揭开这些技术的神秘面纱. 常见的内核对象 ...
- 【windwos 操作系统】关键的Windows内核数据结构一览(上)
文章作者:r00tk1t 发布时间:2018年01月08日 - 21时56分 最后更新:2020年10月20日 - 21时01分 原始链接:https://r00tk1ts.github.io/201 ...
- 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)
原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...
- Windows内核 基本数据结构
驱动对象: 每个驱动程序都会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载时被内核中的对象管理程序所创建的.驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并 ...
- Windows内核 基本汇编指令
1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...
- Windows内核安全与驱动开发
这篇是计算机中Windows Mobile/Symbian类的优质预售推荐<Windows内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定 ...
随机推荐
- mysql 日期查询 总结
1,对一天24小时内每小时的数据量求和: SELECT IFNULL(SUM(CASE HOUR(时间字段) WHEN 0 THEN 1 ELSE 0 END),0)as '0', IFNULL(SU ...
- Web Config配置备忘
数据压缩 <httpCompression>节点用于配置静态压缩和动态压缩,<urlCompression>则用于开关 http压缩 <urlCompression do ...
- HDU 2586
http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:求最近祖先节点的权值和 思路:LCA Tarjan算法 #include <stdio.h&g ...
- Django (2)
一.Django基本 程序编写 a. url.py /index/ -> func b. views.py def func(request): # 包含所有 ...
- [转]Android静态变量的生命周期
原文地址:https://my.oschina.net/jerikc/blog/137207 Android是用Java开发,其静态变量的生命周期遵守Java的设计.我们知道静态变量是在类被load的 ...
- theano学习
import numpy import theano.tensor as T from theano import function x = T.dscalar('x') y = T.dscalar( ...
- iOS10 远程推送服务器所需证书以及应用授权文件配置
推送证书制作步骤(目的:导出服务器需要的p12证书) 第一步: 打开Mac系统的"钥匙串访问"-"证书助理"-"从证书颁发机构请求证书" 取 ...
- OpenGL中坐标系的理解(一)
在OpenGL中,存在着至少存在着三种矩阵,对应着函数glMatrixMode()的三个参数:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE. 以下主要描述GL_MODEL ...
- jquery中的ajax参数说明
本文只作为记录,方便以后查阅. 内容原地址:$.ajax( )方法详解及案例_JQuery_wodi0007的博客_程序员博客网 http://u.cxyblog.com/28/article-aid ...
- Bill的挑战(bzoj 1879)
Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. Output ...