IsBadWritePtr 関数 (winbase.h)
呼び出し元プロセスが、指定されたメモリ範囲への書き込みアクセス権を持っていることを確認します。
構文
BOOL IsBadWritePtr(
[in] LPVOID lp,
[in] UINT_PTR ucb
);
パラメーター
[in] lp
メモリ ブロックの最初のバイトへのポインター。
[in] ucb
メモリ ブロックのサイズ (バイト単位)。 このパラメーターが 0 の場合、戻り値は 0 になります。
戻り値
呼び出し元プロセスが、指定されたメモリ範囲内のすべてのバイトに対する書き込みアクセス権を持つ場合、戻り値は 0 になります。
呼び出し元プロセスが、指定されたメモリ範囲内のすべてのバイトへの書き込みアクセス権を持たない場合、戻り値は 0 以外になります。
アプリケーションがデバッガーで実行され、プロセスが指定されたメモリ範囲内のすべてのバイトに対する書き込みアクセス権を持たない場合、関数は例外STATUS_ACCESS_VIOLATION最初の機会を引き起こします。 デバッガーは、この条件に対して中断するように構成できます。 デバッガーでプロセスの実行を再開した後、関数は通常どおりに続行され、0 以外の値を返します。この動作は設計上のものであり、デバッグ支援として機能します。
解説
この関数は通常、サード パーティのライブラリから返されるポインターを操作する場合に使用されます。この場合、サード パーティ DLL のメモリ管理動作を判断できません。
プロセス内のスレッドは、他のスレッドが必要とするメモリを解放しないように連携することが期待されます。 この関数を使用しても、これを行う必要はありません。 これを行わないと、アプリケーションが予期しない方法で失敗する可能性があります。
逆参照すると、無効なポインターが他のスレッドのスタック拡張を無効にする可能性があります。 スタックの拡張が無効になっているときにスタックを使い果たすスレッドは、ポップアップ エラー ウィンドウや診断情報なしで、親プロセスを直ちに終了します。
呼び出し元プロセスが、指定されたメモリ範囲内のバイトの一部 (すべてではない) への書き込みアクセス権を持つ場合、戻り値は 0 以外になります。
プリエンプティブ マルチタスク環境では、他のスレッドがテスト対象のメモリへのプロセスのアクセスを変更できます。 関数が、プロセスが指定されたメモリへの書き込みアクセス権を持っていることを示している場合でも、メモリへのアクセスを試みる場合は、構造化例外処理を使用する必要があります。 構造化例外処理を使用すると、システムはアクセス違反例外が発生した場合にプロセスに通知し、プロセスに例外を処理する機会を提供します。
IsBadWritePtr はマルチスレッド セーフではありません。 複数のスレッドによって共有されるポインターで適切に使用するには、チェック対象のメモリにアクセスできる 1 つのスレッドのみを許可するコードの重要な領域内で呼び出します。 クリティカル セクションやミューテックス、インターロックされた関数などのオペレーティング システム レベルのオブジェクトを使用して、コードのクリティカル領域を作成します。
要件
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | winbase.h (Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |