【内核篇】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 ()]

[引  用]


ExCreateHandleTable()                       创建进程时调用创建句柄表链入全局链表头


ExDupHandleTable()


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 ()]

[引  用]


ObpCloseHandle()                              关闭句柄(内核句柄)


ObpCreateHandle()                                   创建句柄(内核句柄)


ObpCreateUnnamedHandle()            创建匿名句柄(内核句柄)


ObSetHandleAttributes()                   设置句柄属性(内核句柄)


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 ()]

[引  用]


KiSwapThread()                                   线程调度


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
()]

[引  用]


KiDispatchException()                        异常分发

[描  述]

函数指针,指向了用户模式异常处理入口:位于ntdll.dll中的KiUserExceptionDispatcher函数。用于系统在进行异常分发过程中向用户态分发异常。

To be update…

轩辕之风http://www.cnblogs.com/xuanyuan/

上一篇:考拉Android统一弹框


下一篇:git 临时记录