[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 반환합니다. 그렇지 않으면 이 메서드는 다음 값 중 하나를 반환할 수 있습니다.
| 반환 코드 | 설명 |
|---|---|
|
WDF_INTERRUPT_CONFIG 구조체의 크기가 잘못되었습니다. |
|
잘못된 매개 변수를 지정했습니다. |
|
WdfInterruptCreate 디바이스가 시작된 후 호출되었습니다. WdfInterruptCreate 드라이버의 EVT_WDF_DEVICE_PREPARE_HARDWARE 콜백 루틴이 인터럽트루WdfInterruptCreate 호출하고 WDF_INTERRUPT_CONFIG 구조의 InterruptTranslated 멤버를 NULL 경우 이 값을 반환합니다. |
|
메모리가 부족했습니다. |
|
KMDF 버전 1.9 이전 버전에서 드라이버는 WDF_OBJECT_ATTRIBUTES 구조체의 ParentObject 멤버에 대해NULL이 아닌 값을 지정했습니다.
KMDF 버전 1.11 이상에서 드라이버는 WDF_OBJECT_ATTRIBUTES 구조체의 ParentObject 멤버에 대한 프레임워크 디바이스 또는 큐 이외의 값을 지정했습니다. |
|
WDF_INTERRUPT_CONFIG 구조체의 AutomaticSerialization 멤버는 TRUE 설정됩니다.
|
|
드라이버는 Windows 8 이전 플랫폼에서 수동 수준 인터럽트 처리를 요청했습니다. |
WdfInterruptCreate 메서드가 반환할 수 있는 다른 반환 값 목록은 Framework 개체 만들기 오류참조하세요.
이 메서드는 다른NTSTATUS 값을 반환할 수도 있습니다.
드라이버에서 잘못된 개체 핸들을 제공하면 버그 검사가 수행됩니다.
비고
드라이버는 일반적으로 EvtDriverDeviceAdd 콜백 함수에서 WdfInterruptCreate 메서드를 호출합니다. KMDF 버전 1.11 및 UMDF 버전 2.0부터 드라이버는 EvtDevicePrepareHardwareWdfInterruptCreate 호출할 수 있습니다. 드라이버가 EvtDriverDeviceAddWdfInterruptCreate 호출하는 경우 WDF_INTERRUPT_CONFIG 구조체의 인터럽트루 및 InterruptTranslated 멤버는 NULL이어야 합니다. 드라이버가 EvtDevicePrepareHardwareWdfInterruptCreate 호출하는 경우 이러한 멤버는 모두 유효해야 합니다.
절전 모드 해제 가능 인터럽트 개체를 만드는 경우 인터럽트를 사용하여 디바이스절전 모드 해제를 사용하는 경우 EvtDevicePrepareHardwareWdfInterruptCreate 호출해야 합니다.
드라이버는 디바이스에 필요한 각 인터럽트 벡터에 대해 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) |