MINIPORT_ISR 콜백 함수(ndis.h)

NDIS는 NIC 또는 NIC와 인터럽트를 공유하는 다른 디바이스가 인터럽트를 생성할 때 MiniportInterrupt 함수를 호출합니다.

참고 MINIPORT_ISR 형식을 사용하여 이 함수를 선언해야 합니다. 자세한 내용은 다음 예제 섹션을 참조하세요.

구문

MINIPORT_ISR MiniportIsr;

BOOLEAN MiniportIsr(
  [in]  NDIS_HANDLE MiniportInterruptContext,
  [out] PBOOLEAN QueueDefaultInterruptDpc,
  [out] PULONG TargetProcessors
)
{...}

매개 변수

[in] MiniportInterruptContext

인터럽트 컨텍스트 정보 블록에 대한 핸들입니다. 미니포트 드라이버는 미니포트 드라이버가 NdisMRegisterInterruptEx 함수에 전달한 MiniportInterruptContext 매개 변수에 이 핸들을 제공했습니다.

[out] QueueDefaultInterruptDpc

미니포트 드라이버가 이 호출에서 반환하기 전에 설정하는 BOOLEAN 변수에 대한 포인터입니다. 미니포트 드라이버는 이 값을 TRUE 로 설정하여 드라이버에 기본(현재) CPU에 DPC가 필요함을 나타냅니다. 이 값을 TRUE로 설정하면 NDIS는 TargetProcessors 매개 변수의 값을 무시합니다. FALSE로 설정된 경우 NDIS는 TargetProcessors 매개 변수의 값을 사용하여 DPC를 예약합니다. QueueDefaultInterruptDpcTRUE이면 NDIS는 MiniportInterrupt의 반환 값에 관계없이 DPC를 예약합니다.

[out] TargetProcessors

NDIS가 DPC를 예약해야 하는 대상 프로세서를 나타내는 비트 마스크입니다. 이 비트 마스크는 프로세서 그룹 0의 처음 32개 프로세서를 나타냅니다. 비트 마스크의 각 비트는 CPU를 식별합니다. 호출자가 비트 0을 설정하면 NDIS는 CPU 0에 대한 DPC를 예약합니다. 호출자가 비트 1을 설정하면 NDIS는 CPU 1에 대한 DPC를 예약합니다. QueueDefaultInterruptDpcFALSE로 설정되고 TargetProcessors가 0으로 설정된 경우 NDIS는 모든 DPC를 예약하지 않습니다. 그렇지 않으면 NDIS는 MiniportInterrupt의 반환 값에 관계없이 DPC를 예약합니다.

참고 NDIS 6.20 이상 드라이버는 이 매개 변수를 사용하여 DPC를 예약하면 안 됩니다. 대신 이 매개 변수를 0으로 설정하고 NdisMQueueDpcEx 함수를 사용하여 DPC를 예약해야 합니다.

반환 값

MiniportInterrupt는 다음 값 중 하나를 반환합니다.

반환 코드 설명
사실

MiniportInterrupt 는 기본 NIC가 인터럽트를 생성했음을 확인했습니다.

FALSE

MiniportInterrupt 는 기본 NIC가 인터럽트를 생성하지 않았다고 확인했습니다.

참고 NDIS는 MiniportInterrupt가 반환하는 값에 관계없이 QueueDefaultInterruptDpcTargetProcessors 매개 변수에 지정된 값에 따라 DPC를 큐에 대기합니다. 그러나 MiniportInterrupt 는 여전히 올바른 값을 반환해야 합니다.

설명

NdisMRegisterInterruptEx 함수에 인터럽트를 등록하는 미니포트 드라이버는 MiniportInterrupt 함수를 제공해야 합니다.

미니포트 드라이버는 MiniportInterrupt 함수에서 가능한 한 적은 작업을 수행해야 합니다. NIC가 MiniportInterruptDPC 함수에 생성하는 인터럽트에 대한 I/O 작업을 연기해야 합니다.

NIC의 인터럽트 라인에서 인터럽트가 발생하면 NDIS는 미니포트 드라이버의 MiniportInterrupt 함수를 호출합니다.

모든 NIC는 I/O 버스의 다른 디바이스와 라인 기반 인터럽트 공유가 가능합니다. NIC가 인터럽트를 생성하지 않은 경우 시스템에서 인터럽트를 생성한 디바이스의 드라이버를 호출할 수 있도록 MiniportInterrupt즉시 FALSE 를 반환해야 합니다. QueueDefaultInterruptDpcFALSE로 설정되어 있고 TargetProcessors 매개 변수가 0으로 설정된 경우 NDIS는 모든 DPC를 예약하지 않습니다. 그렇지 않으면 NDIS는 MiniportInterrupt에서 reMiniportInterruptturn 값이 없는 DPC를 예약합니다.

인터럽트가 NIC에 대한 경우 MiniportInterrupt 는 NIC에서 인터럽트를 해제하고, 인터럽트에 대해 수행해야 하는 상태를 저장하고, 가능한 한 많은 I/O 처리를 MiniportInterruptDPC 함수에 연기합니다.

기본 NIC가 지정된 인터럽트(인터럽트)를 생성하고 미니포트 드라이버가 DPC(지연 프로시저 호출)를 요청하는 경우 미니포트 드라이버는 NIC의 모든 추가 인터럽트에서 비활성화하고 모든 DPC가 완료된 후 인터럽트 다시 활성화해야 합니다.

미니포트 드라이버는 기본 CPU에 대해서만 DPC를 예약하도록 QueueDefaultInterruptDpcTRUE 로 설정해야 합니다. 예를 들어 다음과 같은 경우 드라이버에서 이 작업을 수행할 수 있습니다.

  • NIC는 보내기 작업 또는 다른 CPU에서 실행되지 않는 다른 요청의 완료를 알리기 위해 인터럽트(interrupt)를 생성했습니다.
  • NIC는 수신된 데이터를 알리기 위해 인터럽트(interrupt)를 생성했으며 미니포트 드라이버는 수신된 패킷을 별도의 DPC로 처리할 수 없습니다.
  • 인터럽트는 수신된 패킷을 나타내고 미니포트 드라이버는 수신된 패킷을 별도의 DPC로 처리할 수 있지만 미니포트 드라이버에 대해 RSS(수신측 크기 조정) 가 사용되지 않습니다. 자세한 내용은 OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS 참조하세요.
미니포트 드라이버가 수신된 패킷을 별도의 DPC로 처리하는 경우 드라이버는 QueueDefaultInterruptDpc 매개 변수를 FALSE로 설정합니다. 미니포트 드라이버는 각 비어 있지 않은 수신 큐와 연결된 CPU에 대한 TargetProcessors 비트를 설정해야 합니다. NDIS는 표시된 각 CPU에서 DPC를 예약합니다.
참고 NDIS는 MiniportInterrupt가 반환하는 값에 관계없이 QueueDefaultInterruptDpcTargetProcessors 매개 변수에 지정된 값에 따라 DPC를 큐에 대기합니다. 그러나 MiniportInterrupt 는 여전히 올바른 값을 반환해야 합니다.
MiniportInterrupt가 하위 IRQL에서 실행되는 다른 MiniportXxx 함수와 NIC 레지스터 또는 상태 변수와 같은 리소스를 공유하는 경우 해당 MiniportXxx 함수는 NdisMSynchronizeWithInterruptEx 함수를 호출해야 합니다. 이렇게 하면 드라이버의 MiniportSynchronizeInterrupt 함수가 동기화되고 다중 프로세서로부터 안전한 방식으로 공유 리소스에 액세스할 수 있습니다.

미니포트 드라이버는 MiniportInitializeEx 또는 MiniportHaltEx 함수에서 NdisMDeregisterInterruptEx 함수를 호출하여 NdisMRegisterInterruptEx로 할당된 리소스를 해제할 수 있습니다. NdisMDeregisterInterruptEx가 반환되면 NDIS는 미니포트 드라이버의 MiniportInterrupt 또는 MiniportInterruptDPC 함수를 호출하지 않습니다.

NDIS는 미니포트 드라이버가 NdisMRegisterInterruptEx에 대한 이전 호출에서 등록한 인터럽트의 DIRQL에서 MiniportInterrupt를 호출합니다. 따라서 MiniportInterrupt는 IRQL에서 안전하게 호출할 수 있는 NdisRawXxx 또는 NdisRead/WriteRegisterXxx 함수와 같은 NDIS 함수의 하위 집합을 호출해야 합니다.

예제

MiniportInterrupt 함수를 정의하려면 먼저 정의 중인 함수의 형식을 식별하는 함수 선언을 제공해야 합니다. Windows 드라이버에 대한 함수 형식 집합을 제공합니다. 함수 형식을 사용하여 함수를 선언하면 드라이버, SDV(정적 드라이버 검증 도구) 및 기타 확인 도구에 대한 Code Analysis 오류를 찾는 데 도움이 되며, Windows 운영 체제용 드라이버를 작성하기 위한 요구 사항입니다.

예를 들어 " MyInterrupt"라는 MiniportInterrupt 함수를 정의하려면 다음 코드 예제와 같이 MINIPORT_ISR 형식을 사용합니다.

MINIPORT_ISR MyInterrupt;

그런 다음 다음과 같이 함수를 구현합니다.

_Use_decl_annotations_
BOOLEAN
 MyInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

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

Use_decl_annotations 대한 자세한 내용은 함수 동작 주석 지정을 참조하세요.

요구 사항

   
지원되는 최소 클라이언트 NDIS 6.0 이상에서 지원됩니다.
대상 플랫폼 Windows
헤더 ndis.h(Ndis.h 포함)
IRQL 설명 섹션 참조

참고 항목

MiniportHaltEx

MiniportInitializeEx

MiniportInterruptDPC

MiniportSynchronizeInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx

OID_GEN_RECEIVE_SCALE_CAPABILITIES

OID_GEN_RECEIVE_SCALE_PARAMETERS

Receive Side Scaling (RSS)