Функция ScsiPortValidateRange (srb.h)

Подпрограмма ScsiPortValidateRange указывает, были ли указанные значения диапазона доступа уже запрошены в реестре другим драйвером.

Примечание В будущем модели драйвера портов SCSI и драйвера для минипорта SCSI могут быть изменены или недоступны. Вместо этого рекомендуется использовать модели драйверов Storport и драйверов для мини-портов Storport .
 

Синтаксис

SCSIPORT_API BOOLEAN ScsiPortValidateRange(
  [in] PVOID                 HwDeviceExtension,
  [in] INTERFACE_TYPE        BusType,
  [in] ULONG                 SystemIoBusNumber,
  [in] SCSI_PHYSICAL_ADDRESS IoAddress,
  [in] ULONG                 NumberOfBytes,
  [in] BOOLEAN               InIoSpace
);

Параметры

[in] HwDeviceExtension

Указатель на расширение аппаратного устройства. Это область хранения для каждого адаптера, которую драйвер порта выделяет и инициализирует от имени драйвера мини-порта. Драйверы минипорта обычно хранят сведения, относящиеся к HBA, в этом расширении, например состояние адаптера шины и сопоставленные диапазоны доступа. Эта область доступна драйверу мини-порта в элементе DeviceExtension-HwDeviceExtension> объекта устройства HBA сразу после того, как драйвер минипорта вызывает ScsiPortInitialize. Драйвер порта освобождает эту память при удалении устройства.

[in] BusType

Задает значение члена AdapterInterfaceType в структуре PORT_CONFIGURATION_INFORMATION при вызове HwScsiFindAdapter .

[in] SystemIoBusNumber

Указывает значение элемента SystemIoBusNumber в сведениях о конфигурации при вызове HwScsiFindAdapter .

[in] IoAddress

Указывает базовый адрес относительно шины для диапазона портов или памяти устройства, который необходимо проверить , прежде чем подпрограмма HwScsiFindAdapter драйвера мини-порта попытается сопоставить диапазон доступа для адаптера по указанному адресу.

[in] NumberOfBytes

Задает размер в байтах или количество элементов в диапазоне.

[in] InIoSpace

Указывает значение true, что диапазон находится в пространстве ввода-вывода, а не в памяти. При значении FALSE диапазон находится в памяти.

Возвращаемое значение

ScsiPortValidateRange возвращает значение TRUE , если подпрограмма HwScsiFindAdapter может безопасно сопоставлять и использовать сопоставленный диапазон для доступа к адаптеру. ScsiPortValidateRange возвращает значение FALSE , если указанные значения диапазона доступа уже были запрошены в реестре другим драйвером.

Комментарии

ScsiPortValidateRange можно вызывать только из подпрограммы HwScsiFindAdapter драйвера мини-порта. Вызовы из других подпрограмм драйвера минипорта приведут к сбою системы или неправильной работе вызывающего объекта.

Если драйвер порта для конкретной операционной системы инициализирует любой элемент AccessRanges структуры PORT_CONFIGURATION_INFORMATION перед вызовом подпрограммы HwScsiFindAdapter драйвера мини-порта, драйвер минипорта должен передать предоставленные значения в ScsiPortGetDeviceBase и использовать сопоставленные логические адреса для диапазона, чтобы определить, является ли адаптер HBA поддерживаемым.

Драйвер порта либо заполняет элемент типа ACCESS_RANGE полным описанием диапазона адресов адаптера относительно шины, либо драйвер порта обнуляет все элементы элемента.

Для входных элементов AccessRanges , заданных с нулями по умолчанию, подпрограмма HwScsiFindAdapter может попытаться найти адаптер, поддерживаемый в заданной шине ввода-вывода. В таких случаях драйвер минипорта обычно имеет набор определяемых драйвером адресов по умолчанию для его типов HBA. Однако ранее загруженный драйвер может уже использовать инициализированный адаптер в одном из диапазонов адресов по умолчанию этого драйвера минипорта, особенно в системах только x86, в которых некоторые устройства инициализируются в реальном режиме x86. Чтобы предотвратить непреднамеренное перепрограммированное устройство, подпрограмма HwScsiFindAdapter каждого драйвера мини-порта должна вызвать ScsiPortValidateRange , прежде чем сопоставлять любые адреса, предоставленные драйвером, с ScsiPortGetDeviceBase , а затем использовать сопоставленные логические адреса для опроса адаптеров в шине ввода-вывода.

Если ScsiPortValidateRange возвращает значение FALSE, HwScsiFindAdapter не должен пытаться сопоставить адреса входного диапазона, так как другой драйвер уже затребовал диапазон в реестре.

Если ScsiPortValidateRange возвращает значение TRUE, HwScsiFindAdapter может безопасно выполнять следующие действия:

  1. Сопоставьте адреса относительного диапазона шины с адресами логического диапазона системного пространства с помощью ScsiPortGetDeviceBase.
  2. Используйте сопоставленные логические адреса с ScsiPortRead/WriteXxx , чтобы определить, действительно ли адаптер является адаптером HBA, поддерживаемым драйвером.
Если драйвер мини-порта использует диапазон, успешно переданный в ScsiPortValidateRange для адаптера HBA, который он поддерживает, этот драйвер должен инвертировать значение InIoSpace при установке элемента RangeInMemory элемента AccessRanges в PORT_CONFIGURATION_INFORMATION.

ScsiPortValidateRange использует SCSI_PHYSICAL_ADDRESS для представления адресов, относящихся к шине.

typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;

Тип SCSI_PHYSICAL_ADDRESS — это независимый от операционной системы тип данных, который драйверы мини-порта SCSI используют для представления физических адресов или адресов относительно шины.

Примечание В будущем модели драйвера портов SCSI и драйвера для минипорта SCSI могут быть изменены или недоступны. Вместо этого рекомендуется использовать модели драйверов Storport и драйверов для мини-портов Storport .
 

Требования

Требование Значение
Целевая платформа Персональный компьютер
Верхняя часть srb.h (включая Miniport.h, Scsi.h)
Библиотека Scsiport.lib

См. также раздел

ACCESS_RANGE

HwScsiFindAdapter

PORT_CONFIGURATION_INFORMATION (SCSI)

ScsiPortGetDeviceBase

ScsiPortInitialize