Compartilhar via


Método IWDFIoQueue::RetrieveNextRequest (wudfddi.h)

[Aviso: UMDF 2 é a versão mais recente do UMDF e substitui UMDF 1. Todos os novos drivers UMDF devem ser gravados usando UMDF 2. Nenhum novo recurso está sendo adicionado ao UMDF 1 e há suporte limitado para UMDF 1 em versões mais recentes do Windows 10. Drivers universais do Windows devem usar UMDF 2. Para obter mais informações, consulte Introdução com UMDF.]

O método RetrieveNextRequest recupera a próxima solicitação de E/S de uma fila de E/S.

Sintaxe

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

Parâmetros

[out] ppRequest

Um ponteiro para um buffer que recebe um ponteiro para a interface IWDFIoRequest para o próximo objeto de solicitação ou recebe NULL se a fila estiver vazia ou se a próxima solicitação não for encontrada.

Retornar valor

RetrieveNextRequest retorna um dos seguintes valores:

Código de retorno Descrição
S_OK
A próxima solicitação de E/S foi recuperada com êxito da fila de E/S.
HRESULT_FROM_NT (STATUS_WDF_PAUSED)
A fila não está expedindo solicitações. Essa situação ocorrerá se o dispositivo passar por uma transição de estado de energia e todas as filas forem impedidas de expedir solicitações ou se o driver chamar explicitamente IWDFIoQueue::Stop para parar de expedir solicitações. Essa situação também pode ocorrer se o driver tentar remover uma solicitação de uma fila manual que é gerenciada por energia e que está desativada ou se a fila está em pausa.
HRESULT_FROM_WIN32 (ERROR_NO_MORE_ITEMS)
Nenhuma solicitação estava na fila.
HRESULT_FROM_NT (STATUS_INVALID_DEVICE_STATE)
A chamada foi feita para recuperar a solicitação de uma fila paralela.
 

RetrieveNextRequest também pode retornar outros valores HRESULT.

Comentários

Se um driver configurar uma fila de E/S para expedição manual de solicitações de E/S, o driver poderá chamar o método RetrieveNextRequest para obter a próxima solicitação da fila. Para obter mais informações sobre como expedir manualmente solicitações de E/S, consulte Configurando o modo de expedição para uma fila de E/S.

Se um driver configurar uma fila de E/S para expedição sequencial de solicitações de E/S, o driver ainda poderá chamar o método RetrieveNextRequest para obter a próxima solicitação da fila sem receber um erro. Embora a estrutura permita que o driver chame RetrieveNextRequest para recuperar uma solicitação de uma fila sequencial, o driver só deve chamar RetrieveNextRequest antes que o driver conclua a solicitação atual. Caso contrário, se o piloto tentar chamar RetrieveNextRequest depois que o piloto concluir a solicitação atual, poderá ocorrer uma condição de corrida. Essa condição de corrida ocorre entre o envio automático da estrutura da próxima solicitação da fila sequencial e a chamada do driver para RetrieveNextRequest para recuperar a próxima solicitação.

Exemplos

O exemplo de código a seguir, que é do driver de exemplo umdf_fx2 , sonda a fila para solicitações desde que as solicitações possam ser recuperadas. O código primeiro verifica se as solicitações estão associadas a um objeto de arquivo específico.

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

Requisitos

Requisito Valor
Fim do suporte Indisponível no UMDF 2.0 e posterior.
Plataforma de Destino Área de Trabalho
Versão mínima do UMDF 1.5
Cabeçalho wudfddi.h (include Wudfddi.h)
DLL WUDFx.dll

Confira também

IWDFIoQueue

IWDFIoQueue::Stop

IWDFIoRequest