Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ovladače podřízených zařízení, které používají DMA založené na paketech, volají při zpracování IRP požadujícího přenos DMA následující obecnou sekvenci rutin podpory:
KeFlushIoBuffers těsně před pokusem o přidělení systémového řadiče DMA (další informace naleznete v tématu Údržba mezipaměti Coherency)
AllocateAdapterChannel, když je ovladač připraven naprogramovat své zařízení pro DMA a potřebuje systémový řadič DMA
AllocateAdapterChannel zase volá rutinu AdapterControl ovladače.
MmGetMdlVirtualAddress pro získání indexu do MDL, který se vyžaduje jako parametr v počátečním volání MapTransfer
MapTransfer k naprogramování systémového řadiče DMA pro operaci přenosu
Ovladač může potřebovat zavolat MapTransfer více než jednou, aby přenesl všechna požadovaná data, jak je vysvětleno v Rozdělení žádostí o přenos.
FlushAdapterBuffers těsně po každé operaci přenosu DMA do/z podřízeného zařízení
Pokud ovladač musí zavolat MapTransfer více než jednou k přenosu všech požadovaných dat, musí volat FlushAdapterBuffers tolikrát, kolikrát volá MapTransfer.
FreeAdapterChannel buď jakmile se přenesou všechna požadovaná data, nebo pokud ovladač selže kvůli I/O chybě zařízení
Ukazatel objektu adaptéru vrácený IoGetDmaAdapter je povinný parametr pro každou z těchto rutin s výjimkou KeFlushIoBuffers a MmGetMdlVirtualAddress, které vyžadují ukazatel na MDL předaný v Irp-MdlAddress>.
Jednotlivé ovladače volají tuto sekvenci rutin podpory v různých bodech v závislosti na tom, jak je každý ovladač implementovaný do služby svého zařízení. Například rutina StartIo jednoho ovladače může volat funkci AllocateAdapterChannel, jiný ovladač může tuto funkci volat z rutiny, která odebere IRP z fronty vytvořené ovladačem, která je vzájemně zablokovaná, a další ovladač může toto volání uskutečnit, když jeho podřízené zařízení DMA indikuje, že je připravené k přenosu dat.