Delen via


Ondersteuning voor Kernel-Mode-clients in UMDF-stuurprogramma's

In dit onderwerp wordt beschreven hoe een UMDF-stuurprogramma (User-Mode Driver Framework) ondersteuning biedt voor kernelmodusclients, vanaf UMDF versie 2.

Een kernelmodusclient is een kernelmodusstuurprogramma waarmee I/O-aanvragen worden verzonden naar uw UMDF-stuurprogramma. Het stuurprogramma voor de kernelmodus bevindt zich mogelijk boven het UMDF-stuurprogramma, in dezelfde apparaatstack of in een andere apparaatstack.

Het stuurprogramma voor de kernelmodus kan I/O-aanvragen doorsturen die het heeft ontvangen van een toepassing in de gebruikersmodus, of kan nieuwe I/O-aanvragen maken en verzenden naar het stuurprogramma voor de gebruikersmodus.

Hoe kernelmodus-clients te ondersteunen in een UMDF-stuurprogramma

Als u de ondersteuning van een UMDF-stuurprogramma voor kernelmodusclients wilt inschakelen, moet het INF-bestand van het UMDF-stuurprogramma een UmdfKernelModeClientPolicy- instructie bevatten in de INF-DDInstall-.sectie WDF-.

Het framework biedt twee methoden die nuttig zijn voor stuurprogramma's die ondersteuning bieden voor kernelmodusclients. Een stuurprogramma kan de WdfRequestGetRequestorMode methode aanroepen om te bepalen of een I/O-aanvraag afkomstig is van de kernelmodus of gebruikersmodus. Als de I/O-aanvraag afkomstig is van de gebruikersmodus, kan het stuurprogramma WdfRequestIsFromUserModeDriver aanroepen om te bepalen of de aanvraag afkomstig is van een toepassing of een ander stuurprogramma voor de gebruikersmodus.

Beperkingen voor kernelmodusstuurprogramma's

Een UMDF-stuurprogramma kan I/O-aanvragen van een kernelmodusstuurprogramma alleen verwerken als het stuurprogramma voor de kernelmodus voldoet aan de volgende vereisten:

  • Het stuurprogramma voor de kernelmodus moet worden uitgevoerd op IRQL = PASSIVE_LEVEL wanneer de I/O-aanvraag wordt verzonden.

  • Tenzij het stuurprogramma de UmdfFileObjectPolicy INF-instructie heeft ingesteld op AllowNullAndUnknownFileObjects, moet elke I/O-aanvraag die een kernelmodusstuurprogramma naar een stuurprogramma in de gebruikersmodus verzendt, een gekoppeld bestandsobject hebben. Het framework moet van tevoren zijn geïnformeerd dat de I/O-manager het bestandsobject heeft gemaakt. (Deze melding zorgt ervoor dat het framework de EvtDeviceFileCreate callback-functie van het stuurprogramma in de gebruikersmodus aanroept, maar die callback-functie is optioneel.)

  • De I/O-aanvraag kan geen IRP_MJ_INTERNAL_DEVICE_CONTROL functiecode bevatten.

  • De buffers van het I/O-verzoek mogen geen aanwijzers naar aanvullende informatie bevatten, omdat het stuurprogramma voor de gebruikersmodus de aanwijzers niet kan derefereren.

  • Als de I/O-aanvraag een I/O-besturingscode bevat die de 'geen' buffertoegangsmethode aangeeft, moet het stuurprogramma voor kernelmodus de I/O-aanvraag verzenden in de procescontext van de toepassing die de I/O-aanvraag heeft gemaakt. Zie Beheren van buffertoegangsmethoden in UMDF-stuurprogramma'svoor meer informatie over het ondersteunen van de "noch de één, noch de ander" methode.

  • Het UMDF-stuurprogramma kan de uitvoergegevens van een I/O-aanvraag wijzigen in de gebruikersmodus. Daarom moet het stuurprogramma voor de kernelmodus alle uitvoergegevens valideren die het ontvangt van het stuurprogramma voor de gebruikersmodus.

  • De client in kernelmodus hoort normaal gesproken de Information-waarde te valideren die wordt doorgegeven door een UMDF-stuurprogramma aan WdfRequestCompleteWithInformation-. Als de client een KMDF-stuurprogramma is, kan deze WdfRequestGetCompletionParams aanroepen om deze informatie te verkrijgen in een IO_STATUS_BLOCK structuur.

    Normaal gesproken valideert het framework niet de informatiewaarde die een UMDF-stuurprogramma doorgeeft aan WdfRequestCompleteWithInformation. (Met deze parameter wordt meestal het aantal overgedragen bytes opgegeven.) Het framework valideert de informatiewaarde alleen voor uitvoerbuffers en alleen voor de gebufferde I/O- methode voor gegevenstoegang. (Het framework controleert bijvoorbeeld of het aantal overgedragen bytes niet groter is dan de uitvoerbuffergrootte van een leesbewerking, als de toegangsmethode is gebufferd I/O.)