Condividi tramite


Funzione KeRemoveQueue (ntifs.h)

La routine KeRemoveQueue fornisce al thread chiamante un puntatore a una voce dequeued dall'oggetto coda specificato o consente al chiamante di attendere, fino a un intervallo di timeout facoltativo, nell'oggetto queue.

Sintassi

PLIST_ENTRY KeRemoveQueue(
  [in, out]      PRKQUEUE        Queue,
  [in]           KPROCESSOR_MODE WaitMode,
  [in, optional] PLARGE_INTEGER  Timeout
);

Parametri

[in, out] Queue

Puntatore a un oggetto coda inizializzato per il quale il chiamante fornisce l'archiviazione residente nel pool non di paging.

[in] WaitMode

Modalità del processore in cui il chiamante è in attesa, che può essere KernelMode o UserMode. Se è possibile accedere a qualcosa nello stack in IRQL >= DISPATCH_LEVEL, il chiamante deve specificare KernelMode.

[in, optional] Timeout

Puntatore a una variabile che specifica il tempo assoluto o relativo, in unità di 100 nanosecondi, in corrispondenza del quale l'attesa scade. Se il valore di Timeout è negativo, l'ora di scadenza è relativa all'ora di sistema corrente; in caso contrario, è assoluto. I tempi di scadenza assoluti tengono traccia delle modifiche apportate al tempo di sistema; le ore di scadenza relative non sono interessate dalle modifiche apportate all'ora di sistema. Questo puntatore può essere NULL.

Valore restituito

KeRemoveQueue restituisce uno dei valori seguenti:

  • Puntatore a una voce dequeued dall'oggetto coda specificato, se disponibile.
  • STATUS_TIMEOUT, se l'intervallo di timeout specificato è scaduto prima della disponibilità di una voce
  • STATUS_USER_APC, se un APC in modalità utente è stato recapitato nel contesto del thread chiamante
  • STATUS_ABANDONED, se la coda è stata eseguita inattiva

Commenti

I chiamanti di KeRemoveQueue devono verificare se il valore restituito è STATUS_TIMEOUT o STATUS_USER_APC prima di accedere a qualsiasi membro della voce. Il test del valore restituito di KeRemoveQueue su NULL è un errore di programmazione.

Se si specifica un valore zero per Timeout, il chiamante non è disposto ad attendere una voce se la coda è attualmente vuota. Se si specifica unpuntatore ditimeout **NULL*, il chiamante è disposto ad attendere un tempo illimitato per una voce.

Se il parametro WaitMode è UserMode, lo stack del kernel può essere scambiato durante l'attesa. Di conseguenza, un chiamante non deve mai tentare di passare parametri nello stack quando si chiama KeRemoveQueue con WaitMode impostato su UserMode.

Se si specifica WaitMode come KernelMode in una chiamata a KeRemoveQueue , lo stack del kernel del thread chiamante non viene scambiato, oltre a impedire il recapito delle chiamate asincrone in modalità utente (APC). Non impedisce il recapito delle API in modalità kernel, ad esempio quelle usate da I/O Manager per completare i runtime di integrazione, quando un thread chiama KeRemoveQueue da IRQL PASSIVE_LEVEL. Il recapito di tale APC in modalità kernel non impedisce al thread chiamante di attendere l'oggetto coda né di essere inviato per l'esecuzione con una voce dopo l'esecuzione del kernel APC.

Per altre informazioni sull'uso delle code interne gestite dal driver, vedere Code gestite da driver.

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Intestazione ntifs.h (include Ntifs.h, FltKernel.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
Regole di conformità DDI HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

Vedi anche

KeInsertHeadQueue

KeInsertQueue