KeSetKernelStackSwapEnable 関数 (ntifs.h)

KeSetKernelStackSwapEnable ルーチンは、呼び出し元のスタックをディスクにスワップすることを有効または無効にします。

構文

BOOLEAN KeSetKernelStackSwapEnable(
  [in] BOOLEAN Enable
);

パラメーター

[in] Enable

呼び出し元スレッドに属するスタックのスワップを有効にするかどうかを指定します。 TRUE の場合、スワップが有効になり、スタックの内容をメモリ内またはメモリ外にページングできます。 FALSE の場合、スワップは無効になり、スタックはメモリ常駐になります。

戻り値

KeSetKernelStackSwapEnable は、呼び出しが開始された時点でスタック スワップが有効にされたかどうかを示す BOOLEAN 値を返します。 この値は、スタック スワップが以前に有効になっていた場合は TRUE 、無効になっている場合は FALSE です。

注釈

カーネル モード ドライバーは、このルーチンを呼び出して、スタックがページング可能であるか、メモリ内でロックされているかを制御できます。

スタック スワップは、スレッドがユーザー モード アプリケーションからの要求によって引き起こされた待機状態にある場合にのみ発生する可能性があります。 スタック スワップが有効になっているかどうかに関係なく、カーネル モード コンポーネントによって開始される待機状態に対してスタック スワップは発生しません。

通常、スタック スワップを無効にする必要はありません。 これはまれなケースでのみ行います。 スタック スワップを無効にする代替手段について説明する例については、以下の「例」セクションを参照してください。

KeWaitForSingleObject などのカーネル モード待機ルーチンの呼び出しでは、呼び出し元は WaitMode パラメーターを指定して、呼び出し元がカーネル モードまたはユーザー モードで待機するかどうかを示します。 WaitMode = UserMode の場合、および待機時間が十分に長い場合、メモリ マネージャーは待機中のスレッドに属するスタックのセクションをページングする可能性があります。 ただし、待機中にメモリ常駐状態を維持する必要があるデータ項目がスタックに含まれている場合、スレッドは KeSetKernelStackSwapEnable を呼び出し = ENABLE FALSE を指定することでスタックのページングを妨げる可能性があります。

スタック スワップが無効になっている間、またはシステム バグ チェックが発生する間、スレッドを終了 (終了) することはできません。

次のコード例では、ドライバー スレッドがスタックにイベントを割り当て、 KeSetKernelStackSwap を呼び出して、イベントが通知されるまでメモリ内のスタックを一時的にロックします。 ドライバーは、WaitReason of UserRequest を指定して KeWaitForSingleObject を呼び出して、そのスレッドがユーザー モード アプリケーションからの要求によって発生した待機状態であることを示し、WaitModeKernelMode に設定して、カーネル モードで待機が発生していることを示します。 待機が完了すると、スレッドは必要に応じて KeSetKernelStackSwap を再度呼び出して、スレッドの元のスタック スワップ状態を復元します。

KEVENT event;
BOOLEAN oldSwapEnable;
NTSTATUS status;

oldSwapEnable = KeSetKernelStackSwapEnable(FALSE);

KeInitializeEvent(&event, SynchronizationEvent, FALSE);

//
// TO DO: Insert code here to pass the event to another thread
// that will set the event to the signaled state.
//
...

status = KeWaitForSingleObject(&event, UserRequest, KernelMode, FALSE, NULL);

if (oldSwapEnable)
{
    KeSetKernelStackSwapEnable(TRUE);
}

イベント オブジェクトは、シグナル状態または非割り当て状態に設定できる間、またはスレッドがイベントを待機している間は、メモリ常駐である必要があります。 詳細については、「 イベント オブジェクトの定義と使用」を参照してください。

多くの場合、 KeSetKernelStackSwap ルーチンの使用は不要であり、スタックにページング可能なデータ項目のみを割り当てることで回避できます。 前の例では、イベント オブジェクトがスタックに割り当てられているため、ドライバー スレッドはスタックをロックする必要があります。 より良い代替手段は、単に非ページ プールからイベントを割り当てることです。

要件

要件
サポートされている最小のクライアント Windows 2000
対象プラットフォーム ユニバーサル
Header ntifs.h (Ntifs.h、Fltkernel.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <= APC_LEVEL

こちらもご覧ください

KeInitializeEvent

KeWaitForSingleObject