• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小默

            Windows內(nèi)核學(xué)習(xí)筆記(六)-- [總結(jié)]創(chuàng)建IRP的四種不同方式zz

            在驅(qū)動(dòng)程序中,經(jīng)常會(huì)調(diào)用其他的驅(qū)動(dòng)程序;其中,手動(dòng)構(gòu)造 IRP ,然后將 IRP 傳遞到相應(yīng)驅(qū)動(dòng)程序的派遣函數(shù)中是一種比較簡(jiǎn)單的方法,下面就來介紹下手動(dòng)創(chuàng)建 IRP 的幾種不同的方法及其特點(diǎn)。

                     創(chuàng)建 IRP 總共有 4 種方法。分別通過調(diào)用: IoBuildSynchronousFsdRequest 、 IoBuildAsynchronousFsdRequest 、 IoBuildDeviceIoControl 和 IoAllocateIrp 這 4 個(gè)內(nèi)核函數(shù)來完成。這其中, IoAllocateIrp 是比較底層的內(nèi)核函數(shù),其余的三個(gè)內(nèi)核函數(shù)是屬于靠近上層的內(nèi)核函數(shù),而且這三個(gè)函數(shù)都是通過調(diào)用 IoAllocateIrp 實(shí)現(xiàn)的。

                     這幾個(gè)函數(shù)都是文檔化的函數(shù),原型都可以在 DDK Documentation 中查到,這里就不多說了,下面主要來說說它們的不同點(diǎn):

            1.       可創(chuàng)建的 IRP 類型

            這四個(gè)函數(shù)可以創(chuàng)建的 IRP 的類型是不同的。 IoBuildSynchronousFsdRequest 用于創(chuàng)建同步的 IRP 請(qǐng)求,但是只可以創(chuàng)建以下類型的 IRP : IRP_MJ_PNP ,IRP_MJ_READ,IRP_MJ_WRITE,IRP_MJ_FLUSH_BUFFERS 和IRP_MJ_SHUTDOWN ; IoBuildAsynchronousFsdRequest 可創(chuàng)建的 IRP 類型和 IoBuildSynchronousFsdRequest 一樣(從名字就可以看出來),只是它是用來創(chuàng)建異步的 IRP 請(qǐng)求。 IoBuildDeviceIoControl 可以創(chuàng)建的 IRP 類型為:IRP_MJ_DEVICE_CONTROL 和IRP_MJ_INTERNAL_DEVICE_CONTROL 。而且 IoBuildDeviceIoControl 只能創(chuàng)建同步的 IRP 。在這三個(gè)函數(shù)中,都有一個(gè) ULONG 的輸入?yún)?shù)指定創(chuàng)建的 IRP 類型。 IoAllocateIrp 函數(shù)的使用比較靈活,他可以創(chuàng)建任意類型的 IRP ,但不是由參數(shù)指定,而是創(chuàng)建后自行填寫,要求用戶對(duì) IRP 的結(jié)構(gòu)有比較熟悉的理解。

            2.       創(chuàng)建后 IRP 對(duì)象的刪除

            IoBuildSynchronousFsdRequest 、 IoBuildAsynchronousFsdRequest 和 IoBuildDeviceIoControl 內(nèi)核函數(shù)在創(chuàng)建完 IRP 后,不需要程序員負(fù)責(zé)刪除 IRP ,操作系統(tǒng)會(huì)自動(dòng)刪除。而用 IoAllocateIrp 內(nèi)核函數(shù)創(chuàng)建 IRP 時(shí),需要程序員自己調(diào)用 IoFreeIrp 內(nèi)核函數(shù)刪除 IRP 對(duì)象。

            3.       關(guān)聯(lián)的事件

            IoBuildSynchronousFsdRequest 和 IoBuildDeviceIoControl 在創(chuàng)建 IRP 時(shí),需要為它們準(zhǔn)備好一個(gè)事件,這個(gè)事件會(huì)和 IRP 請(qǐng)求相關(guān)聯(lián),當(dāng) IRP 請(qǐng)求被結(jié)束時(shí)該事件觸發(fā)。程序中要用 KeWaitForSingleObject 函數(shù)等待。 IoBuildAsynchronousFsdRequest 函數(shù)創(chuàng)建 IRP 時(shí)則不需要準(zhǔn)備事件,不過可以通過 IRP 的 UserEvent 子域來通知 IRP 請(qǐng)求的結(jié)束。

            當(dāng)執(zhí)行 IoCompleteRequest 內(nèi)核函數(shù)時(shí),操作系統(tǒng)會(huì)檢查 IRP 的 UserEvent 子域是否為空。如果該子域?yàn)榭眨瑒t它代表一個(gè)事件指針,這時(shí) IoCompleteRequest 會(huì)設(shè)置這個(gè)事件。

             

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

            posted on 2010-02-06 00:13 小默 閱讀(1603) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            午夜精品久久久久久影视777 | 九九99精品久久久久久| 亚洲AV无码久久精品成人| 狠狠88综合久久久久综合网| 久久久国产精品福利免费 | 久久精品国产亚洲av麻豆小说| 国产情侣久久久久aⅴ免费| 久久久免费观成人影院| 国产精品禁18久久久夂久| 性高朝久久久久久久久久| 久久精品国产免费一区| 亚洲午夜无码久久久久| 久久人人爽人人澡人人高潮AV| 亚洲色大成网站www久久九| 国产高潮久久免费观看| 国产成人久久AV免费| 18岁日韩内射颜射午夜久久成人 | 国产亚洲美女精品久久久久狼| 精品久久久久成人码免费动漫| 亚洲国产精品无码久久98| 久久久久亚洲AV无码专区桃色| 国产一区二区三区久久| 久久久久久九九99精品| 久久99热只有频精品8| 久久婷婷成人综合色综合| 丰满少妇人妻久久久久久| 青青青青久久精品国产h久久精品五福影院1421| 狠狠色婷婷久久综合频道日韩| 欧美喷潮久久久XXXXx| 国产精品久久一区二区三区| 精品99久久aaa一级毛片| 久久人人妻人人爽人人爽| 99久久精品日本一区二区免费 | 亚洲国产天堂久久久久久| 伊人久久大香线焦AV综合影院| 久久久久无码精品国产不卡| 久久人妻少妇嫩草AV蜜桃| 99久久国产综合精品麻豆| 久久丫忘忧草产品| 伊人久久大香线蕉综合影院首页| 成人国内精品久久久久影院VR |