使用封包型 DMA 的次級裝置驅動程式會在處理要求 DMA 傳輸的 IRP 時呼叫下列一般支援例程:
KeFlushIoBuffers 在嘗試配置系統 DMA 控制器之前 (如需詳細資訊,請參閱 維護快取一致性)
當驅動程式準備好針對 DMA 進行裝置程式設計,且需要系統 DMA 控制器時,AllocateAdapterChannel
AllocateAdapterChannel,接著呼叫驅動程式的 AdapterControl 例程。
MmGetMdlVirtualAddress 以取得 MDL 的索引,這是初始呼叫 mapTransfer 時所需的參數
MapTransfer 設定系統 DMA 控制器以進行傳輸作業
驅動程式可能需要多次呼叫 MapTransfer 以傳輸所有要求的數據,如 分割傳輸要求中所述。
FlushAdapterBuffers 每個 DMA 傳輸作業往返次級裝置之後
如果驅動程式必須多次呼叫 MapTransfer 以傳輸所有要求的數據,那麼就必須呼叫 FlushAdapterBuffers 的次數與呼叫 MapTransfer的次數相同。
FreeAdapterChannel 當所有請求的數據已經傳輸完畢,或因裝置 I/O 錯誤而導致驅動程式失敗時。
IoGetDmaAdapter 所返回的配接器對象指標是所有這些例程的必要參數,除了 KeFlushIoBuffers 和 MmGetMdlVirtualAddress。這些例程需要的是從 Irp->MdlAddress 傳入的 MDL 指標。
個別驅動程式會根據每個驅動程序的實作方式,在不同的時間點呼叫此序列的支援例程,以服務其裝置。 例如,一個驅動程式的 StartIo 例程可能會呼叫 AllocateAdapterChannel,另一個驅動程式可能會從從驅動程式建立的聯結佇列中移除 IRP 的例程進行此呼叫,而另一個驅動程式可能會在其次級 DMA 裝置指出已準備好傳輸數據時進行此呼叫。