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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

对IRP的理解

發布時間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对IRP的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對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_XXX派遣例程
UCHAR MinorFunction?????????????? 同上,一般文件系統和SCSI驅動程序使用它

union Parameters?????????????? MajorFunction的聯合類型
{
struct Read?????????????????????? IRP_MJ_READ的參數
ULONG Length
ULONG Key
LARGE_INTEGER ByteOffset

struct Write????????????????????? IRP_MJ_WRITE的參數
ULONG Length
ULONG Key
LARGE_INTEGER ByteOffset

struct DeviceIoControl??????????? IRP_MJ_DEVICE_CONTROL參數
ULONG OutputBufferLength
ULONG InputBufferLength
ULONG IoControlCode
PVOID Type3InputBuffer
}?
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的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。