Função ScsiPortNotification (srb.h)

A rotina ScsiPortNotification informa o driver de porta específico do sistema operacional de determinados eventos, como quando um driver de miniporto conclui uma solicitação ou está pronto para iniciar outro SRB, bem como quando o HBA (adaptador de barramento de host) indica determinadas condições de erro SCSI que ocorreram durante uma operação.

Observação

Os modelos de driver de porta SCSI e driver de miniporto SCSI podem ser alterados ou indisponíveis no futuro. Em vez disso, recomendamos usar os modelos de driver do Storport e do driver de miniporto storport .

Sintaxe

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

Parâmetros

NotificationType

Especifica o tipo de notificação. Consulte Observações.

HwDeviceExtension

Ponteiro para a extensão do dispositivo de hardware. Essa é uma área de armazenamento por HBA que o driver de porta aloca e inicializa em nome do driver de miniport. Os drivers de miniporto geralmente armazenam informações específicas do HBA nessa extensão, como o estado do HBA e os intervalos de acesso mapeados do HBA. Essa área está disponível para o driver de miniporto no membro DeviceExtension-HwDeviceExtension> do objeto de dispositivo do HBA imediatamente após o driver de miniporto chamar ScsiPortInitialize. O driver de porta libera essa memória quando remove o dispositivo.

...

Argumentos variádicos para essa rotina. O número e o tipo de argumentos dependem de NotificationType. Consulte Observações.

Valor retornado

Nenhum

Comentários

A rotina ScsiPortNotification tem um conjunto diferente de parâmetros opcionais associados a cada NotificationType. A lista de valores possíveis para NotificationType segue, juntamente com descrições para cada valor.

  • NotificationType = RequestComplete

    Indica que o Srb especificado foi concluído. Se esse valor for definido, ScsiPortNotification exigirá um parâmetro adicional: o endereço do SRB. Após essa notificação, o driver de porta específico do sistema operacional possui a solicitação. O driver de miniporte não deve acessar o Srb e não deve passar o Srb para outra rotina (como ScsiPortLogError).

    Sintaxe:

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

    Indica que o driver de miniporto está pronto para outra solicitação para um destino que não está ocupado no momento. Essa notificação deve ser enviada pelo driver de miniporte assim que o driver estiver pronto para outra solicitação. Normalmente, essa notificação é enviada da rotina HwScsiStartIo , mas, às vezes, da rotina HwScsiInterrupt (ou HwScsiEnableInterruptsCallback).

  • NotificationType = NextLuRequest

    Indica que o HBA está pronto para outra solicitação para a unidade lógica especificada. Se esse valor for definido, ScsiPortNotification exigirá três parâmetros adicionais: (1) a ID do caminho, (2) a ID de destino e (3) o número da unidade lógica. Esse valor só deverá ser usado se o HBA puder enfileirar várias solicitações e dar suporte ao sentido de solicitação automática ou à fila marcada.

    Sintaxe:

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

    Indica que o HBA detectou uma redefinição no barramento SCSI. Após essa notificação, o driver de miniporto ainda é responsável por concluir quaisquer solicitações ativas. O driver de porta SCSI gerenciará todos os atrasos necessários de redefinição de barramento.

  • NotificationType = CallEnableInterrupts

    Indica que o driver de miniporto requer que o driver de porta específico do sistema operacional chame a rotina HwScsiEnableInterruptsCallback do driver de miniport. Se esse valor for definido, ScsiPortNotification exigirá um parâmetro adicional: o ponto de entrada para hwScsiEnableInterruptsCallback. A rotina HwScsiInterrupt do driver de miniporto faz essa chamada depois de desabilitar interrupções no HBA, para adiar algum processamento de E/S controlado por interrupção se o HBA exigir sondagem ou paralisação no ISR. Enquanto o retorno de chamada é executado, as interrupções do sistema permanecem habilitadas, mas a rotina HwScsiInterrupt do driver de miniport não será chamada. O HwScsiEnableInterruptsCallback é responsável por concluir o processamento de E/S adiado e por chamar ScsiPortNotification novamente com CallDisableInterrupts e o ponto de entrada HwScsiDisableInterruptsCallback do driver de miniport.

    Sintaxe:

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

    Indica que o driver de miniporto requer que o driver de porta específico do sistema operacional chame a rotina HwScsiDisableInterruptsCallback do driver de miniport. Se esse valor for definido, ScsiPortNotification exigirá um parâmetro adicional: o ponto de entrada para hwScsiDisableInterruptsCallback. Embora esse retorno de chamada seja executado, ele não pode ser precedido por uma interrupção, exceto de um dispositivo com uma interrupção de prioridade mais alta do que o HBA. Nesse retorno de chamada, o driver de miniporte reabilita as interrupções no HBA.

    Sintaxe:

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

    Indica que o driver de miniporto requer que o driver de porta específico do sistema operacional chame a rotina HwScsiTimer do driver de miniporte no número solicitado de microssegundos. Se esse valor for definido, ScsiPortNotification exigirá dois parâmetros adicionais: (1) o ponto de entrada para a rotina HwScsiTimer do driver de miniport e (2) um intervalo MiniportTimerValue , em microssegundos. Observe que a resolução do temporizador do sistema é de aproximadamente 10 milissegundos.

    Sintaxe:

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

    Indica que um dispositivo de destino pode ter sido adicionado ou removido de um barramento dinâmico. Se esse valor for definido, ScsiPortNotification exigirá um parâmetro adicional: a ID do caminho do barramento no qual a alteração foi detectada. Após essa notificação, o driver de porta reabilita o barramento emitindo comandos INQUIRY. A enumeração de ônibus é demorada e vincula o ônibus, portanto, um motorista de miniporte não deve enviar essa notificação desnecessariamente.

    Sintaxe:

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

    Indica que o driver de miniporto detectou um evento para o qual um ou mais consumidores de dados WMI estão registrados. Se esse valor for definido, ScsiPortNotification exigirá pelo menos três argumentos adicionais: (1) um ponteiro para uma estrutura de eventos WMI, (2) o tamanho da estrutura do evento e (3) a ID do caminho do dispositivo de destino se o evento tiver se originado de um dispositivo ou 0xFF se o evento tiver se originado do adaptador. Se (3) for uma ID de caminho, ScsiPortNotification exigirá dois argumentos adicionais: (4) a ID de destino e (5) o LUN (número de unidade lógica) do dispositivo de destino.

    Sintaxe 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
    );
    

    Sintaxe para 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 o driver de miniporto alterou os itens de dados ou o número de instâncias de um determinado bloco de dados registrado anteriormente chamando IoWMIRegistrationControl. Se WMIReregister estiver definido, ScsiPortNotification exigirá pelo menos dois argumentos adicionais: (1) a ID do caminho do dispositivo de destino para registrar novamente esse dispositivo ou 0xFF para registrar novamente o adaptador. Se (1) for uma ID de caminho, ScsiPortNotification exigirá dois argumentos adicionais: (2) a ID de destino e (3) o LUN (número de unidade lógica) do dispositivo de destino.

    Sintaxe 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
    );
    

    Sintaxe para PathId = 0xFF

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

Cada driver de miniporto deve chamar ScsiPortNotification duas vezes para cada chamada para a rotina HwScsiStartIo do driver de miniporto com um SRB que o driver de miniporto conclui com êxito. Primeiro, o driver de miniporto chama ScsiPortNotification com o NotificationType de NextRequest ou com NextLuRequest se o driver de miniporto der suporte à fila marcada ou a várias solicitações por LU. Em seguida, o driver de miniporto chama ScsiPortNotification com o NotificationType de RequestComplete e a solicitação que ele acabou de atender.

A rotina HwScsiInterrupt de um driver de miniport é mais provável que chame ScsiPortNotification com o NotificationType de ResetDetected.

Se um HBA exigir que o driver de miniporte use mais de um processamento de milissegundo de operações de E/S controladas por interrupção, sua rotina HwScsiInterrupt deve desabilitar interrupções no HBA e chamar ScsiPortNotification com CallEnableInterrupts e uma rotina HwScsiEnableInterruptsCallback fornecida pelo driver. Essa rotina, por sua vez, chama ScsiPortNotification com CallDisableInterrupts e o HwScsiDisableInterruptsCallback fornecido pelo driver correspondente.

Um driver de miniporte registrado como um provedor de dados WMI pode chamar ScsiPortNotification com WMIEvent para postar um evento para o qual ele recebeu anteriormente uma solicitação de habilitação. O driver de porta enfileira o evento na área de dados de interrupção da extensão de dispositivo do driver de miniporto para processamento posterior em um IRQL inferior. Como apenas um número limitado de eventos pode ser enfileirado ao mesmo tempo, o driver de miniporto deve usar o WMIEvent para sinalizar condições excepcionais em vez de rotina, e deve dar ao driver de porta tempo para voltar a DISPATCH_LEVEL entre postagens, para evitar que eventos sejam perdidos.

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho srb.h (inclua Miniport.h, Scsi.h)
Biblioteca Scsiport.lib; Storport.lib
IRQL (Consulte a seção Comentários)

Confira também

HwScsiDisableInterruptsCallback

HwScsiEnableInterruptsCallback

HwScsiTimer

IoWMIRegistrationControl

ScsiPortCompleteRequest