Freigeben über


WdfRequestWdmFormatUsingStackLocation-Funktion (wdfrequest.h)

[Gilt nur für KMDF]

Die WdfRequestWdmFormatUsingStackLocation-Methode formatiert eine E/A-Anforderung, indem der Inhalt einer angegebenen WDM-E/A-Stapelspeicherortstruktur an den nächsten Stapelspeicherort in der Anforderung kopiert wird.

Syntax

void WdfRequestWdmFormatUsingStackLocation(
  [in] WDFREQUEST         Request,
  [in] PIO_STACK_LOCATION Stack
);

Parameter

[in] Request

Ein Handle für ein Frameworkanforderungsobjekt.

[in] Stack

Ein Zeiger auf eine IO_STACK_LOCATION Struktur, die vom Treiber bereitgestellte Informationen enthält.

Rückgabewert

Keine

Bemerkungen

Eine Fehlerüberprüfung tritt auf, wenn der Treiber ein ungültiges Objekthandle bereitstellt.

Die WdfRequestWdmFormatUsingStackLocation-Methode kopiert die vom Stack-Parameter bereitgestellten Informationen in den nächsten IRP-Stapelspeicherort in der Anforderung.

WdfRequestWdmFormatUsingStackLocation formatiert die Anforderung unabhängig davon, ob das E/A-Zielobjekt der Anforderung lokal oder remote ist.

Wenn Sie eine Vervollständigungsroutine für die Anforderung festlegen möchten, muss Ihr Treiber WdfRequestSetCompletionRoutine aufrufen, nachdem WdfRequestWdmFormatUsingStackLocation aufgerufen wurde.

Weitere Informationen zu WdfRequestWdmFormatUsingStackLocation finden Sie unter Weiterleiten von E/A-Anforderungen.

Beispiele

Das folgende Codebeispiel stellt eine IO_STACK_LOCATION-Struktur für eine E/A-Anforderung bereit, legt eine CompletionRoutine-Rückruffunktion fest und sendet die Anforderung dann an ein E/A-Ziel.

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
                            );

Im folgenden Codebeispiel wird veranschaulicht, wie ein PnP-IRP_MN_QUERY_CAPABILITIES IRP an ein E/A-Ziel gesendet wird.

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);
}

Anforderungen

Anforderung Wert
Zielplattform Universell
KMDF-Mindestversion 1.0
Kopfzeile wdfrequest.h (include Wdf.h)
Bibliothek Wdf01000.sys (siehe Versionsverwaltung der Frameworkbibliothek).)
IRQL <=DISPATCH_LEVEL
DDI-Complianceregeln DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestFormattedValid(kmdf)

Weitere Informationen

WdfRequestSetCompletionRoutine