Eszközobjektum inicializálása

Miután az IoCreateDevice visszatér, és a hívónak mutatót ad egy DeviceObjecteszközbővítményhez, az illesztőprogramoknak be kell állítaniuk bizonyos mezőket az eszközobjektumokban a megfelelő fizikai, logikai és/vagy virtuális eszközeikhez.

Az IoCreateDevice egy újonnan létrehozott eszközobjektum StackSize mezőjét egy értékre állítja. A legalacsonyabb szintű illesztőprogram figyelmen kívül hagyhatja ezt a mezőt. Amikor egy magasabb szintű illesztő meghívja az IoAttachDeviceToDeviceStacket , hogy csatolja magát a következő alacsonyabb szintű illesztőprogramhoz, ez a rutin automatikusan beállítja az eszközobjektum StackSize mezőjét a következő alsóbb szintű illesztőprogram eszközobjektumához, plusz egyhez. Egyes eszköztípusok esetében azonban előfordulhat, hogy a magasabb szintű illesztőprogramnak nagyobb értékre kell állítania a StackSize mezőt, amint az az eszközspecifikus dokumentációban is szerepel. A verem méretének beállítása biztosítja, hogy a magasabb szintű illesztőprogramnak küldött INTEGRÁCIÓS-címek egy illesztőprogram-specifikus I/O-veremhelyet, valamint a lánc összes alacsonyabb szintű illesztőprogramjának megfelelő számú I/O veremhelyet tartalmazzanak.

Az IoCreateDevice egy újonnan létrehozott eszközobjektum AlignRequirement mezőjét a processzor adatgyorsítótár-vonalméretének mínusz egy értékére állítja, hogy a közvetlen I/O-ban használt pufferek megfelelően legyenek igazítva. Az IoCreateDevice visszatérése után a legalacsonyabb szintű fizikai eszközillesztőknek a következőket kell elvégeznie:

  1. Vonhat ki egyet az eszköz igazítási követelményéből.

  2. Hasonlítsa össze az 1. lépés eredményét az eszközobjektum AlignmentRequirement tulajdonságának aktuális értékével.

  3. Ha az eszköz igazítási követelménye nagyobb, állítsa az AlignmentRequirement értékét az 1. lépés eredményére. Ellenkező esetben hagyja meg a AlignmentRequirement értéket az IoCreateDevice által megadott módon.

Miután bármely magasabb szintű illesztőprogram egy másik illesztőprogram fölé láncol az IoGetDeviceObjectPointer meghívásával, a magasabb szintű illesztőnek az újonnan létrehozott eszközobjektum AlignmentRequirement mezőjét a következő alacsonyabb szintű illesztőprogram eszközobjektumához kell beállítania. Általános szabály, hogy a magasabb szintű illesztőprogramok nem módosíthatják ezt az értéket. Ha egy magasabb szintű illesztőprogram meghívja az IoAttachDevice vagy az IoAttachDeviceToDeviceStack parancsot, ezek a rutinok automatikusan az eszközobjektum AlignmentRequirement mezőjét az alsó szintű illesztőprogram eszközobjektumának megfelelőre állítják be.

Az IoGetDeviceObjectPointer az alsó szintű illesztőprogram eszközobjektumára és a társított fájlobjektumra mutató mutatókat is visszaad. A visszaadott fájlobjektum-mutatót csak egy FSD (vagy esetleg egy másik legmagasabb szintű illesztőprogram) használhatja. Az IoGetDeviceObjectPointert hívó köztes illesztőprogramnak mentenie kell ezt a fájlobjektum-mutatót, hogy az obDereferenceObject meghívásával el lehessen halasztani az illesztőprogram eltávolításakor.

Miután egy FSD csatlakoztatta az alacsonyabb illesztőprogram eszközobjektumát képviselő fájlobjektumot tartalmazó kötetet, a köztes illesztőprogram nem tudja láncoltatni magát a fájlrendszer és az alsó illesztőprogram között az IoAttachDevice vagy az IoAttachDeviceToDeviceStack meghívásával. Emellett az FSD beállíthatja az eszközobjektum SectorSize tagját a mögöttes kötethardver geometriája alapján, amikor csatlakoztatás történik. További információ: DEVICE_OBJECT.

A köztes vagy legalacsonyabb szintű illesztők is beállítanak egy bitet az eszközobjektum jelzőiben azzal, hogy az OR-t használják a DO_DIRECT_IO vagy a DO_BUFFERED_IO értékekkel, minden létrehozott eszközobjektumban. A logikai vagy virtuális eszközök legmagasabb szintű illesztőprogramjai elkerülhetik a pufferelt vagy a közvetlen I/O-ra vonatkozó jelzők beállítását, ha az illesztőprogram-író úgy dönt, hogy a további érintett munka jobb illesztőprogram-teljesítménnyel jár. A köztes illesztőknek az eszközobjektum Jelzők mezőjét úgy kell beállítaniuk, hogy megfeleljenek a következő alsó illesztőprogram eszközobjektumának.

Az Eszközobjektum-jelzők mezőjének beállítása DO_DIRECT_IO vagy DO_BUFFERED_IO értékkel meghatározza, hogyan továbbítja az I/O-kezelő a hozzáférést a felhasználói pufferekhez az illesztőprogramnak küldött összes adatátviteli kérelem esetén.

Az illesztő ezután bármilyen más eszközfüggő értéket beállíthat az eszközobjektumban. A cserélhető adathordozók nem WDM-illesztőinek például vagy az eszközobjektum Jelzők tagjának DO_VERIFY_VOLUME kell lenniük, ha észlelik (vagy gyanítják) a médiaváltozást az I/O-műveletek során. (További információt a Cserélhető adathordozó támogatása című témakörben talál.) Az inrush-teljesítményt igénylő eszközök illesztőprogramjainak bináris VAGY műveletet kell végezniük a Flags taggal és beállítaniuk a DO_POWER_INRUSH-t, és a rendszer lapozási útvonalán nem található eszközök illesztőprogramjainak bináris VAGY műveletet kell végezniük a Flags taggal és beállítaniuk a DO_POWER_PAGABLE-t. A függvény- és szűrőillesztőknek törölnie kell a DO_DEVICE_INITIALIZING jelzőt.

Az eszközobjektum inicializálása után az illesztőprogram inicializálhat minden kernel által definiált objektumot és más rendszer által definiált adatstruktúrát is, amelyek számára az eszközbővítményben tárterületet biztosított. Az illesztőprogramok pontosan az eszközétől, az objektum típusától és/vagy az adatok természetétől függenek. Az AddDevice rutinban általában inicializálhatók a PnP indítási és leállítási kérései által megőrzhető objektumok vagy adatstruktúrák. A PnP-IRP_MN_START_DEVICE-kéréshez megadott erőforrás-információkat igénylő vagy az eszköz leállítása és/vagy újraindítása esetén módosítást igénylő erőforrásokat inicializálni kell, amikor az illesztőprogram kezeli a IRP_MN_START_DEVICE kérést. Az AddDevice-rutinokkal kapcsolatos további információkért lásd: AddDevice-rutin írása.