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