ProbeForRead 函数 (wdm.h)

ProbeForRead 例程检查用户模式缓冲区是否实际驻留在地址空间的用户部分中,并且正确对齐。

语法

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

参数

[in] Address

指定用户模式缓冲区的开头。

[in] Length

指定用户模式缓冲区的长度(以字节为单位)。

[in] Alignment

指定用户模式缓冲区开头的所需对齐方式(以字节为单位)。

返回值

备注

如果指定的内存范围不在用户模式地址范围内, ProbeForRead 将引发STATUS_ACCESS_VIOLATION异常。 如果地址范围的开头未在 对齐方式指定的字节边界上对齐, ProbeForRead 将引发STATUS_DATATYPE_MISALIGNMENT异常。

内核模式驱动程序必须使用 ProbeForRead 来验证对在用户空间中分配的缓冲区的读取访问权限。 它最常用于在 METHOD_NEITHER I/O 期间验证 Irp -> UserBuffer 指向的用户缓冲区。

驱动程序必须在 try/except 块内调用 ProbeForRead。 如果例程引发异常,驱动程序应以适当的错误完成 IRP。 请注意,驱动程序对用户模式缓冲区的后续访问也必须封装在 try/except 块中:恶意应用程序可能具有另一个线程删除、替换或更改用户地址范围的保护 (,即使在调用 ProbeForReadProbeForWrite) 之后或调用期间也是如此。 有关详细信息,请参阅 处理异常

请勿在内核模式地址上使用此例程;它将引发异常。

如果 Irp-RequestorMode> KernelMode = ,则 Irp-AssociatedIrp.SystemBuffer>Irp-UserBuffer> 字段不包含用户模式地址,并且调用 ProbeForRead 来探测任一字段指向的缓冲区将引发异常。

如果 Length = 0, ProbeForRead 不会检查地址。 在这种情况下,例程不会引发错误或超出有效用户地址范围的地址的异常。

要求

   
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDIs (storport) IrqlExApcLte2 (wdm)

请参阅

ProbeForWrite