1. 程式人生 > >Windows內核重要變量

Windows內核重要變量

shared ssdt initial dha 著名 out pep 創建線程 sin

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內核重要變量