Condividi tramite


Funzione KeExpandKernelStackAndCalloutEx (ntddk.h)

La routine KeExpandKernelStackAndCalloutEx chiama una routine e garantisce che per questa chiamata sia disponibile una quantità specificata di spazio dello stack.

Sintassi

NTSTATUS KeExpandKernelStackAndCalloutEx(
  PEXPAND_STACK_CALLOUT Callout,
  PVOID                 Parameter,
  SIZE_T                Size,
  BOOLEAN               Wait,
  PVOID                 Context
);

Parametri

Callout

Puntatore di funzione a una routine ExpandedStackCall . KeExpandKernelStackAndCalloutEx espande lo stack, se necessario, prima di chiamare questa routine.

Parameter

Specifica il valore del parametro da passare alla routine ExpandedStackCall .

Size

Specifica il numero di byte dello spazio dello stack da fornire per la chiamata alla routine ExpandedStackCall . Questo valore deve essere abbastanza grande per soddisfare l'utilizzo dello stack della routine ExpandedStackCall e di qualsiasi chiamata che questa routine potrebbe effettuare. Il valore Size non deve superare MAXIMUM_EXPANSION_SIZE.

Wait

Specifica se la routine deve attendere l'allocazione dello spazio dello stack richiesto se questo spazio non è immediatamente disponibile. Impostare Wait su TRUE se la routine può attendere l'allocazione di uno stack espanso. In caso contrario, impostare Wait su FALSE. Questo parametro deve essere FALSE se KeExpandKernelStackAndCalloutEx viene chiamato in IRQL = DISPATCH_LEVEL.

Context

Riservato. Impostare sempre questo parametro su NULL.

Valore restituito

KeExpandKernelStackAndCalloutEx restituisce STATUS_SUCCESS se la chiamata ha esito positivo. I valori restituiti possibili includono i codici di errore seguenti.

Codice restituito Descrizione
STATUS_INVALID_PARAMETER_3 Il parametro Size è maggiore di MAXIMUM_EXPANSION_SIZE.
STATUS_INVALID_PARAMETER_4 Il parametro Wait è TRUE, ma la routine è stata chiamata in IRQL = DISPATCH_LEVEL.
STATUS_NO_MEMORY Memoria insufficiente disponibile per espandere lo stack.
STATUS_STACK_OVERFLOW Lo stack, se espanso, supera i limiti interni del sistema operativo sullo spazio dello stack.

Commenti

Questa routine determina innanzitutto se è disponibile un minimo di byte di dimensioni nello stack corrente per la chiamata alla routine ExpandedStackCall . In caso contrario, KeExpandKernelStackAndCalloutEx tenta di espandere lo stack corrente in byte size . Se lo stack corrente non può essere espanso in base a questa quantità, KeExpandKernelStackAndCalloutEx alloca temporaneamente un nuovo segmento dello stack di kernel. Se è disponibile uno stack delle dimensioni necessarie, KeExpandKernelStackAndCalloutEx usa questo stack per chiamare la routine ExpandedStackCall .

Se KeExpandKernelStackAndCalloutEx non è in grado di ottenere lo spazio dello stack richiesto, restituisce senza chiamare la routine ExpandedStackCall . KeExpandKernelStackAndCalloutEx restituisce STATUS_SUCCESS solo se è in grado di chiamare la routine ExpandedStackCall . In caso contrario, restituisce un codice di errore.

KeExpandKernelStackAndCalloutEx non è dichiarato in un file di intestazione. Per usare questa routine nel driver, includere la dichiarazione di funzione seguente nel codice del driver:

#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

La routine KeExpandKernelStackAndCallout è simile a KeExpandKernelStackAndCalloutEx, ma non dispone di parametri Wait e Context. Inoltre, KeExpandKernelStackAndCallout deve essere sempre chiamato in IRQL <= APC_LEVEL, mentre KeExpandKernelStackAndCalloutEx può essere chiamato in DISPATCH_LEVEL (ma solo se Wait è FALSE).

Il thread chiamante non deve chiamare la routine PsTerminateSystemThread finché non viene restituita la routine ExpandedStackCall del thread. PsTerminateSystemThread verifica se la routine ExpandedStackCall è ancora attiva e, se è, causa un controllo di bug.

In Windows Vista e Windows Server 2008, KeExpandKernelStackAndCalloutEx deve essere chiamato in IRQL <= APC_LEVEL. In Windows 7, Windows Server 2008 R2 e versioni successive di Windows, questa routine può essere chiamata in IRQL <= DISPATCH_LEVEL. Tuttavia, il parametro Wait deve essere FALSE se la routine viene chiamata in DISPATCH_LEVEL. Se Wait è TRUE, la chiamata deve verificarsi in IRQL <= APC_LEVEL.

Requisiti

Requisito Valore
Client minimo supportato Disponibile a partire da Windows Vista.
Piattaforma di destinazione Universale
Intestazione ntddk.h
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Vedere La sezione Osservazioni.

Vedi anche

ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread