zoukankan      html  css  js  c++  java
  • 【内核篇】Windows内核重要变量

    ======================================================

    LIST_ENTRY PsLoadedModuleList;

    [定  义] wrkwrk-v1.2ase tosmmSysload.c

    [初始化] wrkwrk-v1.2ase tosmmSysload.c  [MiInitializeLoadedModuleList()]

    [引  用]

    l  NtQuerySystemInformation()             查询系统所有内核模块

    l  MiReleaseAllMemory()                       释放所有内核模块

    l  MiProcessLoaderEntry()                            从全局链表中插入或删除一个模块

    [描  述]

    内核加载的所有驱动对象链表。链表所连接结构为KLDR_DATA_TABLE_ENTRY。

    使用NtQuerySystemInformation()查询系统模块信息和进程信息时内部就是在对这个链表进行遍历。

    ======================================================

    LIST_ENTRY PsActiveProcessHead;

    [定  义] wrkwrk-v1.2ase tospsPsinit.c

    [初始化] wrkwrk-v1.2ase tospsPsinit.c  [PspInitPhase0()]

    [引  用]

    l  PsEnumProcesses()                     遍历所有进程

    l  PsGetNextProcess()                     获取下一个进程

    l  PspCreateProcess()               创建一个新进程插入到链表中

    [描  述]

    内核所有进程EPROCESS对象链表,所有获取进程列表的函数都是从这里出发遍历的。

    该全局变量通过EPROCESS中的ActiveProcessLinks把所有进程链接在一起。

    ======================================================

    PEPROCESS PsIdleProcess;

    [定  义] wrkwrk-v1.2ase tospsPsinit.c

    [初始化] wrkwrk-v1.2ase tospsPsinit.c  [PspInitPhase0()]

    [引  用]

    [描  述]

    空闲进程的进程对象

    ======================================================

    PEPROCESS PsInitialSystemProcess; //导出

    [定  义] wrkwrk-v1.2ase tospsPsinit.c

    [初始化] wrkwrk-v1.2ase tospsPsinit.c  [PspInitPhase0()]

    [引  用]

    [描  述]

    系统进程(SYSTEM)的进程对象,被内核导出,驱动程序使用它可以遍历全局进程链表。

    ======================================================

    KSERVICE_TABLE_DESCRIPTOR

    KeServiceDescriptorTable[NUMBER_SERVICE_TABLES]; //导出

    [定  义] wrkwrk-v1.2ase toskekernldat.c

    [初始化] wrkwrk-v1.2ase toskekeinit.c  [KiSystemStartup ()]

    [引  用]

    l  KeInitThread()                                     线程初始化使用SSDT表

    l  KeAddSystemServiceTable()                     增加系统调用表

    [描  述]

    著名的SSDT表,包含了Windows NT内核的基本系统服务,供Ring3调用。其中宏NUMBER_SERVICE_TABLES随不同系统不一样。WRK中定义为2。

    ======================================================

    KSERVICE_TABLE_DESCRIPTOR

    KeServiceDescriptorTableShadow [NUMBER_SERVICE_TABLES];

    [定  义] wrkwrk-v1.2ase toskekernldat.c

    [初始化] wrkwrk-v1.2ase toske 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;

    [定  义] wrkwrk-v1.2ase tosioiomgrIodata.c

    [初始化] wrkwrk-v1.2ase tosioiomgrIoinit.c  [IoInitSystem()]

    [引  用]

    l  IoRegisterShutdownNotification()           添加关机回调

    l  IoUnregisterShutdownNotification()        删除关机回调

    l  IoShutdownSystem()                                 遍历链表发送关机消息

    [描  述]

    关机回调驱动对象链表,使用IoRegisterShutdownNotification()注册的驱动会在这里。链表链接结构为:SHUTDOWN_PACKET

    详情查看WRK源码中IoRegisterShutdownNotification()函数实现向该结构添加新的关机回调, IoUnregisterShutdownNotification从该结构中删除回调。在函数IoShutdownSystem()中会遍历这个链表,向它们分别发送IRP_MJ_SHUTDOWN消息。

    ======================================================

    LIST_ENTRY IopNotifyLastChanceShutdownQueueHead;

    [定  义] wrkwrk-v1.2ase tosioiomgrIodata.c

    [初始化] wrkwrk-v1.2ase tosioiomgrIoinit.c  [IoInitSystem()]

    [引  用]

    l  IoRegisterLastChanceShutdownNotification()      添加关机回调

    l  IoUnregisterShutdownNotification()                      删除关机回调

    l  IoShutdownSystem()                                               遍历链表发送关机消息

    [描  述]

    关机回调驱动对象链表,使用IoRegisterLastChanceShutdownNotification()注册的驱动会在这里。链表链接结构为:SHUTDOWN_PACKET

    注意和IoRegisterShutdownNotification()不同的是,这里从名字中可以看出LastChance——最后机会,WDK中给出了说明,这里注册的关机回调被调用时所有的文件系统已经关闭了,所以不能执行关于文件IO的相关操作。看WRK也可以印证这一点。

    ======================================================

    LIST_ENTRY IopDriverReinitializeQueueHead;

    [定  义] wrkwrk-v1.2ase tosioiomgrIodata.c

    [初始化] wrkwrk-v1.2ase tosioiomgrIoinit.c  [IoInitSystem()]

    [引  用]

    l  IopCallDriverReinitializationRoutines()                  调用驱动二次初始化例程

    l  IoRegisterDriverReinitialization()                           注册驱动为此初始化例程

    [描  述]

    驱动二次初始化链表头

    ======================================================

    LIST_ENTRY IopBootDriverReinitializeQueueHead;

    [定  义] wrkwrk-v1.2ase tosioiomgrIodata.c

    [初始化] wrkwrk-v1.2ase tosioiomgrIoinit.c  [IoInitSystem()]

    [引  用]

    l  IopCallBootDriverReinitializationRoutines()   调用0级驱动二次初始化例程

    l  IoRegisterBootDriverReinitialization()            注册0级驱动二次初始化例程

    [描  述]

    0级驱动二次初始化链表头

    ======================================================

    EX_CALLBACK CmpCallBackVector [CM_MAX_CALLBACKS] = {0};

    ULONG CmpCallBackCount = 0;

    [定  义] wrkwrk-v1.2ase tosconfigCmhook.c

    [初始化] wrkwrk-v1.2ase tosconfigCmhook.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;

    [定  义] wrkwrk-v1.2ase tospspsp.h

    [初始化] wrkwrk-v1.2ase tospsPsinit.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;

    [定  义] wrkwrk-v1.2ase tospspsp.h

    [初始化] wrkwrk-v1.2ase tospsPsinit.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;

    [定  义] wrkwrk-v1.2ase tospspsp.h

    [初始化] wrkwrk-v1.2ase tospsPsinit.c  [PspInitPhase0()]

    [引  用]

    l  PsSetLoadImageNotifyRoutine                 添加模块加载回调

    l  PsRemoveLoadImageNotifyRoutine        移除模块加载回调

    l  PsCallImageNotifyRoutines                      调用所有模块加载回调

    [描  述]

    驱动程序使用PsSetLoadImageNotifyRoutine添加和使用PsRemoveLoadImageNotifyRoutine删除模块加载回调函数,用于对模块加载事件进行捕获。其添加的回调函数保存在这个全局数组中,WRK中宏PSP_MAX_LOAD_IMAGE_NOTIFY定义为8,最多支持8个回调。

    ======================================================

    PHANDLE_TABLE PspCidTable;

    [定  义] wrkwrk-v1.2ase tosps Psinit.c

    [初始化] wrkwrk-v1.2ase tospsPsinit.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;

    [定  义] wrkwrk-v1.2ase tosexHandle.c

    [初始化] wrkwrk-v1.2ase tosexHandle.c  [ExInitializeHandleTablePackage ()]

    [引  用]

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

    l  ExDupHandleTable()

    l  ExSnapShotHandleTables()

     [描  述]

    系统所有进程的句柄表构成一个链表,链表节点为HANDLE_TABLE,而上面的PspCidTable是个例外。

    ======================================================

    PHANDLE_OBJECT ObpKernelHandleTable;

    [定  义] wrkwrk-v1.2ase tosobobp.h

    [初始化] wrkwrk-v1.2ase tosobobinit.c  [ObInitSystem ()]

    [引  用]

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

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

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

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

    l  ObReferenceObjectByHandle()          通过句柄引用对象(内核句柄)

    [描  述]

    系统进程System的句柄表,也是内核全局句柄表。内核驱动程序所打开的句柄都存储在这里。内核句柄最高位为1。

    ======================================================

    CCHAR KeNumberProcessors; //导出

    [定  义] wrkwrk-v1.2ase toskekernldat.c

    [初始化] wrkwrk-v1.2ase toske ewsysbg.c  [KiSystemStartup ()]

    [引  用]

    [描  述]

    处理器数量

    ======================================================

    PKPRCB KiProcessorBlock[MAXIMUM_PROCESSORS];

    [定  义] wrkwrk-v1.2ase toskekernldat.c

    [初始化] wrkwrk-v1.2ase tosexobinit.c  [KiSystemStartup ()]

    [引  用]

    l  KiSwapThread()                                   线程调度

    l  KiSetAffinityThread()                          设置线程亲和性

    [描  述]

    系统核心数据结构,与线程调度密切相关。所有KPRCB的指针数组,往前拨偏移可以得到对应KPCR。MAXIMUM_PROCESSORS定义为32。而实际数组的元素个数由上面KeNumberProcessors决定,每个处理器对应一个KPRCB结构体。

    ======================================================

    ULONG_PTR KiSystemSharedData =KI_USER_SHARED_DATA;

    [定  义] wrkwrk-v1.2ase toskekernldat.c

    [初始化] wrkwrk-v1.2ase toske kernldat.c

    [引  用]

    [描  述]

    常量指针,指向Ring0与Ring3共享的一个页面地址,宏KI_USER_SHARED_DATA定义为:0xFFDF0000,即内核态地址,用户态地址为:0x7FFE0000。该页面存储的数据结构是:KUSER_SHARED_DATA。

    ======================================================

    PVOID KeUserExceptionDispatcher;

    [定  义] wrkwrk-v1.2ase toskekernldat.c

    [初始化] wrkwrk-v1.2ase tospskulookup.c  [PspLookupKernelUserEntryPoints ()]

    [引  用]

    l  KiDispatchException()                        异常分发

    [描  述]

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

     

     

    To be update…

     

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

  • 相关阅读:
    《RabbitMQ 实战》读书笔记
    使用jstack命令查看CPU高占用的问题记录
    两种常见的单元测试方式(笔记)
    Apache Solr入门教程(转)
    搜索引擎选择: Elasticsearch与Solr(转)
    CopyOnWriteArrayList与Collections.synchronizedList的性能对比(转)
    理解list和vector的区别
    从上往下打印出二叉树的每个节点,同层节点从左至右打印。
    TypeError: Object function (req, res, next) { app.handle(req, res, next); } has no method 'configure'
    Cannot find module 'crc'
  • 原文地址:https://www.cnblogs.com/xuanyuan/p/4165232.html
Copyright © 2011-2022 走看看