次の方法で共有


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 ルーチンのスタック使用と、このルーチンが行う可能性のある呼び出しに対応できる十分な大きさにする必要があります。 Size 値はMAXIMUM_EXPANSION_SIZEを超えてはなりません。

Wait

この領域がすぐに使用できない場合に、ルーチンが必要なスタック領域の割り当てを待機するかどうかを指定します。 展開されたスタックが割り当てられるまでルーチンが待機できる場合は、待機を TRUE に設定します。 それ以外の場合は、[待機] FALSEに設定します。 KeExpandKernelStackAndCalloutEx が IRQL = DISPATCH_LEVEL で呼び出される場合、このパラメーターは 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 ルーチンの呼び出しに対して、現在のスタックで最小の Size バイトを使用できるかどうかを判断します。 そうでない場合は、KeExpandKernelStackAndCalloutEx 、現在のスタックのサイズ バイト 拡張しようとします。 現在のスタックをこの量で拡張できない場合は、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 する必要があります。 待機 が TRUE 場合、呼び出しは IRQL <= APC_LEVELで行う必要があります。

必要条件

要件 価値
サポートされる最小クライアント Windows Vista 以降で使用できます。
ターゲット プラットフォーム 万国
ヘッダー ntddk.h
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 「解説」セクションを参照してください。

関連項目

ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread