Partilhar via


Função ScsiPortNotification (srb.h)

A rotina de 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 certas condições de erro SCSI que ocorreram durante uma operação.

Nota

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

Sintaxe

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

Parâmetros

NotificationType

Especifica o tipo de notificação. Consulte Comentários.

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 miniporto. 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 DeviceExtension->HwDeviceExtension membro 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 Comentários.

Valor de retorno

Nenhum

Observações

A rotina de 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 a Srb fornecida foi concluída. 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 é o proprietário da solicitação. O driver de miniporto não deve acessar o Srbe 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 miniporto assim que o driver estiver pronto para outra solicitação. Normalmente, essa notificação é enviada da rotina deHwScsiStartIo, mas, às vezes, da rotinaHwScsiInterrupt(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 todas as solicitações ativas. O driver de porta SCSI gerenciará todos os atrasos necessários de redefinição de ônibus.

  • NotificationType = CallEnableInterrupts

    Indica que o driver de miniporto requer que o driver de porta específico do sistema operacional chame o driver de miniporto HwScsiEnableInterruptsCallback rotina. Se esse valor for definido, ScsiPortNotification exigirá um parâmetro adicional: o ponto de entrada do HwScsiEnableInterruptsCallback. A rotina deHwScsiInterruptdo driver de miniporto faz essa chamada após desabilitar interrupções no HBA, para adiar algum processamento de E/S controlado por interrupção se o HBA exigir sondagem ou interrupção no ISR. Enquanto o retorno de chamada é executado, as interrupções do sistema permanecem habilitadas, mas a rotina de 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 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 o driver de miniporto HwScsiDisableInterruptsCallback rotina. Se esse valor for definido, ScsiPortNotification exigirá um parâmetro adicional: o ponto de entrada do HwScsiDisableInterruptsCallback. Embora esse retorno de chamada seja executado, ele não pode ser antecipado por uma interrupção, exceto por um dispositivo com uma interrupção de prioridade maior do que o HBA. Neste retorno de chamada, o driver de miniporto reenables interrompe 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 de HwScsiTimer do driver de miniportuário 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 de do HwScsiTimer do driver de miniport e (2) um intervalo de 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 ônibus emitindo comandos INQUIRY. A enumeração de ônibus é demorada e vincula o ônibus, portanto, um motorista de miniporto 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 de eventos e (3) a ID do caminho do dispositivo de destino se o evento se originou de um dispositivo ou 0xFF se o evento se originou 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 de 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 miniport dá 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 de HwScsiInterrupt de um driver de miniporto provavelmente chamará ScsiPortNotification com o NotificationType de ResetDetected.

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

Um driver de miniporto registrado como um provedor de dados WMI pode chamar ScsiPortNotification com WMIEvent para postar um evento para o qual ele já recebeu 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 WMIEvent para sinalizar condições excepcionais em vez de rotineiras, e deve dar ao driver de porta tempo para voltar ao DISPATCH_LEVEL entre postagens, para evitar que os eventos sejam perdidos.

Requisitos

Requisito Valor
da 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)

Consulte também

HwScsiDisableInterruptsCallback

HwScsiEnableInterruptsCallback

HwScsiTimer

IoWMIRegistrationControl

ScsiPortCompleteRequest