• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 模擬技術 > 設計應用 > PCI驅動程序開發實例(2)

    PCI驅動程序開發實例(2)

    作者: 時間:2013-09-22 來源:網絡 收藏
    2.2 IRP處理

      I/O請求包(IRP)是操作的中心,是一個預先定義的數據結構,帶有一組對它進行操作的I/O管理器例程。一個IRP有固定的首部和可變數目的 IRP棧單元。IRP的固定部分含有IRP的固定屬性,每個棧單元含有大多數有關的IRP參數。當IRP由多個處理時,使用多個IRP棧單元。每個從當前IRP棧單元得到它的IRP參數。如果把IRP沿當前設備的驅動程序棧向下傳遞,必須在當前驅動程序中使用正確的參數設置下一個棧單元,然后在此驅動程序中利用函數IoCalldriver()調用更低層的驅動程序。驅動程序不必處理所有的IRP,但至少需要處理“創建”和“關閉”這兩個 IRP。I/O管理器接收I/O請求,然后在把它傳遞到合適的驅動程序棧中的最高驅動程序之前,分配并初始化IRP。驅動程序處理IRP的過程如圖2所示。

      

    PCI驅動程序開發實例(2)

      IRP首先到達最高層的驅動程序1,驅動程序1使用函數IoGetCurrentIrpStackLocation()獲得指向當前棧單元的指針。

      然后驅動程序1使用IoCallDriver()函數調用下一個驅動程序。I/O管理器現在改變“當前IRF’棧單元”指針,所以驅動程序2看到向下的第二個IRP棧單元(驅動程序1為它設置的棧單元)。這個過程繼續,直到最底層的的驅動程序4收到這個IRP。

      驅動程序4現在處理這個IRP。當它完成IRP的處理時,驅動程序4調用IoCompleteRequest()函數。指示它已經完成IRP的處理。IRP再沿設備棧向上傳遞,直到它最終彈出棧頂,回到用戶。

      2.3 IRP的完成

      當一個驅動程序完成對IRP的處理時,它必須告訴I/O管理器,這稱為IRP完成。如下面代碼所示,必須設置IRP IoStatus域結構中的幾個域。IoStatus,Status設置為一個NTSTATUS狀態碼,IoStatus.In-formation通常存儲傳輸的字節數。如:

      Irp一>loStatus.Status=S T ATUS_SUCCESS

      Irp一>IoStatus.Information=info;

      IoCompleteRequest(Irp,IO_NO_INCREMENT);

      調用IoCompleteRequest()表明低層驅動程序已經完成了IRP的請求,并將這個IRP返回給I/O管理器。IO_No_INCREMENT是個系統定義的常量,指定啟動該IRP的優先級,需要驅動程序快速處理。

      3 驅動程序功能實現

      當把板卡第一次插到計算機的插槽以后,計算機的系統總線會檢測到有個新設備沒有安裝驅動程序,并提示安裝驅動程序。正確地安裝驅動程序以后,用戶就可以在應用程序中與驅動程序進行通信。

      3.1 打開設備


    上一頁 1 2 下一頁

    關鍵詞: PCI 驅動程序 開發實例

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 喀喇沁旗| 远安县| 于田县| 莱州市| 罗源县| 徐水县| 新兴县| 咸宁市| 乐昌市| 冀州市| 大庆市| 班玛县| 佛坪县| 延吉市| 临沧市| 武穴市| 阿巴嘎旗| 饶河县| 中方县| 繁峙县| 墨竹工卡县| 屏山县| 莱州市| 深州市| 宁陵县| 阿荣旗| 自治县| 杭锦后旗| 平利县| 博客| 体育| 满城县| 道真| 富裕县| 邹城市| 逊克县| 赤壁市| 凤台县| 沽源县| 历史| 祁门县|