WdfRequestWdmFormatUsingStackLocation, fonction (wdfrequest.h)
[S’applique à KMDF uniquement]
La méthode WdfRequestWdmFormatUsingStackLocation met en forme une requête d’E/S en copiant le contenu d’une structure d’emplacement de pile d’E/ S WDM spécifiée vers l’emplacement de pile suivant dans la requête.
Syntaxe
void WdfRequestWdmFormatUsingStackLocation(
[in] WDFREQUEST Request,
[in] PIO_STACK_LOCATION Stack
);
Paramètres
[in] Request
Handle pour un objet de requête d’infrastructure.
[in] Stack
Pointeur vers une structure de IO_STACK_LOCATION qui contient des informations fournies par le pilote.
Valeur de retour
None
Remarques
Un bogue case activée se produit si le pilote fournit un handle d’objet non valide.
La méthode WdfRequestWdmFormatUsingStackLocation copie les informations fournies par le paramètre Stack dans l’emplacement de pile IRP suivant dans la requête.
WdfRequestWdmFormatUsingStackLocation met en forme la requête indépendamment du fait que l’objet cible d’E/S de la requête est local ou distant.
Si vous souhaitez définir une routine d’achèvement pour la demande, votre pilote doit appeler WdfRequestSetCompletionRoutine après avoir appelé WdfRequestWdmFormatUsingStackLocation.
Pour plus d’informations sur WdfRequestWdmFormatUsingStackLocation, consultez Transfert des demandes d’E/S.
Exemples
L’exemple de code suivant fournit une structure de IO_STACK_LOCATION pour une requête d’E/S, définit une fonction de rappel CompletionRoutine , puis envoie la demande à une cible d’E/S.
IO_STACK_LOCATION ioStackLocation;
BOOLEAN sendStatus;
...
//
// Initialize the IO_STACK_LOCATION structure here.
//
...
//
// Assign the IO_STACK_LOCATION structure to the request.
//
WdfRequestWdmFormatUsingStackLocation(
request,
&ioStackLocation
);
//
// Assign a CompletionRoutine callback function.
//
WdfRequestSetCompletionRoutine(
Request,
RequestTimeoutComplete,
NULL
);
//
// Send the request.
//
sendStatus = WdfRequestSend(
Request,
target,
NULL
);
L’exemple de code suivant montre comment envoyer un pnP IRP_MN_QUERY_CAPABILITIES IRP à une cible d’E/S.
target = WdfDeviceGetIoTarget(Device);
status = WdfRequestCreate(WDF_NO_OBJECT_ATTRIBUTES,
target,
&request);
if (!NT_SUCCESS(status)) {
// Log failure and leave
}
//
// PnP IRPs must be initialized with STATUS_NOT_SUPPORTED
//
WDF_REQUEST_REUSE_PARAMS_INIT(&reuse,
WDF_REQUEST_REUSE_NO_FLAGS,
STATUS_NOT_SUPPORTED);
WdfRequestReuse(request, &reuse);
//
// Initialize device capabilities
//
RtlZeroMemory(Capabilities, sizeof(DEVICE_CAPABILITIES));
Capabilities->Size = sizeof(DEVICE_CAPABILITIES);
Capabilities->Version = 1;
Capabilities->Address = (ULONG) -1;
Capabilities->UINumber = (ULONG) -1;
RtlZeroMemory(&stack, sizeof(stack));
stack.MajorFunction = IRP_MJ_PNP;
stack.MinorFunction = IRP_MN_QUERY_CAPABILITIES;
stack.Parameters.DeviceCapabilities.Capabilities = Capabilities;
WdfRequestWdmFormatUsingStackLocation(request, &stack);
WDF_REQUEST_SEND_OPTIONS_INIT(&options,
WDF_REQUEST_SEND_OPTION_SYNCHRONOUS);
if (WdfRequestSend(request, target, &options) == FALSE) {
// Log failure
}
status = WdfRequestGetStatus(request);
if (!NT_SUCCESS(status)) {
// Log failure
}
// Remember to delete the WDFREQUEST after creating it
if (request != NULL) {
WdfObjectDelete(request);
}
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Universal |
Version KMDF minimale | 1.0 |
En-tête | wdfrequest.h (inclure Wdf.h) |
Bibliothèque | Wdf01000.sys (consultez Gestion des versions de la bibliothèque d’infrastructure).) |
IRQL | <=DISPATCH_LEVEL |
Règles de conformité DDI | DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestFormattedValid(kmdf) |