функция обратного вызова HW_BUILDIO (storport.h)
Подпрограмма HwStorBuildIo обрабатывает SRB с несинхронизированным доступом к общим структурам системных данных перед передачей в HwStorStartIo.
Синтаксис
HW_BUILDIO HwBuildio;
BOOLEAN HwBuildio(
PVOID DeviceExtension,
PSCSI_REQUEST_BLOCK Srb
)
{...}
Параметры
DeviceExtension
Указатель на место хранения драйвера мини-порта на хранилище HBA.
Srb
Указатель на блок запросов SCSI (SRB) для обработки.
Возвращаемое значение
HwStorBuildIo возвращает значение TRUE , чтобы сообщить вызывающей объекту, что StorPort должен вызвать подпрограмму HwStorStartIo , если StorPort считает, что LUN готов к приему ввода-вывода. HwStorBuildIo возвращает значение FALSE , чтобы сообщить вызывающей о том, что SRB не следует передавать в HwStorStartIo. В таких случаях драйвер мини-порта должен завершить SRB, вызвав StorPortNotification с типом уведомления RequestComplete. Это можно сделать в HwStorBuildIo или в другом месте драйвера мини-порта, если SRB будет завершена до истечения времени ожидания, указанного в поле TimeOutValue структуры SRB.
Комментарии
Имя HwStorBuildIo — это просто заполнитель для функции miniport, на которую указывает элемент HwBuildIo в структуре HW_INITIALIZATION_DATA . Фактический прототип этой подпрограммы определен в Storport.h следующим образом:
typedef
BOOLEAN
HW_BUILDIO (
_In_ PVOID DeviceExtension,
_In_ PSCSI_REQUEST_BLOCK Srb
);
Драйвер порта вызывает подпрограмму HwStorBuildIo в DISPATCH IRQL, не удерживая при этом блокировки спина. Поэтому в HwStorBuildIo разрешено выделение памяти с помощью StorPortAllocatePool и взаимное исключение с помощью StorPortAcquireSpinLock. В многопроцессорной среде одновременно может быть активно несколько HwStorBuildIo , поэтому драйвер минипорта требуется для синхронизации доступа к системным ресурсам, что может быть в состоянии состязания, если в любой момент времени активен более одного экземпляра HwStorBuildIo .
Выполняя длительные действия по настройке ввода-вывода в HwStorBuildIo , а не в HwStorStartIo, драйвер минипорта обеспечивает больший параллелизм операций ввода-вывода и, следовательно, повышает пропускную способность ввода-вывода. Для достижения максимальной производительности драйверы мини-порта должны выполнять как можно большую предварительную обработку в HwStorBuildIo , чтобы они могли отправлять запросы в HBA через HwStorStartIo в кратчайшие сроки. Предварительно обработанные данные и состояние могут храниться в структурах DeviceExtension или SrbExtension . Только изменения уникальных частей DeviceExtension должны происходить, так как блокировки не удерживаются. HwStorBuildIo и HwStorStartIo получают следующие типы функций Srb:
SRB_FUNCTION_EXECUTE_SCSI: отправляет CDB в указанную шину, целевой объект или lun.
- Srb-DataTransferLength> допустим для всех cdbs.
- Srb-DataBuffer> имеет значение NULL для запросов на чтение и запись. Чтобы получить доступ к связанным данным, используйте StorPortGetScatterGatherList (для передачи Dma) или StorPortGetSystemAddress (для операций ввода-вывода, контролируемых программой), чтобы получить список точечной сборки или виртуальный адрес буфера. Для других запросов Srb-Databuffer> указывает на данные, связанные с Srb.
- Srb-PathId> является допустимым и представляет идентификатор пути, заданный storport в StorPortNotification (BusChange). Авторы водителей минипорта должны использовать pathid в качестве индекса в таблице автобусов в пределах минипорта.
- Допустимы значения Srb-TargetId> и Srb-Lun>.
SRB_FUNCTION_IO_CONTROL: определен минипорт.
- Srb-DataTransferLength> и Srb-DataBuffer> допустимы, если они заданы инициатором запроса.
- Допустимы все значения Srb-PathId>, Srb-TargetId> и Srb-Lun>.
SRB_FUNCTION_RESET_LOGICAL_UNIT. Сброс указанной логической единицы (если устройство поддерживается).
- Недопустимые значения Srb-DataTransferLength> и Srb-DataBuffer>.
- Допустимы все значения Srb-PathId>, Srb-TargetId> и Srb-Lun>.
SRB_FUNCTION_RESET_DEVICE. Сброс указанного целевого объекта Scsi.
- Недопустимы srb-DataTransferLength> и Srb-DataBuffer>, Srb-Lun>.
- Допустимы значения Srb-PathId> и Srb-TargetId>.
SRB_FUNCTION_RESET_BUS. Сброс всех целевых объектов в указанной шине SCSI.
- Допустимы только Srb-PathId>.
SRB_FUNCTION_FLUSH. Указывает драйверу мини-порта очистить все кэшированные данные.
- Выполняется драйвером мини-порта, только если в структуре PORT_CONFIGURATION_INFORMATION задано значение CachesData == TRUE.
- Допустимы все значения Srb-PathId>, Srb-TargetId> и Srb-Lun>.
SRB_FUNCTION_SHUTDOWN: предписывает драйверу мини-порта очистить все кэшированные данные, чтобы завершить работу.
- Выполняется драйвером мини-порта, только если в структуре PORT_CONFIGURATION_INFORMATION задано значение CachesData == TRUE.
- Допустимы все значения Srb-PathId>, Srb-TargetId> и Srb-Lun>.
SRB_FUNCTION_DUMP_POINTERS. Предоставляет сведения, необходимые драйверу мини-порта для поддержки аварийного дампа и гибернации.
- Этот запрос отправляется в драйвер виртуального минипорта Storport, который используется для управления диском, на котором хранятся данные аварийного дампа. Начиная с Windows 8, не виртуальные драйверы минипорта могут при необходимости получать этот запрос.
- Допустимы все значения Srb-PathId>, Srb-TargetId> и Srb-Lun>.
SRB_FUNCTION_FREE_DUMP_POINTERS. Начиная с Windows 8 этот запрос отправляется в мини-порт для освобождения ресурсов, выделенных во время запроса SRB_FUNCTION_DUMP_POINTERS.
- Допустимы все значения Srb-PathId>, Srb-TargetId> и Srb-Lun>.
Начиная с Windows 8, параметр Srb может указывать на SCSI_REQUEST_BLOCK или STORAGE_REQUEST_BLOCK. Если идентификатор функции в поле ФункцияSrbSRB_FUNCTION_STORAGE_REQUEST_BLOCK, SRB является STORAGE_REQUEST_BLOCK структурой запроса.
Дополнительные сведения о том, что вы можете и не можете безопасно делать в этой подпрограмме драйвера мини-порта, см. в разделе Unsynchronized HwStorBuildIo Routine.
Примеры
Чтобы определить функцию обратного вызова HwStorBuildIo , необходимо сначала предоставить объявление функции, определяющее тип определяемой функции обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.
Например, чтобы определить подпрограмму обратного вызова HwStorBuildIo с именем MyHwBuildIo, используйте тип HW_BUILDIO , как показано в этом примере кода:
HW_BUILDIO MyHwBuildIo;
Затем реализуйте процедуру обратного вызова следующим образом:
_Use_decl_annotations_
BOOLEAN
MyHwBuildIo (
_In_ PVOID DeviceExtension,
_In_ PSCSI_REQUEST_BLOCK Srb
);
{
...
}
Тип функции HW_BUILDIO определяется в файле заголовка Storport.h. Чтобы более точно определить ошибки при запуске средств анализа кода, обязательно добавьте заметку Use_decl_annotations в определение функции. Заметка Use_decl_annotations гарантирует использование заметок, применяемых к типу функции HW_BUILDIO в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в разделе Объявление функций с помощью типов ролей функций для драйверов Storport. Сведения о Use_decl_annotations см. в статье О поведении функции.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Верхняя часть | storport.h (включая Storport.h) |
IRQL | DISPATCH_LEVEL (см. раздел "Примечания")) |