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.
Als een stuurprogramma geen gebufferde of directe I/O gebruikt, geeft de I/O-manager de oorspronkelijke virtuele adressen van de gebruikersruimte door in IRP's die naar het stuurprogramma worden verzonden. Als u deze buffers veilig wilt openen, moet het stuurprogramma worden uitgevoerd in de context van de aanroepende thread. Daarom kunnen alleen stuurprogramma's op het hoogste niveau, zoals FSD's, deze methode gebruiken voor toegang tot buffers.
Een stuurprogramma op tussen- of laagste niveau kan niet altijd aan deze voorwaarde voldoen. Als een aanvraagthread bijvoorbeeld wacht op het voltooien van een I/O-aanvraag of als een stuurprogramma op een hoger niveau is gelaagd over het tussenliggende of laagste stuurprogramma, worden de routines van het stuurprogramma op het lagere niveau waarschijnlijk niet aangeroepen in de context van de aanvraagthread.
De I/O-manager bepaalt dat een I/O-bewerking geen gebruik maakt van gebufferde of directe I/O zoals volgt:
Voor IRP_MJ_READ- en IRP_MJ_WRITE-verzoeken worden noch DO_BUFFERED_IO noch DO_DIRECT_IO ingesteld in het Flags-lid van de DEVICE_OBJECT-structuur. Zie Initialiseren van een apparaatobjectvoor meer informatie.
Voor IRP_MJ_DEVICE_CONTROL en IRP_MJ_INTERNAL_DEVICE_CONTROL aanvragen, bevat de IOCTL-codewaarde de waarde METHOD_NEITHER als de TransferType-waarde in de IOCTL-waarde. Zie I/O-besturingscodes definiƫrenvoor meer informatie.
Wanneer een stuurprogramma een IRP ontvangt waarmee een I/O-bewerking wordt opgegeven die geen buffer of directe I/O gebruikt, moet dit het volgende doen:
Controleer de geldigheid van het adresbereik van de gebruikersbuffer en controleer of de juiste lees- of schrijftoegang is toegestaan met behulp van de ProbeForRead- en ProbeForWrite ondersteuningsroutines. Het stuurprogramma moet zijn toegang tot het adresbereik van de buffer omsluiten binnen een door het stuurprogramma geleverde uitzonderingshandler, zodat een gebruikersthread de toegangsrechten voor de buffer niet kan wijzigen terwijl het stuurprogramma toegang heeft tot het geheugen. Als de sonde een uitzondering genereert, moet de driver een fout teruggeven. Het stuurprogramma moet deze routines aanroepen binnen de context van de thread die de I/O-aanvraag heeft ingediend; Daarom kan alleen een stuurprogramma op een hoger niveau deze taak uitvoeren.
Beheer buffers en geheugenbewerkingen op een van de volgende manieren:
- Voer zijn eigen dubbele bufferbewerkingen uit, zoals de I/O-manager doet voor stuurprogramma's die gebruikmaken van gebufferde I/O. Meer informatie vindt u onder Gebruiken van Buffered I/O.
- Maak eigen MDL's en vergrendel de buffer door de ondersteuningsroutines van de geheugenbeheerder aan te roepen, zoals de I/O-manager doet voor stuurprogramma's die directe I/O gebruiken. Voor meer informatie, zie Direct I/O gebruiken.
- Voer alle benodigde bewerkingen rechtstreeks uit op de gebruikersbuffer in de context van de aanroepende thread. Het stuurprogramma moet de toegang tot de buffer verpakken binnen een door het stuurprogramma geleverde uitzonderingshandler, voor het geval een gebruikersthread de toegangsrechten voor de buffer of de gegevens in de buffer wijzigt terwijl het stuurprogramma toegang heeft tot het geheugen. Zie Uitzonderingen verwerkenvoor meer informatie.
In feite moet het stuurprogramma per IRP kiezen of er een buffer-I/O, directe I/O of I/O moet worden uitgevoerd in de context van de aanroepende thread en moet het eventuele uitzonderingen verwerken die zich in een threadcontext in de gebruikersmodus kunnen voordoen. Het stuurprogramma moet, indien nodig, toegang tot eigen gebruikersbuffers, dubbele bufferbewerkingen en geheugentoewijzingen beheren in plaats van de I/O-manager deze bewerkingen voor het stuurprogramma te laten afhandelen.