【内核篇】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内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定 ...
随机推荐
- bzoj2928: [Poi1999]飞弹
惨啊…… 被卡常是一种什么感受&…… 很明显的分治. 我们首先可以找到所有点中的最低点,然后对所有点进行一次极角排序,选取一个点使得他各侧飞弹和地堡一样多,并对两侧继续进行分治. 很容易证明这 ...
- Javascript模块化编程(三):require.js的用法
Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- 【POJ2104】K-th Number
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABToAAAJ2CAIAAADwi6oDAAAgAElEQVR4nOy9a5Pj1nnvi0/Q71Llj3
- 【Network】OVS、VXLAN/GRE、OVN等 实现 Docker/Kubernetes 网络的多租户隔离
多租户隔离 DragonFlow与OVN | SDNLAB | 专注网络创新技术 Neutron社区每周记(6.25~7.6)| OVS将加入Linux基金会?OVN或抛弃ovsdb? | Unite ...
- 最新Mac OS X 10.12.1 安装cocoapods及使用详解
cocoapods官网:https://cocoapods.org 一.什么是CocoaPods 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如 Java 语言的 Maven,nodejs ...
- CSS3 media 入门
css3 media 严格来说是自适应布局 对不同的屏幕(正确的说应该是) 写不同的css样式.而流式布局 则才算是响应式布局. css3 media 语法: @media mediatype a ...
- linux下php-mysql拓展安装
今天遇到一个奇怪的问题: 在服务器A上部署应用,在服务器B上部署数据库和缓存. 服务器A:apache2.2,php5.3 服务器B:mysql5.5,redis2.4 问题现象: 本地远程连接服务器 ...
- Mac系统下开启和关闭隐藏文件的方法
在Mac下找到终端,输入以下命令(注意区分大小写): 显示Mac隐藏文件的命令: defaults write com.apple.finder AppleShowAllFiles -bool tru ...
- 创建Odoo8数据库时的“new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)“问题
Odoo8创建数据库时,显示如下错误信息: DataError: new encoding (UTF8) is incompatible with the encoding of the templa ...