KeSetKernelStackSwapEnable 関数 (ntifs.h)

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

構文

BOOLEAN KeSetKernelStackSwapEnable(
  [in] BOOLEAN Enable
);

パラメーター

[in] Enable

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

戻り値

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

注釈

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

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

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

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