функция обратного вызова HW_STARTIO (storport.h)

Драйвер Storport вызывает подпрограмму HwStorStartIo один раз для каждого входящего запроса ввода-вывода.

Синтаксис

HW_STARTIO HwStartio;

BOOLEAN HwStartio(
  PVOID DeviceExtension,
  PSCSI_REQUEST_BLOCK Srb
)
{...}

Параметры

DeviceExtension

Указатель на минипорт драйвер на область хранения HBA.

Srb

Указатель на блок запроса SCSI для запуска.

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

HwStorStartIo возвращает значение TRUE , если запрос был успешно инициирован. В противном случае возвращается значение FALSE.

Комментарии

HwStorStartIo инициирует операцию ввода-вывода. StorPort предназначен для использования частных данных мини-порта, подготовленных в HwStorBuildIo и хранящихся в DeviceExtension или Srb-SrbExtension>. Так как HwStorBuildIo вызывается без спин-блокировок, лучшая производительность драйвера достигается путем подготовки максимально возможного объема данных в HwStorBuildIo.

Storport вызывает HwStorStartIo следующим образом:

  • Для драйверов хранилища, не являющихся виртуальными минипортами, в зависимости от значения SynchronizationModel , установленного в PORT_CONFIGURATION_INFORMATION, Storport всегда вызывает HwStorStartIo в том же IRQL и использует внутреннюю блокировку спина, чтобы обеспечить последовательный запуск запросов ввода-вывода. IRQL — это либо DISPATCH_LEVEL (полнодуплексный режим), либо DIRQL (режим полудуплексного режима).

    При обработке ввода-вывода в полудуплексном режиме подпрограмма HwStorStartIo не требует получения собственной блокировки спина. Кроме того, выделение памяти с помощью StorPortAllocatePool и взаимное исключение через StorPortAcquireSpinLock запрещено в подпрограмме HwStorStartIo . В полнодуплексном режиме StorPortAllocatePool и StorPortAcquireSpinLock могут использоваться в подпрограмме HwStorStartIo .

    Если не виртуальный минипорт поддерживает оптимизацию параллельных каналов (STOR_PERF_CONCURRENT_CHANNELS задано StorPortInitializePerfOpts), возможны одновременные вызовы HwStorStartIo . В этом случае мини-порт должен убедиться, что все общие ресурсы защищены блокировкой. Благодаря этой оптимизации производительности Storport не получит блокировку StartIo перед вызовом HwStorStartIo , а мини-порт должен предоставить собственную блокировку при необходимости.

  • Для драйверов виртуального минипорта хранилища Storport вызывает HwStorStartIo в любом IRQL <= DISPATCH_LEVEL и не использует внутреннюю блокировку спина. Подпрограмма HwStorStartIo может получить собственную спин-блокировку, вызвав StorPortAcquireSpinLock. Кроме того, вызовы StorPortAllocatePool разрешены в подпрограмме HwStorStartIo виртуального мини-порта хранилища.

Ожидается, что SRB будет завершен при получении состояния SCSI. Когда драйвер Storport завершает SRB путем вызова StorPortNotification с типом notificationType of RequestComplete, ожидается, что SRB вернет одно из следующих значений в поле SrbStatus Srb:

  • SRB_STATUS_SUCCESS

    • Указывает, что служба Srb была отправлена, а состояние SCSI (возможно, с данными) возвращено.
    • Storport возвращает данные и состояние вызывающей объекту.
    • Действие мини-порта не выполняется, за исключением завершения запроса с помощью StorPortNotification для RequestComplete, вероятно, из HwStorDpcRoutine.
  • SRB_STATUS_BUSY

    • Указывает, что при отправке Srb возникла временная проблема (например, регистры адаптеров или буферы заняты).
    • Storport удаляет исходное расширение Srb, на которое указывает Srb-SrbExtension> и выдает новое. Storport отправляет исходный Srb с недавно выпущенным расширением Srb в последующих вызовах HwStorBuildIo и HwStorStartIo. Все данные в исходном расширении Srb будут потеряны.
    • Минипорт не должен обновлять DataTransferLength Srb.
    • Так как выдается новое расширение Srb, мини-порт должен убедиться, что он никогда не выдает SRB_STATUS_BUSY в середине транзакции SCSI. После запуска транзакции ее необходимо завершить или отменить. Состояние занятости оборудования во время транзакции должно обрабатываться драйвером мини-порта.

Имя HwStorStartIo — это заполнитель, описывающий набор подпрограмм минипорта в элементе HwStartIo структуры HW_INITIALIZATION_DATA . Эта структура передается в параметре HwInitializationDatastorPortInitialize. Фактический прототип этой подпрограммы определен в Storport.h следующим образом:

typedef
BOOLEAN
(*PHW_STARTIO) (
  _In_ PVOID  DeviceExtension,
  _In_ PSCSI_REQUEST_BLOCK  Srb
  );

Начиная с Windows 8 параметр Srb может указывать на SCSI_REQUEST_BLOCK или STORAGE_REQUEST_BLOCK. Если идентификатор функции в поле "Функция" SRB_FUNCTION_STORAGE_REQUEST_BLOCK, SRB является структурой запросов STORAGE_REQUEST_BLOCK.

Примеры

Чтобы определить подпрограмму обратного вызова HwStorStartIo , необходимо сначала предоставить объявление функции, которое требуется для статического средства проверки драйверов (SDV) и других средств проверки, как показано в следующем примере кода:

Чтобы определить функцию обратного вызова HwStorStartIo , необходимо сначала указать объявление функции, определяющее тип определяемой функции обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с использованием типов функций обратного вызова помогает анализу кода для драйверов, средства проверки статических драйверов (SDV) и других средств проверки найти ошибки, и это требование для написания драйверов для операционной системы Windows.

Например, чтобы определить подпрограмму обратного вызова HwStorStartIo , которая называется MyHwStartIo, используйте тип HW_STARTIO и реализуйте подпрограмму обратного вызова следующим образом:

HW_STARTIO MyHwStartIo

BOOLEAN
MyHwStartIo (
  _In_ PVOID  DeviceExtension,
  _In_ PSCSI_REQUEST_BLOCK  Srb
  );
  {
      ...
  }

Тип функции HW_STARTIO определен в файле заголовка Storport.h . Чтобы точнее определить ошибки при запуске средств анализа кода, обязательно добавьте _Use_decl_annotations_ annotation его в определение функции. Гарантирует _Use_decl_annotations_ annotation использование заметок, примененных к типу функции HW_STARTIO в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в разделе "Объявление функций с использованием типов ролей функций для драйверов Storport". Дополнительные сведения см. в _Use_decl_annotations_разделе "Поведение функции аннотирования".

Требования

   
Целевая платформа Универсальное
Заголовок storport.h (include Storport.h)
IRQL DISPATCH_LEVEL (см. раздел "Примечания".)

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

HwStorBuildIo

SCSI_REQUEST_BLOCK

STORAGE_REQUEST_BLOCK

StorPortInitialize