Partilhar via


Rotina BuildRequest do Driver de Classe de Armazenamento

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 driver mais baixo ao manipular 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, o local da pilha de E/S do driver de porta é definido 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 SRBs, bem como para 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ãopagada. Consulte Usando listas lookaside para obter mais informações sobre como usar listas lookaside e pool nãopaged.

Seja alocando memória do pool ou de uma lista lookaside criada pelo driver, cada driver de classe de armazenamento é responsável por liberar a memória alocada para SRBs. As rotinas de IoCompletion dos drivers de classe de armazenamento, descritas em Rotinas de IoCompletion do Driver de Classe de Armazenamento, geralmente liberam a memória alocada para SRBs de volta para uma lista lookaside.

A rotina BuildRequest de um driver de classe deve definir valores apropriados nos membros SRB, incluindo o comprimento do CDB que ele configurou para se comunicar com seu dispositivo. Para solicitações que retornam informações de sentido 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 ORs o 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 de configurar um SRB com um par de rotinas SendSrbSynchronous e SendSrbAsynchronous . Ou seja, a rotina BuildRequest pode configurar os membros SRB normalmente configurados para todas as solicitações, enquanto o SendSrbXxx rotinas de cada conjunto valores SRB pertinentes apenas a cada tipo de solicitação. Quando um IRP é passado para o driver de porta de uma rotina SendSrbAsynchronous , o IRP deve ser configurado com uma rotina IoCompletion fornecida pelo driver.

Depois que o driver de classe for carregado, ele configurará a maioria dos SRBs com o membro function 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 SRB definidos pelo sistema e seus valores, consulte SCSI_REQUEST_BLOCK.

Configurando SRBs para o Sensor de Solicitação

Um driver de classe pode solicitar que o driver de porta retorne informações equivalentes ou sentido de solicitação SCSI quando o controlador de destino retorna uma condição de marcar. 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 sentido de solicitação se ocorrer uma condição de marcar. O driver de porta indica que ele retornou informações de sentido 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 Rotina InterpretRequestSense do Driver de Classe de Armazenamento.

Tentativas

Os drivers de classe de armazenamento são responsáveis por repetir solicitações que falham devido a erros de destino/controlador, redefinições de barramento ou tempos limite de solicitação. Consequentemente, muitos drivers de classe mantêm uma contagem de repetições em seu próprio local de pilha de E/S do IRP. Essa rotina BuildRequest de um driver de classe também pode inicializar o limite de repetição 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.