Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Nadat IoCreateDevice is afgerond en de beller een pointer heeft gegeven naar een DeviceObject dat een pointer bevat naar de device-uitbreiding, moeten stuurprogramma's bepaalde velden in de apparaatobjecten instellen voor hun respectieve fysieke, logische en/of virtuele apparaten.
IoCreateDevice stelt het veld StackSize van een nieuw apparaatobject in op één. Een stuurprogramma op het laagste niveau kan dit veld negeren. Wanneer een stuurprogramma op een hoger niveau IoAttachDeviceToDeviceStack aanroept om zichzelf aan het volgende lagere stuurprogramma te koppelen, wordt het veld StackSize in het apparaatobject automatisch ingesteld op dat van het apparaatobject van het volgende lagere stuurprogramma plus één. Voor sommige apparaattypen moet het stuurprogramma op een hoger niveau mogelijk het veld StackSize instellen op een hogere waarde, zoals vermeld in de apparaatspecifieke documentatie. Als u de stackgrootte instelt, zorgt u ervoor dat IR's die naar het stuurprogramma op een hoger niveau worden verzonden, een stuurprogrammaspecifieke I/O-stacklocatie bevatten, plus het juiste aantal I/O-stacklocaties voor alle stuurprogramma's op een lager niveau in de keten.
IoCreateDevice stelt het veld AlignmentRequirement van een nieuw gemaakt apparaatobject in op de regelgrootte van de gegevenscache van de processor min één om ervoor te zorgen dat buffers die in directe I/O worden gebruikt, correct zijn uitgelijnd. Nadat IoCreateDevice is geretourneerd, moeten fysieke apparaatstuurprogramma's op het laagste niveau het volgende doen:
Trek er een af van de uitlijningsvereiste van het apparaat.
Vergelijk het resultaat van stap 1 met de huidige waarde van de AlignmentRequirement van het apparaatobject.
Als de uitlijningsvereiste van het apparaat groter is, stelt u AlignmentRequirement in op het resultaat van stap 1. Laat anders de waarde AlignmentRequirement zoals ingesteld door IoCreateDevice.
Nadat een stuurprogramma op een hoger niveau over een ander stuurprogramma is gekoppeld door IoGetDeviceObjectPointer aan te roepen, moet het stuurprogramma op een hoger niveau het veld AlignmentRequirement van het zojuist gemaakte apparaatobject instellen op dat van het apparaatobject op het volgende lagere niveau van het stuurprogramma. In de regel mag een stuurprogramma op een hoger niveau deze waarde niet wijzigen. Als een stuurprogramma op een hoger niveau IoAttachDevice of IoAttachDeviceToDeviceStack aanroept, worden met deze routines het veld AlignmentRequirement in het apparaatobject automatisch ingesteld op dat van het apparaatobject op het lagere niveau.
IoGetDeviceObjectPointer retourneert aanwijzers zowel naar het apparaatobject op lager niveau als naar het bijbehorende bestandsobject. Alleen een FSD (of, mogelijk, een ander stuurprogramma op het hoogste niveau) kan de geretourneerde bestandsobjectaanwijzer gebruiken. Een tussenliggend stuurprogramma dat IoGetDeviceObjectPointer aanroept, moet deze bestandsobjectaanwijzer opslaan, zodat deze kan worden gededucteerd door ObDereferenceObject aan te roepen wanneer het stuurprogramma wordt verwijderd.
Nadat een FSD het volume aankoppelt dat het bestandsobject bevat dat een apparaatobject van een lager stuurprogramma vertegenwoordigt, kan een tussenliggend stuurprogramma zichzelf niet tussen het bestandssysteem en het lagere stuurprogramma koppelen door IoAttachDevice of IoAttachDeviceToDeviceStack aan te roepen. Daarnaast kan een FSD het lid SectorSize van het apparaatobject instellen op basis van de geometrie van de onderliggende volumehardware wanneer er een koppeling plaatsvindt. Zie DEVICE_OBJECT voor meer informatie.
Een stuurprogramma op tussen- of laagste niveau zet ook een bit in de vlaggen van het apparaatobject door het met een OR-bewerking toe te passen met DO_DIRECT_IO of DO_BUFFERED_IO op elk apparaatobject dat het creëert. Stuurprogramma's op het hoogste niveau van logische of virtuele apparaten kunnen het instellen van vlaggen voor gebufferde of directe I/O voorkomen als de schrijver van het stuurprogramma besluit dat het extra werk dat betrokken is, afbetaalt in betere prestaties van het stuurprogramma. Een tussenliggend stuurprogramma moet het veld Vlaggen van het apparaatobject instellen om overeen te komen met dat van het apparaatobject van het volgende lagere stuurprogramma.
Het instellen van een veld Vlaggen voor apparaatobjecten met DO_DIRECT_IO of DO_BUFFERED_IO bepaalt hoe de I/O-manager toegang geeft tot gebruikersbuffers in alle aanvragen voor gegevensoverdracht die vervolgens naar het stuurprogramma worden verzonden.
Het stuurprogramma kan vervolgens eventuele andere apparaatafhankelijke waarden instellen in het apparaatobject. Niet-WDM-stuurprogramma's voor verwisselbare media-apparaten moeten bijvoorbeeld het lid Vlaggen van het apparaatobject met OF DO_VERIFY_VOLUME OR'en als ze een wijziging in media detecteren (of vermoeden) tijdens I/O-bewerkingen. (Zie Ondersteuning voor verwisselbare media voor meer informatie.) Stuurprogramma's voor apparaten die inschakelstroom vereisen, moeten het lid Vlaggen verbinden met behulp van OR met DO_POWER_INRUSH, en stuurprogramma's voor apparaten die zich niet op het systeempagina-pad bevinden, moeten het lid Vlaggen verbinden met behulp van OR met DO_POWER_PAGABLE. Functie- en filterstuurprogramma's moeten de DO_DEVICE_INITIALIZING vlag wissen.
Nadat het apparaatobject is geïnitialiseerd, kan een stuurprogramma ook eventuele door kernel gedefinieerde objecten en andere door het systeem gedefinieerde gegevensstructuren initialiseren waarvoor het opslag in de apparaatextensie heeft geleverd. Precies wanneer een stuurprogramma deze taken uitvoert, is afhankelijk van het apparaat, het type object en/of de aard van de gegevens. Over het algemeen kunnen objecten of gegevensstructuren die kunnen worden bewaard via het starten en stoppen van PnP-aanvragen worden geïnitialiseerd in de AddDevice-routine . Degenen die resourcegegevens nodig hebben die zijn geleverd met een PnP-IRP_MN_START_DEVICE-aanvraag, of die mogelijk wijzigingen vereisen wanneer het apparaat wordt gestopt en/of opnieuw wordt opgestart, moeten worden geïnitialiseerd wanneer het stuurprogramma de IRP_MN_START_DEVICE aanvraag afhandelt. Zie Een AddDevice-routine schrijven voor meer informatie over AddDevice-routines.