Compartilhar via


Função WdfDeviceEnqueueRequest (wdfdevice.h)

[Aplica-se somente ao KMDF]

O método WdfDeviceEnqueueRequest fornece uma solicitação de E/S especificada para a estrutura, para que a estrutura possa adicionar posteriormente a solicitação a uma das filas de E/S que o driver criou para o dispositivo especificado.

Sintaxe

NTSTATUS WdfDeviceEnqueueRequest(
  [in] WDFDEVICE  Device,
  [in] WDFREQUEST Request
);

Parâmetros

[in] Device

Um identificador para um objeto de dispositivo de estrutura.

[in] Request

Um identificador para um objeto de solicitação de estrutura.

Retornar valor

Se a operação for bem-sucedida, o método retornará STATUS_SUCCESS. Os valores de retorno adicionais incluem:

Código de retorno Descrição
STATUS_INSUFFICIENT_RESOURCES
A quantidade de memória disponível é baixa.
STATUS_INVALID_DEVICE_REQUEST
O driver não criou nenhuma fila de E/S para o dispositivo e o driver não é um driver de filtro.
STATUS_WDF_BUSY
A fila de E/S do dispositivo não está aceitando solicitações.
 

O método pode retornar outros valores NTSTATUS.

Um bug marcar ocorrerá se o driver fornecer um identificador de objeto inválido.

Comentários

Seu driver pode chamar WdfDeviceEnqueueRequest somente de uma função de retorno de chamada EvtIoInCallerContext .

O método WdfDeviceEnqueueRequest adiciona a solicitação à fila de E/S específica do tipo de solicitação do driver para o dispositivo, se o driver tiver criado um. Caso contrário, o método adicionará a solicitação à fila padrão do dispositivo, se o driver tiver criado uma.

Se o driver não tiver criado nenhuma fila de E/S para o dispositivo, WdfDeviceEnqueueRequest fará o seguinte:

  • Se o driver for um driver de filtro, WdfDeviceEnqueueRequest enviará a solicitação para o destino de E/S do driver.
  • Se o driver não for um driver de filtro, WdfDeviceEnqueueRequest retornará STATUS_INVALID_DEVICE_REQUEST.
Enquanto WdfDeviceEnqueueRequest está em execução, é possível que o driver receba e conclua ou cancele a solicitação.

Como resultado, se o driver precisar usar a solicitação ou seu contexto depois de chamar WdfDeviceEnqueueRequest, ele deverá fazer uma referência na solicitação antes de chamar WdfDeviceEnqueueRequest.

Para fazer isso, o driver pode chamar WdfObjectReference antes e, em seguida, WdfObjectDereference após a chamada para WdfDeviceEnqueueRequest. O driver deve desreferenciar a solicitação antes de sair de EvtIoInCallerContext.

Para obter mais informações sobre o método WdfDeviceEnqueueRequest , consulte Gerenciando filas de E/S.

Para as versões 1.0 e 1.5 do KMDF, WdfDeviceEnqueueRequest deve ser chamado em PASSIVE_LEVEL. Para as versões 1.7 e posteriores, WdfDeviceEnqueueRequest pode ser chamado em IRQL <= DISPATCH_LEVEL.

Exemplos

O exemplo de código a seguir é uma função de retorno de chamada EvtIoInCallerContext que procura solicitações que contêm o código de controle de E/S personalizado, IOCTL_NONPNP_METHOD_NEITHER. Se o código de controle de E/S não for encontrado, a função de retorno de chamada retornará apenas a solicitação para a estrutura. Se a função de retorno de chamada encontrar o código de controle de E/S, ela pré-processará a solicitação e a retornará para a estrutura. Se um erro for encontrado, a função de retorno de chamada concluirá a solicitação.

VOID
MyEvtDeviceIoInCallerContext(
    IN WDFDEVICE  Device,
    IN WDFREQUEST Request
    )
{
    NTSTATUS  status = STATUS_SUCCESS;
    WDF_REQUEST_PARAMETERS  params;

    WDF_REQUEST_PARAMETERS_INIT(&params);
    WdfRequestGetParameters(
                            Request,
                            &params
                            );
    if(!(params.Type == WdfRequestTypeDeviceControl &&
         params.Parameters.DeviceIoControl.IoControlCode == IOCTL_NONPNP_METHOD_NEITHER)) {
        status = WdfDeviceEnqueueRequest(
                                         Device,
                                         Request
                                         );
        if(!NT_SUCCESS(status)) {
            goto End;
        }
        return;
    }
    //
    // Found a match for the control code. Preprocess the request, and then
    // return the request to the framework.
    //

    //...(Preprocess the request here.)

    status = WdfDeviceEnqueueRequest(
                                     Device,
                                     Request
                                     );
    if(!NT_SUCCESS(status)) {
        goto End;
    }
    return;
End:
    WdfRequestComplete(
                       Request,
                       status
                       );
    return;
}

Requisitos

Requisito Valor
Plataforma de Destino Universal
Versão mínima do KMDF 1.0
Cabeçalho wdfdevice.h (inclua Wdf.h)
Biblioteca Wdf01000.sys (consulte Controle de versão da biblioteca de estrutura.)
IRQL <= DISPATCH_LEVEL (consulte a seção comentários)
Regras de conformidade da DDI DeferredRequestCompleted(kmdf), DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf)

Confira também

WDF_REQUEST_PARAMETERS_INIT

WdfRequestComplete

WdfRequestGetParameters