WDM 드라이버에 함수 역할 형식을 사용하여 함수 선언
참고 항목
Windows 10 버전 2004 부터 SDV(정적 드라이버 검증 도구 )는 더 이상 WDM 드라이버에 대한 디스패치 루틴의 역할 유형을 식별하는 주석이 필요하지 않습니다. 이 페이지의 기본 및 고급 초기화 섹션에 있는 지침을 따르세요.
WDM 드라이버를 분석할 때 드라이버의 진입점에 대해 SDV에 알리려면 함수 역할 형식 선언을 사용하여 함수를 선언해야 합니다. 함수 역할 형식은 Wdm.h에 정의됩니다. WDM 드라이버에서 DriverEntry 루틴의 각 진입점은 해당 역할 유형을 지정하여 선언해야 합니다. 역할 형식은 WDM 드라이버에서 인식된 진입점에 해당하는 미리 정의된 typedef입니다.
예를 들어 CsampUnload라는 드라이버의 언로드 루틴에 대한 함수 역할 형식 선언을 만들려면 미리 정의된 typedef DRIVER_UNLOAD 역할 형식 선언을 사용합니다. 함수 역할 형식 선언은 함수 정의 앞에 나타나야 합니다.
DRIVER_UNLOAD CsampUnload;
CsampUnload 함수의 정의는 변경되지 않은 상태로 유지됩니다.
VOID
CsampUnload(
IN PDRIVER_OBJECT DriverObject
)
{
...
}
SDV는 다음 표에 표시된 진입점 유형을 인식합니다.
WDM 함수 역할 형식 | WDM 루틴 |
---|---|
DRIVER_INITIALIZE |
|
DRIVER_STARTIO |
|
DRIVER_UNLOAD |
|
DRIVER_ADD_DEVICE |
|
Dispatch_type( type ) DRIVER_DISPATCH | 드라이버에서 사용하는 디스패치 루틴입니다. 디스패치 루틴 작성을 참조 하세요. |
IO_COMPLETION_ROUTINE |
IoCompletion 루틴은 IoSetCompletionRoutine 또는 IoSetCompletionRoutineEx를 호출하고 함수 포인터를 IoCompletion 루틴에 두 번째 매개 변수로 전달하여 설정됩니다. |
DRIVER_CANCEL |
취소 루틴은 IoSetCancelRoutine을 호출하고 함수에 대한 두 번째 매개 변수로 IRP의 취소 루틴에 함수 포인터를 전달하여 설정됩니다. |
IO_DPC_ROUTINE |
DpcForIsr 루틴은 IoInitializeDpcRequest를 호출하고 함수 포인터를 DpcForIsr 루틴에 두 번째 매개 변수로 전달하여 등록됩니다. DPC를 큐에 추가하려면 동일한 DPC 개체를 사용하여 ISR 루틴에서 IoQueueDpc를 호출합니다. |
KDEFERRED_ROUTINE |
CustomDpc 루틴은 KeInitializeDpc를 호출하고 함수 포인터를 CustomDpc에 두 번째 매개 변수로 전달하여 설정합니다. 드라이버에 대한 CustomDpc를 큐에 추가하려면 동일한 DPC 개체를 사용하여 ISR 루틴에서 KeInsertQueueDpc를 호출합니다. |
KSERVICE_ROUTINE |
ISR(InterruptService 루틴)은 디바이스 인터럽트를 서비스하고 필요한 경우 수신된 데이터의 인터럽트 후 처리를 예약합니다. |
REQUEST_POWER_COMPLETE |
PowerCompletion 콜백 루틴은 전원 IRP의 처리를 완료합니다. 다른 모든 드라이버가 IRP를 완료한 후 드라이버가 추가 작업을 수행해야 하는 경우 드라이버는 IRP를 할당하는 PoRequestPowerIrp 루틴을 호출하는 동안 PowerCompletion 콜백 루틴을 등록합니다. |
WORKER_THREAD_ROUTINE |
루틴 루틴은 ExInitializeWorkItem 함수에 대한 두 번째 매개 변수에 지정된 콜백 루틴입니다. 드라이버가 ExQueueWorkItem을 호출하여 작업 항목을 시스템 큐에 추가하는 경우에만 루틴을 이러한 방식으로 선언해야 합니다. |
드라이버 디스패치 루틴 선언
Windows 10 버전 2004부터 디스패치 루틴에 대한 함수 역할 유형 선언은 WDM 드라이버의 DriverEntry 루틴에서 DriverObject-MajorFunction> 테이블의 초기화를 기반으로 IRP 범주로 자동으로 구체화됩니다.
드라이버 Foo는 SDV를 준수하기 위해 기본 또는 고급 선언 스타일을 사용하여 역할 선언을 수행해야 합니다.
기본 및 고급 초기화
기본 스타일은 아래 예제에서 확인할 수 있습니다(FooCreate 및 FooCleanup 디스패치 루틴 이름은 예제일 뿐이며 적절한 이름을 사용할 수 있습니다.)
DriverObject->MajorFunction[IRP_MJ_CREATE] = FooCreate; //Basic style
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCleanup;
더 고급 접근 방식을 사용하여 필요한 목록을 줄일 수 있습니다. 둘 이상의 IRP 범주에 동일한 디스패치 루틴이 사용되지만 드라이버는 다음과 같이 두 개의 초기화를 인코딩할 수 있습니다.
DriverObject->MajorFunction[IRP_MJ_CREATE] =
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCreateCleanup; // Advanced style for a multi-role dispatch routine
드라이버가 SDV를 제대로 실행할 수 있도록 하려면 드라이버는 위에 표시된 기본 또는 고급 스타일만 사용해야 합니다. 이러한 두 가지 방법 중 하나를 사용하지 않으면 드라이버 에 대한 SDV 확인이 예상대로 작동하지 않습니다.
함수 매개 변수 및 함수 역할 형식
C 프로그래밍 언어에 필요한 대로 함수 정의에 사용하는 매개 변수 형식은 함수 프로토타입의 매개 변수 형식 또는 이 경우 함수 역할 형식과 일치해야 합니다. SDV는 분석을 위한 함수 서명에 따라 다르며 서명이 일치하지 않는 함수는 무시합니다.
예를 들어 IO_COMPLETION_ROUTINE 함수 역할 유형을 사용하여 IoCompletion 루틴을 선언해야 합니다.
IO_COMPLETION_ROUTINE myCompletionRoutine;
myCompletionRoutine을 구현하는 경우 매개 변수 형식은 IO_COMPLETION_ROUTINE 사용되는 형식, 즉 PDEVICE_OBJECT, PIRP 및 PVOID와 일치해야 합니다(구문의 경우 IoCompletion 루틴 참조).
NTSTATUS
myCompletionRoutine(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context
)
{
}
드라이버에 대한 코드 분석을 실행하여 함수 선언 확인
소스 코드가 준비되었는지 여부를 확인하려면 드라이버에 대한 코드 분석을 실행 합니다. 드라이버에 대한 코드 분석은 함수 역할 형식 선언을 확인하며, 함수 정의의 매개 변수가 함수 역할 형식의 매개 변수와 일치하지 않을 때 누락되었을 수 있는 함수 선언을 식별하거나 경고하는 데 도움이 될 수 있습니다.