日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【驱动笔记9】初探IRP

發(fā)布時間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【驱动笔记9】初探IRP 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

文章作者:grayfox
作者主頁:http://nokyo.blogbus.com

原始出處:http://www.blogbus.com/nokyo-logs/34005738.html

??????此前我們可能曾經(jīng)多次聽說過IRP這個名詞,那么它究竟是什么呢?
??????IRP的全名是I/O Request Package,即輸入輸出請求包,它是Windows內(nèi)核中的一種非常重要的數(shù)據(jù)結(jié)構(gòu)。上層應(yīng)用程序與底層驅(qū)動程序通信時,應(yīng)用程序會發(fā)出I/O請求,操作系統(tǒng)將相應(yīng)的I/O請求轉(zhuǎn)換成相應(yīng)的IRP,不同的IRP會根據(jù)類型被分派到不同的派遣例程中進行處理。
??????IRP有兩個基本的屬性,即MajorFunction和MinorFunction,分別記錄IRP的主類型和子類型。操作系統(tǒng)根據(jù)MajorFunction決定將IRP分發(fā)到哪個派遣例程,然后派遣例程根據(jù)MinorFunction進行細分處理。
??????IRP的概念類似于Windows應(yīng)用程序中“消息”的概念。在Win32編程中,程序由“消息”驅(qū)動,不同的消息被分發(fā)到不同的處理函數(shù)中,否則由系統(tǒng)默認處理。
??????文件I/O的相關(guān)函數(shù)例如CreateFile、ReadFile、WriteFile、CloseHandle等分別會引發(fā)操作系統(tǒng)產(chǎn)生IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_CLOSE等不同的IRP,這些IRP會被傳送到驅(qū)動程序的相應(yīng)派遣例程中。?

?

?????? 在派遣例程中處理IRP最簡單做法就是將IRP的狀態(tài)設(shè)置為成功,然后結(jié)束IRP請求并返回成功,同時還要記得設(shè)置這個IRP請求操作了多少字節(jié)。
????? 我們在派遣函數(shù)中設(shè)置IRP的完成狀態(tài)為STATUS_SUCCESS,發(fā)起I/O請求的Win32 API才能返回TRUE,否則Win32 API將返回FALSE,在這個時候可以通過GetLastError獲得錯誤代碼,這個錯誤代碼會和此時IRP被設(shè)置的狀態(tài)一致。

?????? 下面我們首先在驅(qū)動程序中添加一個IRP_MJ_CLEANUP的例程(照抄IRP_MJ_CLOSE的即可),然后編寫下面的應(yīng)用層程序(控制臺程序):

?

01#include "windows.h"
02#include "stdio.h"
03
04int?main()
05{
06????// 打開設(shè)備句柄,它會觸發(fā)IRP_MJ_CREATE
07??? HANDLE hDevice?=?::CreateFile("\\\\.\\Test",??????????// 符號鏈接
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è)備句柄,它會觸發(fā)IRP_MJ_CLEANUP和IRP_MJ_CLOSE
21??? CloseHandle(hDevice);
22????return?0;
23}

????? 現(xiàn)在我們使用KmdManager加載驅(qū)動并運行,同時運行我們前面編寫的應(yīng)用層驅(qū)動程序,根據(jù)應(yīng)用層程序的代碼我們可知它應(yīng)該會觸發(fā)IRP_MJ_CREATE、IRP_MJ_CLEANUP、IRP_MJ_CLOSE這三個IRP,完整文章請參考我的學(xué)習(xí)筆記匯總之PDF電子書(邪惡八進制有下載)。

轉(zhuǎn)載于:https://www.cnblogs.com/huhu0013/p/3312192.html

總結(jié)

以上是生活随笔為你收集整理的【驱动笔记9】初探IRP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。