Condividi tramite


Funzione FsRtlPacchettibleWaitForMultipleObjects (ntifs.h)

La routine FsRtlCancellableWaitForMultipleObjects esegue un'operazione di attesa annullabile (un'attesa che può essere terminata) su uno o più oggetti dispatcher.

Sintassi

NTSTATUS FsRtlCancellableWaitForMultipleObjects(
  [in]           ULONG          Count,
  [in]           PVOID []       ObjectArray,
  [in]           WAIT_TYPE      WaitType,
  [in, optional] PLARGE_INTEGER Timeout,
  [in, optional] PKWAIT_BLOCK   WaitBlockArray,
  [in, optional] PIRP           Irp
);

Parametri

[in] Count

Numero di oggetti da attendere.

[in] ObjectArray

Puntatore a una matrice di puntatori a oggetti dispatcher (eventi, mutex, semafori, thread e timer) per cui il chiamante fornisce l'archiviazione.

[in] WaitType

Entrambi WaitAll, che indica che tutti gli oggetti specificati devono ottenere uno stato segnalato prima che l'attesa venga soddisfatta; o WaitAny, che indica che uno degli oggetti deve ottenere uno stato segnalato prima che l'attesa venga soddisfatta.

[in, optional] Timeout

Puntatore a un valore di timeout facoltativo. Questo parametro specifica il tempo assoluto o relativo, in unità di 100 nanosecondi, in cui l'attesa deve essere completata.

Se timeout punta a un valore zero (ovvero *Timeout == 0), la routine restituisce senza attendere. Se il chiamante fornisce un puntatore NULL ,ovvero Timeout == NULL), la routine attende indefinito fino a quando uno o tutti gli oggetti dispatcher vengono impostati sullo stato segnalato.

Un valore positivo specifica un'ora assoluta, rispetto al 1° gennaio 1601. Un valore negativo specifica un intervallo relativo all'ora corrente. I tempi di scadenza assoluti tengono traccia delle modifiche apportate all'ora di sistema; le ore di scadenza relative non sono interessate dalle modifiche all'ora di sistema.

Se viene specificato timeout, l'attesa verrà soddisfatta automaticamente se nessuna delle condizioni di attesa specificate viene soddisfatta alla scadenza dell'intervallo specificato.

Un valore di timeout pari a zero (ovvero *Timeout == 0) consente di testare un set di condizioni di attesa e di eseguire in modo condizionale eventuali azioni aggiuntive se l'attesa può essere soddisfatta immediatamente, come nell'acquisizione di un mutex.

[in, optional] WaitBlockArray

Se Count<= THREAD_WAIT_OBJECTS, WaitBlockArray può essere NULL. In caso contrario, questo parametro deve puntare a un buffer di memoria di sizeof(KWAIT_BLOCK * Count) byte. La routine usa questo buffer per mantenere i record durante l'esecuzione dell'operazione di attesa.

[in, optional] Irp

Puntatore all'IRP originale che corrisponde all'operazione di I/O rilasciata dall'utente e che può essere annullata dall'utente. Il chiamante deve assicurarsi che l'IRP rimanga valido per la durata di questa routine e che l'IRP non debba avere un set di routine di annullamento( ad esempio, IoSetCancelRoutine non deve essere stato chiamato su IRP). Si noti che l'IRP deve essere mantenuto dal chiamante, non può essere passato a un driver di livello inferiore.

Valore restituito

FsRtlPacchettibleWaitForMultipleObjects può restituire uno dei valori seguenti:

Codice restituito Descrizione
STATUS_SUCCESS Il chiamante specificato WaitAll per il parametro WaitType e tutti gli oggetti dispatcher nella matrice ObjectArray sono stati impostati sullo stato segnalato.
STATUS_TIMEOUT Si è verificato un timeout prima che sia stato soddisfatto il set specificato di condizioni di attesa. Questo valore può essere restituito quando non è possibile soddisfare immediatamente il set specificato di condizioni di attesa e timeout è impostato su zero.
STATUS_WAIT_0 tramite STATUS_WAIT_63 Il chiamante specificato WaitAny per WaitType e uno degli oggetti dispatcher nella matrice ObjectArray è stato impostato sullo stato segnalato. I sei bit inferiori del valore restituito codificano l'indice in base zero dell'oggetto che ha soddisfatto l'attesa.
STATUS_ABANDONED_WAIT_0 tramite STATUS_ABANDONED_WAIT_63 Il chiamante ha tentato di attendere un mutex abbandonato. I sei bit inferiori del valore restituito codificano l'indice in base zero del mutex nella matrice ObjectArray.
STATUS_CANCELLED L'attesa è stata interrotta da una richiesta di annullamento in sospeso nell'IRP specificato. Si noti che questo valore viene restituito solo se un IRP valido viene passato a FsRtlPacchettibleWaitForMultipleObjects e l'IRP è stato annullato da CancelSynchronousIo.
STATUS_THREAD_IS_TERMINATING L'attesa è stata interrotta perché il thread è stato terminato da un'applicazione o dall'utente.

Il valore restituito indica solo lo stato dell'attesa. Se applicabile, lo stato effettivo della richiesta di I/O deve essere ottenuto direttamente da un altro IRP generato nel processo di gestione dell'IRP in modalità utente originale.

Si noti che la macro NT_SUCCESS restituisce FALSE ("errore") per i valori di stato STATUS_CANCELLED e STATUS_THREAD_IS_TERMINATING e TRUE ("operazione riuscita") per tutti gli altri valori di stato.

Osservazioni

La routine FsRtlPacchettibleWaitForMultipleObjects esegue un'operazione di attesa annullabile sugli oggetti dispatcher. Se il thread viene terminato dall'utente o dall'applicazione o se CancelSynchronousIo pubblica una richiesta di annullamento in un IRP (IRP sincrono) threaded associato al thread, l'attesa viene annullata.

La routine fsRtlPacchettibleWaitForMultipleObjects è stata progettata per supportare le linee guida per il completamento/annullamento di I/O a partire da Windows Vista. L'obiettivo di queste linee guida è consentire agli utenti (o alle applicazioni) di terminare rapidamente le applicazioni. A sua volta, richiede che le applicazioni abbiano la possibilità di terminare rapidamente i thread che eseguono operazioni di I/O e qualsiasi operazione di I/O corrente. Questa routine consente ai thread utente di bloccare (ovvero attendere) nel kernel per il completamento di I/O, oggetti dispatcher o variabili di sincronizzazione in modo da consentire l'annullamento dell'attesa. Questa routine consente inoltre di terminare l'attesa del thread se il thread viene terminato da un utente o da un'applicazione.

Ad esempio, un redirector potrebbe dover creare uno o più runtime di integrazione secondari per elaborare un IRP in modalità utente e attendere in modo sincrono il completamento dei runtime di integrazione secondari.For example, a redirector may need to create one or more secondary IRPs to process a user-mode IRP and synchronously wait for the secondary IRPs to complete. Un modo per eseguire questa operazione consiste nel configurare un evento che verrà segnalato dalla routine di completamento dell'IRP secondario e quindi attendere che l'evento venga segnalato. Quindi, per eseguire un'operazione di attesa annullabile, FsRtlPacchettibleWaitForMultipleObjects viene chiamato passando l'evento associato all'IRP secondario, nonché l'IRP in modalità utente originale. L'attesa del thread per la segnalazione dell'evento viene annullata se si verifica un evento di terminazione in sospeso o se l'IRP in modalità utente originale viene annullato.

Si noti che l'interruzione dell'attesa non annulla automaticamente qualsiasi operazione di I/O rilasciata dal chiamante, che deve essere gestita separatamente dal chiamante.

Ogni oggetto thread ha una matrice predefinita di blocchi di attesa che possono essere usati per attendere diversi oggetti contemporaneamente. Quando possibile, la matrice predefinita di blocchi di attesa deve essere usata in un'operazione di attesa multipla perché non è necessario allocare e deallocare in un secondo momento l'archiviazione dei blocchi di attesa aggiuntiva. Tuttavia, se il numero di oggetti da attendere contemporaneamente è maggiore del numero di blocchi di attesa predefiniti, utilizzare il parametro WaitBlockArray per specificare un set alternativo di blocchi di attesa da utilizzare nell'operazione di attesa. I driver devono allocare solo un buffer di memoria sufficientemente grande per WaitBlockArray. Il buffer non deve essere inizializzato e i driver possono considerarlo come una struttura opaca. Il buffer può essere liberato una volta restituita la routine.

Se Count è maggiore di MAXIMUM_WAIT_OBJECTS o se WaitBlockArray è NULL e Count è maggiore di THREAD_WAIT_OBJECTS, il sistema genera controllo bug 0xC: MAXIMUM_WAIT_OBJECTS_EXCEEDED.

Una considerazione speciale si applica quando il parametro ObjectArray passato a FsRtl GestiscibleWaitForMultipleObjects è un mutex. Se l'oggetto dispatcher in attesa è un mutex, il recapito APC è uguale a quello di tutti gli altri oggetti dispatcher durante l'attesa. Tuttavia, una volta FsRtlPacchettibleWaitForMultipleObjects restituisce con STATUS_SUCCESS e il thread contiene effettivamente il mutex, vengono recapitati solo API speciali in modalità kernel. Il recapito di tutte le altre API, sia in modalità kernel che in modalità utente, è disabilitato. Questa restrizione per il recapito delle API persiste fino al rilascio del mutex.

Un mutex può essere acquisito in modo ricorsivo solo volte MINLONG. Se questo limite viene superato, la routine genera un'eccezione STATUS_MUTANT_LIMIT_EXCEEDED.

è necessario chiamare FsRtlCancellableWaitForMultipleObjects in IRQL PASSIVE_LEVEL se il parametro facoltativo Irp punta a un IRP valido. Se il parametro Irp non viene usato, la routine può essere chiamata in IRQL minore o uguale a APC_LEVEL. Le API del kernel normali possono essere disabilitate dal chiamante, se necessario, chiamando le routine KeEnterCriticalRegion o FsRtlEnterFileSystem. Tuttavia, le API del kernel speciali non devono essere disabilitate.

FsRtlPacchettibleWaitForMultipleObjects asserirà nelle build di debug se IRQL è maggiore o uguale a APC_LEVEL e il parametro Irp punta a un IRP valido.

Fabbisogno

Requisito Valore
client minimo supportato Windows Vista
piattaforma di destinazione Universale
intestazione ntifs.h (include Ntifs.h)
libreria NtosKrnl.lib
dll NtosKrnl.exe
IRQL Vedere la sezione Osservazioni.
regole di conformità DDI HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport)

Vedere anche

ExInitializeFastMutex

FsRtlCancellableWaitForSingleObject

KeInitializeEvent

KeInitializeMutex

KeInitializeSemaphore

KeInitializeTimer

KeWaitForMultipleObjects

KeWaitForSingleObject

KeWaitForMutexObject