루틴 다시 초기화 작성
스테이지에서 자신을 초기화해야 하는 모든 드라이버에는 루틴 다시 초기화 가 포함될 수 있습니다. DriverEntry 루틴이 컨트롤을 반환하고 다른 드라이버가 자신을 초기화한 후에 다시 초기화 루틴이 호출됩니다. 일반적으로 다시 초기화 루틴은 다른 드라이버가 시작된 후 수행해야 하는 작업을 수행합니다.
예를 들어 시스템의 키보드 클래스 드라이버인 kbdclass는 PnP 및 레거시 키보드 포트를 모두 지원합니다. 시스템에 PnP 관리자가 검색할 수 없는 하나 이상의 레거시 포트가 포함된 경우 키보드 클래스 드라이버는 각 포트에 대한 디바이스 개체를 만들고 포트에 대한 하위 수준 드라이버를 통해 자체 계층화해야 합니다. 따라서 클래스 드라이버에는 DriverEntry 및 AddDevice 루틴이 호출되고 다른 드라이버가 로드된 후에 호출할 Reinitialize 루틴이 있습니다. 다시 초기화 루틴은 포트를 검색하고, 포트에 대한 디바이스 개체를 만들고, 디바이스에 대한 다른 하위 수준 드라이버보다 드라이버를 계층화합니다.
드라이버의 DriverEntry 루틴은 IoRegisterDriverReinitialization 을 호출하여 실행을 위해 다시 초기화 루틴을 큐에 대기합니다. 다시 초기화 루틴은 IoRegisterDriverReinitialization 자체를 호출하여 루틴을 다시 큐에 추가할 수도 있습니다. 다시 초기화하는 매개 변수 중 하나는 호출된 횟수를 나타냅니다.
IoRegisterDriverReinitialization 호출에는 시스템에서 다시 초기화하기 위한 입력으로 제공하는 드라이버 정의 컨텍스트 데이터에 대한 포인터가 포함될 수 있습니다. Reinitialize 루틴이 레지스트리를 사용하는 경우 컨텍스트 데이터에는 이 포인터가 다시 초기화 루틴에 대한 입력 매개 변수가 아니므로 DriverEntry 루틴에 전달된 RegistryPath 포인터가 포함되어야 합니다.
DriverEntry가 STATUS_SUCCESS 반환하지 않으면 다시 초기화 루틴이 호출되지 않습니다.
일반적으로 다시 초기화 루틴이 있는 드라이버는 PnP 및 레거시 디바이스를 모두 제어하는 상위 수준 드라이버입니다. PnP 관리자가 감지하는 디바이스(및 PnP 관리자가 드라이버의 AddDevice 루틴을 호출하는 디바이스)에 대한 디바이스 개체를 만드는 것 외에도 드라이버는 PnP 관리자가 열거하지 않는 레거시 디바이스에 대한 디바이스 개체를 만들어야 합니다. 다시 초기화 루틴은 해당 디바이스 개체를 만들고 기본 디바이스의 다음 하위 드라이버 위에 드라이버를 계층화합니다.
드라이버에 다시 초기화 루틴이 있는 경우 드라이버 엔터티 루틴 작성에 설명된 것과 동일한 기본 단계에서 초기화되며 DriverEntry 루틴과 동일한 기본 요구 사항도 있습니다.