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