DriverEntry 포팅

WDM 및 프레임워크 기반 드라이버 모두에서 DriverEntry 함수는 기본 진입점입니다. 함수 프로토타입은 두 모델에서 동일합니다. WDM 드라이버에서 시스템은 드라이버가 메모리에 처음 로드될 때 DriverEntry 를 호출합니다. DriverEntry는 DRIVER_OBJECT 구조체의 DriverExtension-AddDevice> 필드에서 드라이버의 AddDevice 루틴에 대한 포인터를 설정하고 DRIVER_OBJECT 구조체의 MajorFunction 배열에서 해당 I/O 디스패치 루틴에 대한 포인터를 설정한 다음 반환합니다. 프레임워크 기반 드라이버에서 시스템은 드라이버를 로드할 때 프레임워크의 내부 FxDriverEntry 함수를 호출합니다. 이 내부 함수는 프레임워크를 초기화한 다음 드라이버의 DriverEntry 함수를 호출합니다. DriverEntry 는 드라이버의 EvtDriverDeviceAdd 콜백에 대한 포인터를 설정하고 다음 예제와 같이 WdfDriverCreate 를 호출하여 WDFDRIVER 개체를 만듭니다.

NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT  DriverObject
    IN PUNICODE_STRING RegistryPath
    )
{
    WDF_DRIVER_CONFIG config;

    WDF_DRIVER_CONFIG_INIT( &config,
                              ToasterEvtDeviceAdd );
    status = WdfDriverCreate(
                 DriverObject,
                 RegistryPath,
                 WDF_NO_OBJECT_ATTRIBUTES,
                 &config,
                 WDF_NO_HANDLE
             );

    return STATUS_SUCCESS;
}

또한 DriverEntry 는 조회 목록 만들기 또는 추적 초기화와 같이 드라이버에 필요한 모든 전역 데이터 또는 리소스를 초기화합니다. WdfDriverCreate는 WDFDRIVER 개체에 대한 핸들을 반환하지만, WDM 드라이버가 DriverEntry 루틴에 전달된 DRIVER_OBJECT 포인터를 유지하지 않을 수 있는 것처럼 드라이버는 이 핸들을 유지하지 않습니다. 이유는 동일합니다. 드라이버 개체에 대한 포인터를 사용하는 드라이버는 소수에 불과합니다.