Função WdfRequestCreateFromIrp (wdfrequest.h)
[Aplica-se somente ao KMDF]
O método WdfRequestCreateFromIrp cria um objeto de solicitação de estrutura de um WDM IRP especificado.
Sintaxe
NTSTATUS WdfRequestCreateFromIrp(
[in, optional] PWDF_OBJECT_ATTRIBUTES RequestAttributes,
[in] PIRP Irp,
[in] BOOLEAN RequestFreesIrp,
[out] WDFREQUEST *Request
);
Parâmetros
[in, optional] RequestAttributes
Um ponteiro para uma estrutura de WDF_OBJECT_ATTRIBUTES alocada pelo chamador que especifica atributos de objeto para o objeto de solicitação. Esse parâmetro é opcional e pode ser WDF_NO_OBJECT_ATTRIBUTES.
[in] Irp
Um ponteiro para uma estrutura de IRP que contém um pacote de solicitação de E/S do WDM.
[in] RequestFreesIrp
Um valor booliano que, se verdadeiro, indica que a estrutura remove o IRP quando o identificador de solicitação é destruído. Se FALSE, o driver deverá chamar IoFreeIrp para remover o IRP, usando as etapas demonstradas pela seção Exemplos a seguir.
[out] Request
Um ponteiro para um local que recebe um identificador para um objeto de solicitação de estrutura.
Valor de retorno
WdfRequestCreateFromIrp retornará STATUS_SUCCESS se a operação for bem-sucedida. Para obter uma lista de valores retornados adicionais, consulte Erros de Criação de Objeto da Estrutura.
Esse método também pode retornar outros valores NTSTATUS .
Observações
Normalmente, os drivers baseados em estrutura chamam WdfRequestCreateFromIrp somente se receberem IRPs do WDM em uma rotina de expedição do WDM e encaminharem as solicitações para destinos de E/S da estrutura.
Se um driver chamar WdfRequestCreateFromIrp para criar um objeto de solicitação, ele não deverá chamar WdfRequestComplete para o objeto de solicitação. Em vez disso, o driver deve chamar WdfObjectDelete quando terminar de usar o objeto de solicitação.
Além disso, o driver não deve chamar WdfRequestRetrieveOutputMemory, WdfRequestRetrieveOutputBuffer, WdfRequestRetrieveInputBufferou WdfRequestRetrieveInputMemory com o novo objeto de solicitação.
Por padrão, o pai do novo objeto de solicitação é o objeto de driver da estrutura que o método WdfDriverCreate criou. Você pode usar o ParentObject membro da estrutura WDF_OBJECT_ATTRIBUTES para especificar um pai diferente. A estrutura exclui o objeto de solicitação quando exclui o objeto pai. Se o driver não alterar o pai padrão, o driver deverá excluir o objeto de solicitação quando terminar de usar o objeto; caso contrário, o objeto de solicitação permanecerá até que o gerente de E/S descarregue o driver.
Para obter mais informações sobre como criar objetos de solicitação de estrutura, consulte Criando objetos de solicitação da estrutura.
Os drivers baseados em estrutura não devem usar o Tail.Overlay.DriverContext membro da estrutura IRP, pois a estrutura usa esse membro.
Exemplos
exemplo 1
O exemplo de código a seguir cria um objeto de solicitação de estrutura de um WDM IRP especificado e o exclui. Este exemplo define o parâmetro RequestFreesIrp como TRUE, de modo que a estrutura remove o IRP quando o identificador de solicitação é destruído.
WDFREQUEST request;
PIRP irp;
//Creation
status = WdfRequestCreateFromIrp(
WDF_NO_OBJECT_ATTRIBUTES,
irp,
TRUE,
&request
);
...
//Deletion
WdfObjectDelete(request);
Exemplo 2
O exemplo de código a seguir também cria um objeto de solicitação de estrutura de um WDM IRP especificado e o exclui. Este exemplo define o parâmetro RequestFreesIrp como FALSE, portanto, o driver deve chamar IoFreeIrp para remover o IRP. Todas as chamadas de função no exemplo são necessárias.
WDF_REQUEST_REUSE_PARAMS params;
WDFREQUEST request;
PIRP irp;
//Creation
status = WdfRequestCreateFromIrp(
WDF_NO_OBJECT_ATTRIBUTES,
irp,
FALSE,
&request
);
...
//Deletion
WDF_REQUEST_REUSE_PARAMS_INIT(
¶ms,
WDF_REQUEST_REUSE_NO_FLAGS,
STATUS_SUCCESS
);
WDF_REQUEST_REUSE_PARAMS_SET_NEW_IRP(
¶ms,
NULL
);
status = WdfRequestReuse(
request,
¶ms
);
ASSERT(NT_SUCCESS(status));
IoFreeIrp(irp);
WdfObjectDelete(request);
Requisitos
Requisito | Valor |
---|---|
da Plataforma de Destino | Universal |
versão mínima do KMDF | 1.0 |
cabeçalho | wdfrequest.h (inclua Wdf.h) |
biblioteca | Wdf01000.sys (consulte o Controle de Versão da Biblioteca da Estrutura.) |
IRQL | <=DISPATCH_LEVEL |
regras de conformidade de DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |