日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

2 《Undocumented Windows 2000 Secrets》翻譯 --- 第二章( 五 )


typedef struct _IO_STRATUS_BLOCK
{
NTSTATUS Status;
ULONG Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
列表 2-6. IO_STATUS_BLOCK 結構
另一個常見的 Windows 2000 數據類型是 LIST_ENTRY 結構,列表 2-7 給出了該結構的定義 。內核使用該結構將所有對象維護在一個雙向鏈表中 。一個對象分屬多個鏈表是很常見的,Flink 成員是一個向前鏈接,指向下一個 LIST_ENTRY 結構,Blink 成員則是一個向后鏈接,指向前一個 LIST_ENTRY 結構 。通常情況下,這些鏈表都成環(huán)形,也就是說,最后一個 Flink 指向鏈表中的第一個 LIST_ENTRY 結構,而第一個 Blink 指向最后一個 。這樣就很容易雙向遍歷該鏈表 。如果一個程序要遍歷整個鏈表,它需要保存第一個 LIST_ENTRY 結構的地址,以判斷是否已遍歷了整個鏈表 。如果鏈表僅包含一個 LIST_ENTRY 結構,那么該 LIST_ENTRY 結構必須引用其自身,也就是說,Flink 和 Blink 都指向其自己 。
typedef struct _LIST_ENTRY
{
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY;
列表 2-7. LIST_ENTRY 結構
圖 2-4 展示了對象鏈表各成員間的關系 。對象 A1 、 A2 、 A3 屬于同一鏈表 。注意,A3 的 Flink 指向 A1 ,A1 的 Blink 指向 A3。最右邊的對象 B1 僅有一個成員,因此,其 Flink 和 Blink 都指向相同的地址 --- 即對象 B1 的地址 。典型的雙向鏈表的例子是進程和線程鏈表 。內部變量 PsActiveProcessHead 就是一個 LIST_ENTRY 結構,位于 ntoskrnl.exe 的 .data 節(jié)中 。該變量指向系統(tǒng)進程列表的首部(通過其 Blink 指針) 。你可以在內核調試器中使用 dd PsActiveProcessHead 來獲取該鏈表的首部,然后通過其 Flink 和 Blink 指針遍歷整個鏈表(仍使用 dd 命令) 。當然,這種探測 Windows 進程的方法非常繁瑣,但這可使你深入的觀察基本的系統(tǒng)結構 。Windows 2000 Native API 提供了更便利的方法來枚舉進程,如 NtQuerySystemInformation() 函數 。
typedef struct _CLIENT_ID
{
HANDLE UniqueProcess;
HANDLE UniqueThread;
} CLIENT_ID, *PCLIENT_ID;
列表 2-8. CLIENT_ID 結構
處理進程和線程的 API 函數,如: NtOpenProcess() 和 NtOpenThread() ,使用 列表 2-8 給出的 CLIENT_ID 結構來和特定的進程、線程相關聯(lián) 。盡管其類型為 HANDLE ,實際上,從嚴格的意義上來講 UniqueProcess 和 UniqueThread 成員并不是句柄( Handle ),它們都是整數型的進程 ID 和線程 ID。即標準 Win32 函數 GetCurrentProcessId() 和 GetCurrentThreadId() 返回的 DWORD 類型的數值 。
Windows 2000 執(zhí)行體( Executive )還使用 CLIENT_ID 結構在全局范圍內標識唯一的線程 。例如,如果你使用內核調試器的 !thread 命令來顯示當前線程參數,就會在輸出的第一行看到類似“ Cid ppp.ttt ”的顯示,其中“ ppp ”就是 CLIENT_ID 的 UniqueProcess 成員,而“ ttt ”則代表 UniqueThread ,如下所示 。注意,我用黑體標出的地方 。
kd> !thread
THREAD 83a51ba8 Cid 0a5c.0e64 Teb: 7ffdd000 Win32Thread: e14f4eb0 RUNNING on processor 0
Not impersonating
DeviceMap e20fb208
Owning Process 83a14708
Wait Start TickCount 906512 Elapsed Ticks: 68570
Context Switch Count 266 LargeStack
UserTime 00:00:00.0312
KernelTime 00:00:00.0015
。。。。。。。。。。。。。。。。。。。
Native API 的接口
對于內核模式的驅動程序,使用 Native API 的接口非常平常,就像在用戶模式下的程序中調用 Win32 API 一樣 。Windows 2000 DDK 提供的頭文件和庫包含了所有在調用 ntoskrnl.exe 導出的 Native API 時所需的信息 。而另一方面,Win32 SDK 幾乎不支持在程序中調用 ntdll.dll 導出的 Native API。我說“幾乎不”是因為 Win32 SDK 實際上提供了一個重要的東西:導入庫 ntdll.lib ,該文件位于 Program FilesMicrosoft Platfrom SDKLib 目錄中 。如果沒有這個庫,將很難調用 ntdll.dll 導出的函數 。

推薦閱讀