1. 程式人生 > >Windows中0環與3環通訊(常規方式)

Windows中0環與3環通訊(常規方式)

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

一、知識點講解

1. 裝置物件

  我們在開發視窗程式的時候,訊息被封裝成一個結構體:MSG,在核心開發時,訊息被封裝成另外一個結構體:IRP(I/O Request Package I/O請求包)。

 

  在視窗程式中,能夠接收訊息的只能是視窗物件(由視窗物件將訊息分發給各個視窗過程)。

  在核心中,能夠接收IRP訊息的只能時裝置物件。

    

 

2. 建立裝置物件

  呼叫 IoCreateDevice API 來建立裝置物件,其中需要傳入裝置名稱(R3依據這個找到),需要初始化字串。

 1 //建立裝置名稱
 2 UNICODE_STRING Devicename;
 3 RtlInitUnicodeString(&Devicename,L"\\Device\\MyDevice");
 4 
 5 //建立裝置
 6 IoCreateDevice(
 7 pDriver,                //當前裝置所屬的驅動物件
 8 0,
 9 &Devicename,            //裝置物件的名稱
10 FILE_DEVICE_UNKNOWN,
11 FILE_DEVICE_SECURE_OPEN,
12 FALSE,
13 &pDeviceObj            //裝置物件指標
14 );

 

3. 設定資料互動方式

  pDeviceObj->Flags |= DO_BUFFERED_IO (注意: I= 表示按位或的含義)

  其存在三種讀寫方式:

  1)緩衝區讀寫方式(DO_BUFFERED_IO):作業系統將應用程式提供緩衝區的資料複製到核心模式下的地址中。

  2)  直接方式讀寫(DO_DIRECT_IO):作業系統會將使用者模式下的緩衝區鎖住。然後作業系統將這段緩衝區在核心模式地址再次對映一遍。這樣,使用者模式的緩衝區和核心模式的緩衝區指向的時同一區域的實體記憶體。缺點就是要單獨佔用物理頁面。

  3)其他方式讀寫(不設定Flags):很危險,直接讀寫緩衝區地址,很容易出現藍屏並且很可能資料丟失(讀取過程中掛起頁置換)。

 

4. 建立符號連結

  //建立符號連結名稱

  RtlInitUnicodeString(&SymbolicLinkName,L"\\??\\MyTestDriver");

  // 建立符號連結

  IoCreateSymbolicLink(&SymbolicLinkName,&Devicename);

 

  特別說明:

  1)裝置名稱的作用就是給核心物件用的,如果要在R3訪問,必須要有符號連結。其實就是一個別名,沒有這個別名,在R3不可見。

  2)在核心模式下,符號連結是以 '\??\'開頭的,如果C盤就是 "\??\C:"

  3)  在使用者模式下,則是以 '\\.\' 開頭的,如果是C盤就是 "\\.\C:"

 

5. IRP與派遣函式

  如下圖,在R3層面上,其由視窗物件負責將訊息傳送給對應的回撥函式;而在核心層,將IRP傳送給裝置物件,由裝置物件轉發給對應的派遣函式。

  

6、IRP的型別

  微軟文件 :IRP structure

  1)  當應用層通過CreateFile,ReadFile,WriteFile,CloseHandle等函式開啟、從裝置讀取資料、向裝置寫入資料、關閉裝置的時候,會時作業系統產生出IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_CLOSE等不同的IRP。

  2)其他的IRP型別

    IRP_MJ_DEVICE_CONTROL    DeviceControl函式會產生此IRP

    IRP_MJ_POWER        在作業系統處理電源訊息時,產生次IRP

    IRP_MJ_SHUTDOWN      關閉系統前會產生此IRP

 

7、派遣函式在哪裡註冊呢?

  其在 _DRIVER_OBJECT 函式最後一個數組中。其派遣函式的種類及其有限(由IRP訊息型別限制),可以看出一共有29種。

  關於 _DRIVER_OBJECT的介紹可以檢視之前這篇部落格:核心空間與核心地址

  

 

8. 註冊派遣函式

  如下圖,我們直接採取對陣列賦值的形式來設定派遣函式。

  

 9. 派遣函式格式

  一定要設定其返回狀態 NTSTATUS,三環程式判斷API是否呼叫成功就是根據這個狀態,如果不設定,則可能會出錯。

  

 

 

  

&n