Функция ScsiPortGetPhysicalAddress (srb.h)
Подпрограмма ScsiPortGetPhysicalAddress преобразует заданный диапазон виртуальных адресов в физический диапазон адресов для операции DMA.
Синтаксис
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 используют для представления физических адресов или адресов относительно шины.
Требования
Требование | Значение |
---|---|
Целевая платформа | Персональный компьютер |
Верхняя часть | srb.h (включая Miniport.h, Scsi.h) |
Библиотека | Scsiport.lib |