Función ScsiPortGetDeviceBase (srb.h)

La rutina ScsiPortGetDeviceBase devuelve una dirección base lógica asignada que se puede usar para comunicarse con un HBA. Cada controlador de minipuerto debe pasar direcciones de intervalo de acceso lógico asignados a ScsiPort.. PuertoXxx y ScsiPort.. Registre las rutinas Xxx para comunicarse con sus HBA(s).

Nota Los modelos del controlador de puerto SCSI y del controlador de miniporte SCSI pueden modificarse o no estar disponibles en el futuro. En su lugar, se recomienda usar el controlador Storport y los modelos de controlador de miniport storport .
 

Sintaxis

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

Puntero a la extensión de dispositivo de hardware. Se trata de un área de almacenamiento por HBA que el controlador de puerto asigna e inicializa en nombre del controlador de minipuerto. Los controladores de minipuerto suelen almacenar información específica de HBA en esta extensión, como el estado del HBA y los intervalos de acceso asignados del HBA. Esta área está disponible para el controlador de miniport en el miembro DeviceExtension-HwDeviceExtension> del objeto de dispositivo del HBA inmediatamente después de que el controlador de miniporte llame a ScsiPortInitialize. El controlador de puerto libera esta memoria cuando quita el dispositivo.

[in] BusType

Especifica el tipo de interfaz del bus de E/S en el que está conectado el HBA. La rutina HwScsiFindAdapter del controlador de miniporte obtiene el valor de este parámetro del miembro AdapterInterfaceType de la PORT_CONFIGURATION_INFORMATION de entrada.

[in] SystemIoBusNumber

Especifica el número asignado por el sistema del bus de E/S en el que está conectado el HBA. La rutina HwScsiFindAdapter obtiene el valor de este parámetro del miembro SystemIoBusNumber del PORT_CONFIGURATION_INFORMATION de entrada.

[in] IoAddress

Especifica la dirección base relativa al bus de un intervalo utilizado por el HBA. La rutina HwScsiFindAdapter obtiene el valor de este parámetro de uno de los elementos AccessRanges de la PORT_CONFIGURATION_INFORMATION si el controlador de puerto proporciona información de configuración de intervalo. De lo contrario, esta dirección puede ser un valor devuelto por ScsiPortGetBusData o un valor predeterminado proporcionado por el controlador miniport. Evite usar una dirección base de cero porque su estado de retorno correcto puede entrar en conflicto con el estado de error (NULL).

[in] NumberOfBytes

Especifica el tamaño en bytes del intervalo que debe cubrir la asignación. La rutina HwScsiFindAdapter obtiene el valor de este parámetro del mismo elemento AccessRanges que IoAddress si el controlador de puerto proporciona información de configuración del intervalo. De lo contrario, ScsiPortGetBusData puede devolver este valor o un valor predeterminado proporcionado por el controlador miniport. En cualquier caso, el controlador no debe tener acceso al hardware fuera del intervalo devuelto asignado.

[in] InIoSpace

TRUE indica que el intervalo que se va a asignar está en el espacio de E/S y el controlador de miniporte pasará direcciones asignadas en este intervalo a ScsiPort... PuertoXxx para comunicarse con el HBA. La rutina HwScsiFindAdapter obtiene el valor de este parámetro del mismo elemento AccessRanges que IoAddress. Tenga en cuenta que un controlador de minipuerto debe invertir el valor del miembro InMemorySpace en un elemento de tipo ACCESS_RANGE antes de pasarlo a ScsiPortGetDeviceBase como argumento InIoSpace . FALSE indica que el intervalo que se va a asignar está en el espacio de memoria.

Valor devuelto

ScsiPortGetDeviceBase devuelve una dirección base lógica asignada para ioAddress dada si asigna correctamente el intervalo especificado de IoAddress a NumberOfBytes. Si no se puede asignar un intervalo determinado, ScsiPortGetDeviceBase devuelve NULL.

Comentarios

Las plataformas de sistema operativo basadas en NT pueden tener varios tipos de buses de E/S y varios buses de E/S del mismo tipo. Además, HAL puede asignar espacio de E/S a la memoria en algunas plataformas.

Por lo tanto, un controlador de minipuerto no puede usar direcciones de intervalo de acceso relativo al bus para comunicarse con su HBA. Para mantener la portabilidad del controlador de miniporte entre las máquinas basadas en CISC y RISC, las direcciones que usan para acceder a los HBA deben traducirse con ScsiPortGetDeviceBase.

Cada controlador de minipuerto debe usar direcciones de intervalo lógico de espacio del sistema, asignadas por ScsiPortGetDeviceBase, para comunicarse con sus HBA. Llamadas a ScsiPort... Las rutinas Port/RegisterXxx requieren estas direcciones lógicas asignadas.

Se puede llamar a ScsiPortGetDeviceBase varias veces, dependiendo del número de HBA que admita el controlador de miniporte y de cuántos intervalos de acceso requiere cada HBA. Cada intervalo asignado corresponde a un intervalo de direcciones de dispositivo relativas al bus especificadas en un elemento de tipo ACCESS_RANGE de la matriz AccessRanges .

Solo se puede llamar a ScsiPortGetDeviceBase desde una rutina HwScsiFindAdapter del controlador de miniporte o desde HwScsiAdapterControl cuando el tipo de control es ScsiSetRunningConfig. Las llamadas de otras rutinas del controlador de miniporte producirán un error del sistema o una operación incorrecta para el autor de la llamada.

Siga estas instrucciones para llamar a ScsiPortGetDeviceBase:

  • Si HwScsiFindAdapter usa un conjunto proporcionado por el controlador miniport de intervalos o valores de acceso relativos al bus predeterminados devueltos por ScsiPortGetBusData, debe llamar a ScsiPortValidateRange antes de intentar llamar a ScsiPortGetDeviceBase.
  • Si HwScsiFindAdapter determina que un HBA determinado no es el que admite el controlador de miniporte, debe llamar a ScsiPortFreeDeviceBase para liberar las asignaciones que configuró para comunicarse con ese HBA.
La dirección lógica devuelta por ScsiPortGetDeviceBase debe usarse para todas las referencias posteriores realizadas al hardware, pero no debe agregarse a ninguna especificación de AccessRanges en el PORT_CONFIGURATION_INFORMATION. Los escritores de controladores de miniport no deben suponer cuántos bits se usan en la dirección base lógica devuelta por ScsiPortGetDeviceBase.

ScsiPortGetDeviceBase usa SCSI_PHYSICAL_ADDRESS para representar direcciones relativas al bus.

typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;

El tipo SCSI_PHYSICAL_ADDRESS es un tipo de datos independiente del sistema operativo que usan los controladores de miniporte SCSI para representar direcciones físicas o una dirección relativa al bus.

Nota Los modelos del controlador de puerto SCSI y del controlador de miniporte SCSI pueden modificarse o no estar disponibles en el futuro. En su lugar, se recomienda usar el controlador Storport y los modelos de controlador de miniport storport .
 

Requisitos

Requisito Value
Plataforma de destino Escritorio
Encabezado srb.h (incluya Miniport.h, Scsi.h)
Library Scsiport.lib

Consulte también

ACCESS_RANGE

HwScsiFindAdapter

PORT_CONFIGURATION_INFORMATION (SCSI)

ScsiPortFreeDeviceBase

ScsiPortGetBusData

ScsiPortValidateRange