Sdílet prostřednictvím


Inicializace objektu zařízení

Po IoCreateDevice vrátí volajícímu ukazatel na DeviceObject, který obsahuje ukazatel na rozšíření zařízení, ovladače musí nastavit určitá pole v objektech zařízení pro jejich relevantní fyzická, logická a/nebo virtuální zařízení.

IoCreateDevice nastaví pole StackSize nově vytvořeného objektu zařízení na jedno. Toto pole může ignorovat ovladač nejnižší úrovně. Když ovladač vyšší úrovně zavolá rutinu IoAttachDeviceToDeviceStack, aby se připojil k dalšímu nižšímu ovladači, tato rutina automaticky nastaví pole StackSize v objektu zařízení na hodnotu pole objektu zařízení dalšího nižšího ovladače plus jedna. U některých typů zařízení ale ovladač vyšší úrovně může potřebovat nastavit pole StackSize na vyšší hodnotu, jak je uvedeno v dokumentaci specifické pro zařízení. Nastavením velikosti zásobníku zajistíte, že BIR odesílané do ovladače vyšší úrovně budou obsahovat specifické umístění zásobníku pro vstupně-výstupní operace daného ovladače, plus správný počet umístění zásobníku pro všechny ovladače na nižší úrovni v řetězci.

IoCreateDevice nastaví pole AlignmentRequirement nově vytvořeného objektu zařízení na velikost datového řádku cache procesoru minus jedna, aby bylo zajištěno správné zarovnání vyrovnávacích pamětí používaných v přímém vstupu/výstupu. Poté, co IoCreateDevice vrátí hodnotu, musí ovladače fyzických zařízení nejnižší úrovně provést následující kroky:

  1. Odečtěte jednu z požadavků na zarovnání zařízení.

  2. Porovnejte výsledek kroku 1 s aktuální hodnotou objektu zařízení AlignmentRequirement.

  3. Pokud je požadavek na zarovnání zařízení větší, nastavte AlignmentRequirement na výsledek kroku 1. Jinak ponechte hodnotu AlignmentRequirement nastavenou IoCreateDevice.

Jakmile se jakýkoli ovladač vyšší úrovně zřetězí nad jiným ovladačem voláním IoGetDeviceObjectPointer, ovladač vyšší úrovně musí nastavit AlignmentRequirement pole jeho nově vytvořeného objektu zařízení na objekt zařízení další nižší úrovně. Obecně platí, že ovladač vyšší úrovně by neměl tuto hodnotu měnit. Pokud ovladač vyšší úrovně volá IoAttachDevice nebo IoAttachDeviceToDeviceStack, tyto rutiny automaticky nastaví pole AlignmentRequirement v objektu zařízení tak, aby odpovídalo tomu v objektu zařízení ovladače nižší úrovně.

IoGetDeviceObjectPointer vrací ukazatele na objekt zařízení ovladače nižší úrovně i na přidružený objekt souboru. Pouze FSD (případně jiný ovladač nejvyšší úrovně) může použít vrácený ukazatel objektu souboru. Zprostředkující ovladač, který volá IoGetDeviceObjectPointer by měl uložit tento ukazatel objektu souboru, aby jej bylo možné odvodit voláním ObDereferenceObject při uvolnění ovladače.

Jakmile FSD připojí svazek obsahující objekt souboru, který představuje objekt zařízení nižšího ovladače, nemůže se mezilehlý ovladač vložit mezi systém souborů a nižší ovladač voláním IoAttachDevice nebo IoAttachDeviceToDeviceStack. Kromě toho může FSD nastavit SectorSize člena objektu zařízení na základě geometrie základního hardwaru svazku při připojení. Další informace naleznete v tématu DEVICE_OBJECT.

Střední nebo nejnižší ovladač také nastaví bit v příznacích objektu zařízení tím, že ho sloučí buď s DO_DIRECT_IO, nebo s DO_BUFFERED_IO v každém objektu zařízení, který vytvoří. Ovladače nejvyšší úrovně logických nebo virtuálních zařízení se můžou vyhnout nastavení příznaky buď pro vyrovnávací paměť, nebo přímé vstupně-výstupní operace, jestliže se programátor ovladače rozhodne, že další práce se vyplatí ve zlepšení výkonu ovladače. Zprostředkující ovladač musí nastavit pole Flags svého objektu zařízení tak, aby odpovídalo objektu zařízení nižšího ovladače.

Nastavení pole příznaků objektu zařízení s hodnotami DO_DIRECT_IO nebo DO_BUFFERED_IO určuje, jak správce I/O poskytuje přístup k uživatelským bufferům ve všech žádostech o přenos dat, které byly následně odeslány k ovladači.

Ovladač pak může nastavit jakékoli jiné hodnoty závislé na zařízení v objektu zařízení. Například ne-WDM ovladače pro zařízení pro vyměnitelná média musí provést logický OR na členu příznaků objektu zařízení s DO_VERIFY_VOLUME, pokud během vstupně-výstupních operací zjistí (nebo mají podezření na) změnu média. (Další informace najdete v tématu Podpora vyměnitelných médií.) Ovladače zařízení, která vyžadují nárazový proud, musí člena Příznaky spojit logickou operací OR s DO_POWER_INRUSH, a ovladače zařízení, která nejsou na cestě stránkování systému, musí člena Příznaky spojit logickou operací OR s DO_POWER_PAGABLE. Ovladače funkcí a filtrů musí vymazat příznak DO_DEVICE_INITIALIZING.

Po inicializaci objektu zařízení může ovladač také inicializovat všechny objekty definované jádrem a další systémové datové struktury, pro které poskytuje úložiště v rozšíření zařízení. Přesně tehdy, když ovladač provádí tyto úlohy, závisí na jeho zařízení, typu objektu nebo povaze dat. Obecně platí, že v rutině AddDevice lze inicializovat objekty nebo datové struktury, které mohou přetrvávat prostřednictvím požadavků na spuštění a zastavení PnP. Zařízení, která vyžadují informace o prostředcích poskytnuté v žádosti o IRP_MN_START_DEVICE PnP, nebo která mohou vyžadovat změny, když je zařízení zastavené a/nebo restartované, by měla být inicializována během zpracování požadavku ovladačem IRP_MN_START_DEVICE. Další informace o rutinách AddDevice naleznete v tématu Zápis rutiny AddDevice.