Rutinas AddDevice en controladores de función o filtro
Una rutina AddDevice en una función o un controlador de filtro debe realizar los pasos siguientes:
Llame a IoCreateDevice para crear un objeto de dispositivo funcional o de filtro (FDO o do de filtro) para el dispositivo que se va a agregar.
No especifique un DeviceName para el objeto de dispositivo, ya que, al hacerlo, se omite la seguridad del administrador de PnP. Si un componente en modo de usuario necesita un vínculo simbólico al dispositivo, registre una interfaz de dispositivo (consulte el paso siguiente a continuación). Si un componente en modo kernel necesita un nombre de dispositivo heredado, el controlador debe asignar un nombre al objeto de dispositivo, pero no se recomienda asignar nombres.
Incluya FILE_DEVICE_SECURE_OPEN en el parámetro DeviceCharacteristics . Esta característica dirige al administrador de E/S para realizar comprobaciones de seguridad en el objeto de dispositivo para todas las solicitudes abiertas, incluidas las aperturas relativas y se abre el nombre de archivo final.
[opcional] Cree uno o varios vínculos simbólicos al dispositivo.
Llame a IoRegisterDeviceInterface para registrar la funcionalidad del dispositivo y crear un vínculo simbólico que las aplicaciones o los componentes del sistema pueden usar para abrir el dispositivo. El controlador debe habilitar la interfaz llamando a IoSetDeviceInterfaceState cuando controla la solicitud IRP_MN_START_DEVICE . Para obtener más información, consulte Clases de interfaz de dispositivo.
Almacene el puntero al PDO del dispositivo en la extensión del dispositivo.
El administrador de PnP proporciona un puntero al PDO como parámetro PhysicalDeviceObject a AddDevice. Los controladores usan el puntero PDO en llamadas a rutinas como IoGetDeviceProperty.
Defina marcas en la extensión de dispositivo para realizar un seguimiento de determinados estados PnP del dispositivo, como el dispositivo en pausa, quitado y quitado sorpresa.
Por ejemplo, defina una marca para indicar que los IRP entrantes deben mantenerse mientras el dispositivo está en un estado en pausa. Cree una cola para contener IRP, si el controlador aún no tiene un mecanismo para poner en cola los IRP. Para obtener más información, consulte Puesta en cola y desqueuing IRP .
Asigne también una estructura de IO_REMOVE_LOCK en la extensión del dispositivo y llame a IoInitializeRemoveLock para inicializar esta estructura. Para obtener más información, consulte Uso de bloqueos de eliminación.
Establezca el bit de marca DO_BUFFERED_IO o DO_DIRECT_IO en el objeto de dispositivo para especificar el tipo de almacenamiento en búfer que el administrador de E/S va a usar para las solicitudes de E/S que se envían a la pila de dispositivos. Controladores de nivel superior O este miembro con el mismo valor que el controlador siguiente inferior de la pila, excepto posiblemente para los controladores de nivel superior. Para obtener más información, consulte Inicialización de un objeto device.
Establezca la marca DO_POWER_INRUSH o DO_POWER_PAGABLE para la administración de energía, si es necesario. Los controladores que se pueden paginar deben establecer la marca DO_POWER_PAGABLE. Normalmente, el controlador de bus establece las marcas de objeto de dispositivo cuando crea el PDO para el dispositivo. Sin embargo, los controladores de nivel superior pueden necesitar ocasionalmente modificar los valores de estas marcas en sus rutinas AddDevice cuando crean el FDO o el filtro DO. Consulte Establecer marcas de objeto de dispositivo para la administración de energía para obtener más información.
Cree o inicialice cualquier otro recurso de software que use el controlador para administrar este dispositivo, como eventos, bloqueos de número u otros objetos. (Los recursos de hardware, como los puertos de E/S, se configuran más adelante, en respuesta a una solicitud de IRP_MN_START_DEVICE ).
Dado que una rutina AddDevice se ejecuta en un contexto de subproceso del sistema en IRQL = PASSIVE_LEVEL, cualquier memoria asignada con ExAllocatePoolWithTag para su uso exclusivo durante la inicialización puede provenir del grupo paginado, siempre y cuando el controlador no controle el dispositivo que contiene el archivo de página del sistema. Esta asignación de memoria debe liberarse con ExFreePool antes de que AddDevice devuelva el control.
Conecte el objeto de dispositivo a la pila de dispositivos (IoAttachDeviceToDeviceStack).
Especifique un puntero al PDO del dispositivo en el parámetro TargetDevice .
Almacene el puntero devuelto por IoAttachDeviceToDeviceStack. Este puntero, que apunta al objeto de dispositivo del controlador siguiente inferior para el dispositivo, es un parámetro necesario para IoCallDriver y PoCallDriver al pasar IRP a la pila de dispositivos.
Borre la marca DO_DEVICE_INITIALIZING en el FDO o filtre DO con una instrucción similar a la siguiente:
FunctionalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
Prepárese para controlar los IRP de PnP para el dispositivo (como IRP_MN_QUERY_RESOURCE_REQUIREMENTS y IRP_MN_START_DEVICE).
Un controlador no debe empezar a controlar el dispositivo hasta que reciba una IRP_MN_START_DEVICE que contenga la lista de recursos de hardware asignados al dispositivo por el administrador de PnP.