Condividi tramite


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. Nessuna nuova funzionalità viene aggiunta 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 informazioni, vedere 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 successiva richiesta di I/O è 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 esegue una transizione dello stato di alimentazione e tutte le code vengono arrestate dall'invio di richieste o se il driver chiama esplicitamente 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 e che è inattiva 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 Configurazione della modalità di invio per una coda di I/O.

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. Sebbene il framework consenta al driver di chiamare RetrieveNextRequest per recuperare una richiesta da una coda sequenziale, il driver deve chiamare solo RetrieveNextRequest prima che il driver completi la richiesta corrente. In caso contrario, se il driver tenta di chiamare RetrieveNextRequest dopo il completamento della richiesta corrente, potrebbe verificarsi una condizione di gara. Questa condizione di gara 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 prima 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

Requisito Valore
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