다음을 통해 공유


KSERVICE_ROUTINE 콜백 함수(wdm.h)

인터럽트 서비스 루틴(ISR)은 디바이스 인터럽트를 신속하게 처리하고 필요한 경우 수신된 데이터의 인터럽트 후 처리를 예약합니다.

통사론

KSERVICE_ROUTINE KserviceRoutine;

BOOLEAN KserviceRoutine(
  [in] _KINTERRUPT *Interrupt,
  [in] PVOID ServiceContext
)
{...}

매개 변수

[in] Interrupt

인터럽트에 대한 KINTERRUPT 구조체에 대한 호출자 제공 포인터입니다.

[in] ServiceContext

IoConnectInterrupt 또는 IoConnectInterruptEx 이전 호출에서 지정한 컨텍스트 정보에 대한 호출자 제공 포인터입니다.

반환 값

루틴이 드라이버의 디바이스 중 하나에서 인터럽트(interrupt)가 오지 않았다고 판단하는 경우 FALSE반환해야 합니다. 그렇지 않으면 루틴이 인터럽트 서비스를 제공하고 true 반환해야 합니다.

발언

특정 인터럽트 벡터 및 프로세서 선호도에 대해 ISR을 등록하려면 드라이버는 IoConnectInterrupt 또는 IoConnectInterruptEx호출해야 합니다.

드라이버의 인터럽트 서비스 루틴(ISR)은 IoConnectInterrupt 위해 SynchronizeIrql 매개 변수에 지정된 대로 일부 시스템 할당 DIRQL에서 인터럽트 컨텍스트에서 실행됩니다. (DIRQL 값이 더 높은 다른 디바이스는 ISR을 중단할 수 있습니다.)

시스템이 ISR을 호출하기 전에 인터럽트의 스핀 잠금(IoConnectInterrupt SpinLock 매개 변수)을 획득하므로 ISR은 다른 프로세서에서 동시에 실행할 수 없습니다. ISR이 반환되면 시스템에서 스핀 잠금을 해제합니다.

ISR은 먼저 컨텍스트제공된 컨텍스트 정보를 검사하여 드라이버의 디바이스 중 하나에서 인터럽트를 발생했는지 확인해야 합니다. 드라이버 디바이스 중 하나에서 인터럽트하지 않은 경우 I/O 관리자가 동일한 프로세서 및 인터럽트 벡터에 대해 ISR을 등록한 다른 드라이버를 호출할 수 있도록 루틴이 FALSE 즉시 반환해야 합니다.

ISR 구현에 대한 자세한 내용은 인터럽트 서비스 루틴참조하세요.

예제

인터럽트 서비스 콜백 루틴을 정의하려면 먼저 정의하는 콜백 루틴의 형식을 식별하는 함수 선언을 제공해야 합니다. Windows는 드라이버에 대한 콜백 함수 형식 집합을 제공합니다. 콜백 함수 형식을 사용하여 함수를 선언하면 드라이버 , SDV(정적 드라이버 검증 도구) 및 기타 확인 도구에 대한 코드 분석을데 도움이 되며 Windows 운영 체제용 드라이버를 작성하기 위한 요구 사항입니다.

예를 들어 명명된 MyInterruptService 콜백 루틴을 정의하려면 다음 코드 예제와 같이 KSERVICE_ROUTINE 형식을 사용합니다.

KSERVICE_ROUTINE MyInterruptService;

그런 다음 다음과 같이 콜백 루틴을 구현합니다.

_Use_decl_annotations_
BOOLEAN
  MyInterruptService(
    struct _KINTERRUPT  *Interrupt,
    PVOID  ServiceContext
    )
  {
      // Function body
  }

KSERVICE_ROUTINE 함수 형식은 Wdm.h 헤더 파일에 정의됩니다. 코드 분석 도구를 실행할 때 오류를 보다 정확하게 식별하려면 함수 정의에 _Use_decl_annotations_ 주석을 추가해야 합니다. _Use_decl_annotations_ 주석은 헤더 파일의 KSERVICE_ROUTINE 함수 형식에 적용되는 주석이 사용되는지 확인합니다. 함수 선언 요구 사항에 대한 자세한 내용은 WDM 드라이버함수 역할 형식을 사용하여 함수 선언을 참조하세요. _Use_decl_annotations_대한 자세한 내용은 함수 동작 주석참조하세요.

요구 사항

요구
대상 플랫폼 바탕 화면
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
IRQL DIRQL에서 호출됩니다(설명 섹션 참조).