WdfInterruptCreate 함수(wdfinterrupt.h)

[KMDF 및 UMDF에 적용]

WdfInterruptCreate 메서드는 프레임워크 인터럽트 개체를 만듭니다.

구문

NTSTATUS WdfInterruptCreate(
  [in]           WDFDEVICE              Device,
  [in]           PWDF_INTERRUPT_CONFIG  Configuration,
  [in, optional] PWDF_OBJECT_ATTRIBUTES Attributes,
  [out]          WDFINTERRUPT           *Interrupt
);

매개 변수

[in] Device

프레임워크 디바이스 개체에 대한 핸들입니다.

[in] Configuration

WDF_INTERRUPT_CONFIG_INIT 호출로 초기화된 WDF_INTERRUPT_CONFIG 구조체에 대한 포인터입니다.

[in, optional] Attributes

프레임워크 인터럽트 개체의 개체 특성을 지정하는 WDF_OBJECT_ATTRIBUTES 구조체에 대한 포인터입니다. (자세한 내용은 비고를 참조하세요.) 이 매개 변수는 선택 사항이며 WDF_NO_OBJECT_ATTRIBUTES 수 있습니다.

[out] Interrupt

새 인터럽트 개체에 대한 핸들을 수신하는 위치에 대한 포인터입니다.

반환 값

WdfInterruptCreate 는 작업이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 이 메서드는 다음 값 중 하나를 반환할 수 있습니다.

반환 코드 설명
STATUS_INFO_LENGTH_MISMATCH
WDF_INTERRUPT_CONFIG 구조체의 크기가 잘못되었습니다.
STATUS_INVALID_PARAMETER
잘못된 매개 변수가 지정되었습니다.
STATUS_INVALID_DEVICE_STATE

WdfInterruptCreate 는 디바이스가 시작된 후 호출되었습니다.

드라이버의 EVT_WDF_DEVICE_PREPARE_HARDWARE 콜백 루틴이 NULL로 설정된 WDF_INTERRUPT_CONFIG구조체InterruptRawInterruptTranslated 멤버를 사용하여 WdfInterruptCreate를 호출하는 경우에도 WdfInterruptCreate는 이 값을 반환합니다.

STATUS_INSUFFICIENT_RESOURCES
메모리가 부족했습니다.
STATUS_WDF_PARENT_ASSIGNMENT_NOT_ALLOWED
KMDF 버전 1.9 이하에서 드라이버는 WDF_OBJECT_ATTRIBUTES 구조체의 ParentObject 멤버에 대해 NULL이 아닌 값을 지정했습니다.

KMDF 버전 1.11 이상에서 드라이버는 WDF_OBJECT_ATTRIBUTES 구조체의 ParentObject 멤버에 대한 프레임워크 디바이스 또는 큐 이외의 값을 지정했습니다.

STATUS_WDF_INCOMPATIBLE_EXECUTION_LEVEL
WDF_INTERRUPT_CONFIG 구조체의 AutomaticSerialization 멤버는 TRUE로 설정되며 다음 중 하나로 설정됩니다.
  • 인터럽트의 부모 개체의 실행 수준은 WdfExecutionLevelPassive 이며 드라이버는 EvtInterruptDpc를 제공했습니다.
  • 인터럽트의 부모 개체의 실행 수준은 WdfExecutionLevelDispatch 이고 드라이버는 EvtInterruptWorkItem을 제공했습니다.
자세한 내용은 WDF_INTERRUPT_CONFIG 참조하세요.
STATUS_NOT_SUPPORTED
드라이버는 Windows 8 이전 플랫폼에서 수동 수준 인터럽트 처리를 요청했습니다.
 

WdfInterruptCreate 메서드가 반환할 수 있는 다른 반환 값 목록은 프레임워크 개체 만들기 오류를 참조하세요.

이 메서드는 다른 NTSTATUS 값을 반환할 수도 있습니다.

드라이버가 잘못된 개체 핸들을 제공하는 경우 버그 검사 발생합니다.

설명

드라이버는 일반적으로 EvtDriverDeviceAdd 콜백 함수에서 WdfInterruptCreate 메서드를 호출합니다. KMDF 버전 1.11 및 UMDF 버전 2.0부터 드라이버는 EvtDevicePrepareHardware에서 WdfInterruptCreate를 호출할 수 있습니다. 드라이버가 EvtDriverDeviceAdd에서 WdfInterruptCreate를 호출하는 경우 WDF_INTERRUPT_CONFIG 구조체의 InterruptRawInterruptTranslated 멤버는 NULL이어야 합니다. 드라이버가 EvtDevicePrepareHardware에서 WdfInterruptCreate를 호출하는 경우 이러한 멤버는 모두 유효해야 합니다.

절전 모드 해제 가능 인터럽트 개체를 만드는 경우 인터럽트를 사용하여 디바이스 절전 모드 해제에 설명된 대로 EvtDevicePrepareHardware에서 WdfInterruptCreate를 호출해야 합니다.

드라이버는 디바이스에 필요한 각 인터럽트 벡터에 대해 WdfInterruptCreate 를 한 번 호출해야 합니다. 디바이스가 MSI(메시지 신호 인터럽트)를 지원하는 경우 드라이버는 디바이스에서 지원할 수 있는 각 메시지에 대해 인터럽트 개체를 만들어야 합니다.

PnP 관리자가 디바이스에 시스템 리소스를 할당한 후 프레임워크는 드라이버가 만든 인터럽트 개체에 디바이스의 할당된 인터럽트 리소스에 대한 정보를 저장합니다. (플러그 앤 플레이 지원하지 않는 드라이버는 인터럽트 개체를 사용할 수 없습니다.)

시스템에서 디바이스가 지원할 수 있는 모든 인터럽트 리소스를 할당하지 않을 수 있습니다. 예를 들어 드라이버는 8개의 MSI 메시지를 지원할 수 있는 디바이스에 대해 8개의 인터럽트 개체를 만듭니다. 그러나 시스템은 디바이스에 하나의 메시지만 할당할 수 있습니다. 이 경우 인터럽트 개체 중 7개가 사용되지 않습니다.

일반적으로 드라이버는 인터럽트 개체의 컨텍스트 공간에 디바이스 인터럽트 레지스터의 복사된 콘텐츠와 같은 인터럽트 관련 정보를 저장해야 합니다. 드라이버가 WdfInterruptCreate에 전달하는 WDF_OBJECT_ATTRIBUTES 구조체는 컨텍스트 공간을 설명해야 합니다.

프레임워크 버전 1.9 이하를 사용하는 드라이버의 경우 각 인터럽트 개체의 부모는 인터럽트에서 속한 디바이스 개체입니다. 드라이버는 이 부모를 변경할 수 없으며 WDF_OBJECT_ATTRIBUTES 구조체의 ParentObject 멤버는 NULL이어야 합니다. 버전 1.11부터 ParentObject 는 프레임워크 디바이스 개체 또는 큐 개체일 수 있습니다. 드라이버가 부모를 지정하는 경우 드라이버는 구성 구조의 AutomaticSerialization 멤버를 TRUE로 설정해야 합니다. 드라이버는 DIRQL 및 수동 수준 인터럽트에서 인터 럽트 모두에 대해 부모를 지정할 수 있습니다.

드라이버가 프레임워크 인터럽트 개체 에 대해 EvtCleanupCallback 또는 EvtDestroyCallback 콜백 함수를 제공하는 경우 프레임워크는 IRQL = PASSIVE_LEVEL 이러한 콜백 함수를 호출합니다.

프레임워크 기반 드라이버에서 인터럽트 처리에 대한 자세한 내용은 하드웨어 인터럽트 처리를 참조하세요.

예제

다음 코드 예제에서는 WDF_INTERRUPT_CONFIG 구조체와 WDF_OBJECT_ATTRIBUTES 구조를 초기화한 다음 WdfInterruptCreate를 호출합니다.

NTSTATUS  status;
WDF_INTERRUPT_CONFIG  interruptConfig;
WDF_OBJECT_ATTRIBUTES  interruptAttributes;

WDF_INTERRUPT_CONFIG_INIT(
                          &interruptConfig,
                          MyEvtInterruptIsr,
                          MyEvtInterruptDpc
                          );
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(
                                        &interruptAttributes,
                                        INTERRUPT_DATA
                                        );
status = WdfInterruptCreate(
                            device,
                            &interruptConfig,
                            &interruptAttributes,
                            &devExt->WdfInterrupt
                            );

요구 사항

요구 사항
대상 플랫폼 유니버설
최소 KMDF 버전 1.0
최소 UMDF 버전 2.0
머리글 wdfinterrupt.h(Wdf.h 포함)
라이브러리 Wdf01000.sys(KMDF); WUDFx02000.dll(UMDF)
IRQL <=DISPATCH_LEVEL
DDI 규정 준수 규칙 DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

추가 정보

EvtDriverDeviceAdd

WDF_INTERRUPT_CONFIG

WDF_INTERRUPT_CONFIG_INIT

WDF_OBJECT_ATTRIBUTES

WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE