Routine ReleaseQueue del driver della classe di archiviazione
A meno che un driver della classe di archiviazione non esegua le richieste SrbFlags per una determinata richiesta con SRB_FLAGS_NO_QUEUE_FREEZE, il driver della porta di sistema blocca una coda per una determinata unità logica dopo una delle operazioni seguenti:
Si è verificato un ripristino del bus durante l'esecuzione di una richiesta da parte dell'unità logica.
L'unità logica restituita SCSISTAT_CHECK_CONDITION o SCSISTAT_COMMAND_TERMINATED, che il driver di classe può trovare nel membro ScsiStatus di SRB.
Timeout di una richiesta.
Una richiesta è stata terminata da un comando di messaggio del bus, ad esempio SCSIMESS_ABORT.
Il driver di porta indica che una coda specifica del lu è stata bloccata restituendo una richiesta con SRB_STATUS_QUEUE_FROZEN nel membro SrbStatus . È possibile inserire nuove richieste dal driver di classe nella coda, ma solo le richieste di autosense vengono inviate all'unità logica purché la coda sia bloccata.
Il blocco della coda in queste condizioni consente a ogni driver della classe di archiviazione di analizzare un errore prima dell'esecuzione di altri processi in coda. Ad esempio, i processi in coda potrebbero essere necessari per essere annullati se il supporto è stato modificato. Per scaricare la coda, il driver può inviare una richiesta con SrbFlags ORed con SRB_FLAGS_BYPASS_FROZEN_QUEUE.
Una routine ReleaseQueue alloca e configura un IRP e un SRB per rilasciare o scaricare una coda bloccata. Il membro Function di SRB deve essere impostato su SRB_FUNCTION_RELEASE_QUEUE o SRB_FUNCTION_FLUSH_QUEUE, che rilascia una coda bloccata e annulla tutte le richieste attualmente in coda per l'unità logica di destinazione. Il driver di porta completa tutte le richieste in una coda scaricata con i membri SrbStatus impostati su SRB_STATUS_REQUEST_FLUSHED.
Se non si rilascia una coda bloccata, il dispositivo non è accessibile, quindi la routine ReleaseQueue di un driver deve essere progettata per avere esito positivo anche in condizioni di memoria insufficiente. Una routine ReleaseQueue deve prima tentare di allocare memoria per un SRB chiamando ExAllocatePool con il tipo di memoria NonPagedPool e, se l'allocazione ha esito negativo, usare una SRB preallocata durante l'inizializzazione del driver. Se il driver alloca un SRB da conservare in riserva quando inizializza l'estensione del dispositivo, come descritto in Configurazione dell'estensione del dispositivo di un driver di classe di archiviazione, releaseQueue può usare tale SRB se il pool di memoria è basso, con un meccanismo di sincronizzazione appropriato nel caso in cui potrebbero essere necessarie più operazioni di rilascio simultanee.
Si noti che la routine ReleaseQueue di un driver di classe viene chiamata in modo asincrono, in genere dalla routine IoCompletion . La routine IoCompletion di un driver di classe non può chiamare ReleaseQueue per scaricare una coda non bloccata. Tuttavia, può chiamare ReleaseQueue per rilasciare una coda non bloccata e il driver della porta ignora semplicemente tale richiesta.