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).
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.
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.
Requisitos
Requisito | Valor |
---|---|
Plataforma de Destino | Área de Trabalho |
Cabeçalho | srb.h (inclua Miniport.h, Scsi.h) |
Biblioteca | Scsiport.lib |