【驱动笔记9】初探IRP
?
文章作者:grayfox
作者主頁:http://nokyo.blogbus.com
原始出處:http://www.blogbus.com/nokyo-logs/34005738.html
??????此前我們可能曾經(jīng)多次聽說過IRP這個(gè)名詞,那么它究竟是什么呢?
??????IRP的全名是I/O Request Package,即輸入輸出請(qǐng)求包,它是Windows內(nèi)核中的一種非常重要的數(shù)據(jù)結(jié)構(gòu)。上層應(yīng)用程序與底層驅(qū)動(dòng)程序通信時(shí),應(yīng)用程序會(huì)發(fā)出I/O請(qǐng)求,操作系統(tǒng)將相應(yīng)的I/O請(qǐng)求轉(zhuǎn)換成相應(yīng)的IRP,不同的IRP會(huì)根據(jù)類型被分派到不同的派遣例程中進(jìn)行處理。
??????IRP有兩個(gè)基本的屬性,即MajorFunction和MinorFunction,分別記錄IRP的主類型和子類型。操作系統(tǒng)根據(jù)MajorFunction決定將IRP分發(fā)到哪個(gè)派遣例程,然后派遣例程根據(jù)MinorFunction進(jìn)行細(xì)分處理。
??????IRP的概念類似于Windows應(yīng)用程序中“消息”的概念。在Win32編程中,程序由“消息”驅(qū)動(dòng),不同的消息被分發(fā)到不同的處理函數(shù)中,否則由系統(tǒng)默認(rèn)處理。
??????文件I/O的相關(guān)函數(shù)例如CreateFile、ReadFile、WriteFile、CloseHandle等分別會(huì)引發(fā)操作系統(tǒng)產(chǎn)生IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_CLOSE等不同的IRP,這些IRP會(huì)被傳送到驅(qū)動(dòng)程序的相應(yīng)派遣例程中。?
?
?????? 在派遣例程中處理IRP最簡(jiǎn)單做法就是將IRP的狀態(tài)設(shè)置為成功,然后結(jié)束IRP請(qǐng)求并返回成功,同時(shí)還要記得設(shè)置這個(gè)IRP請(qǐng)求操作了多少字節(jié)。
????? 我們?cè)谂汕埠瘮?shù)中設(shè)置IRP的完成狀態(tài)為STATUS_SUCCESS,發(fā)起I/O請(qǐng)求的Win32 API才能返回TRUE,否則Win32 API將返回FALSE,在這個(gè)時(shí)候可以通過GetLastError獲得錯(cuò)誤代碼,這個(gè)錯(cuò)誤代碼會(huì)和此時(shí)IRP被設(shè)置的狀態(tài)一致。
?????? 下面我們首先在驅(qū)動(dòng)程序中添加一個(gè)IRP_MJ_CLEANUP的例程(照抄IRP_MJ_CLOSE的即可),然后編寫下面的應(yīng)用層程序(控制臺(tái)程序):
?
01#include "windows.h"
02#include "stdio.h"
03
04int?main()
05{
06????// 打開設(shè)備句柄,它會(huì)觸發(fā)IRP_MJ_CREATE
07??? HANDLE hDevice?=?::CreateFile("\\\\.\\Test",??????????// 符號(hào)鏈接
08????????????????????????? GENERIC_READ?|?GENERIC_WRITE,
09??????????????????????????0,
10??????????????????????????NULL,
11????????????????????????? OPEN_EXISTING,
12????????????????????????? FILE_ATTRIBUTE_NORMAL,
13??????????????????????????NULL);
14????if?(hDevice?==?INVALID_HANDLE_VALUE)
15??? {
16??????? printf("Try to Open Device %s Error : %d!\n",?"\\\\.\\Test",::GetLastError());
17????????return?-1;
18??? }
19
20????// 關(guān)閉設(shè)備句柄,它會(huì)觸發(fā)IRP_MJ_CLEANUP和IRP_MJ_CLOSE
21??? CloseHandle(hDevice);
22????return?0;
23}
轉(zhuǎn)載于:https://www.cnblogs.com/huhu0013/p/3312192.html
總結(jié)
以上是生活随笔為你收集整理的【驱动笔记9】初探IRP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sublime Text 2 中怎样查找
- 下一篇: MyEclipse8.5注册码 到201