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 块中:恶意应用程序可能随时有另一个线程删除、替换或更改用户地址范围的保护, (即使在调用 ProbeForRead 或 ProbeForWrite) 之后或期间也是如此。 有关详细信息,请参阅 处理异常。
请勿在内核模式地址上使用此例程;它将引发异常。
如果 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) |