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

Подпрограмма ScsiPortGetPhysicalAddress преобразует заданный диапазон виртуальных адресов в физический диапазон адресов для операции DMA.

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

Синтаксис

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

Параметры

[in] HwDeviceExtension

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

[in] Srb

Указатель на блок запросов SCSI, если преобразуемый VirtualAddress поступает из этого элемента DataBuffer SRB или, возможно, из SenseInfoBuffer. В противном случае этот параметр должен иметь значение NULL.

[in] VirtualAddress

Указатель на преобразуемый базовый виртуальный адрес. Если этот виртуальный адрес попадает в диапазон для databuffer, предоставленного SRB, вызывающий объект также должен предоставить указатель Srb .

[out] Length

Возвращает число сопоставленных байтов, начиная с возвращенного физического адреса.

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

ScsiPortGetPhysicalAddress возвращает соответствующий физический адрес для заданного Объекта VirtualAddress. Если данный адрес не может быть преобразован, возвращается значение NULL.

Комментарии

Драйверы минипортов master HBA вызывают ScsiPortGetPhysicalAddress, чтобы получить сопоставленные диапазоны физических адресов, которые будут использоваться во время операций DMA. Например, ScsiPortGetPhysicalAddress можно использовать для создания точечных и сборных списков для передачи данных, охватывающих страницы. Обратите внимание, что возвращаемое значение Length может быть больше размера DataBuffer в заданном SRB.

Если передается Srb, отличный от NULL, VirtualAddress должен находиться в диапазоне DataBuffer SRB или быть указателем из SenseInfoBuffer. В противном случае указанный VirtualAddress должен находиться в некэшированном расширении драйвера мини-порта, SrbExtension или SenseInfoBuffer.

Драйвер мини-порта может вызывать ScsiPortGetPhysicalAddress , чтобы преобразовать адрес расширения, только если подпрограмма DriverEntry этого драйвера мини-порта задает для параметра NeedPhysicalAddressesзначение TRUE в HW_INITIALIZATION_DATA при вызове ScsiPortInitialize.

Из-за ограничений на некоторых автобусах, таких как ISA, адрес, возвращаемый этой подпрограммой, не гарантируется в соответствии с адресом, возвращенным аналогичной внешней подпрограммой (например , MmGetPhysicalAddress). Драйвер мини-порта должен вызывать только подпрограммы ScsiPortXxx , чтобы быть переносимыми.

ScsiPortGetPhysicalAddress использует 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

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

DriverEntry of SCSI Miniport Driver

HW_INITIALIZATION_DATA (SCSI)

SCSI_REQUEST_BLOCK

ScsiPortGetUncachedExtension

ScsiPortGetVirtualAddress