Stöd för Kernel-Mode klienter i UMDF-drivrutiner
Det här avsnittet beskriver hur en User-Mode Driver Framework-drivrutin (UMDF) stöder kernellägesklienter, med början i UMDF version 2.
En -klient i kernelläge är en drivrutin i kernelläge som skickar I/O-förfrågningar till din UMDF-drivrutin. Drivrutinen i kernelläge kan ligga ovanför UMDF-drivrutinen, i samma enhetsstack eller i en annan enhetsstack.
Drivrutinen i kernelläge kan vidarebefordra I/O-begäranden som den har tagit emot från ett användarlägesprogram, eller skapa nya I/O-begäranden och skicka dem till drivrutinen i användarläge.
Så här stöder du kernellägesklienter i en UMDF-drivrutin
Om du vill aktivera UMDF-drivrutinsstöd för kernellägesklienter måste INF-filen för UMDF-drivrutinen innehålla ett UmdfKernelModeClientPolicy--direktiv i INF-DDInstall-.WDF--avsnittet.
Ramverket innehåller två metoder som är användbara för drivrutiner som stöder kernellägesklienter. En drivrutin kan anropa metoden WdfRequestGetRequestorMode för att avgöra om en I/O-begäran kom från kernelläge eller användarläge. Om I/O-begäran kom från användarläget kan drivrutinen anropa WdfRequestIsFromUserModeDriver för att avgöra om begäran kom från ett program eller en annan drivrutin i användarläge.
Begränsningar för drivrutiner i kernelläge
En UMDF-drivrutin kan endast bearbeta I/O-begäranden från en drivrutin i kernelläge om drivrutinen i kernelläge uppfyller följande krav:
Kärnlägesdrivrutinen måste köras vid IRQL = PASSIVE_LEVEL när I/O-begäran skickas.
Om inte drivrutinen har angett UmdfFileObjectPolicy INF-direktiv till AllowNullAndUnknownFileObjectsmåste varje I/O-begäran som en drivrutin i kernelläge skickar till en drivrutin i användarläge ha ett associerat filobjekt. Ramverket måste tidigare ha meddelats att I/O-hanteraren skapade filobjektet. (Ett sådant meddelande gör att ramverket anropar drivrutinens EvtDeviceFileSkapa återanropsfunktion, men återanropsfunktionen är valfri.)
I/O-begäran får inte innehålla en IRP_MJ_INTERNAL_DEVICE_CONTROL funktionskod.
I/O-begärandets buffertar får inte innehålla pekare till ytterligare information, eftersom användarlägesdrivrutinen inte kan dereferera pekarna.
Om I/O-begäran innehåller en I/O-kontrollkod som anger "ingen" buffertåtkomstmetod, måste drivrutinen i kernelläge skicka I/O-begäran i processkontexten för programmet som skapade I/O-begäran. Mer information om hur du stöder metoden "ingen av dem" i en UMDF-drivrutin finns i Hantera buffertåtkomstmetoder i UMDF-drivrutiner.
UMDF-drivrutinen kan ändra utdata för en I/O-begäran i användarläge. Därför måste drivrutinen i kernelläge verifiera alla utdata som den tar emot från drivrutinen i användarläge.
Klienten i kernelläge bör vanligtvis verifiera värdet Information som en UMDF-drivrutin skickar till WdfRequestCompleteWithInformation. Om klienten är en KMDF-drivrutin kan den anropa WdfRequestGetCompletionParams för att hämta den här informationen i en IO_STATUS_BLOCK-struktur.
Vanligtvis verifierar ramverket inte det informationsvärde som en UMDF-drivrutin skickar till WdfRequestCompleteWithInformation. (Den här parametern anger vanligtvis antalet överförda byte.) Ramverket validerar endast informationsvärdet för utdatabuffertar och endast för buffrad I/O- dataåtkomstmetod. (Ramverket verifierar till exempel att antalet överförda byte inte överskrider utdatabuffertens storlek för en läsåtgärd, om åtkomstmetoden är buffrad I/O.)