對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 第乙個...