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. 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 informazioni, vedi Introduzione a 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 di 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 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.

Osservazioni

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à dispatch per una coda di I/O.

Se un driver configura una coda di I/O per l'invio sequenziale di 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 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.

Esempi

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

Fabbisogno

Requisito Valore
Fine del supporto Non disponibile in UMDF 2.0 e versioni successive.
piattaforma di destinazione Desktop
versione minima di UMDF 1.5
intestazione wudfddi.h (include Wudfddi.h)
dll WUDFx.dll

Vedere anche

IWDFIoQueue

IWDFIoQueue::Stop

IWDFIoRequest