DRIVER_DISPATCH 콜백 함수(wdm.h)

콜백 루틴은 다양한 IRP를 서비스합니다. 함수 코드 목록은 비고를 참조하세요.

통사론

C++
DRIVER_DISPATCH DriverDispatch;

NTSTATUS DriverDispatch(
  [in, out] _DEVICE_OBJECT *DeviceObject,
  [in, out] _IRP *Irp
)
{...}

매개 변수

[in, out] DeviceObject

DEVICE_OBJECT 구조체에 대한 호출자 제공 포인터입니다. 이는 이전에 드라이버의 AddDevice 루틴에서 만든 대상 디바이스의 디바이스 개체입니다.

[in, out] Irp

요청된 I/O 작업을 설명하는 IRP 구조체에 대한 호출자 제공 포인터입니다.

반환 값

루틴이 성공하면 STATUS_SUCCESS 반환해야 합니다. 그렇지 않으면 Ntstatus.h에 정의된 오류 상태 값 중 하나를 반환해야 합니다.

발언

모든 디스패치 루틴에 대한 입력 매개 변수는 Irp가리키는 IRP 구조에 제공됩니다. 추가 매개 변수는 IO_STACK_LOCATION 구조에서 설명하고 IoGetCurrentIrpStackLocation호출하여 가져올 수 있는 드라이버의 연결된 I/O 스택 위치에 제공됩니다.

일반적으로 모든 디스패치 루틴은 IRQL = PASSIVE_LEVEL 임의의 스레드 컨텍스트에서 실행되지만 예외가 있습니다. 자세한 내용은 디스패치 루틴 및 IRQL참조하세요.

디스패치 루틴에 대한 자세한 내용은 디스패치 루틴 작성참조하세요. IRP에 대한 자세한 내용은 IRP처리를 참조하세요.

IRP 콜백 구현 정보
IRP_MJ_CLEANUP 드라이버의 DispatchCleanup 루틴은 Xxx DispatchCleanup에이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DriverObjectDispatchCleanup 루틴의 주소를 저장해야>MajorFunction[IRP_MJ_CLEANUP].
IRP_MJ_CLOSE 드라이버의 DispatchClose 루틴은 XxxDispatchClose 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchClose 루틴의 주소를 DriverObject>MajorFunction[IRP_MJ_CLOSE]에 저장해야 합니다.
IRP_MJ_CREATE 드라이버의 DispatchCreate 루틴은 Xxx DispatchCreate에이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchCreate 루틴의 주소를 DriverObject저장해야 합니다.>MajorFunction[IRP_MJ_CREATE].
IRP_MJ_CREATE 또는 IRP_MJ_CLOSE 드라이버는 별도의 DispatchCreateDispatchClose 루틴 대신 단일 DispatchCreateClose 루틴을 제공할 수 있습니다.

드라이버의 DispatchCreateClose 루틴은 XxxDispatchCreateClose 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchCreateClose 루틴의 주소를 DriverObject저장해야 합니다.>MajorFunction[IRP_MJ_CREATE] 및 DriverObject->MajorFunction[IRP_MJ_CLOSE].
IRP_MJ_DEVICE_CONTROL 드라이버의 DispatchDeviceControl 루틴은 XxxDispatchDeviceControl 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchDeviceControl 루틴의 주소를 DriverObject저장해야 합니다.>MajorFunction[IRP_MJ_DEVICE_CONTROL].

시스템은 I/O 컨트롤 코드의 FILE_XXX 플래그를 사용하여 IRP 발신자가 IRP를 디바이스 개체로 보낼 수 있는 권한이 있는지 여부를 확인합니다. Windows Server 2003 이상 버전의 Windows용 드라이버는 IoValidateDeviceIoControlAccess 루틴을 사용하여 DispatchDeviceControl내에서 더 엄격한 액세스 검사를 수행할 수 있습니다.
IRP_MJ_FLUSH_BUFFERS 드라이버의 DispatchFlushBuffers 루틴은 Xxx DispatchFlushBuffers에이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchFlushBuffers 루틴의 주소를 DriverObject>MajorFunction[IRP_MJ_FLUSH_BUFFERS]에 저장해야 합니다.
IRP_MJ_INTERNAL_DEVICE_CONTROL 드라이버의 DispatchInternalDeviceControl 루틴은 XxxDispatchInternalDeviceControl 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchInternalDeviceControl 루틴의 주소를 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL]에 저장해야 합니다.
IRP_MJ_PNP 드라이버의 DispatchPnP 루틴은 Xxx DispatchPnP에이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchPnP 루틴의 주소를 DriverObject저장해야 합니다.>MajorFunction[IRP_MJ_PNP].
IRP_MJ_POWER 드라이버의 DispatchPower 루틴은 XxxDispatchPower 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchPower 루틴의 주소를 DriverObject>MajorFunction[IRP_MJ_POWER]에 저장해야 합니다.
IRP_MJ_QUERY_INFORMATION 드라이버의 DispatchQueryInformation 루틴은 XxxDispatchQueryInformation 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchQueryInformation 루틴의 주소를 DriverObject>MajorFunction[IRP_MJ_QUERY_INFORMATION]에 저장해야 합니다.
IRP_MJ_READ 드라이버의 DispatchRead 루틴은 XxxDispatchRead 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchRead 루틴의 주소를 DriverObject->MajorFunction[IRP_MJ_READ]에 저장해야 합니다.
IRP_MJ_READ 또는 IRP_MJ_WRITE 드라이버는 별도의 DispatchReadDispatchWrite 루틴 대신 단일 DispatchReadWrite 루틴을 제공할 수 있습니다.

드라이버의 DispatchReadWrite 루틴은 XxxDispatchReadWrite 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchReadWrite 루틴의 주소를 DriverObject저장해야 합니다.>MajorFunction[IRP_MJ_READ] 및 DriverObject->MajorFunction[IRP_MJ_WRITE].
IRP_MJ_SET_INFORMATION 드라이버의 DispatchSetInformation 루틴은 XxxDispatchSetInformation 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DriverObjectDispatchSetInformation 루틴의 주소를 저장해야>MajorFunction[IRP_MJ_SET_INFORMATION].
IRP_MJ_SHUTDOWN 드라이버의 DispatchShutdown 루틴은 XxxDispatchShutdown 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DriverObject>MajorFunction[IRP_MJ_SHUTDOWN]에 DispatchShutdown 루틴의 주소를 저장해야 합니다.

또한 IRP_MJ_SHUTDOWN 요청을 받으려면 드라이버가 IoRegisterShutdownNotification 또는 IoRegisterLastChanceShutdownNotification 호출하여 DispatchShutdown 루틴을 시스템에 등록해야 합니다.
IRP_MJ_SYSTEM_CONTROL 드라이버의 DispatchSystemControl 루틴은 XxxDispatchSystemControl 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DispatchSystemControl 루틴의 주소를 DriverObject저장해야 합니다.>MajorFunction[IRP_MJ_SYSTEM_CONTROL].
IRP_MJ_WRITE 드라이버의 DispatchWrite 루틴은 XxxDispatchWrite 이름이 지정되어야 합니다. 여기서 Xxx 드라이버별 접두사입니다. 드라이버의 DriverEntry 루틴은 DriverObjectDispatchWrite 루틴의 주소를 저장해야>MajorFunction[IRP_MJ_WRITE].

예제

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

예를 들어 MyDispatchCleanup명명된 DispatchCleanup 콜백 루틴을 정의하려면 다음 코드 예제와 같이 DRIVER_DISPATCH 형식을 사용합니다.

C++
DRIVER_DISPATCH MyDispatchCleanup;

그런 다음 다음과 같이 콜백 루틴을 구현합니다.

C++
_Use_decl_annotations_
NTSTATUS
  MyDispatchCleanup(
    struct _DEVICE_OBJECT  *DeviceObject,
    struct _IRP  *Irp
    )
  {
      // Function body
  }

DRIVER_DISPATCH 함수 형식은 Wdm.h 헤더 파일에 정의됩니다. 코드 분석 도구를 실행할 때 오류를 보다 정확하게 식별하려면 함수 정의에 the_Use_decl_annotations_annotation 추가해야 합니다. The_Use_decl_annotations_annotation 헤더 파일의 DRIVER_DISPATCH 함수 형식에 적용되는 주석이 사용되는지 확인합니다. 함수 선언 요구 사항에 대한 자세한 내용은 WDM 드라이버함수 역할 형식을 사용하여 함수 선언을 참조하세요. Use_decl_annotations대한 자세한 내용은 함수 동작 주석참조하세요.

요구 사항

요구
대상 플랫폼 바탕 화면
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
IRQL PASSIVE_LEVEL 호출됩니다(설명 섹션 참조).