推薦序 1
推薦序 2
序言
前言
第 1 章 搭建開發和調試環境
1.1 編譯環境
1.2 使用 Bochs 運行 ntos.img
1.3 使用 VMware 運行 ntos.vmdk
1.4 模擬調試運行
1.5 編程思想(等差數列求和)
1.6 函數調用約定
1.7 模塊擴展約定
1.8 本章總結
第 2 章 Windows 內核加載器(SU)
2.1 主引導記錄(MBR)
2.2 係統分區(Partition1)
2.3 SU 模塊(startup.com)
2.3.1 原版 Windows Server 2003 係統 NTLDR startup.com 基本分析
2.3.2 根據原理重新構建新的 startup.com
2.4 檢測物理內存
2.5 開啓 A20 地址綫
2.6 重新定位 GDT 和 IDT
2.7 保護模式
2.7.1 段描述符(Segment Descriptor)
2.7.2 特權級(privilege level)
2.7.3 段描述符錶(segment descriptor table)
2.7.4 開啓保護模式
2.8 加載 Loader 模塊
2.9 轉移控製權
2.10 導齣函數
2.10.1 讀寫扇區
2.10.2 獲取物理內存塊
2.10.3 檢測硬件
2.11 本章總結
第 3 章 Windows 內核調試設計
3.1 初始化調試係統
3.2 初始化模擬調試
3.3 初始化內核調試
3.3.1 中斷和異常嚮量錶
3.3.2 注冊異常處理例程
3.3.3 基於棧框架的異常處理程序
3.3.4 除零錯誤(#DE)
3.3.5 單步異常(#DB)
3.3.6 斷點異常(#BP)
3.3.7 一般保護性錯誤(#GP)
3.3.8 頁麵錯誤(#PF)
3.3.9 調試器服務(debugger service)
3.4 分發異常
3.5 內核調試分發
3.5.1 打印字符串
3.5.2 加載/卸載符號
3.5.3 報告異常
3.6 內核調試引擎核心
3.6.1 獲取係統版本
3.6.2 獲取/設置機器信息
3.6.3 讀/寫虛擬內存
3.6.4 設置/恢復斷點
3.7 調試通信協議
3.7.1 串行端口
3.7.2 COM 寄存器
3.7.3 波特率
3.7.4 端口初始化
3.7.5 通信協議
3.7.6 讀端口
3.7.7 寫端口
3.7.8 調試包
3.7.9 接收調試包(KdReceivePacket)
3.7.10 發送調試包(KdSendPacket)
3.8 本章總結
第 4 章 Windows 內核加載器(Loader)
4.1 NtProcessStartup
4.2 PcMachInit
4.3 初始化內存管理器
4.3.1 內存描述符錶
4.3.2 頁麵查找錶
4.3.3 初始化堆
4.4 分頁機製
4.4.1 頁幀號(PFN)
4.4.2 頁目錄和頁錶
4.4.3 開啓分頁機製
4.4.4 虛擬地址轉譯物理地址
4.4.5 修改頁目錄和頁錶位置
4.5 Loader 讀/寫支持
4.5.1 ARC 接口標準
4.5.2 虛擬磁盤驅動(RamDisk)
4.5.3 磁盤驅動(Hwdisk)
4.5.4 文件係統驅動(Ldfs)
4.6 加載器參數塊
4.7 加載和啓動內核
4.7.1 收集硬件信息
4.7.2 本地語言支持(NLS)
4.7.3 加載模塊
4.7.4 內存描述符鏈錶
4.7.5 處理器控製域(PCR)和任務狀態段(TSS)
4.8 本章總結
第 5 章 結構化異常處理
5.1 異常觸發
5.2 分發異常(RtlDispatchException)
5.3 異常處理(_except_handler3)
5.4 全局展開(__global_unwind2)
5.5 局部展開(__local_unwind2)
5.6 冒泡排序(BubbleSort)
5.7 本章總結
第 6 章 內存管理
6.1 物理內存管理概述
6.2 虛擬地址空間布局
6.3 初始化內存係統(MmArmInitSystem)
6.4 初始化機器相關(MiInitMachineDependent)
6.5 初始化非分頁池(MiInitializeNonPagedPool)
6.6 初始化係統 PTE(MiInitializeSystemPtes)
6.7 映射頁幀數據庫(MiMapPfnDatabase)
6.8 初始化顔色錶(MiInitializeColorTables)
6.9 初始化頁幀號數據庫(MiInitializePfnDatabase)
6.9.1 從頁麵建立頁幀號數據庫(MiBuildPfnDatabaseFromPages)
6.9.2 從加載塊物理內存鏈錶建立頁幀號數據庫(MiBuildPfnDatabaseFromLoad-
erBlock)
6.10 初始化池(InitializePool)
6.11 分配池頁麵(MiAllocatePoolPages)
6.11.1 非分頁池分配
6.11.2 分頁池分配
6.11.3 分頁池頁麵錯誤處理
6.12 釋放池頁(MiFreePoolPages)
6.12.1 釋放分頁池
6.12.2 釋放非分頁池
6.13 建立分頁池(MiBuildPagedPool)
6.14 分配池內存(ExAllocatePoolWithTag)
6.15 釋放池內存(ExFreePoolWithTag)
6.16 初始化係統空間映射(MiInitializeSystemSpaceMap)
6.17 本章總結
第 7 章 對象管理
7.1 對象概述
7.1.1 對象整體結構
7.1.2 對象頭(object header)
7.1.3 對象類型(object type)
7.1.4 對象類型例程模闆(object type procedure template)
7.2 分配對象內存空間(ObpAllocateObject)
7.3 釋放對象內存空間(ObpDeallocateObject)
7.4 初始化對象係統(ObInitSystem)
7.5 創建句柄錶(ExCreateHandleTable)
7.6 創建對象類型(ObCreateObjectType)
7.7 創建目錄對象(NtCreateDirectoryObject)
7.8 創建對象(ObCreateObject)
7.9 插入對象(ObInsertObject)
7.10 查找對象名(ObpLookupObjectName)
7.11 查找目錄項(ObpLookupEntryDirectory)
7.12 創建無名句柄(ObpCreateUnnamedHandle)
7.13 分配句柄錶項(ExpAllocateHandleTableEntry)
7.14 解析符號鏈接(ObpParseSymbolicLink)
7.15 Section 和 Segment
7.15.1 Prototype PTE 頁麵異常處理
7.15.2 Section 映射到係統進程
7.15.3 VAD 頁麵錯誤處理
7.16 本章總結
第 8 章 I/O 係統
8.1 初始化 I/O 係統(IoInitSystem)
8.2 創建驅動對象(IopCreateDriver)
8.3 創建設備對象(IoCreateDevice)
8.4 分配 I/O 請求包(IoAllocateIrp)
8.5 傳遞 I/O 請求包(IoCallDriver)
8.6 釋放 I/O 請求包(IoFreeIrp)
8.7 解析設備(IopParseDevice)
8.8 磁盤讀/寫支持
8.9 本章總結
第 9 章 文件係統設計
9.1 文件係統初始化(DriverEntry)
9.2 掛載捲(NtfsMountVolume)
9.2.1 識彆文件係統格式
9.2.2 文件控製塊(FCB)
9.2.3 上下文控製塊(CCB)
9.2.4 創建流文件對象(IoCreateStreamFileObject)
9.2.5 初始化緩存映射(CcInitializeCacheMap)
9.3 打開文件(NtfsOpenFile)
9.4 讀文件(NtfsReadFile)
9.5 關閉文件(NtfsCloseFile)
9.6 發起捲掛載請求
9.7 加載 NTDLL
9.7.1 打開 NTDLL
9.7.2 檢查 NTDLL 映像(MmCheckSystemImage)
9.7.3 創建 NTDLL Section
9.7.4 映射 NTDLL Section 到當前進程空間
9.7.5 獲取用戶進入點
9.8 本章總結
第 10 章 進程和綫程
10.1 進程和綫程初始化
10.1.1 初始化進程
10.1.2 初始化綫程
10.1.3 初始化綫程上下文
10.1.4 初始化進程係統(PspInitPhase0)
10.2 綫程優先級(priority)
10.3 綫程狀態(thread state)
10.4 綫程調度(thread dispatch)
10.5 分配進程虛擬內存(NtAllocateVirtualMemory)
10.6 創建用戶進程(smss.exe)
10.7 本章總結
附錄 A PE 格式
· · · · · · (
收起)