WdfRequestWdmFormatUsingStackLocation, fonction (wdfrequest.h)
[S’applique uniquement à KMDF]
La méthode WdfRequestWdmFormatUsingStackLocation met en forme une requête d’E/S en copiant le contenu d’un emplacement de pile d’E/S WDM spécifié structure à 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 vers un objet de requête de framework.
[in] Stack
Pointeur vers une structure IO_STACK_LOCATION qui contient des informations fournies par le pilote.
Valeur de retour
Aucun
Remarques
Une vérification de bogue 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 suivant de la pile IRP dans la requête.
WdfRequestWdmFormatUsingStackLocation met en forme la requête indépendamment de 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 requête, votre pilote doit appeler WdfRequestSetCompletionRoutine après avoir appelé WdfRequestWdmFormatUsingStackLocation.
Pour plus d’informations sur WdfRequestWdmFormatUsingStackLocation, consultez demandes d’E/S de transfert.
Exemples
L’exemple de code suivant fournit une structure IO_STACK_LOCATION pour une requête d’E/S, définit une CompletionRoutine fonction de rappel, puis envoie la requête à 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 IRP pnP IRP_MN_QUERY_CAPABILITIES à 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);
}
Exigences
Exigence | Valeur |
---|---|
plateforme cible | Universel |
version minimale de KMDF | 1.0 |
d’en-tête | wdfrequest.h (include Wdf.h) |
bibliothèque | Wdf01000.sys (voir Versioning de la bibliothèque Framework.) |
IRQL | <=DISPATCH_LEVEL |
règles de conformité DDI | DriverCreate(kmdf), invalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestFormattedValid(kmdf) |