Windows驅動開發 IRP結構體

2022-04-23 05:51:09 字數 1699 閱讀 9491

irp的全名是i/o request package,即輸入輸出請求包,它是windows核心中的一種非常重要的資料結構。

上層應用程式與底層驅動程式通訊時,應用程式會發出i/o請求,作業系統將相應的i/o請求轉換成相應的irp,不同的irp會根據型別被分派到不同的派遣例程中進行處理。

irp有兩個基本的屬性,即majorfunctionminorfunction,分別記錄irp的主型別和子型別。

作業系統根據majorfunction決定將irp分發到哪個派遣例程,然後派遣例程根據minorfunction進行細分處理。

沒有設定派遣函式的irp,預設與iopinvaliddevicerequest函式關聯

irp結構體原始碼

typedef struct

declspec_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下的訊息,應用程式對驅動程式進行操作的時候會發出相應的訊息,驅...