MINIPORT_MESSAGE_INTERRUPT 콜백 함수(ndis.h)

NDIS는 NIC가 메시지 기반 인터럽트를 생성할 때 MiniportMessageInterrupt 함수를 호출합니다.

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

구문

MINIPORT_MESSAGE_INTERRUPT MiniportMessageInterrupt;

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

매개 변수

[in] MiniportInterruptContext

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

[in] MessageId

MSI(메시지 신호 인터럽트) 메시지 식별자입니다. MessageId 는 에 대한 인덱스입니다. IO_INTERRUPT_MESSAGE_INFO_ENTRY 구조체 IO_INTERRUPT_MESSAGE_INFO 구조체입니다. 드라이버가 NdisMRegisterInterruptEx 함수를 사용하여 MSI에 성공적으로 등록되면 NDIS는 MessageInfoTable 멤버의 연결된 IO_INTERRUPT_MESSAGE_INFO 구조에 대한 포인터를 전달합니다.

[out] QueueDefaultInterruptDpc

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

[out] TargetProcessors

NDIS가 DPC를 예약해야 하는 대상 프로세서를 나타내는 비트 마스크입니다. 이 비트 마스크는 프로세서 그룹 0의 처음 32개 프로세서를 나타냅니다. 비트 마스크의 각 비트는 CPU를 식별합니다. 호출자가 비트 0을 설정하는 경우 NDIS는 CPU 0용 DPC를 예약합니다. 호출자가 비트 1을 설정하는 경우 NDIS는 CPU 1용 DPC를 예약합니다.

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

반환 값

MiniportMessageInterrupt 는 기본 NIC가 인터럽트를 생성한 경우 TRUE 를 반환합니다. 그렇지 않으면 FALSE를 반환 합니다.

설명

NdisMRegisterInterruptEx 함수를 사용하여 MSI(메시지 신호 인터럽트) 지원을 등록하는 미니포트 드라이버는 MiniportMessageInterrupt 함수를 제공해야 합니다.

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

NIC가 MSI를 생성하면 NDIS는 미니포트 드라이버의 MiniportMessageInterrupt 함수를 호출합니다.

MiniportMessageInterrupt 는 인터럽트에 대한 필수 상태 정보를 저장하고 가능한 한 많은 I/O 처리를 연기합니다. MiniportMessageInterruptDPC 함수입니다.

미니포트 드라이버가 지정된 메시지에 대해 DPC(지연 프로시저 호출)를 요청하는 경우 미니포트 드라이버는 해당 메시지에 대한 추가 인터럽트 모두를 사용하지 않도록 설정하고 모든 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는 프로세서 그룹 0의 표시된 각 CPU에서 DPC를 예약합니다.

MiniportMessageInterrupt가 NIC 레지스터 또는 상태 변수와 같은 지정된 메시지에 대한 리소스를 하위 IRQL에서 실행되는 다른 MiniportXxx 함수와 공유하는 경우 해당 MiniportXxx 함수는 를 호출해야 합니다. NdisMSynchronizeWithInterruptEx 함수입니다. 이렇게 하면 드라이버의 MiniportSynchronizeMessageInterrupt 함수가 동기화되고 다중 프로세서로부터 안전한 방식으로 공유 리소스에 액세스할 수 있습니다.

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

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

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

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

MINIPORT_MESSAGE_INTERRUPT MyMessageInterrupt;

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

_Use_decl_annotations_
BOOLEAN
 MyMessageInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    ULONG  MessageId,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

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

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

요구 사항

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

추가 정보

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterruptDPC

MiniportSynchronizeMessageInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

Receive Side Scaling (RSS)