다음을 통해 공유


DriverEntry의 선택적 책임

계층화된 드라이버 체인에서 특정 드라이버의 위치, 기본 디바이스의 특성 및 드라이버 디자인에 따라 DriverEntry 루틴도 다음을 담당할 수 있습니다.

  • 드라이버 전체에서 데이터에 대한 스토리지가 필요한 경우 IoAllocateDriverObjectExtension 을 호출하여 드라이버 개체 확장을 만들고 초기화합니다. 드라이버 개체 확장은 드라이버별 데이터 구조입니다. 예를 들어 드라이버는 드라이버 개체 확장을 사용하여 레지스트리 경로 또는 기타 전역 정보를 저장할 수 있습니다.

  • 드라이버가 이러한 스레드를 사용하는 최상위 드라이버(예: 파일 시스템 드라이버)인 경우 PsCreateSystemThread 를 호출하여 임원 작업자 스레드를 만듭니다. 이 경우 드라이버에는 단일 입력 PVOID 매개 변수를 사용하는 WORKER_THREAD_ROUTINE 형식의 콜백 루틴도 있어야 합니다.

  • 루틴 다시 초기화 등록 ( 루틴 다시 초기화 작성을 참조하세요.)

  • 포트 또는 클래스 드라이버와 함께 작동하는 디바이스별 미니포트 또는 미니클래스 드라이버와 같이 여기에 설명된 것과 다른 클래스별 초기화 요구 사항을 처리합니다. 자세한 내용은 WDK(Windows 드라이버 키트)의 디바이스 유형별 설명서를 참조하세요.

시스템 리소스에 대한 스토리지 제공

디바이스별 개체는 DriverEntry가 아닌 PnP IRP_MN_START_DEVICE 요청을 처리하는 AddDevice 루틴 또는 Dispatch 루틴에서 할당되어야 합니다.

그러나 드라이버는 다른 드라이버 전체 사용을 위해 추가 시스템 공간 메모리를 할당해야 할 수 있습니다. 이 경우 DriverEntry 루틴은 다음 루틴 중 하나 이상을 호출할 수 있습니다.

모든 DriverEntry 루틴은 IRQL = PASSIVE_LEVEL 시스템 스레드의 컨텍스트에서 실행됩니다. 따라서 초기화 중에만 사용하기 위해 ExAllocatePoolWithTag 로 할당된 메모리는 드라이버가 시스템 페이지 파일을 보유하는 디바이스를 제어하지 않는 한 페이징 풀에서 사용할 수 있습니다. DriverEntry가 컨트롤을 반환하기 전에 ExFreePool을 사용하여 할당된 메모리를 해제해야 합니다. 그러나 Reinitialize 루틴을 설정하는 드라이버는 IoRegisterDriverReinitialization을 호출할 때 이 메모리에 대한 포인터를 전달할 수 있으므로 드라이버의 다시 초기화 루틴이 메모리 할당 해제를 담당하게 합니다.

하드웨어 리소스 클레임

이전의 비 PnP 드라이버는 레지스트리에서 리소스를 클레임했습니다. 반면 PnP 드라이버는 에서 디바이스 리소스를 클레임하거나 레지스트리에 리소스 요구 사항을 직접 작성하지 않습니다. 대신 이러한 드라이버는 PnP 관리자의 열거 프로세스의 일부로 특정 PnP IRP에 대한 응답으로 요구 사항을 보고합니다. PnP 드라이버는 PnP IRP_MN_START_DEVICE 요청에서 할당된 리소스를 받습니다.

특정 미니포트 드라이버와 같이 PnP 관리자와 직접 상호 작용하지 않는 드라이버는 PnP 관리자와 상호 작용하는 클래스 또는 포트 드라이버에 의해 부과된 다른 보고 요구 사항이 있을 수 있습니다. 이러한 요구 사항은 디바이스 클래스에 따라 다릅니다. 디바이스별 및 클래스별 세부 정보는 WDK(Windows 드라이버 키트)의 관련 디바이스 클래스에 대한 설명서를 참조하세요.

레지스트리 사용

DriverEntry 루틴은 레지스트리를 사용하여 드라이버를 초기화하는 데 필요한 정보를 얻거나 레지스트리에서 다른 드라이버 또는 보호된 하위 시스템에 사용할 정보를 설정할 수 있습니다. 정보의 특성은 디바이스 유형에 따라 달라집니다. 드라이버는 ZwXxxRtlXxx 루틴을 사용하여 레지스트리에 액세스할 수 있습니다. DriverEntry 루틴의 RegistryPath 매개 변수는 드라이버의 레지스트리 키인 \Registry\Machine\System\CurrentControlSet\Services\*DriverName의 경로를 지정하는 계산된 유니코드 문자열을 가리킵니다. *DriverEntry가 반환된 후 포인터가 더 이상 유효하지 않으므로 루틴은 포인터 자체가 아닌 문자열의 복사본을 저장해야 합니다.