KeExpandKernelStackAndCalloutEx 関数 (ntddk.h)
KeExpandKernelStackAndCalloutEx ルーチンはルーチンを呼び出し、この呼び出しで指定された量のスタック領域が使用可能であることを保証します。
構文
NTSTATUS KeExpandKernelStackAndCalloutEx(
PEXPAND_STACK_CALLOUT Callout,
PVOID Parameter,
SIZE_T Size,
BOOLEAN Wait,
PVOID Context
);
パラメーター
Callout
ExpandedStackCall ルーチンへの関数ポインター。 KeExpandKernelStackAndCalloutEx は、必要に応じて、このルーチンを呼び出す前にスタックを拡張します。
Parameter
ExpandedStackCall ルーチンに渡すパラメーター値を指定します。
Size
ExpandedStackCall ルーチンの呼び出しに使用するスタック領域のバイト数を指定します。 この値は、 ExpandedStackCall ルーチンのスタック使用量と、このルーチンが行う可能性のある呼び出しに対応するのに十分な大きさである必要があります。 [サイズ] の値はMAXIMUM_EXPANSION_SIZEを超えることはできません。
Wait
この領域がすぐに使用できない場合に、ルーチンが必要なスタック領域の割り当てを待機するかどうかを指定します。 展開されたスタックが割り当てられるまでルーチンが待機できる場合は、Wait を TRUE に設定します。 それ以外の場合は、Wait を FALSE に設定 します。 IRQL = DISPATCH_LEVEL で KeExpandKernelStackAndCalloutEx が呼び出される場合、このパラメーターは FALSE である必要があります。
Context
予約済み。 このパラメーターは常に NULL に設定してください。
戻り値
呼び出しが成功した場合、KeExpandKernelStackAndCalloutEx はSTATUS_SUCCESSを返します。 可能な戻り値には、次のエラー コードが含まれます。
リターン コード | 説明 |
---|---|
STATUS_INVALID_PARAMETER_3 | Size パラメーターがMAXIMUM_EXPANSION_SIZEより大きい。 |
STATUS_INVALID_PARAMETER_4 | Wait パラメーターは TRUE ですが、ルーチンは IRQL = DISPATCH_LEVEL で呼び出されました。 |
STATUS_NO_MEMORY | スタックを拡張するのに十分なメモリがありません。 |
STATUS_STACK_OVERFLOW | スタックが拡張された場合、スタック領域のオペレーティング システムの内部制限を超える可能性があります。 |
注釈
このルーチンは、まず、ExpandedStackCall ルーチンの呼び出しに対して、現在のスタックで最小サイズ バイトを使用できるかどうかを判断します。 そうでない場合、 KeExpandKernelStackAndCalloutEx は 現在のスタックを Size バイト単位で拡張しようとします。 現在のスタックをこの量だけ拡張できない場合、 KeExpandKernelStackAndCalloutEx は 新しいカーネル スタック セグメントを一時的に割り当てます。 必要なサイズのスタックが使用可能な場合、 KeExpandKernelStackAndCalloutEx はこのスタックを使用して ExpandedStackCall ルーチンを呼び出します。
KeExpandKernelStackAndCalloutEx が必要なスタック領域を取得できない場合は、ExpandedStackCall ルーチンを呼び出さずに を返します。 KeExpandKernelStackAndCalloutEx は、 ExpandedStackCall ルーチンを呼び出すことができる場合にのみ、STATUS_SUCCESSを返します。 それ以外の場合は、エラー コードを返します。
KeExpandKernelStackAndCalloutEx はヘッダー ファイルで宣言されていません。 ドライバーでこのルーチンを使用するには、ドライバー コードに次の関数宣言を含めます。
#if (NTDDI_VERSION >= NTDDI_VISTA)
__checkReturn
__drv_minIRQL(PASSIVE_LEVEL)
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_reportError("DISPATCH_LEVEL is only supported on Windows 7 or later versions of Windows.")
NTKERNELAPI
NTSTATUS
KeExpandKernelStackAndCalloutEx (
__in PEXPAND_STACK_CALLOUT Callout,
__in_opt PVOID Parameter,
__in SIZE_T Size,
__in BOOLEAN Wait,
__in_opt PVOID Context
);
#endif
KeExpandKernelStackAndCallout ルーチンは KeExpandKernelStackAndCalloutEx に似ていますが、Wait パラメーターと Context パラメーターはありません。 さらに、 KeExpandKernelStackAndCallout は常に IRQL <= APC_LEVELで呼び出す必要がありますが、 KeExpandKernelStackAndCalloutEx はDISPATCH_LEVELで呼び出すことができます ( ただし、Wait が FALSE の場合のみ)。
呼び出し元のスレッドは、スレッドの ExpandedStackCall ルーチンが戻るまで PsTerminateSystemThread ルーチンを呼び出してはなりません。 PsTerminateSystemThread は、ExpandedStackCall ルーチンがまだアクティブであるかどうかを確認し、アクティブな場合はバグ チェックを引き起こします。
Windows Vista および Windows Server 2008 では、 KEExpandKernelStackAndCalloutEx を IRQL <= APC_LEVELで呼び出す必要があります。 Windows 7、Windows Server 2008 R2、およびそれ以降のバージョンの Windows では、このルーチンは IRQL <= DISPATCH_LEVELで呼び出すことができます。 ただし、ルーチンがDISPATCH_LEVELで呼び出される場合は、 Wait パラメーターは FALSE である必要があります。 Wait が TRUE の場合、呼び出しは IRQL <= APC_LEVELで行う必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista 以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | ntddk.h |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | 「解説」を参照してください。 |
こちらもご覧ください
ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread