Sdílet prostřednictvím


Přístup k datovým vyrovnávacím pamětím v ovladačích WDF (KMDF nebo UMDF)

Když ovladač Windows Driver Frameworks (WDF) obdrží požadavek na čtení, zápis nebo řízení vstupně-výstupních operací zařízení, objekt požadavku obsahuje buď vstupní vyrovnávací paměť, výstupní vyrovnávací paměť, nebo obojí.

Vstupní vyrovnávací paměti obsahují informace, které ovladač potřebuje. U žádostí o zápis jsou tyto informace obvykle data, která ovladač funkce musí odeslat do zařízení. U požadavků na řízení vstupně-výstupních operací zařízení může vstupní vyrovnávací paměť obsahovat informace, které označují typ operace, kterou musí ovladač provést.

Výstupní vyrovnávací paměti přijímají informace z ovladače zařízení. U žádostí o čtení jsou tyto informace obvykle data, která ovladač funkce přijímá ze zařízení. U požadavků na řízení vstupně-výstupních operací zařízení může výstupní vyrovnávací paměť přijímat stav nebo jiné informace určené kódem řízení vstupně-výstupních operací požadavku.

Technika, kterou ovladač používá pro přístup k datovým vyrovnávacím pamětím požadavku, závisí na metodě ovladače pro přístup k datovým vyrovnávacím pamětím pro zařízení. Existují tři metody přístupu:

Ovladač Kernel-Mode Driver Framework (KMDF) může použít některou ze tří metod přístupu. Ovladač ve frameworku User-Mode Driver (UMDF) může pro požadavky na čtení, zápis a IOCTL operace použít vyrovnávaný nebo přímý vstupně-výstupní režim a může převést požadavky, které specifikují metodu METHOD_NEITHER.

Určení metody přístupu k vyrovnávací paměti

Ovladače KMDF

Pro požadavky na čtení a zápis musí všechny ovladače v zásobníku ovladačů používat stejnou metodu pro přístup k vyrovnávací paměti zařízení s výjimkou ovladače nejvyšší úrovně, který může používat metodu "ani jedna", bez ohledu na to, kterou metodu používají nižší ovladače.

Od verze 1.13 ovladač KMDF určuje metodu přístupu pro všechny požadavky na čtení a zápis zařízení voláním WdfDeviceInitSetIoTypeEx pro každé zařízení. Pokud například ovladač určuje vstupně-výstupní metodu vyrovnávací paměti pro jedno ze svých zařízení, použije správce vstupně-výstupních operací metodu vyrovnávací paměti při doručování žádostí o čtení a zápis do ovladače tohoto zařízení.

U požadavků na řízení vstupně-výstupních operací zařízení obsahuje kód IOCTL (IOCTL) bity, které určují metodu přístupu k vyrovnávací paměti. V důsledku toho ovladač KMDF nemusí provést žádnou akci pro výběr metody ukládání do vyrovnávací paměti pro IOCTL. Další informace o vstupně-výstupních kontrolních kódech najdete v tématu Definování kódů řízení vstupně-výstupních operací. Na rozdíl od požadavků na čtení a zápis nemusí všechny IOCTL zařízení používat stejnou metodu přístupu.

Ovladače UMDF

Ovladač UMDF určuje předvolby pro metodu přístupu, kterou architektura používá pro požadavky na čtení a zápis a také žádosti o řízení vstupně-výstupních operací zařízení. Hodnoty, které ovladač UMDF poskytuje, jsou pouze předvolby a nejsou zaručeny, že je bude architektura používat. Další informace naleznete v tématu Správa metod přístupu vyrovnávací paměti v ovladačích UMDF.

Ovladač UMDF určuje metodu přístupu pro všechny požadavky na čtení, zápis a IOCTL zařízení voláním WdfDeviceInitSetIoTypeEx pro každé zařízení. Pokud například ovladač určuje vstupně-výstupní metodu vyrovnávací paměti pro jedno ze svých zařízení, architektura při doručování požadavků na čtení, zápis a IOCTL pro toto zařízení používá metodu vyrovnávací paměti.

Všimněte si rozdílu v technice přístupu k vyrovnávací paměti pro I/O řídicí kódy (IOCTLs) mezi KMDF a UMDF. Ovladače KMDF nezadávají metodu přístupu k vyrovnávací paměti pro knihovny IOCTLs, zatímco ovladače UMDF určují metodu přístupu k vyrovnávací paměti pro knihovny IOCTLs.

Pokud ovladač WDF popisuje vyrovnávací paměť V/V požadavku pomocí techniky, která je nesprávná pro vstupně-výstupní metodu, kterou cíl vstupně-výstupní operace používá, architektura opraví popis vyrovnávací paměti. Pokud například ovladač používá MDL k popisu vyrovnávací paměti, kterou předává WdfIoTargetSendReadSynchronously, a pokud cíl vstupně-výstupní operace používá bufferované I/O (což vyžaduje, aby vyrovnávací paměti byly zadány pomocí virtuálních adres místo MDL), framework převede popis vyrovnávací paměti z MDL na virtuální adresu a délku. Je však efektivnější, pokud ovladač určuje vyrovnávací paměti ve správném formátu.

Informace o paměťových objektech rozhraní, vyhrazených seznamech, MDL a místních paměťových vyrovnávacích pamětích naleznete v tématu Použití paměťových vyrovnávacích pamětí.

Informace o tom, kdy jsou vyrovnávací paměti odstraněny, naleznete v Životní cyklus vyrovnávací paměti.

Přístup k vyrovnávacím pamětím dat pro vstupně-výstupní operace ve vyrovnávací paměti

Pokud váš ovladač používá vyrovnávací I/O, jeho chování se změní v závislosti na typu požadavku dat a na tom, zda používá KMDF nebo UMDF.

Ovladače KMDF

Když ovladač KMDF používá vstupně-výstupní operace ve vyrovnávací paměti, správce vstupně-výstupních operací vytvoří jednu zprostředkující vyrovnávací paměť, ke které má ovladač přístup pro každý typ požadavku. Co se stane:

  • Zapisujte požadavky. Správce vstupu/výstupu předá vstupní informace z vyrovnávací paměti volající aplikace před tím, než zavolá zásobník ovladačů. Ovladač KMDF pak načte vstupní informace ze zprostředkující vyrovnávací paměti a zapíše je do zařízení.
  • Přečtěte si požadavky. Ovladač KmDF čte informace ze zařízení a ukládá je do přechodné vyrovnávací paměti. Potom V/V manager zkopíruje výstupní data z mezilehlých vyrovnávacích pamětí do výstupní vyrovnávací paměti aplikace.
  • Žádosti o řízení vstupně-výstupních operací zařízení Ovladač KMDF pro tento požadavek čte nebo zapisuje data do zprostředkující vyrovnávací paměti nebo z ní.

Ovladače UMDF

Pokud ovladač UMDF používá vyrovnávaný vstup/výstup, vytvoří hostitelský proces ovladače jednu nebo dvě zprostředkující vyrovnávací paměti v závislosti na typu požadavku. Co se stane:

  • Zapisujte požadavky. Rámec vytvoří jednu vyrovnávací paměť, přenese vstupní informace ze vstupní vyrovnávací paměti volající aplikace a následně zavolá zásobník ovladačů. Ovladač UMDF čte vstupní informace z přechodné vyrovnávací paměti a zapíše je do zařízení.
  • Přečtěte si požadavky. Ovladač UMDF načte informace ze zařízení a uloží je do vyrovnávací paměti, kterou architektura vytvořila. Proces hostitele ovladače zkopíruje výstupní data z zprostředkující vyrovnávací paměti do výstupní vyrovnávací paměti aplikace.
  • Žádosti o řízení vstupně-výstupních operací zařízení Architektura vytvoří dvě vyrovnávací paměti odpovídající vstupním a výstupním vyrovnávacím pamětíM IOCTL, ke kterým má ovladač přístup. Rámec zkopíruje vstupní informace z hodnoty IOCTL do nové vyrovnávací paměti zprostředkující vrstvy a zpřístupní je ovladači. Rámec nekopíruje obsah výstupní vyrovnávací paměti, takže by se ovladač neměl pokoušet číst z ní (jinak skončí čtením nesmyslných dat). Všechna data, která ovladač zapíše do výstupní vyrovnávací paměti, se zkopírují zpět do původní vyrovnávací paměti IOCTL a vrátí se do aplikace po úspěšném dokončení V/V požadavku. Všimněte si, že všechna data, která ovladač zapisuje do vstupní vyrovnávací paměti, jsou zahozena a nevrátí se do volající aplikace.

Pokud chcete načíst popisovač objektu paměti rozhraní, který představuje vyrovnávací paměť, ovladače KMDF i UMDF volají WdfRequestRetrieveInputMemory nebo WdfRequestRetrieveOutputMemory v závislosti na tom, zda se jedná o požadavek na čtení nebo zápis. Ovladač pak může načíst ukazatel na paměť voláním WdfMemoryGetBuffer. Pro čtení a zápis vyrovnávací paměti ovladač volá WdfMemoryCopyFromBuffer nebo WdfMemoryCopyToBuffer.

Pro načtení virtuální adresy a délky vyrovnávací paměti ovladač volá WdfRequestRetrieveInputBuffer nebo WdfRequestRetrieveOutputBuffer.

Chcete-li přidělit a sestavit seznam popisovačů paměti (MDL) pro vyrovnávací paměť, ovladač KMDF volá WdfRequestRetrieveInputWdmMdl nebo WdfRequestRetrieveOutputWdmMdl.

Přístup k vyrovnávacím pamětím dat pro přímé vstupně-výstupní operace

Ovladače KMDF

Pokud váš ovladač používá přímý vstup/výstup, správce vstupně-výstupních operací ověří přístupnost prostoru vyrovnávací paměti, který původce požadavku na vstup/výstup (obvykle aplikace v uživatelském režimu) specifikoval, uzamkne prostor vyrovnávací paměti do fyzické paměti a poté poskytne ovladači přímý přístup k prostoru vyrovnávací paměti.

Ovladače UMDF

Pokud váš ovladač určil předvolbu pro přímé vstupně-výstupní operace a všechny požadavky UMDF pro přímé vstupně-výstupní operace byly splněny (viz Správa metod přístupu vyrovnávací paměti v ovladačích UMDF), architektura mapuje vyrovnávací paměť, kterou přijímá ze správce vstupně-výstupních operací přímo do adresního prostoru hostitelského procesu ovladače, a tím poskytuje ovladač přímý přístup k prostoru vyrovnávací paměti.

Chcete-li získat popisovač paměťového objektu rámce, který reprezentuje vyrovnávací prostor, ovladač volá WdfRequestRetrieveInputMemory nebo WdfRequestRetrieveOutputMemory. Ovladač pak může získat ukazatel na vyrovnávací paměť voláním WdfMemoryGetBuffer. Pro čtení a zápis vyrovnávací paměti ovladač volá WdfMemoryCopyFromBuffer nebo WdfMemoryCopyToBuffer.

Pro načtení virtuální adresy a délky prostoru vyrovnávací paměti ovladač volá WdfRequestRetrieveInputBuffer nebo WdfRequestRetrieveOutputBuffer.

Pokud ovladače zařízení používají přímé I/O, správce I/O popisuje vyrovnávací paměti pomocí MDL. Pokud chcete načíst ukazatel na MDL vyrovnávací paměti, ovladač KMDF volá WdfRequestRetrieveInputWdmMdl nebo WdfRequestRetrieveOutputWdmMdl. Ovladač UMDF nemá přístup k MDLům.

Přístup k datovým vyrovnávacím pamětím pro nevyrovnávací ani přímé vstupně-výstupní operace

Ovladače KMDF

Pokud váš ovladač používá metodu přístupu k vyrovnávací paměti známou jako ani zprostředkovaná V/V, ani přímá vstupně-výstupní metoda (neboli zkráceně 'ani' metoda), správce vstupně-výstupních operací jednoduše poskytne ovladači virtuální adresy, které původce V/V požadavku určil pro prostor vyrovnávací paměti požadavku. Správce vstupně-výstupních operací neověřuje prostor vyrovnávací paměti požadavku na vstupně-výstupní operace, takže ovladač musí ověřit, že je prostor vyrovnávací paměti přístupný, a uzamknout prostor vyrovnávací paměti do fyzické paměti.

K virtuálním adresám, které poskytuje správce vstupně-výstupních operací, je možné získat přístup pouze v kontextu procesu původce žádosti o vstupně-výstupní operace. V kontextu procesu původce je zaručeno, že se v kontextu procesu původce spustí pouze ovladač nejvyšší úrovně v zásobníku ovladačů.

Pokud chcete získat přístup k prostoru vyrovnávací paměti požadavku na vstupně-výstupní operace, musí ovladač nejvyšší úrovně poskytnout funkci zpětného volání EvtIoInCallerContext . Architektura volá tuto funkci zpětného volání pokaždé, když obdrží vstupně-výstupní požadavek pro ovladač.

Pokud metoda přístupu k vyrovnávací paměti požadavku není "žádná", ovladač KMDF musí pro každou vyrovnávací paměť provést následující:

  1. Pro volání WdfRequestRetrieveUnsafeUserInputBuffer nebo WdfRequestRetrieveUnsafeUserOutputBuffer pro získání virtuální adresy vyrovnávací paměti.

  2. Zavolejte WdfRequestProbeAndLockUserBufferForRead nebo WdfRequestProbeAndLockUserBufferForWrite pro zkontrolování a uzamčení vyrovnávací paměti a získání popisovače pro objekt paměti rámce pro vyrovnávací paměť.

  3. Uložte popisovače objektů paměti do kontextového prostoru požadavku.

  4. Zavolejte WdfDeviceEnqueueRequest, které vrátí požadavek na rámec.

Architektura následně přidá požadavek do jedné z vstupně-výstupních front ovladače. Pokud ovladač poskytl obslužné rutiny, architektura nakonec zavolá příslušnou obslužnou rutinu.

Obslužná rutina požadavku může načíst popisovače objektu paměti požadavku z kontextového prostoru požadavku. Ovladač může předat popisovače WdfMemoryGetBuffer k získání adresy vyrovnávací paměti.

V některých případech musí ovladač nejvyšší úrovně použít předchozí kroky k přístupu k vyrovnávací paměti v režimu uživatele, i když ovladač nepoužívá metodu přístupu 'žádnou z nich'. Předpokládejme například, že ovladač používá vyrovnávací paměť pro I/O. Řídicí kód I/O, který používá metodu přístupu ve vyrovnávací paměti, může přenést strukturu, která obsahuje vložený ukazatel na vyrovnávací paměť uživatelského režimu. V takovém případě musí ovladač poskytnout funkci zpětného volání EvtIoInCallerContext , která extrahuje ukazatele ze struktury a pak použije předchozí kroky 2 až 4.

Ovladače UMDF

UMDF nepodporuje ani vyrovnávací, ani přímé vstupně-výstupní vyrovnávací paměti, takže ovladač UMDF nikdy nepotřebuje tento typ vyrovnávací paměti zpracovávat přímo.

Pokud však framework přijímá takové vyrovnávací paměti pro čtení nebo zápis od I/O manažera, zpřístupňuje je ovladači UMDF jako buffered I/O nebo direct I/O (přímé I/O), v závislosti na zvolené metodě přístupu ovladačem. Pokud architektura obdrží hodnotu IOCTL určující metodu vyrovnávací paměti "žádná", může volitelně převést metodu přístupu k vyrovnávací paměti požadavku IOCTL na vstupně-výstupní operace vyrovnávací paměti nebo přímé vstupně-výstupní operace na základě přítomnosti direktivy INF. Další informace najdete v tématu Správa metod přístupu k vyrovnávací paměti v ovladačích UMDF .