Função WdfRequestRetrieveInputMemory (wdfrequest.h)
[Aplica-se a KMDF e UMDF]
O método WdfRequestRetrieveInputMemory recupera um identificador para um objeto de memória de estrutura que representa o buffer de entrada de uma solicitação de E/S.
Sintaxe
NTSTATUS WdfRequestRetrieveInputMemory(
[in] WDFREQUEST Request,
[out] WDFMEMORY *Memory
);
Parâmetros
[in] Request
Um identificador para um objeto de solicitação de estrutura.
[out] Memory
Um ponteiro para um local que recebe um identificador para um objeto de memória de estrutura.
Retornar valor
WdfRequestRetrieveInputMemory retornará STATUS_SUCCESS se a operação for bem-sucedida. Caso contrário, esse método pode retornar um dos seguintes valores:
Código de retorno | Descrição |
---|---|
|
Um parâmetro de entrada é inválido. |
|
O tipo de solicitação não é válido ou a solicitação não está usando E/S direta nem buffer. Para obter mais informações sobre métodos com suporte para acessar buffers de dados, consulte a seção Comentários a seguir. |
|
A solicitação já foi concluída. |
|
O comprimento do buffer de entrada é zero. |
|
Não há memória suficiente. |
Esse método também pode retornar outros valores NTSTATUS.
Um bug marcar ocorrerá se o driver fornecer um identificador de objeto inválido.
Comentários
O buffer de entrada de uma solicitação contém informações, como dados a serem gravados em um disco, que foram fornecidos pelo originador da solicitação. Seu driver pode chamar WdfRequestRetrieveInputMemory para obter o buffer de entrada para uma solicitação de gravação ou uma solicitação de controle de E/S do dispositivo, mas não para uma solicitação de leitura (porque as solicitações de leitura não fornecem dados de entrada).
O método WdfRequestRetrieveInputMemory recupera o buffer de entrada para solicitações de E/S que usam o método de E/S em buffer ou o método direto de E/S para acessar buffers de dados. Se o código de controle de E/S da solicitação for IRP_MJ_INTERNAL_DEVICE_CONTROL ou se a solicitação veio de outro driver de modo kernel, WdfRequestRetrieveInputMemory também oferecerá suporte a solicitações de E/S que não usam E /S não armazenadas em buffer nem diretas.
Se WdfRequestRetrieveInputMemory retornar STATUS_SUCCESS, o driver receberá um identificador para um objeto de memória de estrutura que representa o buffer de entrada. Para acessar o buffer, o driver deve chamar WdfMemoryGetBuffer.
O driver pode acessar o objeto de memória da estrutura recuperada até concluir a solicitação de E/S que o parâmetro Request representa.
Em vez de chamar WdfRequestRetrieveInputMemory, o driver pode chamar WdfRequestRetrieveInputBuffer, que recupera o endereço e o comprimento do buffer.
Para obter mais informações sobre WdfRequestRetrieveInputMemory, consulte Acessando buffers de dados em drivers de Framework-Based.
Exemplos
O exemplo de código a seguir mostra como uma função de retorno de chamada EvtIoWrite pode obter um identificador para o objeto de memória da estrutura que representa o buffer de entrada de uma solicitação de gravação. Em seguida, o exemplo formata e envia a solicitação de gravação para um destino de E/S USB.
VOID
MyEvtIoWrite(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t Length
)
{
NTSTATUS status;
WDFUSBPIPE pipe;
WDFMEMORY reqMemory;
PDEVICE_CONTEXT pDeviceContext;
//
// The driver previously stored a pipe handle in
// the device object's context space.
//
pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));
pipe = pDeviceContext->BulkWritePipe;
//
// Get input memory.
//
status = WdfRequestRetrieveInputMemory(
Request,
&reqMemory
);
if(!NT_SUCCESS(status)){
goto Exit;
}
//
// Format the request.
//
status = WdfUsbTargetPipeFormatRequestForWrite(
pipe,
Request,
reqMemory,
NULL
);
if (!NT_SUCCESS(status)) {
goto Exit;
}
WdfRequestSetCompletionRoutine(
Request,
EvtRequestWriteCompletionRoutine,
pipe
);
//
// Send the request.
//
if (WdfRequestSend(
Request,
WdfUsbTargetPipeGetIoTarget(pipe),
WDF_NO_SEND_OPTIONS
) == FALSE) {
status = WdfRequestGetStatus(Request);
goto Exit;
}
Exit:
//
// Complete the request now if an error occurred.
//
if (!NT_SUCCESS(status)) {
WdfRequestCompleteWithInformation(
Request,
status,
0
);
}
return;
}
Requisitos
Requisito | Valor |
---|---|
Plataforma de Destino | Universal |
Versão mínima do KMDF | 1.0 |
Versão mínima do UMDF | 2,0 |
Cabeçalho | wdfrequest.h (inclua Wdf.h) |
Biblioteca | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
Regras de conformidade da DDI | DriverCreate(kmdf), InputBufferAPI(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), MemAfterReqCompletedIntIoctl(kmdf), MemAfterReqCompletedIntIoctlA(kmdf), MemAfterReqCompletedIoctl(kmdf), MemAfterReqCompletedIoctlA(kmdf), MemAfterReqCompletedRead(kmdf), MemAfterReqCompletedWrite(kmdf) , MemAfterReqCompletedWriteA(kmdf) |