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

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

[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는 다음 값 중 하나를 반환합니다.

반환 코드 설명
TRUE

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의 re MiniportInterrupt턴 값에 관계없이 DPC를 예약 합니다.

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

기본 NIC가 지정된 인터럽트(인터럽트)를 생성하고 미니포트 드라이버가 DPC(지연 프로시저 호출)를 요청하는 경우 미니포트 드라이버는 NIC의 추가 인터럽트 모두를 사용하지 않도록 설정하고 모든 DPC가 완료된 후 인터럽트 사용을 다시 설정해야 합니다.

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

  • NIC는 송신 작업의 완료를 알리기 위해 인터럽트 또는 다른 CPU에서 실행되지 않는 다른 요청을 생성했습니다.
  • 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( 정적 드라이버 검증 도구 ) 및 기타 확인 도구에서 오류를 찾을 수 있으며 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)