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异常。 如果地址范围的开头在 Alignment 指定的字节边界上不对齐, 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 符合性规则 HwStorPortProhibitedDDI (storport) IrqlExApcLte2 (wdm)

另请参阅

ProbeForWrite