Windows內核重要變量
IST_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函數。用於系統在進行異常分發過程中向用戶態分發異常。
Windows內核重要變量