Compartilhar via


Função ProbeForRead (wdm.h)

A rotina ProbeForRead verifica se um buffer do modo de usuário realmente reside na parte do usuário do espaço de endereço e está alinhado corretamente.

Sintaxe

void ProbeForRead(
  [in] const volatile VOID *Address,
  [in] SIZE_T              Length,
  [in] ULONG               Alignment
);

Parâmetros

[in] Address

Especifica o início do buffer do modo de usuário.

[in] Length

Especifica o comprimento, em bytes, do buffer do modo de usuário.

[in] Alignment

Especifica o alinhamento necessário, em bytes, do início do buffer do modo de usuário.

Retornar valor

Nenhum

Comentários

Se o intervalo de memória especificado não estiver dentro do intervalo de endereços do modo de usuário, ProbeForRead gerará a exceção STATUS_ACCESS_VIOLATION. Se o início do intervalo de endereços não estiver alinhado no limite de bytes especificado por Alignment, ProbeForRead gerará a exceção STATUS_DATATYPE_MISALIGNMENT.

Os drivers no modo kernel devem usar ProbeForRead para validar o acesso de leitura aos buffers alocados no espaço do usuário. É mais comumente usado durante METHOD_NEITHER E/S para validar o buffer de usuário apontado por Irp –> UserBuffer.

Os drivers devem chamar ProbeForRead dentro de um bloco try/except . Se a rotina gerar uma exceção, o driver deverá concluir o IRP com o erro apropriado. Observe que os acessos subsequentes do driver ao buffer do modo de usuário também devem ser encapsulados em um bloco try/except : um aplicativo mal-intencionado pode ter outro thread excluindo, substituindo ou alterando a proteção de intervalos de endereços do usuário a qualquer momento (mesmo após ou durante uma chamada para ProbeForRead ou ProbeForWrite). Para obter mais informações, consulte Tratamento de exceções.

Não use essa rotina em endereços no modo kernel; ele gerará uma exceção.

Se os campos Irp-RequestorMode> = KernelMode, os campos Irp-AssociatedIrp.SystemBuffer> e Irp-UserBuffer> não contiverem endereços de modo de usuário e uma chamada para ProbeForRead para investigar um buffer apontado por ambos os campos gerará uma exceção.

Se Length = 0, ProbeForRead não faz nenhuma verificação do endereço. Nesse caso, a rotina não gera uma exceção para um endereço desalinhado ou está fora do intervalo de endereços de usuário válidos.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows 2000.
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
Regras de conformidade de DDI HwStorPortProhibitedDIs(storport), IrqlExApcLte2(wdm)

Confira também

ProbeForWrite