對IRP的理解

2021-04-01 22:15:03 字數 2611 閱讀 9232

對irp的理解

驅動程式與i/o管理器通訊,使用的是irp,即i/o請求包。irp分為2部分:1)irp首部;2)irp堆疊。irp首部資訊如下:

irp首部:

io_status_block iostatus         包含i/o請求的狀態

pvoid associatedirp.systembuffer 如果執行緩衝區i/o,這個指標指向系統緩衝區

pmdl mdladdress        如果直接i/o,這個指標指向使用者緩衝區的儲存器描述符表

pvoid userbuffer        i/o緩衝區的使用者空間位址

irp堆疊:

uchar majorfunction               指示irp_mj_***派遣例程

uchar minorfunction               同上,一般檔案系統和scsi驅動程式使用它

union parameters               majorfunction的聯合型別

pdevice_object deviceobject       請求的目標裝置物件的指標

pfile_object fileobject                請求的目標檔案物件的指標,如果有的話

操作irp。對於不同的irp函式,操作也是不同的:有的只操作irp首部;有的只操作irp堆疊;還有操作irp整體,下面是一些常用的函式:

irp整體:

名稱                            描述                                   呼叫者

iostartpacket             傳送irp到start i/o例程              dispatch

iocompleterequest     表示所有的處理完成                  dpcforisr

iostartnextpacket      傳送下乙個irp到start i/o例程     dpcforisr

iocalldriver                傳送irp請求                              dispatch

ioallocateirp             請求另外的irp                            dispatch

iofreeirp                 釋放驅動程式分配的irp                i/o completion

irp堆疊:

名稱                                             描述                         呼叫者

iogetcurrentirpstacklocation   得到呼叫者堆疊的指標             dispatch

iomarkirppending              為進一步的處理標記呼叫者i/o堆疊  dispatch

iogetnextirpstacklocation 得到下乙個驅動程式的i/o堆疊的指標 dispatch

iosetnextirpstacklocation      將i/o堆疊指標壓入堆疊            dispatc

在驅動程式,irp派遣例程起著很重要的作用,每個irp派遣例程,幾乎都有對應的win32函式,下面是幾個常用的:

irp派遣例程:

名稱                                      描述                           呼叫者

irp_mj_create                   請求乙個控制代碼                    createfile

irp_mj_cleanup            在關閉控制代碼時取消懸掛的irp      closehandle

irp_mj_close                     關閉控制代碼                         closehandle

irp_mj_read                      從裝置得到資料                 readfile

irp_mj_write                    傳送資料到裝置                 writefile

irp_mj_device_control    控制操作(利用ioctl巨集)   deviceiocontrol

irp_mj_internal_device_control  控制操作(只能被核心呼叫)       n/a

irp_mj_query_information    得到檔案的長度             getfilesize

irp_mj_set_information         設定檔案的長度             setfilesize

irp_mj_flush_buffers             寫輸出緩衝區或者丟棄輸入緩衝區  flushfilebuffers flushconsoleinputbuffer purgecomm

irp_mj_shutdown             系統關閉                     initiatesystemshutdown

對自己裝置的控制IRP的處理

ursaemin ris 10977789 21 20 23 這個irp是deviceiocontrol發下來的,我只返回了status,但是沒skip也沒complete。楚天樂 285008395 21 25 35 deviceiocontrol 楚天樂 285008395 21 25 40 是...

IRP的非同步完成

exe部分 include include include include ioctl.h int main void uchar buffer 10 ulong ulread 0 bool bread readfile hdevice,buffer,10,ulread,overlap1 if br...

IRP的超時處理

exe部分 include include include include ioctl.h int main void dword dwread 如果讀irp沒有被完成,readfile一直都不會退出 readfile hdevice,null,null,dwread,null printf 第乙個...