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 |
---|---|
|
A quantidade de memória disponível é baixa. |
|
O driver não criou nenhuma fila de E/S para o dispositivo e o driver não é um driver de filtro. |
|
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.
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(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
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) |