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)

Voir aussi

WdfRequestSetCompletionRoutine