Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Como todos os drivers de modo kernel de nível superior, um driver de classe de armazenamento deve configurar o local da pilha de E/S do IRP para o próximo driver inferior ao lidar com solicitações para periféricos de armazenamento. Em IRPs que o driver de classe configura com SRBs para o driver de porta fornecido pelo sistema, a localização da pilha de E/S do driver de porta é definida com o seguinte:
MajorFunction contém IRP_MJ_SCSI
Parameters.Scsi.Srb contém um ponteiro para o SRB
Cada driver de classe é responsável por alocar memória para os SRBs e configurá-los com CDBs para o driver de porta de armazenamento subjacente. O driver de classe pode configurar uma lista lookaside para seus SRBs com ExInitializeNPageLookasideList ou chamar ExAllocatePool para memória não paginada. Consulte Usando listas de lookaside para obter mais informações sobre como usar listas de lookaside e pool não paginado.
Seja a memória alocada do pool ou de uma lista lookaside criada por um driver, cada driver de classe de armazenamento é responsável por libertar a memória que aloca para os SRBs. As rotinas IoCompletion dos drivers de classe de armazenamento, descritas em Rotinas IoCompletion do driver de classe de armazenamento, geralmente libertam a memória alocada para SRBs de volta para uma lista de lookaside.
A rotina BuildRequest de um driver de classe deve definir valores apropriados nos membros do CUR, incluindo o comprimento do CDB configurado para se comunicar com seu dispositivo. Para solicitações que retornam informações de deteção de solicitação e/ou que o driver pode precisar tentar novamente, ele define uma rotina IoCompletion no IRP. Para solicitações de leitura ou gravação, ele OUs os SrbFlags com a direção de transferência apropriada, SRB_FLAGS_DATA_IN ou SRB_FLAGS_DATA_OUT, respectivamente.
Uma rotina BuildRequest pode compartilhar a responsabilidade pela configuração de um SRB com um par de rotinas SendSrbSynchronous e SendSrbAsynchronous . Ou seja, a rotina BuildRequest pode configurar os membros do CUR que normalmente são configurados para todos os pedidos, enquanto as rotinas SendSrbXxx definem valores do CUR pertinentes apenas para cada tipo de pedido. Quando um IRP é passado para o controlador de porta a partir de uma rotina SendSrbAsynchronous , o IRP deve ser configurado com uma rotina IoCompletion fornecida pelo controlador.
Depois que o driver de classe é carregado, ele configura a maioria dos SRBs com o membro da função definido como SRB_FUNCTION_EXECUTE_SCSI, indicando uma solicitação de E/S do dispositivo a ser enviada pelo barramento.
Para obter mais informações sobre os membros do SRB definidos pelo sistema e os seus valores, consulte SCSI_REQUEST_BLOCK.
Configuração de BSRs para Solicitação de Sentido
Um driver de classe pode solicitar que o driver de porta retorne o sensor de solicitação SCSI ou informações equivalentes quando o controlador de destino retornar uma condição de verificação. Para fazer isso, o driver de classe configura o ponteiro SenseInfoBuffer e SenseInfoBufferLength no SRB, para que o driver de porta possa retornar as informações de deteção de solicitação se ocorrer uma condição de verificação. O driver de porta indica que retornou informações de deteção de solicitação definindo o membro SrbStatus com SRB_STATUS_AUTOSENSE_VALID quando retorna o IRP. Para obter mais informações sobre rotinas InterpretSenseInfo , consulte Storage Class Driver's InterpretRequestSense Routine.
Tentativas
Os drivers de classe de armazenamento são responsáveis por repetir solicitações que falham devido a erros no destino/controlador, resets de bus ou tempos de espera de solicitação. Consequentemente, muitos drivers de classe mantêm uma contagem de tentativas em seu próprio local de pilha de E/S do IRP. A rotina BuildRequest desse driver de classe também pode inicializar o limite de novas tentativas para uma determinada solicitação antes de configurar sua rotina IoCompletion e enviar o IRP para o driver de porta. Para obter mais informações sobre rotinas RetryRequest , consulte Rotina RetryRequest do driver de classe de armazenamento.