Função ScsiPortGetDeviceBase (srb.h)
A rotina ScsiPortGetDeviceBase do 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.. Registrexxx rotinas para se comunicar com seus HBA(s).
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
);
[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 miniporto. 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 DeviceExtension->HwDeviceExtension membro 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 de HwScsiFindAdapter do driver de miniporto obtém o valor desse parâmetro do 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 de 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 miniporto. Evite usar um endereço base de zero porque seu status de retorno bem-sucedido 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 de 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 um padrão fornecido pelo driver de miniporto. De qualquer forma, o driver não deve acessar o hardware fora do intervalo mapeado retornado.
[in] InIoSpace
VERDADEIRO 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 de driver de miniporto 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.
ScsiPortGetDeviceBase retornará um endereço base lógico mapeado para o IoAddress de 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.
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 motorista de miniporto não pode usar endereços de intervalo de acesso relativos ao ônibus para se comunicar com seu HBA. Para manter a portabilidade do driver de miniporto em computadores baseados em CISC e RISC, os endereços usados para acessar HBAs devem ser traduzidos com ScsiPortGetDeviceBase.
Cada driver de miniporto 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 a barramento especificados em um elemento de tipo ACCESS_RANGE da matriz de AccessRanges.
ScsiPortGetDeviceBase pode ser chamado somente de uma rotina de HwScsiFindAdapter de um driver de miniporto 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 de intervalos ou valores de acesso relativos ao barramento padrão fornecidos pelo ScsiPortGetBusData, ele deverá chamar ScsiPortValidateRange antes de tentar chamar ScsiPortGetDeviceBase.
- Se HwScsiFindAdapter determinar que um determinado HBA não é aquele que o driver de miniporto dá suporte, ele deve chamar ScsiPortFreeDeviceBase para liberar os mapeamentos que ele configurou para se comunicar com esse HBA.
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.
Requisito | Valor |
---|---|
da Plataforma de Destino | Área de trabalho |
cabeçalho | srb.h (inclua Miniport.h, Scsi.h) |
biblioteca | Scsiport.lib |