irp的全名是i/o request package,即輸入輸出請求包,它是windows核心中的一種非常重要的資料結構。
上層應用程式與底層驅動程式通訊時,應用程式會發出i/o請求,作業系統將相應的i/o請求轉換成相應的irp,不同的irp會根據型別被分派到不同的派遣例程中進行處理。
irp有兩個基本的屬性,即majorfunction和minorfunction,分別記錄irp的主型別和子型別。
作業系統根據majorfunction決定將irp分發到哪個派遣例程,然後派遣例程根據minorfunction進行細分處理。
沒有設定派遣函式的irp,預設與iopinvaliddevicerequest函式關聯
irp結構體原始碼
typedef structdeclspec_align(memory_allocation_alignment) _irp associatedirp;
list_entry threadlistentry;
io_status_block iostatus;
kprocessor_mode requestormode;
boolean pendingreturned;
char stackcount;
char currentlocation;
boolean cancel;
kirql cancelirql;
cchar apcenvironment;
uchar allocationflags;
pio_status_block useriosb;
pkevent userevent;
union ;
pvoid userapccontext;
} asynchronousparameters;
large_integer allocationsize;
} overlay;
__volatile pdriver_cancel cancelroutine;
pvoid userbuffer;
union ;
} ;pethread thread;
pchar auxiliarybuffer;
struct
; };
pfile_object originalfileobject;
} overlay;
kapc apc;
pvoid completionkey;
} tail;
} irp;
驅動程式會建立乙個個的裝置物件,並將這些裝置物件「疊」成乙個垂直結構,這種垂直的結構很像棧,因此叫做「裝置棧」
irp會被作業系統傳送到裝置棧的頂層,如果頂層的裝置物件的派遣函式結束了irp的請求,則這次i/o請求結束,如果沒有
將irp請求結束,那麼作業系統將irp**到裝置棧的下一層裝置處理,如果這個裝置的派遣函式依然不能結束irp請求,則
會繼續向更下層裝置**,
因此,乙個irp請求可能被**多次,為了記錄irp在每層裝置中做的操作,irp會有個io_stack_location陣列,陣列的元素個數
應該大於irp穿過的裝置數目,對於本層裝置對應的io_stack_location,可以通過iogetcurrentirpstacklocation函式得到
Windows驅動開發 IRP的完成例程
windows驅動開發技術詳解 331頁,在將irp傳送給底層驅動或其他驅動之前,可以對irp設定乙個完成例程,一旦底層驅動將irp完成後,irp完成例程立刻被處罰,通過設定完成例程可以方便地使程式設計師了解其他驅動對irp進行的處理,不管是呼叫自己的底層驅動或是呼叫其他驅動,都是使用核心函式ioc...
windows驅動程式設計學習筆記 (三)IRP
一,irp的概念 i o request package 當乙個應用程式呼叫函式去操作某個裝置時,比如呼叫createfile,deviceiocontrol,等等時,i o管理器為此函式建立乙個irp資料結構物件和乙個irp stack location資料結構物件陣列,陣列個數等於驅動程式堆疊上...
驅動學習筆記 irp
irp是windows核心中的一種非常重要的資料結構。上層應用程式與底層驅動程式通訊時,應用程式會發出i o請求,作業系統將相應的i o請求轉換成相應的irp,不同的irp會根據型別被分派到不同的派遣例程中進行處理。irp相當於ring3下的訊息,應用程式對驅動程式進行操作的時候會發出相應的訊息,驅...