Função ScsiPortGetPhysicalAddress (srb.h)

A rotina ScsiPortGetPhysicalAddress converte um determinado intervalo de endereços virtuais em um intervalo de endereços físicos para uma operação de DMA.

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

Sintaxe

SCSIPORT_API SCSI_PHYSICAL_ADDRESS ScsiPortGetPhysicalAddress(
  [in]  PVOID               HwDeviceExtension,
  [in]  PSCSI_REQUEST_BLOCK Srb,
  [in]  PVOID               VirtualAddress,
  [out] ULONG               *Length
);

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 miniporto. Os drivers de miniporta 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] Srb

Ponteiro para o bloco de solicitação SCSI se o VirtualAddress a ser convertido for proveniente do membro DataBuffer desse SRB ou, possivelmente, do SenseInfoBuffer. Caso contrário, esse parâmetro deve ser NULL.

[in] VirtualAddress

Ponteiro para o endereço virtual base a ser convertido. Se esse endereço virtual estiver dentro do intervalo de um DataBuffer fornecido por SRB, o chamador também deverá fornecer o ponteiro Srb .

[out] Length

Retorna o número de bytes mapeados, começando no endereço físico retornado.

Retornar valor

ScsiPortGetPhysicalAddress retorna o endereço físico correspondente para um determinado VirtualAddress. Se o endereço determinado não puder ser convertido, ele retornará NULL.

Comentários

Os motoristas de miniport de HBAs master de ônibus chamam ScsiPortGetPhysicalAddress para obter intervalos de endereços físicos mapeados a serem usados durante as operações de DMA. Por exemplo, ScsiPortGetPhysicalAddress pode ser usado para criar uma lista de dispersão/coleta para transferências de dados que abrangem páginas. Observe que o Comprimento retornado pode ser maior que o tamanho do DataBuffer em um determinado SRB.

Se um Srb não NULL for passado, o VirtualAddress deverá estar dentro do intervalo do DataBuffer do SRB ou deve ser um ponteiro do SenseInfoBuffer. Caso contrário, o VirtualAddress especificado deve estar na extensão não armazenada em cache do driver de miniport, na SrbExtension ou no SenseInfoBuffer.

Um driver de miniporto pode chamar ScsiPortGetPhysicalAddress para traduzir um endereço de extensão somente se a rotina DriverEntry desse driver de miniport definir NeedPhysicalAddresses como TRUE no HW_INITIALIZATION_DATA quando ele chamou ScsiPortInitialize.

Devido a restrições em alguns ônibus, como ISA, não há garantia de que o endereço retornado por essa rotina corresponda ao endereço retornado por uma rotina externa análoga (como MmGetPhysicalAddress). Um driver de miniporta deve chamar apenas as rotinas ScsiPortXxx para serem portáteis.

ScsiPortGetPhysicalAddress usa SCSI_PHYSICAL_ADDRESS para representar endereços físicos.

typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;

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

Nota O driver de porta SCSI e os modelos de driver de miniporta SCSI podem ser alterados ou indisponíveis no futuro. Em vez disso, recomendamos usar os modelos de driver storport e 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

DriverEntry do driver de miniporto SCSI

HW_INITIALIZATION_DATA (SCSI)

SCSI_REQUEST_BLOCK

ScsiPortGetUncachedExtension

ScsiPortGetVirtualAddress