Responsabilidades opcionales de DriverEntry
Dependiendo de la posición de un controlador determinado en una cadena de controladores superpuestas, la naturaleza del dispositivo subyacente y el diseño del controlador, una rutina DriverEntry también puede ser responsable de lo siguiente:
Llamar a IoAllocateDriverObjectExtension para crear e inicializar una extensión de objeto de controlador, si el controlador requiere almacenamiento para los datos en todo el controlador. La extensión de objeto de controlador es una estructura de datos específica del controlador. Por ejemplo, un controlador podría usar su extensión de objeto driver para almacenar una ruta de acceso del Registro u otra información global.
Llamar a PsCreateSystemThread para crear subprocesos de trabajo ejecutivos, si el controlador es un controlador de nivel superior (como un controlador del sistema de archivos) que usa estos subprocesos. En este caso, el controlador también debe tener una rutina de devolución de llamada de tipo WORKER_THREAD_ROUTINE, que toma un único parámetro PVOID de entrada.
Registrar una rutina de reinicialización . (Vea Escribir una rutina de reinicialización).
Controlar los requisitos de inicialización específicos de clase que difieren de los que se describen aquí, como aquellos que un controlador de miniporte o miniclase específico del dispositivo que trabaja en conjunto con un puerto o controlador de clase podría tener. Consulte la documentación específica del tipo de dispositivo en el Kit de controladores de Windows (WDK) para obtener más información.
Proporcionar almacenamiento para los recursos del sistema
Los objetos por dispositivo deben asignarse en la rutina AddDevice o en la rutina Dispatch que controla la solicitud de IRP_MN_START_DEVICE PnP, no en DriverEntry.
Sin embargo, es posible que un controlador necesite asignar memoria de espacio del sistema adicional para otros usos de todo el controlador. Si es así, la rutina DriverEntry puede llamar a una (o varias) de las siguientes rutinas:
IoAllocateDriverObjectExtension, para crear un área de contexto asociada al objeto de controlador
ExAllocatePoolWithTag para la memoria de espacio del sistema paginada o no paginada
MmAllocateNonCachedMemory o MmAllocateContiguousMemory para la memoria de espacio del sistema no paginada alineada con caché (usada para los búferes de E/S)
Cada rutina DriverEntry se ejecuta en el contexto de un subproceso del sistema en IRQL = PASSIVE_LEVEL. Por lo tanto, cualquier memoria asignada con ExAllocatePoolWithTag para su uso exclusivo durante la inicialización puede ser de un grupo paginado, siempre y cuando el controlador no controle el dispositivo que contiene el archivo de página del sistema. La memoria asignada debe liberarse con ExFreePool antes de que DriverEntry devuelva el control. Sin embargo, un controlador que establece una rutina Reinitialize puede pasar un puntero a esta memoria cuando llama a IoRegisterDriverReinitialization, lo que hace que la rutina Reinicializar del controlador sea responsable de liberar la asignación de memoria.
Reclamación de recursos de hardware
Los controladores antiguos que no son PnP reclamaban recursos del registro. Por otro lado, los controladores PnP no reclaman recursos de dispositivo ni escriben directamente los requisitos de recursos en el registro. En su lugar, estos controladores notifican los requisitos en respuesta a determinados IRP de PnP, como parte del proceso de enumeración del administrador de PnP. Un controlador PnP recibe sus recursos asignados en una solicitud de IRP_MN_START_DEVICE PnP.
Los controladores que no interactúan directamente con el administrador de PnP, como determinados controladores de miniporte, pueden tener requisitos de informes diferentes impuestos por un controlador de clase o puerto que interactúe con el administrador de PnP. Estos requisitos son específicos de la clase de dispositivo. Para obtener detalles específicos del dispositivo y específicos de clase, consulta la documentación de la clase de dispositivo pertinente en el Kit de controladores de Windows (WDK).
Uso del Registro
Una rutina DriverEntry puede usar el Registro para obtener parte de la información que necesita para inicializar el controlador, o bien puede establecer información en el Registro para que otros controladores o subsistemas protegidos usen. La naturaleza de la información depende del tipo de dispositivo. Los controladores pueden acceder al registro mediante las rutinas ZwXxx y RtlXxx . El parámetro RegistryPath de la rutina DriverEntry apunta a una cadena Unicode con recuento que especifica una ruta de acceso a la clave del Registro del controlador, \Registry\Machine\System\CurrentControlSet\Services\*DriverName. La rutina debe guardar una copia de la cadena, no el propio puntero, ya que el puntero ya no es válido después de que se devuelva *DriverEntry.