KDEFERRED_ROUTINE 콜백 함수(wdm.h)
콜백 루틴은 스레드된 DPC의 InterruptService 반환한 후 작업을 수행합니다.
CustomDpc 루틴은 인터럽트 서비스 루틴이 반환된 후 I/O 작업의 서비스를 완료합니다.
CustomThreadedDpc 루틴은 스레드된 DPC의 작업을 수행합니다. 스레드된 DPC가 실행될 때 시스템에서 이 루틴을 실행합니다.
CustomTimerDpc 루틴은 타이머 개체의 시간 간격이 만료된 후 실행됩니다.
통사론
KDEFERRED_ROUTINE KdeferredRoutine;
void KdeferredRoutine(
[in] _KDPC *Dpc,
[in, optional] PVOID DeferredContext,
[in, optional] PVOID SystemArgument1,
[in, optional] PVOID SystemArgument2
)
{...}
매개 변수
[in] Dpc
이 콜백 루틴과 연결된 DPC 개체를 나타내는 KDPC 구조체에 대한 호출자 제공 포인터입니다.
[in, optional] DeferredContext
CustomDpc경우 이전에 KeInitializeDpc 호출에서 지정한 드라이버 정의 컨텍스트 정보에 대한 호출자 제공 포인터입니다.
customThreadedDpc 드라이버 정의 컨텍스트 정보를 지정합니다. DPC 개체를 초기화할 때 드라이버는 이 값을 keInitializeThreadedDpc DeferredContext 매개 변수로 제공했습니다.
이 CustomTimerDpc 루틴과 연결된 DPC 개체를 나타내는 KDPC 구조체에 대한 호출자 제공 포인터입니다.
[in, optional] SystemArgument1
keInsertQueueDpc 이전 호출에서 지정한 드라이버 제공 정보에 대한 호출자 제공 포인터입니다. DPC 큐에 DPC를 추가했을 때 드라이버는 이 값을 keInsertQueueDpc SystemArgument1 매개 변수로 제공했습니다.
customTimerDpc 이 값은 사용되지 않습니다.
[in, optional] SystemArgument2
드라이버 정의 컨텍스트 정보를 지정합니다. DPC 큐에 DPC를 추가했을 때 드라이버는 이 값을 keInsertQueueDpc SystemArgument2 매개 변수로 제공했습니다.
customTimerDpc 이 값은 사용되지 않습니다.
반환 값
없음
발언
DPC 개체를 만들고 해당 개체에 대한 CustomDpc 루틴을 등록하려면 드라이버가 KeInitializeDpc호출해야 합니다. (DPC 루틴이 하나만 필요한 경우 DpcForIsr 루틴 및 시스템 할당 DPC 개체를 사용할 수 있습니다.)
실행을 위해 CustomDpc 루틴을 큐에 추가하려면 드라이버의 인터럽트 서비스 루틴이 KeInsertQueueDpc호출해야 합니다.
하나 이상의 CustomDpc 루틴을 DpcForIsr 루틴 대신 또는 함께 사용할 수 있습니다. 여러 내부 IRP 큐를 유지 관리하는 드라이버는 일반적으로 각 큐에 대한 CustomDpc 루틴을 제공합니다. 각 CustomDpc 루틴은 일반적으로 적어도 다음 작업을 담당합니다.
현재 IRP에서 설명하는 I/O 작업을 완료합니다.
드라이버의 IRP 큐 중 하나에서 다음 IRP를 큐에서 제거합니다. (시스템 제공 IRP 큐를 StartIo 일상적인 호출 IoStartNextPacket함께 사용하는 드라이버.
현재 IRP에서 I/O 상태 블록을 설정하고 완료된 요청에 대해 IoCompleteRequest 호출합니다.
CustomDpc 루틴은 실패한 작업을 다시 시도하거나 더 작은 조각으로 나뉘어진 큰 I/O 요청에 대해 다음 전송을 설정할 수도 있습니다.
CustomDpc 루틴에 대한 자세한 내용은 DPC 개체 및 DPC참조하세요.
드라이버는 KeInitializeThreadedDpc호출하여 DPC 개체에 대한 CustomThreadedDpc 등록합니다. CustomThreadedDpc 루틴이 실행되도록 DPC 큐에 DPC를 실제로 추가하려면 KeInsertQueueDpc호출합니다.
CustomThreadedDpc 루틴을 사용하는 방법에 대한 자세한 내용은 스레드 DPC소개를 참조하세요.
CustomThreadedDpc 루틴은 IRQL = DISPATCH_LEVEL 실행하거나 실시간 스레드에서 IRQL = PASSIVE_LEVEL 실행할 수 있습니다.
DPC 개체를 만들고 해당 개체에 대한 CustomTimerDpc 루틴을 등록하려면 드라이버는 KeInitializeDpc호출해야 합니다.
실행을 위해 CustomTimerDpc 루틴을 큐에 추가하려면 드라이버 루틴이 KeSetTimer 또는 KeSetTimerEx호출하여 KeInitializeDpc반환된 DPC 개체 포인터를 제공해야 합니다. 시스템은 타이머 간격이 만료될 때 CustomTimerDpc 루틴을 호출합니다.
CustomTimerDpc 루틴에 대한 자세한 내용은 타이머 개체 및 DPC참조하세요.
예제
콜백 루틴을 정의하려면 먼저 정의하는 콜백 루틴의 유형을 식별하는 함수 선언을 제공해야 합니다. Windows는 드라이버에 대한 콜백 함수 형식 집합을 제공합니다. 콜백 함수 형식을 사용하여 함수를 선언하면 드라이버 , SDV(정적 드라이버 검증 도구) 및 기타 확인 도구에 대한 코드 분석을데 도움이 되며 Windows 운영 체제용 드라이버를 작성하기 위한 요구 사항입니다.
예를 들어 이름이 MyCustomDpc
CustomDpc 콜백 루틴을 정의하려면 다음 코드 예제와 같이 KDEFERRED_ROUTINE 형식을 사용합니다.
KDEFERRED_ROUTINE MyCustomDpc;
그런 다음 다음과 같이 콜백 루틴을 구현합니다.
_Use_decl_annotations_
VOID
MyCustomDpc(
struct _KDPC *Dpc,
PVOID DeferredContext,
PVOID SystemArgument1,
PVOID SystemArgument2
)
{
// Function body
}
요구 사항
요구 | 값 |
---|---|
대상 플랫폼 | 바탕 화면 |
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
IRQL | DISPATCH_LEVEL 호출합니다. |