Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
[Warnung: UMDF 2 ist die neueste Version von UMDF und ersetzt UMDF 1. Alle neuen UMDF-Treiber sollten mit UMDF 2 geschrieben werden. Es werden keine neuen Features zu UMDF 1 hinzugefügt, und es gibt eingeschränkte Unterstützung für UMDF 1 für neuere Versionen von Windows 10. Universelle Windows-Treiber müssen UMDF 2 verwenden. Weitere Informationen finden Sie unter Erste Schritte mit UMDF-.]
Die RetrieveNextRequest Methode ruft die nächste E/A-Anforderung aus einer E/A-Warteschlange ab.
Syntax
HRESULT RetrieveNextRequest(
[out] IWDFIoRequest **ppRequest
);
Parameter
[out] ppRequest
Ein Zeiger auf einen Puffer, der einen Zeiger auf die IWDFIoRequest Schnittstelle für das nächste Anforderungsobjekt empfängt oder NULL- empfängt, wenn die Warteschlange leer ist oder die nächste Anforderung nicht gefunden wird.
Rückgabewert
RetrieveNextRequest einen der folgenden Werte zurück:
| Rückgabecode | Beschreibung |
|---|---|
|
Die nächste E/A-Anforderung wurde erfolgreich aus der E/A-Warteschlange abgerufen. |
|
Die Warteschlange verteilt keine Anforderungen. Diese Situation tritt auf, wenn das Gerät einem Stromzustandsübergang unterzogen wird und alle Warteschlangen angehalten werden, Anforderungen zu verteilen oder wenn der Treiber explizit IWDFIoQueue::Stop aufgerufen wird, um die Verteileranforderungen zu beenden. Diese Situation kann auch auftreten, wenn der Treiber versucht, eine Anforderung aus einer manuellen Warteschlange zu entfernen, die stromverwaltet ist und heruntergefahren wird oder wenn die Warteschlange angehalten wird. |
|
In der Warteschlange waren keine Anforderungen vorhanden. |
|
Der Aufruf wurde ausgeführt, um die Anforderung aus einer parallelen Warteschlange abzurufen. |
RetrieveNextRequest- können auch andere HRESULT-Werte zurückgeben.
Bemerkungen
Wenn ein Treiber eine E/A-Warteschlange für die manuelle Versendung von E/A-Anforderungen konfiguriert, kann der Treiber die RetrieveNextRequest Methode aufrufen, um die nächste Anforderung aus der Warteschlange abzurufen. Weitere Informationen zum manuellen Verteilen von E/A-Anforderungen finden Sie unter Konfigurieren des Versandmodus für eine E/A-Warteschlange.
Wenn ein Treiber eine E/A-Warteschlange für die sequenzielle Verteilerung von E/A-Anforderungen konfiguriert, kann der Treiber weiterhin die RetrieveNextRequest-methode aufrufen, um die nächste Anforderung aus der Warteschlange abzurufen, ohne einen Fehler zu erhalten. Obwohl das Framework dem Treiber das Aufrufen RetrieveNextRequest- zum Abrufen einer Anforderung aus einer sequenziellen Warteschlange zulässt, sollte der Treiber nur RetrieveNextRequest- aufrufen, bevor der Treiber die aktuelle Anforderung abgeschlossen hat. Andernfalls kann eine Rennbedingung auftreten, wenn der Fahrer versucht, RetrieveNextRequest- aufzurufen, nachdem der Fahrer die aktuelle Anforderung abgeschlossen hat. Diese Racebedingung tritt zwischen der automatischen Verteilerung der nächsten Anforderung aus der sequenziellen Warteschlange und dem Aufruf des Fahrers an RetrieveNextRequest zum Abrufen der nächsten Anforderung auf.
Beispiele
Das folgende Codebeispiel, das aus dem umdf_fx2 Beispieltreiber stammt, ruft die Warteschlange für Anforderungen ab, solange Anforderungen abgerufen werden können. Der Code überprüft zuerst, ob Anforderungen einem bestimmten Dateiobjekt zugeordnet sind.
VOID
CMyDevice::ServiceSwitchChangeQueue(
__in SWITCH_STATE NewState,
__in HRESULT CompletionStatus,
__in_opt IWDFFile *SpecificFile
)
{
IWDFIoRequest *fxRequest;
HRESULT enumHr = S_OK;
do {
HRESULT hr;
//
// Get the next request.
//
if (NULL != SpecificFile) {
enumHr = m_SwitchChangeQueue->RetrieveNextRequestByFileObject(
SpecificFile,
&fxRequest
);
}
else {
enumHr = m_SwitchChangeQueue->RetrieveNextRequest(&fxRequest);
}
//
// If a request was retrieved, complete it.
//
if (S_OK == enumHr) {
if (S_OK == CompletionStatus) {
IWDFMemory *fxMemory;
//
// Copy the result to the request buffer.
//
fxRequest->GetOutputMemory(&fxMemory);
hr = fxMemory->CopyFromBuffer(0,
&NewState,
sizeof(SWITCH_STATE));
fxMemory->Release();
}
else {
hr = CompletionStatus;
}
//
// Complete the request with the copy or
// completion status.
//
if (S_OK == hr) {
fxRequest->CompleteWithInformation(hr,
sizeof(SWITCH_STATE));
}
else {
fxRequest->Complete(hr);
}
fxRequest->Release();
}
}
while (S_OK == enumHr);
}
Anforderungen
| Anforderung | Wert |
|---|---|
| Ende des Supports | In UMDF 2.0 und höher nicht verfügbar. |
| Zielplattform- | Desktop |
| Mindest-UMDF-Version | 1.5 |
| Header- | wudfddi.h (include Wudfddi.h) |
| DLL- | WUDFx.dll |