Rotina RetryRequest do Driver de Classe de Armazenamento
O driver da porta de armazenamento subjacente é responsável por repetir solicitações se ocorrerem erros de dispositivo que envolvem a transmissão de dados no barramento, incluindo erros de paridade de barramento, tempos limite de seleção e erros de destino/controlador ocupado. Se as tentativas de repetição falharem, o driver da porta de armazenamento concluirá a solicitação com um erro apropriado e registrará o erro de E/S também.
Um driver de classe de armazenamento nunca deve tentar repetir uma solicitação de que o driver de porta já falhou devido a qualquer um dos erros anteriores.
Um driver de classe de armazenamento é responsável por repetir solicitações que falham devido a erros específicos do dispositivo, erros de destino/controlador diferentes de destino/controlador ocupado, redefinições de barramento ou tempos limite de solicitação. Em geral, uma rotina RetryRequest pode reenviar um IRP para o driver mais baixo e direcionar para que o SRB seja colocado na cabeça da fila específica de LU do driver de porta.
Em particular, uma rotina RetryRequest deve fazer o seguinte:
Verifique se uma solicitação de transferência parcial tem os valores corretos definidos para o endereço inicial e o comprimento.
Zero os membros SrbStatus e ScsiStatus do SRB.
Configure o membro SrbFlags , conforme necessário para o dispositivo.
Configure o local da pilha de E/S para o driver de porta no IRP, conforme já descrito em Rotinas de Expedição do Driver de Classe de Armazenamento por meio da Rotina SplitTransferRequest do Driver de Classe de Armazenamento.
Chame IoSetCompletionRoutine para o IRP, pois a rotina IoCompletion do driver deve liberar o SRB antes que o IRP retorne. A rotina IoCompletion também pode precisar repetir a solicitação mais de uma vez ou chamar a rotina InterpretRequestSense ou ReleaseQueue do driver.
Passe a solicitação para o driver mais baixo com IoCallDriver.