IRP請求的完成與返回

2021-08-23 15:07:42 字數 1018 閱讀 2952

irp請求的完成與返回

每當完成了乙個以irp為代表的i/o操作請求的時候,就要執行irp的善後操作iocompleterequest(),這是個巨集操作,定義為函式iofcompleterequest()。

#define iocompleterequest iofcompleterequest

如前所述,以irp為代表的i/o操作請求的執行可以是同步的,也可以是非同步的,所以乙個i/o操作請求的完成不一定與相應主功能函式的返回相一致。如果操作是同步的,那麼主功能函式要到完成了所要求的操作時才返回,所以在返回之前就要執行這個函式。如果操作是非同步的,那麼主功能函式不等所要求的操作完成就返回了,這個函式的執行就留給了dpc函式。

irp的善後包括一些什麼操作呢?當然,這裡面包括將其從irp所屬執行緒和所針對裝置物件的irp佇列中摘除出來並加以釋放,但是這還不是事情的全部。前面講過,由於非同步操作,各層裝置驅動的主功能函式不等操作完成就返回了,可是各層裝置驅動都可能有自己的善後函式,這些善後函式要等irp所要求的操作完成時才能執行,所以就通過巨集操作iosetcompletionroutine()設定好相應io_stack_location資料結構中的函式指標completionroutine,把善後函式的執行託付給dpc函式。所以,irp的善後就包括自下而上地掃瞄irp中的各層io_stack_location資料結構,如果欄位control中相應標誌位所表示的條件得到滿足就加以呼叫。

讀者也許會問,如果各層裝置驅動所實現的恰巧都是同步操作,那也要把善後函式託付給dpc函式嗎?例如,在前面通過系統呼叫ntreadfile()讀滑鼠器的例子中,如果恰巧類裝置物件的緩衝區中有資料可讀,那麼該操作實際上就是同步的。在這種情況下,各層裝置驅動仍可以通過iosetcompletionroutine()設定irp中的函式指標,但是最後執行iofcompleterequest()的並不是dpc函式,而是當前執行緒。當前執行緒在完成了irp所要求的操作以後就會執行iofcompleterequest(),同樣會自下而上地掃瞄執行各層裝置驅動的善後函式。這樣,當上一層裝置驅動的函式從iocalldriver()返回時,它所託付的善後函式已經得到執行了。

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...

Windows驅動開發 IRP的完成例程

windows驅動開發技術詳解 331頁,在將irp傳送給底層驅動或其他驅動之前,可以對irp設定乙個完成例程,一旦底層驅動將irp完成後,irp完成例程立刻被處罰,通過設定完成例程可以方便地使程式設計師了解其他驅動對irp進行的處理,不管是呼叫自己的底層驅動或是呼叫其他驅動,都是使用核心函式ioc...

Web Web Json的請求與返回

引用dll newtonsoft.json.dll 1.建立url url組成 主機名 埠號 路徑 引數 string strurl string.format collect getprocessdata?sessionid lineno 123 32 2.建立web請求並設定引數 3.獲取jsi...