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