Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una rutina AddDevice en una función o controlador de filtro debe realizar los pasos siguientes:
Llame a IoCreateDevice para crear un objeto de dispositivo funcional o de filtro (un 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 verificaciones de seguridad del objeto de dispositivo para todas las solicitudes de apertura, incluidas las aperturas relativas y las aperturas de nombres de archivo finales.
[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 banderas en la extensión del dispositivo para rastrear ciertos estados PnP del dispositivo, como el dispositivo en pausa, removido y remoción inesperada.
Por ejemplo, defina un indicador para indicar que los IRP entrantes deben mantenerse mientras el dispositivo está en estado de pausa. Cree una cola para contener IRP, si el controlador aún no tiene un mecanismo para poner en cola los IRP. Consulte Puesta en cola y desencolado de IRP para obtener más información.
Asigne también una estructura IO_REMOVE_LOCK en la extensión del dispositivo y llame a IoInitializeRemoveLock para inicializar esta estructura. Para obtener más información, vea Using Remove Locks.
Establezca el bit de bandera DO_BUFFERED_IO o DO_DIRECT_IO en el objeto de dispositivo para especificar el tipo de almacenamiento en búfer que el gestor de E/S utilizará 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 de nivel inferior inmediato en la pila, excepto posiblemente para los controladores de nivel más alto. Para obtener más información, vea Inicializar un objeto de dispositivo.
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 utilice el controlador para gestionar este dispositivo, como eventos, spinlocks 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, cualquiera memoria que se asigne con ExAllocatePoolWithTag para su uso exclusivo durante la inicialización puede ser del grupo paginado, siempre y cuando el controlador no controle el dispositivo que contiene el archivo de paginación del sistema. Esta asignación de memoria debe liberarse con ExFreePool antes de que AddDevice devuelva el control.
Adjunte 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 inmediatamente inferior para el dispositivo, es un parámetro necesario para IoCallDriver y PoCallDriver, al pasar IRPs a la pila del dispositivo.
Borre la marca DO_DEVICE_INITIALIZING en el FDO o en el filtro DO con una instrucción como 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 un IRP_MN_START_DEVICE que contenga la lista de recursos de hardware asignados al dispositivo por el administrador de PnP.