Rotinas de IoCompletion do Driver de Classe de Armazenamento
Um driver de classe de armazenamento deve ter uma ou mais rotinas de IoCompletion , a menos que o driver aguarde de forma síncrona a conclusão de cada IRP enviado ao driver de porta, tente novamente as solicitações conforme necessário e libere memória para SRBs de dentro de uma rotina dispatch ou BuildRequest . Observe que lidar com cada IRP de forma síncrona prejudicará o desempenho do driver de classe. Além disso, os drivers de classe de armazenamento para dispositivos que podem conter o arquivo de página do sistema devem lidar com todas as solicitações de transferência de forma assíncrona e, portanto, devem ter uma rotina IoCompletion para solicitações de leitura/gravação.
Conforme descrito em Rotina BuildRequest do Driver de Classe de Armazenamento, os drivers de classe de armazenamento são responsáveis por liberar a memória alocada para SRBs, seja de volta a uma lista lookaside ou ao pool nãopaged. Como qualquer outro driver de modo kernel de nível superior, eles também são responsáveis por liberar todos os IRPs alocados, como um IRP para dividir uma solicitação de transferência, conforme descrito em Rotina SplitTransferRequest do Driver de Classe de Armazenamento.
A rotina de IoCompletion de um driver de classe é, em última análise, responsável por garantir que o bloco de E/S status esteja definido e para concluir o IRP original. Observe que a conclusão de um IRP pode incluir a conversão de um erro retornado no membro ScsiStatus do SRB ou membro SenseInfoBuffer em um valor do tipo NTSTATUS e/ou registro em log de um erro, conforme descrito em Concluindo IRPs em Rotinas de Expedição.
Quando determinados tipos de erros ocorrem no processamento de uma solicitação, um driver de porta de armazenamento congela sua fila interna para a LU (unidade lógica de destino) e define SRB_STATUS_QUEUE_FROZEN após a conclusão da solicitação. Consequentemente, os drivers de classe geralmente têm rotinas internas para alterar o status da fila para suas solicitações de E/S do dispositivo. Para obter mais informações, consulte Rotina ReleaseQueue do Driver de Classe de Armazenamento.
Se a rotina BuildRequest do driver solicitou que o driver de porta retornasse informações de solicitação para uma solicitação, sua rotina IoCompletion chamará uma rotina interna do InterpretRequestSense ou implementará a mesma funcionalidade embutida. Para obter mais informações, consulte Rotina InterpretRequestSense do Driver de Classe de Armazenamento.
Os drivers de classe de armazenamento são responsáveis por repetir solicitações que falham devido a erros do controlador de destino, redefinições de barramento ou tempos limite de solicitação. Quando o driver de porta retorna uma solicitação específica com seu SrbStatus definido para indicar tal erro, o driver de classe pode chamar uma rotina RetryRequest de sua rotina IoCompletion ou, possivelmente, de sua rotina InterpretRequestSense . Para obter mais informações, consulte Rotina RetryRequest do Driver de Classe de Armazenamento.
Para obter informações gerais sobre rotinas IoCompletion , consulte Concluindo IRPs.