Metodo IWDFIoQueue::RetrieveNextRequest (wudfddi.h)

[Avviso: UMDF 2 è la versione più recente di UMDF e sostituisce UMDF 1. Tutti i nuovi driver UMDF devono essere scritti usando UMDF 2. Non vengono aggiunte nuove funzionalità a UMDF 1 ed è disponibile un supporto limitato per UMDF 1 nelle versioni più recenti di Windows 10. I driver di Windows universali devono usare UMDF 2. Per altre info, vedi Introduzione con UMDF.]

Il metodo RetrieveNextRequest recupera la richiesta di I/O successiva da una coda di I/O.

Sintassi

HRESULT RetrieveNextRequest(
  [out] IWDFIoRequest **ppRequest
);

Parametri

[out] ppRequest

Puntatore a un buffer che riceve un puntatore all'interfaccia IWDFIoRequest per l'oggetto richiesta successivo oppure riceve NULL se la coda è vuota o se la richiesta successiva non viene trovata.

Valore restituito

RetrieveNextRequest restituisce uno dei valori seguenti:

Codice restituito Descrizione
S_OK
La richiesta di I/O successiva è stata recuperata correttamente dalla coda di I/O.
HRESULT_FROM_NT (STATUS_WDF_PAUSED)
La coda non invia richieste. Questa situazione si verifica se il dispositivo subisce una transizione dello stato di alimentazione e tutte le code vengono arrestate dall'invio di richieste o se il driver ha chiamato in modo esplicito IWDFIoQueue::Stop per interrompere l'invio delle richieste. Questa situazione può verificarsi anche se il driver tenta di rimuovere una richiesta da una coda manuale gestita dall'alimentazione e che è spenta o se la coda viene sospesa.
HRESULT_FROM_WIN32 (ERROR_NO_MORE_ITEMS)
Nessuna richiesta nella coda.
HRESULT_FROM_NT (STATUS_INVALID_DEVICE_STATE)
La chiamata è stata effettuata per recuperare la richiesta da una coda parallela.
 

RetrieveNextRequest potrebbe restituire anche altri valori HRESULT.

Commenti

Se un driver configura una coda di I/O per l'invio manuale delle richieste di I/O, il driver può chiamare il metodo RetrieveNextRequest per ottenere la richiesta successiva dalla coda. Per altre informazioni sull'invio manuale delle richieste di I/O, vedere Configuring Dispatch Mode for an I/O Queue .For more information about manually dispatch requests, see Configuring Dispatch Mode for an I/O Queue.

Se un driver configura una coda di I/O per l'invio sequenziale delle richieste di I/O, il driver può comunque chiamare il metodo RetrieveNextRequest per ottenere la richiesta successiva dalla coda senza ricevere un errore. Anche se il framework consente al driver di chiamare RetrieveNextRequest per recuperare una richiesta da una coda sequenziale, il driver deve chiamare RetrieveNextRequest solo prima che il driver completi la richiesta corrente. In caso contrario, se il driver tenta di chiamare RetrieveNextRequest dopo che il driver completa la richiesta corrente, potrebbe verificarsi una race condition. Questa race condition si verifica tra l'invio automatico del framework della richiesta successiva dalla coda sequenziale e la chiamata del driver a RetrieveNextRequest per recuperare la richiesta successiva.

Esempio

Nell'esempio di codice seguente, che proviene dal driver di esempio umdf_fx2 , esegue il polling della coda per le richieste finché è possibile recuperare le richieste. Il codice verifica innanzitutto se le richieste sono associate a un oggetto file specifico.

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

Requisiti

   
Fine del supporto Non disponibile in UMDF 2.0 e versioni successive.
Piattaforma di destinazione Desktop
Versione UMDF minima 1.5
Intestazione wudfddi.h (include Wudfddi.h)
DLL WUDFx.dll

Vedi anche

IWDFIoQueue

IWDFIoQueue::Stop

IWDFIoRequest