다음을 통해 공유


ScsiPortNotification 함수(srb.h)

ScsiPortNotification 루틴은 미니포트 드라이버가 요청을 완료하거나 다른 SRB를 시작할 준비가 된 경우와 HBA(호스트 버스 어댑터)가 작업 중에 발생한 특정 SCSI 오류 조건을 나타내는 경우와 같은 특정 이벤트를 운영 체제별 포트 드라이버에 알릴 수 있습니다.

참고

SCSI 포트 드라이버 및 SCSI 미니포트 드라이버 모델은 나중에 변경되거나 사용할 수 없습니다. 대신 Storport 드라이버Storport 미니포트 드라이버 모델을 사용하는 것이 좋습니다.

구문

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

매개 변수

NotificationType

알림 유형을 지정합니다. 설명 부분을 참조하세요.

HwDeviceExtension

하드웨어 디바이스 확장에 대한 포인터입니다. 포트 드라이버가 미니포트 드라이버를 대신하여 할당하고 초기화하는 HBA별 스토리지 영역입니다. 미니포트 드라이버는 일반적으로 HBA 상태 및 HBA의 매핑된 액세스 범위와 같은 HBA 관련 정보를 이 확장에 저장합니다. 이 영역은 미니포트 드라이버가 ScsiPortInitialize를 호출한 직후 HBA 디바이스 개체의 DeviceExtension-HwDeviceExtension> 멤버의 미니포트 드라이버에서 사용할 수 있습니다. 포트 드라이버는 디바이스를 제거할 때 이 메모리를 해제합니다.

...

이 루틴에 대한 Variadic 인수입니다. 인수의 수와 형식은 NotificationType에 따라 달라집니다. 설명 부분을 참조하세요.

반환 값

없음

설명

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

    HBA가 지정된 논리 단위에 대한 다른 요청에 대해 준비되었음을 나타냅니다. 이 값을 설정하면 ScsiPortNotification 에는 (1) 경로 ID, (2) 대상 ID 및 (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에서 인터럽트를 사용하지 않도록 설정한 이 호출을 수행하여 HBA가 ISR에서 폴링 또는 중단이 필요한 경우 일부 인터럽트 기반 I/O 처리를 연기합니다. 콜백이 실행되는 동안 시스템 인터럽트는 활성화된 상태로 유지되지만 미니포트 드라이버의 HwScsiInterrupt 루틴은 호출되지 않습니다. HwScsiEnableInterruptsCallback은 지연된 I/O 처리를 완료하고 CallDisableInterrupts 및 미니포트 드라이버의 HwScsiDisableInterruptsCallback 진입점을 사용하여 ScsiPortNotification을 다시 호출해야 합니다.

    구문

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

    미니포트 드라이버에 미니포트 드라이버의 HwScsiDisableInterruptsCallback 루틴을 호출하기 위해 운영 체제별 포트 드라이버가 필요했음을 나타냅니다. 이 값을 설정하면 ScsiPortNotification 에는 HwScsiDisableInterruptsCallback의 진입점인 추가 매개 변수가 필요합니다. 이 콜백이 실행되는 동안 HBA보다 우선 순위가 높은 인터럽트를 사용하는 디바이스를 제외하고는 인터럽트를 통해 선점할 수 없습니다. 이 콜백에서 미니포트 드라이버 재엔블은 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 에는 변경 내용이 검색된 버스의 경로 ID인 추가 매개 변수가 필요합니다. 이 알림 이후에 포트 드라이버는 INQUIRY 명령을 실행하여 버스를 다시 열거합니다. 버스 열거형은 시간이 많이 걸리고 버스와 연결되므로 미니포트 드라이버가 이 알림을 불필요하게 보내지 않아야 합니다.

    구문

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

    미니포트 드라이버가 하나 이상의 WMI 데이터 소비자가 등록된 이벤트를 감지했음을 나타냅니다. 이 값을 설정하면 ScsiPortNotification 에는 세 개 이상의 추가 인수가 필요합니다. (1) WMI 이벤트 구조에 대한 포인터, (2) 이벤트 구조의 크기, (3) 이벤트가 디바이스에서 시작된 경우 대상 디바이스의 경로 ID, 또는 이벤트가 어댑터에서 시작된 경우 0xFF. (3)이 경로 ID인 경우 ScsiPortNotification 에는 (4) 대상 ID 및 (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) 대상 디바이스의 경로 ID를 사용하여 해당 디바이스를 다시 등록하거나 어댑터를 다시 등록할 0xFF. (1)이 경로 ID인 경우 ScsiPortNotification 에는 (2) 대상 ID 및 (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
    );
    

모든 미니포트 드라이버는 미니포트 드라이버가 성공적으로 완료된 SRB를 사용하여 미니포트 드라이버의 HwScsiStartIo 루틴을 호출할 때마다 ScsiPortNotification을 두 번 호출해야 합니다. 먼저 미니포트 드라이버는 Miniport 드라이버가 태그가 지정된 큐 또는 LU당 여러 요청을 지원하는 경우 NextRequestNotificationType 또는 NextLuRequest를 사용하여 ScsiPortNotification을 호출합니다. 그런 다음 미니포트 드라이버는 RequestCompleteNotificationType 및 방금 충족된 요청을 사용하여 ScsiPortNotification을 호출합니다.

미니포트 드라이버의 HwScsiInterrupt 루틴은 ResetDetectedNotificationType을 사용하여 ScsiPortNotification을 호출할 가능성이 가장 높습니다.

HBA에서 미니포트 드라이버가 인터럽트 기반 I/O 작업을 밀리초 이상 처리하도록 요구하는 경우 HwScsiInterrupt 루틴은 HBA에서 인터럽트를 사용하지 않도록 설정하고 CallEnableInterrupts 및 드라이버 제공 HwScsiEnableInterruptsCallback 루틴을 사용하여 ScsiPortNotification을 호출해야 합니다. 이 루틴은 CallDisableInterrupts 및 해당 드라이버 제공 HwScsiDisableInterruptsCallback을 사용하여 ScsiPortNotification을 호출합니다.

WMI 데이터 공급자로 등록된 미니포트 드라이버는 WMIEvent사용하여 ScsiPortNotification을 호출하여 이전에 사용 요청을 받은 이벤트를 게시할 수 있습니다. 포트 드라이버는 하위 IRQL에서 나중에 처리하기 위해 미니포트 드라이버 디바이스 확장의 인터럽트 데이터 영역에서 이벤트를 큐에 대기합니다. 제한된 수의 이벤트만 한 번에 큐에 대기할 수 있으므로 미니포트 드라이버는 WMIEvent 를 사용하여 일상적인 조건이 아닌 예외적인 신호를 보내야 하며, 이벤트가 손실되지 않도록 포트 드라이버가 게시 간에 DISPATCH_LEVEL 돌아갈 시간을 제공해야 합니다.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 srb.h(Miniport.h, Scsi.h 포함)
라이브러리 Scsiport.lib; Storport.lib
IRQL (설명 섹션 참조)

추가 정보

HwScsiDisableInterruptsCallback

HwScsiEnableInterruptsCallback

HwScsiTimer

IoWMIRegistrationControl

ScsiPortCompleteRequest