对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
總結
- 上一篇: 混合模型的推荐算法(ACM暑校-案例学习
- 下一篇: aaaaaaaaa