新聞中心

        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 驅動程序 開發實例

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 崇仁县| 泰安市| 柳州市| 秦皇岛市| 平度市| 文水县| 从化市| 苗栗县| 莱州市| 八宿县| 黄大仙区| 五大连池市| 泾川县| 洪泽县| 高密市| 中方县| 虞城县| 舒城县| 调兵山市| 荔波县| 谷城县| 抚远县| 佛教| 澄江县| 商丘市| 台南市| 眉山市| 长宁区| 越西县| 镇江市| 色达县| 普兰店市| 大姚县| 廊坊市| 监利县| 玛多县| 南陵县| 四川省| 甘洛县| 文山县| 太仓市|