若要使用封包型 DMA,總線主機 DMA 裝置的驅動程式會在處理要求 DMA 傳輸的 IRP 時呼叫下列一般支援例程:
KeFlushIoBuffers 就在試圖為傳輸請求分配映射暫存器之前(如需詳細資訊,請參閱 維持快取一致性)
當驅動程式準備好為 DMA 設計總線主機適配卡時,AllocateAdapterChannel
MmGetMdlVirtualAddress 以取得 MDL 的索引,需要作為 MapTransfer 的初始參數,而 MapTransfer 可讓系統物理記憶體備份 IRP 的緩衝區裝置可存取
請注意,任何驅動程式可能需要執行多個傳輸作業,才能滿足目前的 IRP,如 分割傳輸要求中所述。 沒有散佈/收集功能的裝置驅動程式可以為每個傳輸作業呼叫 MapTransfer 一次。 具有散佈/收集功能的裝置驅動程式可以多次呼叫 MapTransfer 來設定每個傳輸作業。 或者,這些驅動程式可以使用系統的內建分散/聚集支援,如 使用分散/聚集 DMA 中所述。
FlushAdapterBuffers 在每次 DMA 傳輸作業結束時以確定所有要求的數據是否已完全傳輸到/從目標裝置
只要完成目前 IRP 的所有 DMA 作業,FreeMapRegisters 就會完成,因為所有要求的數據都已完全傳輸,或因為驅動程式必須因為裝置或總線 I/O 錯誤而使 IRP 失敗
IoGetDmaAdapter 傳回的配接器對象指標是 AllocateAdapterChannel、MapTransfer、FlushAdapterBuffers 和 FreeMapRegisters 的必要參數。 請注意,在 Windows 2000 之前的 Windows NT 版本中,總線主要裝置可以將 NULL 配接器對象指標傳遞至 MapTransfer 和 FlushAdapterBuffers。 在 Windows 2000 和更新版本中,驅動程式無法再這麼做。
KeFlushIoBuffers 和 MmGetMdlVirtualAddress 需要指向 Irp->MdlAddress 上的 MDL 的指標。
個別驅動程式會根據每個驅動程序的實作方式,在不同的時間點呼叫此序列的支援例程,以服務其裝置。 例如,某個驅動程式的 StartIo 例程可能會呼叫 AllocateAdapterChannel,而另一個驅動程式可能會從從驅動程式建立的聯結佇列或裝置佇列中移除 IRP 的例程進行此呼叫。
除了使用本節所述的例程,任何使用封包型 DMA 的驅動程式都可以使用旨在簡化散佈/收集 DMA 的支援例程,而不論其裝置是否有內建散佈/收集支援。 如需詳細資訊,請參閱使用散佈/聚集 DMA。