Windows內核編程時的習慣與注意事項

Windows內核分析索引目錄:https://www.cnblogs.com/onetrainee/p/11675224.htmlhtml

1、內核編程注意細節:編程

  1. 在頭文件中使用的是 <ntddk.h>,而非普通的 <windows.h>。
  2. 在應用層編程時,在內核編程時,要使用本身的WDK文檔。https://docs.microsoft.com/zh-cn/windows-hardware/drivers/?redirectedfrom=MSDN

 

2、獲取未公開API的方法:windows

  1. 特徵碼搜索:遍歷內核函數所在的模塊。
  2. 解析內核PDB文件:用Windbg U 指令查看彙編函數代碼。

  注意:在安全編程時,常常須要用到一些微軟未公開文檔化的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函數:

  

相關文章
相關標籤/搜索