KDEFERRED_ROUTINE 콜백 함수(wdm.h)

콜백 루틴은 InterruptService 가 반환된 후 스레드된 DPC의 작업을 수행합니다.

CustomDpc 루틴은 InterruptService 루틴이 반환된 후 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 개체를 초기화했을 때 드라이버는 이 값을 KeInitializeThreadedDpcDeferredContext 매개 변수로 제공했습니다.

CustomTimerDpc 루틴과 연결된 DPC 개체를 나타내는 KDPC 구조체에 대한 호출자 제공 포인터입니다.

[in, optional] SystemArgument1

KeInsertQueueDpc에 대한 이전 호출에서 지정한 드라이버 제공 정보에 대한 호출자 제공 포인터입니다. DPC 큐에 DPC를 추가했을 때 드라이버는 이 값을 KeInsertQueueDpcSystemArgument1 매개 변수로 제공했습니다.

CustomTimerDpc의 경우 이 값은 사용되지 않습니다.

[in, optional] SystemArgument2

드라이버 정의 컨텍스트 정보를 지정합니다. DPC 큐에 DPC를 추가했을 때 드라이버는 이 값을 KeInsertQueueDpcSystemArgument2 매개 변수로 제공했습니다.

CustomTimerDpc의 경우 이 값은 사용되지 않습니다.

반환 값

없음

설명

DPC 개체를 만들고 해당 개체에 대한 CustomDpc 루틴을 등록하려면 드라이버가 KeInitializeDpc를 호출해야 합니다. (DPC 루틴이 하나만 필요한 경우 DpcForIsr 루틴 및 시스템 할당 DPC 개체를 사용할 수 있습니다.)

실행을 위해 CustomDpc 루틴을 큐에 추가하려면 드라이버의 InterruptService 루틴이 KeInsertQueueDpc를 호출해야 합니다.

DpcForIsr 루틴 대신 하나 이상의 CustomDpc 루틴을 사용할 수 있습니다. 여러 내부 IRP 큐를 유지하는 드라이버는 일반적으로 각 큐에 대해 CustomDpc 루틴을 제공합니다. 각 CustomDpc 루틴은 일반적으로 적어도 다음 작업을 담당합니다.

  • 현재 IRP에서 설명하는 I/O 작업을 완료합니다.

  • 드라이버의 IRP 큐 중 하나에서 다음 IRP 큐를 제거합니다. ( StartIo 루틴 호출 IoStartNextPacket과 함께 시스템 제공 IRP 큐를 사용하는 드라이버.)

  • 현재 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 운영 체제용 드라이버를 작성하기 위한 요구 사항입니다.

예를 들어 라는 MyCustomDpcCustomDpc 콜백 루틴을 정의하려면 다음 코드 예제와 같이 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 호출되었습니다.

추가 정보

KeInsertQueueDpc

KeSetTimer

KeSetTimerEx