Función ScsiPortNotification (srb.h)

La rutina ScsiPortNotification informa al controlador de puerto específico del sistema operativo de determinados eventos, como cuando un controlador de miniporte completa una solicitud o está listo para iniciar otro SRB, así como cuando el adaptador de bus host (HBA) indica ciertas condiciones de error SCSI que se produjeron durante una operación.

Nota

Los modelos del controlador de puerto SCSI y del controlador de miniporte SCSI pueden modificarse o no estar disponibles en el futuro. En su lugar, se recomienda usar el controlador Storport y los modelos de controlador de miniport storport .

Sintaxis

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

Parámetros

NotificationType

Especifica el tipo de notificación. Vea la sección Comentarios.

HwDeviceExtension

Puntero a la extensión de dispositivo de hardware. Se trata de un área de almacenamiento por HBA que el controlador de puerto asigna e inicializa en nombre del controlador de minipuerto. Los controladores de minipuerto suelen almacenar información específica de HBA en esta extensión, como el estado del HBA y los intervalos de acceso asignados del HBA. Esta área está disponible para el controlador de miniport en el miembro DeviceExtension-HwDeviceExtension> del objeto de dispositivo del HBA inmediatamente después de que el controlador de miniporte llame a ScsiPortInitialize. El controlador de puerto libera esta memoria cuando quita el dispositivo.

...

Argumentos variádicos para esta rutina. El número y el tipo de argumentos dependen de NotificationType. Vea la sección Comentarios.

Valor devuelto

None

Observaciones

La rutina ScsiPortNotification tiene un conjunto diferente de parámetros opcionales asociados a cada NotificationType. La lista de valores posibles para NotificationType sigue, junto con descripciones para cada valor.

  • NotificationType = RequestComplete

    Indica que el Srb dado ha finalizado. Si se establece este valor, ScsiPortNotification requiere un parámetro adicional: la dirección del SRB. Después de esta notificación, el controlador de puerto específico del sistema operativo posee la solicitud. El controlador de miniporte no debe tener acceso al Srb y no debe pasar el Srb a otra rutina (por ejemplo , ScsiPortLogError).

    Sintaxis:

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

    Indica que el controlador de minipuerto está listo para otra solicitud a un destino que no está ocupado actualmente. El controlador de miniporte debe enviar esta notificación tan pronto como el controlador esté listo para otra solicitud. Normalmente, esta notificación se envía desde la rutina HwScsiStartIo , pero, a veces, desde la rutina HwScsiInterrupt (o HwScsiEnableInterruptsCallback).

  • NotificationType = NextLuRequest

    Indica que el HBA está listo para otra solicitud para la unidad lógica especificada. Si se establece este valor, ScsiPortNotification requiere tres parámetros adicionales: (1) el identificador de ruta de acceso, (2) el identificador de destino y (3) el número de unidad lógica. Este valor solo se debe usar si el HBA puede poner en cola varias solicitudes y admitir la detección de solicitudes automáticas o la puesta en cola etiquetada.

    Sintaxis:

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

    Indica que el HBA ha detectado un restablecimiento en el bus SCSI. Después de esta notificación, el controlador de minipuerto sigue siendo responsable de completar las solicitudes activas. El controlador de puerto SCSI administrará todos los retrasos de restablecimiento de bus necesarios.

  • NotificationType = CallEnableInterrupts

    Indica que el controlador de miniporte requiere el controlador de puerto específico del sistema operativo para llamar a la rutina HwScsiEnableInterruptsCallback del controlador de miniporte. Si se establece este valor, ScsiPortNotification requiere un parámetro adicional: el punto de entrada para HwScsiEnableInterruptsCallback. La rutina HwScsiInterrupt del controlador de miniporte realiza esta llamada después de deshabilitar las interrupciones en el HBA, para aplazar algún procesamiento de E/S controlado por interrupciones si el HBA requiere sondeo o detendimiento en el ISR. Mientras se ejecuta la devolución de llamada, las interrupciones del sistema permanecen habilitadas, pero no se llamará a la rutina HwScsiInterrupt del controlador de miniporte. HwScsiEnableInterruptsCallback es responsable de completar el procesamiento de E/S diferido y llamar de nuevo a ScsiPortNotification con CallDisableInterrupts y el punto de entrada HwScsiDisableInterruptsCallback del controlador de miniporte.

    Sintaxis:

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

    Indica que el controlador de miniporte requiere el controlador de puerto específico del sistema operativo para llamar a la rutina HwScsiDisableInterruptsCallback del controlador de miniporte. Si se establece este valor, ScsiPortNotification requiere un parámetro adicional: el punto de entrada para HwScsiDisableInterruptsCallback. Aunque esta devolución de llamada se ejecuta, no puede ser adelantada por una interrupción excepto desde un dispositivo con una interrupción de prioridad más alta que el HBA. En esta devolución de llamada, el controlador de miniporte vuelve a habilitar las interrupciones en el HBA.

    Sintaxis:

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

    Indica que el controlador de miniporte requiere el controlador de puerto específico del sistema operativo para llamar a la rutina HwScsiTimer del controlador de miniporte en el número solicitado de microsegundos. Si se establece este valor, ScsiPortNotification requiere dos parámetros adicionales: (1) el punto de entrada para la rutina HwScsiTimer del controlador de miniport y (2) un intervalo MiniportTimerValue , en microsegundos. Tenga en cuenta que la resolución del temporizador del sistema es de aproximadamente 10 milisegundos.

    Sintaxis:

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

    Indica que es posible que se haya agregado o quitado un dispositivo de destino de un bus dinámico. Si se establece este valor, ScsiPortNotification requiere un parámetro adicional: el identificador de ruta de acceso del bus en el que se detectó el cambio. Después de esta notificación, el controlador de puerto vuelve a enumerar el bus mediante la emisión de comandos INQUIRY. La enumeración de bus consume mucho tiempo y enlaza el bus, por lo que un controlador de miniporte no debe enviar esta notificación innecesariamente.

    Sintaxis:

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

    Indica que el controlador de miniporte ha detectado un evento para el que se registran uno o varios consumidores de datos WMI. Si se establece este valor, ScsiPortNotification requiere al menos tres argumentos adicionales: (1) un puntero a una estructura de eventos WMI, (2) el tamaño de la estructura de eventos y (3) el identificador de ruta de acceso del dispositivo de destino si el evento se originó en un dispositivo o 0xFF si el evento se originó en el adaptador. Si (3) es un identificador de ruta de acceso, ScsiPortNotification requiere dos argumentos adicionales: (4) el identificador de destino y (5) el número de unidad lógica (LUN) del dispositivo de destino.

    Sintaxis para 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
    );
    

    Sintaxis de PathId = 0xFF

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

    Indica que el controlador de minipuerto ha cambiado los elementos de datos o el número de instancias de un bloque de datos determinado registrado anteriormente mediante una llamada a IoWMIRegistrationControl. Si se establece WMIReregister , ScsiPortNotification requiere al menos dos argumentos adicionales: (1) el identificador de ruta de acceso del dispositivo de destino para volver a registrar ese dispositivo o 0xFF para volver a registrar el adaptador. Si (1) es un identificador de ruta de acceso, ScsiPortNotification requiere dos argumentos adicionales: (2) el identificador de destino y (3) el número de unidad lógica (LUN) del dispositivo de destino.

    Sintaxis para 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
    );
    

    Sintaxis de PathId = 0xFF

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

Cada controlador de minipuerto debe llamar a ScsiPortNotification dos veces para cada llamada a la rutina HwScsiStartIo del controlador de miniporte con un SRB que el controlador de miniporte se completa correctamente. En primer lugar, el controlador de miniport llama a ScsiPortNotification con notificationType de NextRequest o con NextLuRequest si el controlador de miniporte admite la puesta en cola etiquetada o varias solicitudes por LU. A continuación, el controlador de miniport llama a ScsiPortNotification con notificationType of RequestComplete y la solicitud que acaba de satisfacer.

Es más probable que una rutina HwScsiInterrupt del controlador miniporte llame a ScsiPortNotification con notificationType de ResetDetected.

Si un HBA requiere que el controlador de miniporte use más de un milisegundo procesamiento de operaciones de E/S controladas por interrupciones, su rutina HwScsiInterrupt debe deshabilitar las interrupciones en el HBA y llamar a ScsiPortNotification con CallEnableInterrupts y una rutina HwScsiEnableInterruptsCallback proporcionada por el controlador. Esta rutina, a su vez, llama a ScsiPortNotification con CallDisableInterrupts y al HwScsiDisableInterruptsCallback proporcionado por el controlador correspondiente.

Un controlador de miniporte registrado como proveedor de datos WMI puede llamar a ScsiPortNotification con WMIEvent para publicar un evento para el que ha recibido previamente una solicitud de habilitación. El controlador de puerto pone en cola el evento en el área de datos de interrupción de la extensión del dispositivo del controlador de miniporte para su posterior procesamiento en un IRQL inferior. Dado que solo se puede poner en cola un número limitado de eventos a la vez, el controlador de miniporte debe usar WMIEvent para indicar condiciones excepcionales en lugar de rutinas, y debe dar al controlador de puerto tiempo para volver a DISPATCH_LEVEL entre publicaciones, para evitar que se pierdan eventos.

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado srb.h (incluya Miniport.h, Scsi.h)
Library Scsiport.lib; Storport.lib
IRQL (Consulte la sección Comentarios)

Consulte también

HwScsiDisableInterruptsCallback

HwScsiEnableInterruptsCallback

HwScsiTimer

IoWMIRegistrationControl

ScsiPortCompleteRequest