欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

IRP請(qǐng)求處理及完成機(jī)制

系統(tǒng) 1853 0

近來(lái)學(xué)習(xí) Windows 內(nèi)核方面的東西,覺(jué)得對(duì) I/O 處理過(guò)程沒(méi)有一個(gè)總體的概念。于是,就花了很長(zhǎng)的時(shí)間搜集了很多這方面的知識(shí)總結(jié)了一下。

在 Windows 內(nèi)核中的請(qǐng)求基本上是通過(guò) I/O Request Packet 完成的。前面說(shuō)過(guò),設(shè)備對(duì)象是唯一可以接受請(qǐng)求的實(shí)體。下面,我就來(lái)詳細(xì)地說(shuō)下 IRP 請(qǐng)求是怎么樣一步一步完成的。

首先,我們就需要知道 IRP 是怎么產(chǎn)生。 IRP 是由 I/O 管理器發(fā)出的, I/O 管理器是用戶(hù)態(tài)與內(nèi)核態(tài)之間的橋梁,當(dāng)用戶(hù)態(tài)進(jìn)程發(fā)出 I/O 請(qǐng)求時(shí), I/O 管理器就捕獲這些請(qǐng)求,將其轉(zhuǎn)換為 IRP 請(qǐng)求,發(fā)送給驅(qū)動(dòng)程序。 I/O 管理器無(wú)疑是非常重要的,具有核心地位。它負(fù)責(zé)所有 I/O 請(qǐng)求的調(diào)度和管理工作,根據(jù)請(qǐng)求的不同內(nèi)容,選擇相應(yīng)的驅(qū)動(dòng)程序?qū)ο?,設(shè)備對(duì)象,并生成、發(fā)送、釋放各種不同的 IRP 。整個(gè) I/O 處理流程是在它的指揮下完成的。

一個(gè) IRP 是從非分頁(yè)內(nèi)存中分配的可變大小的結(jié)構(gòu),它包括兩部分: IRP 首部和輔助請(qǐng)求參數(shù)數(shù)組,如圖 1 所示。這兩部分都是由 I/O 管理器建立的。

IRP請(qǐng)求處理及完成機(jī)制

圖 1 IRP 簡(jiǎn)單結(jié)構(gòu)圖

IRP 首部中包含了指向 IRP 輸入輸出緩沖區(qū)指針、當(dāng)前擁有 IRP 的驅(qū)動(dòng)指針等。

緊接著首部的是一個(gè) IO_STACK_LOCATION 結(jié)構(gòu)的數(shù)組。它的大小由設(shè)備棧中的設(shè)備數(shù)確定(設(shè)備棧的概念會(huì)在下文中闡述)。 IO_STACK_LOCATION 結(jié)構(gòu)中保存了一個(gè) I/O 請(qǐng)求的參數(shù)及代碼、請(qǐng)求當(dāng)前對(duì)應(yīng)的設(shè)備指針、完成函數(shù)指針( IoCompletion )等。

那么,由 I/O 管理器產(chǎn)生的 IRP 請(qǐng)求發(fā)送到哪去了呢?這里我們就要來(lái)說(shuō)說(shuō)設(shè)備棧的概念了,操作系統(tǒng)用設(shè)備對(duì)象( device object )表示物理設(shè)備,每一個(gè)物理設(shè)備都有一個(gè)或多個(gè)設(shè)備對(duì)象與之相關(guān)聯(lián),設(shè)備對(duì)象提供了在設(shè)備上的所有操作。也有一些設(shè)備對(duì)象并不表示物理設(shè)備。一個(gè)唯軟件驅(qū)動(dòng)程序( software-only driver ,處理 I/O 請(qǐng)求,但是不把這些請(qǐng)求傳遞給硬件)也必須創(chuàng)建表示它的操作的設(shè)備對(duì)象。設(shè)備常常由多個(gè)設(shè)備對(duì)象所表示,每一個(gè)設(shè)備對(duì)象在驅(qū)動(dòng)程序棧( driver stack )中對(duì)應(yīng)一個(gè)驅(qū)動(dòng)程序來(lái)管理設(shè)備的 I/O 請(qǐng)求。一個(gè)設(shè)備的所有設(shè)備對(duì)象被組織成一個(gè)設(shè)備棧( device stack )。而且, IO_STACK_LOCATION 數(shù)組中的每個(gè)元素和設(shè)備棧中的每個(gè)設(shè)備是一一對(duì)應(yīng)的,一般情況下,只允許層次結(jié)構(gòu)中的每個(gè)設(shè)備對(duì)象訪(fǎng)問(wèn)它自己對(duì)應(yīng)的 IO_STACK_LOCATION 。無(wú)論何時(shí),一個(gè)請(qǐng)求操作都在一個(gè)設(shè)備上被完成, I/O 管理器把 IRP 請(qǐng)求傳遞給設(shè)備棧中頂部設(shè)備的驅(qū)動(dòng)程序( IRP 是傳遞給設(shè)備對(duì)象的,通過(guò)設(shè)備對(duì)象的 DriverObject 成員找到驅(qū)動(dòng)程序)。驅(qū)動(dòng)程序訪(fǎng)問(wèn)它對(duì)應(yīng)的設(shè)備對(duì)象在 IRP 中 IO_STACK_LOCATION 數(shù)組中的元素檢查參數(shù),以決定要進(jìn)行什么操作(通過(guò)檢查結(jié)構(gòu)中的 MajorFunction 字段,確定執(zhí)行什么操作及如何解釋 Parameters 共用體字段的內(nèi)容)。驅(qū)動(dòng)程序可以根據(jù) IO_STACK_LOCATION 結(jié)構(gòu)中的 MajorFunction 字段進(jìn)行處理。每一個(gè)驅(qū)動(dòng)或者處理 IRP ,或者把它傳遞給設(shè)備棧中下一個(gè)設(shè)備對(duì)象的驅(qū)動(dòng)程序。

傳遞 IRP 請(qǐng)求到底層設(shè)備的驅(qū)動(dòng)程序需要經(jīng)過(guò)下面幾個(gè)步驟:

1. 為下一個(gè) IO_STACK_LOCATION 結(jié)構(gòu)設(shè)置參數(shù)。可以有以下兩種方式:

· 調(diào)用 IoGetNextIrpStackLocation 函數(shù)獲得下個(gè)結(jié)構(gòu)的指針,再對(duì)參數(shù)進(jìn)行賦值;

· 調(diào)用 IoCopyCurrentIrpStackLocationToNext 函數(shù)(如果第 2 步中驅(qū)動(dòng)設(shè)置了 IoCompletion 函數(shù) ),或者調(diào)用 IoSkipCurrentIrpStackLocation 函數(shù)(如果第 2 步中驅(qū)動(dòng)沒(méi)有設(shè)置 IoCompletion 函數(shù) )把當(dāng)前的參數(shù)傳遞給下一個(gè)。

2. 如果需要的話(huà),調(diào)用 IoSetCompletionRoutine 函數(shù)設(shè)置 IoCompletion 函數(shù)進(jìn)行后續(xù)處理。

3. 調(diào)用 IoCallDriver 函數(shù)將 IRP 請(qǐng)求傳遞給下一層驅(qū)動(dòng)。這個(gè)函數(shù)會(huì)自動(dòng)調(diào)整 IRP 棧指針,并且執(zhí)行下一層驅(qū)動(dòng)的派遣函數(shù)。

當(dāng)驅(qū)動(dòng)程序把 IRP 請(qǐng)求傳遞給下一層驅(qū)動(dòng)之后,它就不再擁有對(duì)該請(qǐng)求的訪(fǎng)問(wèn)權(quán),強(qiáng)行訪(fǎng)問(wèn)會(huì)導(dǎo)致系統(tǒng)崩潰。如果驅(qū)動(dòng)程序在傳遞完之后還想再訪(fǎng)問(wèn)該請(qǐng)求,就必須要設(shè)置 IoCompletion 函數(shù)。 IRP 請(qǐng)求可以再其他驅(qū)動(dòng)程序或者其他線(xiàn)程中完成或取消。

當(dāng)某一驅(qū)動(dòng)程序調(diào)用 IoCompleteRequest 函數(shù)時(shí), I/O 操作就完成了。這個(gè)函數(shù)使得 IRP 的堆棧指針向上移動(dòng)一個(gè)位置,如圖 2 所示:


IRP請(qǐng)求處理及完成機(jī)制


圖 2 IRP 完成時(shí)棧指針的移動(dòng)

圖 2 所示的當(dāng) C 驅(qū)動(dòng)程序調(diào)用完 IoCompleteRequest 函數(shù)后 I/O 棧的情況。左邊的實(shí)線(xiàn)箭頭表明棧指針現(xiàn)在指向驅(qū)動(dòng) B 的參數(shù)和回調(diào)函數(shù);虛線(xiàn)箭頭是之前的情況。右邊的空心箭頭指明了 IoCompletion 函數(shù)被調(diào)用的順序。

如果驅(qū)動(dòng)程序把 IRP 請(qǐng)求傳遞給設(shè)備棧中的下層設(shè)備之前設(shè)置了 IoCompletion 函數(shù),當(dāng) I/O 棧指針再次指回到該驅(qū)動(dòng)程序時(shí), I/O 管理器就將調(diào)用該 IoCompletion 函數(shù)。

IoCompletion 函數(shù)的返回值有兩種:

( 1 ) STATUS_CONTINUE_COMPLETION :告訴 I/O 管理器繼續(xù)執(zhí)行上層驅(qū)動(dòng)程序的 IoCompletion 函數(shù)。

( 2 ) STATUS_MORE_PROCESSING_REQUIRED :告訴 I/O 管理器停止執(zhí)行上層驅(qū)動(dòng)程序,并將棧指針停在當(dāng)前位置。在當(dāng)前驅(qū) 動(dòng)程序調(diào)用 IoCompleteRequest 函數(shù)后再繼續(xù)執(zhí)行上層驅(qū)動(dòng)的 IoCompletion 函數(shù)。

當(dāng)所有驅(qū)動(dòng)都完成了它們相應(yīng)的子請(qǐng)求時(shí), I/O 請(qǐng)求就結(jié)束了。 I/O 管理器從 Irp?>IoStatus.Status 成員更新?tīng)顟B(tài)信息,從 Irp?>IoStatus.Information 成員更新傳送字節(jié)數(shù)。

寫(xiě)的比較倉(cāng)促,如有不正之處,希望大家指教!


本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處: http://blog.csdn.net/vangoals/archive/2009/07/20/4363863.aspx

IRP請(qǐng)求處理及完成機(jī)制


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 精品国产黄a∨片高清在线 亚洲3atv精品一区二区三区 | 亚欧视频在线观看 | 狠狠色噜噜狠狠狠狠97影音先锋 | 亚洲精品在线免费 | 午夜99| 一级毛片私人影院老司机 | a黄视频| 亚洲国产精品久久婷婷 | 精品乱子伦一区二区三区 | 日韩美在线| 日本一区二区三区四区在线观看 | 538porm在线看国产亚洲 | 欧美视频在线观看一区二区 | 久草香蕉| 日韩二区精品 | 免费久久一级欧美特大黄 | 一区二区三区在线 | 网站 | 91麻豆精品一区二区三区 | 美国一级欧美三级 | 国产精品久久久久久免费软件 | 狠狠操麻豆 | 99草在线| 蜜芽亚洲 | 国产欧美日韩一区 | 深夜爽爽爽gif福利免费 | 免费乱理伦片在线观看八戒 | 国产精品美女网站在线看 | 日韩二三区 | 国产精品福利在线观看免费不卡 | 亚洲精品久久久久综合中文字幕 | 国产精品高清在线观看 | 国产成人免费高清激情视频 | 国产一区二区三区四 | 精品视频网站 | 国产不卡免费视频 | 亚洲黑人在线观看 | 色综合网亚洲精品久久久 | 欧美日韩国产综合视频在线看 | 欧美激情久久久 | 久草视频电影 | 亚洲 久久 |