Windows內核分析索引目錄:https://www.cnblogs.com/onetrainee/p/11675224.htmlhtml
1、內核編程注意細節:編程
2、獲取未公開API的方法:windows
注意:在安全編程時,常常須要用到一些微軟未公開文檔化的API,這時就須要本身去尋找。安全
3、變量定義習慣:函數
遵循WDK本身的一套規範的變量定義習慣,而不是再用原來的int之類的C語言的變量名稱。spa
ULONG(unsigned long) PULONG(unsigned long*)
UCHAR(unsigned char) PUCHAR(unsinged char*)
UINT(unsigned int) PUNIT(unsigned int*)
VOID(void) PVOID(void*)code
4、返回值:htm
不少API都返回 NTSTATUS 來表示函數執行的結果,其中有以下含義。blog
STATUS_SUCCESS 0x0000000 成功
STATUS_INVALID_PARAMETER 0xC000000D 參數無效
STAUS_BUFFER_OVERFLOW 0x80000005 緩衝區長度不夠索引
更多的信息能夠在 ntstatus.h 中查看。
5、內核中的異常處理:
在內核中一個小小的錯誤就可能致使藍屏(例如"讀寫無效內存")
所以須要使用異常處理代碼:
__try {
// 可能出錯的代碼
}
__except (filter_value) {
// 出錯時要執行的代碼
}
filter_value解析:
EXCEPTION_EXECUTE_HANDLER(1) 代碼進入except塊。
EXCEPTION_CONTINUE_SEARCH(0) 不處理異常,由上一層調用函數處理。
EXCEPTION_CONTINUE_EXECUTION(-1), 回去繼續程序錯誤的代碼。
6、經常使用的內核內存函數
對內存的使用,主要就是:申請、設置、拷貝以及釋放。
PVOID ExAllocatePool(
__drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType, // 這裏主要說明其是 主要分頁內存仍是非分頁內存
SIZE_T // NumberOfBytes
);
7、內核字符串種類
在R3層時都是以\0或\0\0結尾。
但在驅動編程中,這樣很容易出現藍屏。
所以,爲了不這種問題,使用內核提供的字符串。
typedef struct _STRING {
USHORT Length;//字節數,不是字符數 必定要* sizeof(CHAR)
USHORT MaximumLength;//字節數,不是字符數 必定要* sizeof(CHAR)
PWSTR Buffer;//非零結尾,中間也可能含有零
}ANSI_STRING, *PANSI_STRING;
typedef struct _UNICODE_STRING {
USHORT Length;//字節數,不是字符數 必定要* sizeof(WCHAR)
USHORT MaximumLength;//字節數,不是字符數 必定要* sizeof(WCHAR)
PWSTR Buffer;//非零結尾,中間也可能含有零
} UNICODE_STRING, *PUNICODE_STRING;
經常使用字符串API函數: