ProbeForWrite 関数 (wdm.h)
ProbeForWrite ルーチンは、ユーザー モード バッファーがアドレス空間のユーザー モード部分に実際に存在し、書き込み可能であり、正しくアラインされていることを確認します。
構文
void ProbeForWrite(
[in, out] volatile VOID *Address,
[in] SIZE_T Length,
[in] ULONG Alignment
);
パラメーター
[in, out] Address
ユーザー モード バッファーの先頭を指定します。
[in] Length
ユーザー モード バッファーの長さをバイト単位で指定します。
[in] Alignment
ユーザー モード バッファーの先頭に必要なアラインメントをバイト単位で指定します。
戻り値
なし
解説
指定されたメモリ範囲が有効なユーザー モード アドレス範囲ではない場合、または書き込み可能でない場合 (アクセス権、読み取り専用など)、 ProbeForWrite はSTATUS_ACCESS_VIOLATION例外を発生させます。 アドレス範囲の先頭が Alignment で指定されたバイト境界にアラインされていない場合、 ProbeForWrite はSTATUS_DATATYPE_MISALIGNMENT例外を発生させます。
カーネル モード ドライバーでは、 ProbeForWrite を使用して、ユーザー空間に割り当てられたバッファーへの書き込みアクセスを検証する必要があります。 最も一般的には、 Irp >UserBuffer によって指されるユーザー バッファーを検証するために、METHOD_NEITHER I/O 中に使用されます。
ドライバーは、try/except ブロック内で ProbeForWrite を呼び出す必要があります。 ルーチンで例外が発生した場合、ドライバーは適切なエラーで IRP を完了する必要があります。 ドライバーによるユーザー モード バッファーへの後続のアクセスは 、try/except ブロック内にもカプセル化する必要があることに注意してください。悪意のあるアプリケーションは、( ProbeForRead または ProbeForWrite の呼び出しの後、または呼び出し中であっても) いつでもユーザー アドレス範囲の保護を削除、置換、または変更する別のスレッドを持つ可能性があります。 詳細については、「例外の 処理」を参照してください。
カーネル モード アドレスでは、このルーチンを使用しないでください。例外が発生します。
Irp->RequestorModeKernelMode = の場合、Irp->AssociatedIrp.SystemBuffer フィールドと Irp->UserBuffer フィールドにはユーザー モード アドレスが含まれていません。また、ProbeForWrite を呼び出していずれかのフィールドが指すバッファーをプローブすると、例外が発生します。
Length = 0 の場合、ProbeForWrite はアドレスのチェックを行いません。 この場合、ルーチンは、位置がずれているか、有効なユーザー アドレスの範囲外のアドレスに対して例外を発生させません。
要件
| サポートされている最小のクライアント | 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) |
関連項目
フィードバック
フィードバックの送信と表示