Função ScsiPortGetDeviceBase (srb.h)

A rotina ScsiPortGetDeviceBase retorna um endereço base lógico mapeado que pode ser usado para se comunicar com um HBA. Cada driver de miniporto deve passar endereços de intervalo de acesso lógico mapeados para o ScsiPort.. PortaXxx e ScsiPort.. Registre rotinas xxx para se comunicar com seus HBA(s).

Nota Os modelos de driver de porta SCSI e driver de miniporto SCSI podem ser alterados ou indisponíveis no futuro. Em vez disso, recomendamos usar os modelos de driver do Storport e do driver de miniporto storport .
 

Sintaxe

SCSIPORT_API PVOID ScsiPortGetDeviceBase(
  [in] PVOID                 HwDeviceExtension,
  [in] INTERFACE_TYPE        BusType,
  [in] ULONG                 SystemIoBusNumber,
  [in] SCSI_PHYSICAL_ADDRESS IoAddress,
  [in] ULONG                 NumberOfBytes,
  [in] BOOLEAN               InIoSpace
);

Parâmetros

[in] HwDeviceExtension

Ponteiro para a extensão do dispositivo de hardware. Essa é uma área de armazenamento por HBA que o driver de porta aloca e inicializa em nome do driver de miniport. Os drivers de miniporto geralmente armazenam informações específicas do HBA nessa extensão, como o estado do HBA e os intervalos de acesso mapeados do HBA. Essa área está disponível para o driver de miniporto no membro DeviceExtension-HwDeviceExtension> do objeto de dispositivo do HBA imediatamente após o driver de miniporto chamar ScsiPortInitialize. O driver de porta libera essa memória quando remove o dispositivo.

[in] BusType

Especifica o tipo de interface do barramento de E/S no qual o HBA está conectado. A rotina HwScsiFindAdapter do driver de miniport obtém o valor desse parâmetro do membro AdapterInterfaceType do PORT_CONFIGURATION_INFORMATION de entrada.

[in] SystemIoBusNumber

Especifica o número atribuído pelo sistema do barramento de E/S no qual o HBA está conectado. A rotina HwScsiFindAdapter obtém o valor desse parâmetro do membro SystemIoBusNumber do PORT_CONFIGURATION_INFORMATION de entrada.

[in] IoAddress

Especifica o endereço base relativo ao barramento de um intervalo usado pelo HBA. A rotina HwScsiFindAdapter obtém o valor desse parâmetro de um dos elementos AccessRanges no PORT_CONFIGURATION_INFORMATION se o driver de porta fornecer informações de configuração de intervalo. Caso contrário, esse endereço pode ser um valor retornado por ScsiPortGetBusData ou um valor padrão fornecido pelo driver de miniport. Evite usar um endereço base de zero porque sua status de retorno bem-sucedida pode entrar em conflito com o status de erro (NULL).

[in] NumberOfBytes

Especifica o tamanho em bytes do intervalo que o mapeamento deve abranger. A rotina HwScsiFindAdapter obtém o valor desse parâmetro do mesmo elemento AccessRanges que IoAddress se o driver de porta fornecer informações de configuração de intervalo. Caso contrário, esse valor pode ser retornado por ScsiPortGetBusData ou por um padrão fornecido pelo driver de miniport. De qualquer forma, o driver não deve acessar o hardware fora do intervalo mapeado retornado.

[in] InIoSpace

TRUE indica que o intervalo a ser mapeado está no espaço de E/S e o driver de miniporto passará endereços mapeados nesse intervalo para o ScsiPort... PortaXxx para se comunicar com o HBA. A rotina HwScsiFindAdapter obtém o valor desse parâmetro do mesmo elemento AccessRanges que IoAddress. Observe que um driver de miniporte deve inverter o valor do membro InMemorySpace em um elemento do tipo ACCESS_RANGE antes de ser passado para ScsiPortGetDeviceBase como o argumento InIoSpace . FALSE indica que o intervalo a ser mapeado está no espaço de memória.

Retornar valor

ScsiPortGetDeviceBase retornará um endereço base lógico mapeado para o IoAddress fornecido se tiver mapeado com êxito o intervalo determinado de IoAddress para NumberOfBytes. Se um determinado intervalo não puder ser mapeado, ScsiPortGetDeviceBase retornará NULL.

Comentários

As plataformas de sistema operacional baseadas em NT podem ter vários tipos de ônibus de E/S e vários ônibus de E/S do mesmo tipo. Além disso, o HAL pode mapear o espaço de E/S para a memória em algumas plataformas.

Consequentemente, um driver de miniporto não pode usar endereços de intervalo de acesso relativos ao barramento para se comunicar com seu HBA. Para manter a portabilidade do driver de miniporte em computadores baseados em CISC e RISC, os endereços que eles usam para acessar HBAs devem ser traduzidos com ScsiPortGetDeviceBase.

Cada driver de miniporte deve usar endereços de intervalo lógico de espaço do sistema, mapeados por ScsiPortGetDeviceBase, para se comunicar com seus HBA(s). Chamadas para o ScsiPort... As rotinas de porta/registroxxx exigem esses endereços lógicos mapeados.

ScsiPortGetDeviceBase pode ser chamado várias vezes, dependendo de quantos HBAs o driver de miniporto dá suporte e quantos intervalos de acesso cada HBA requer. Cada intervalo mapeado corresponde a um intervalo de endereços de dispositivo relativos ao barramento especificados em um elemento do tipo ACCESS_RANGE da matriz AccessRanges .

ScsiPortGetDeviceBase só pode ser chamado da rotina HwScsiFindAdapter de um driver de miniporte ou de HwScsiAdapterControl quando o tipo de controle é ScsiSetRunningConfig. Chamadas de outras rotinas de driver de miniporto resultarão em falha do sistema ou em operação incorreta para o chamador.

Siga estas diretrizes para chamar ScsiPortGetDeviceBase:

  • Se HwScsiFindAdapter estiver usando um conjunto fornecido pelo driver de miniport de intervalos de acesso ou valores padrão relativos ao barramento retornados por ScsiPortGetBusData, ele deverá chamar ScsiPortValidateRange antes de tentar chamar ScsiPortGetDeviceBase.
  • Se hwScsiFindAdapter determinar que um HBA específico não é aquele que o driver de miniporto dá suporte, ele deve chamar ScsiPortFreeDeviceBase para liberar os mapeamentos configurados para se comunicar com esse HBA.
O endereço lógico retornado por ScsiPortGetDeviceBase deve ser usado para todas as referências subsequentes feitas ao hardware, mas não deve ser adicionado a nenhuma especificação accessRanges no PORT_CONFIGURATION_INFORMATION. Os gravadores de driver de miniport não devem fazer suposições sobre quantos bits são usados no endereço base lógico retornado por ScsiPortGetDeviceBase.

ScsiPortGetDeviceBase usa SCSI_PHYSICAL_ADDRESS para representar endereços relativos ao barramento.

typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;

O tipo SCSI_PHYSICAL_ADDRESS é um tipo de dados independente do sistema operacional que os motoristas de miniporto SCSI usam para representar um endereço físico ou um endereço relativo ao barramento.

Nota Os modelos de driver de porta SCSI e driver de miniporto SCSI podem ser alterados ou indisponíveis no futuro. Em vez disso, recomendamos usar os modelos de driver do Storport e do driver de miniporto storport .
 

Requisitos

Requisito Valor
Plataforma de Destino Área de Trabalho
Cabeçalho srb.h (inclua Miniport.h, Scsi.h)
Biblioteca Scsiport.lib

Confira também

ACCESS_RANGE

HwScsiFindAdapter

PORT_CONFIGURATION_INFORMATION (SCSI)

ScsiPortFreeDeviceBase

ScsiPortGetBusData

ScsiPortValidateRange