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

Подпрограмма ScsiPortNotification сообщает драйверу порта операционной системы об определенных событиях, например, когда драйвер мини-порта завершает запрос или готов к запуску другого SRB, а также когда адаптер шины узла (HBA) указывает на определенные ошибки SCSI, возникшие во время операции.

Примечание

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

Синтаксис

SCSIPORT_API VOID ScsiPortNotification(
  SCSI_NOTIFICATION_TYPE NotificationType,
  PVOID                  HwDeviceExtension,
  ...                    
);

Параметры

NotificationType

Указывает тип уведомления. См. заметки.

HwDeviceExtension

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

...

Вариадические аргументы для этой подпрограммы. Количество и тип аргументов зависят от NotificationType. См. заметки.

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

None

Remarks

Подпрограмма ScsiPortNotification имеет другой набор необязательных параметров, связанных с каждым типом NotificationType. Ниже приведен список возможных значений для NotificationType , а также описания каждого значения.

  • NotificationType = RequestComplete

    Указывает, что данный Srb завершен. Если это значение задано, для ScsiPortNotification требуется один дополнительный параметр: адрес SRB. После этого уведомления драйвер порта операционной системы будет владельцем запроса. Драйвер мини-порта не должен обращаться к Srb и передавать Srb в другую подпрограмму (например , ScsiPortLogError).

    Синтаксис:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,   // RequestComplete
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PSCSI_REQUEST_BLOCK    Srb
    );
    
  • NotificationType = NextRequest

    Указывает, что драйвер мини-порта готов к другому запросу к целевому объекту, который в настоящее время не занят. Это уведомление должно быть отправлено драйвером мини-порта, как только драйвер будет готов к другому запросу. Обычно это уведомление отправляется из подпрограммы HwScsiStartIo , но иногда из подпрограммы HwScsiInterrupt (или HwScsiEnableInterruptsCallback).

  • NotificationType = NextLuRequest

    Указывает, что адаптер шины готов к другому запросу для указанной логической единицы. Если это значение задано, ScsiPortNotification требует трех дополнительных параметров: (1) идентификатор пути, (2) идентификатор целевого объекта и (3) номер логической единицы. Это значение следует использовать только в том случае, если HBA может ставить в очередь несколько запросов и поддерживать автозапрос или очередь с тегами.

    Синтаксис:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,   // NextLuRequest
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_                        PathId,
      _In_opt_                        TargetId,
      _In_opt_                        Lun
    );
    
  • NotificationType = ResetDetected

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

  • NotificationType = CallEnableInterrupts

    Указывает, что драйверу мини-порта требуется, чтобы драйвер порта для конкретной операционной системы вызывал подпрограмму HwScsiEnableInterruptsCallback драйвера мини-порта. Если это значение задано, для ScsiPortNotification требуется дополнительный параметр: точка входа для HwScsiEnableInterruptsCallback. Подпрограмма HwScsiInterrupt драйвера мини-порта выполняет этот вызов после отключения прерываний в адаптере безопасности, чтобы отложить обработку ввода-вывода, управляемой прерыванием, если адаптеру HBA требуется опрос или приостановка в ISR. Во время выполнения обратного вызова системные прерывания остаются включенными, но подпрограмма HwScsiInterrupt драйвера мини-порта не будет вызываться. HwScsiEnableInterruptsCallback отвечает за завершение отложенной обработки ввода-вывода и за повторный вызов ScsiPortNotification с помощью CallDisableInterrupts и точки входа HwScsiDisableInterruptsCallback драйвера мини-порта.

    Синтаксис:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,           // CallEnableInterrupts
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PHW_INTERRUPT          HwScsiXxxInterruptsCallback
    );
    
  • NotificationType = CallDisableInterrupts

    Указывает, что драйверу мини-порта требуется, чтобы драйвер порта для конкретной операционной системы вызывал подпрограмму HwScsiDisableInterruptsCallback драйвера мини-порта. Если это значение задано, для ScsiPortNotification требуется дополнительный параметр: точка входа для HwScsiDisableInterruptsCallback. Хотя этот обратный вызов выполняется, он не может быть вытеснен прерыванием, за исключением устройства с более высоким приоритетом прерывания, чем HBA. В этом обратном вызове драйвер минипорта повторно прерывает работу адаптера.

    Синтаксис:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,          // CallDisableInterrupts
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PHW_INTERRUPT          HwScsiXxxInterruptsCallback
    );
    
  • NotificationType = RequestTimerCall

    Указывает, что драйверу мини-порта требуется, чтобы драйвер портов для конкретной операционной системы вызывал подпрограмму HwScsiTimer драйвера мини-порта в запрошенном количестве микросекунд. Если это значение задано, ScsiPortNotification требует двух дополнительных параметров: (1) точки входа для подпрограммы HwScsiTimer драйвера мини-порта и (2) интервала MiniportTimerValue в микросекундах. Обратите внимание, что разрешение системного таймера составляет примерно 10 миллисекундах.

    Синтаксис:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // RequestTimerCall
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PHW_TIMER              HwScsiTimer,
      _In_opt_ ULONG                  MiniportTimerValue
    );
    
  • NotificationType = BusChangeDetected

    Указывает, что целевое устройство могло быть добавлено или удалено из динамической шины. Если это значение задано, для ScsiPortNotification требуется дополнительный параметр: идентификатор пути шины, в которой было обнаружено изменение. После этого уведомления драйвер порта повторно заменяется шиной, выдавая команды ЗАПРОСА. Перечисление шины занимает много времени и связывает автобус, поэтому водитель минипорта не должен отправлять это уведомление без необходимости.

    Синтаксис:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // BusChangeDetected
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ UCHAR                  PathId
    );
    
  • NotificationType = WMIEvent

    Указывает, что драйвер минипорта обнаружил событие, для которого зарегистрирован один или несколько потребителей данных WMI. Если это значение задано, ScsiPortNotification требует по крайней мере три дополнительных аргумента: (1) указатель на структуру событий WMI, (2) размер структуры событий и (3) идентификатор пути целевого устройства, если событие возникло с устройства, или 0xFF, если событие возникло из адаптера. Если (3) является идентификатором пути, ScsiPortNotification требует два дополнительных аргумента: (4) идентификатор целевого объекта и (5) номер логического устройства (LUN) целевого устройства.

    Синтаксис для pathId != 0xFF

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // WMIEvent
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PVOID                  WMIEvent,
      _In_opt_ UCHAR                  PathId,              // != 0xFF
      _In_opt_ UCHAR                  TargetId,
      _In_opt_ UCHAR                  Lun
    );
    

    Синтаксис для PathId = 0xFF

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // WMIEvent
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PVOID                  WMIEvent,
      _In_opt_ UCHAR                  PathId               // 0xFF
    );
    
  • NotificationType = WMIReregister

    Указывает, что драйвер минипорта изменил элементы данных или количество экземпляров заданного блока данных, ранее зарегистрированных путем вызова IoWMIRegistrationControl. Если задан параметр WMIReregister , ScsiPortNotification требует по крайней мере два дополнительных аргумента: (1) идентификатор пути целевого устройства для повторной регистрации устройства или 0xFF для повторной регистрации адаптера. Если (1) является идентификатором пути, ScsiPortNotification требует два дополнительных аргумента: (2) идентификатор целевого объекта и (3) номер логического устройства (LUN) целевого устройства.

    Синтаксис для pathId != 0xFF

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // WMIReregister
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ UCHAR                  PathId,             // != 0xFF
      _In_opt_ UCHAR                  TargetId,
      _In_opt_ UCHAR                  Lun
    );
    

    Синтаксис для PathId = 0xFF

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,   // WMIReregister
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ UCHAR                  PathId              // 0xFF
    );
    

Каждый драйвер мини-порта должен дважды вызывать ScsiPortNotification для каждого вызова подпрограммы HwScsiStartIo драйвера мини-порта с SRB, что драйвер минипорта успешно завершает. Во-первых, драйвер мини-порта вызывает ScsiPortNotification с типом уведомленияNextRequest или NextLuRequest , если драйвер мини-порта поддерживает очередь с тегами или несколько запросов на lu. Затем драйвер мини-порта вызывает ScsiPortNotification с типом уведомленияRequestComplete и запросом, который он только что выполнил.

Подпрограмма HwScsiInterrupt драйвера мини-порта, скорее всего, вызовет ScsiPortNotification с типом уведомленияResetDetected.

Если для HBA требуется, чтобы драйвер мини-порта использовал более миллисекунд обработки операций ввода-вывода, управляемых прерываниями, его подпрограмма HwScsiInterrupt должна отключать прерывания на адаптере безопасности и вызывать ScsiPortNotification с CallEnableInterrupts и предоставляемой драйвером подпрограммой HwScsiEnableInterruptsCallback . Эта подпрограмма, в свою очередь, вызывает ScsiPortNotification с CallDisableInterrupts и соответствующим предоставленным драйвером HwScsiDisableInterruptsCallback.

Драйвер мини-порта, зарегистрированный как поставщик данных WMI, может вызывать ScsiPortNotification с WMIEvent для публикации события, для которого он ранее получил запрос на включение. Драйвер порта помещает событие в очередь в области данных прерывания расширения устройства драйвера мини-порта для последующей обработки на более низком IRQL. Так как одновременно можно поместить в очередь только ограниченное количество событий, драйвер мини-порта должен использовать WMIEvent для сигналов об исключительных, а не обычных условиях, и он должен дать драйверу порта время, чтобы вернуться к DISPATCH_LEVEL между публикациями, чтобы предотвратить потерю событий.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть srb.h (включая Miniport.h, Scsi.h)
Библиотека Scsiport.lib; Storport.lib
IRQL (См. раздел "Примечания")

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

HwScsiDisableInterruptsCallback

HwScsiEnableInterruptsCallback

HwScsiTimer

IoWMIRegistrationControl

ScsiPortCompleteRequest