次の方法で共有


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 を使用して、ユーザー空間に割り当てられているバッファーへの読み取りアクセスを検証する必要があります。 これは、 Irp -> UserBuffer が指すユーザー バッファーを検証するために、METHOD_NEITHER I/O 中に最もよく使用されます。

ドライバーは、try/except ブロック内で ProbeForRead を呼び出す必要があります。 ルーチンで例外が発生した場合、ドライバーは適切なエラーで IRP を完了する必要があります。 ドライバーによるユーザー モード バッファーへの後続のアクセスは 、try/except ブロック内にもカプセル化する必要があることに注意してください。悪意のあるアプリケーションでは、( ProbeForRead または ProbeForWrite の呼び出しの後または呼び出し中でも) いつでも、ユーザー アドレス範囲の保護を削除、置換、または変更する別のスレッドが存在する可能性があります。 詳細については、「例外の 処理」を参照してください。

カーネル モード アドレスでは、このルーチンを使用しないでください。例外が発生します。

Irp-RequestorMode> = KernelMode の場合、Irp-AssociatedIrp.SystemBuffer> フィールドと Irp-UserBuffer> フィールドにはユーザー モード アドレスが含まれていません。また、ProbeForRead を呼び出して、どちらのフィールドが指すバッファーをプローブしても例外が発生します。

Length = 0 の場合、ProbeForRead はアドレスのチェックを行いません。 この場合、ルーチンは、位置がずれているアドレスまたは有効なユーザー アドレスの範囲外のアドレスに対して例外を発生させません。

要件

要件
サポートされている最小のクライアント Windows 2000 以降で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <= APC_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport), IrqlExApcLte2(wdm)

こちらもご覧ください

ProbeForWrite