Inicialización de un objeto device

Después de que IoCreateDevice vuelva, dando al autor de la llamada un puntero a un DeviceObject que contiene un puntero a la extensión del dispositivo, los controladores deben configurar determinados campos en los objetos de dispositivo para sus respectivos dispositivos físicos, lógicos o virtuales.

IoCreateDevice establece el campo StackSize de un objeto de dispositivo recién creado en uno. Un controlador de nivel inferior puede omitir este campo. Cuando un controlador de nivel superior llama a IoAttachDeviceToDeviceStack para asociarse al controlador inferior siguiente, esa rutina establece automáticamente el campo StackSize del objeto de dispositivo en el objeto de dispositivo del controlador siguiente más uno. Sin embargo, para algunos tipos de dispositivo, es posible que el controlador de nivel superior tenga que establecer el campo StackSize en un valor mayor, como se indica en la documentación específica del dispositivo. Establecer el tamaño de pila garantiza que los IRP enviados al controlador de nivel superior contendrán una ubicación de pila de E/S específica del controlador, además del número correcto de ubicaciones de pila de E/S para todos los controladores de nivel inferior de la cadena.

IoCreateDevice establece el campo AlignmentRequirement de un objeto de dispositivo recién creado en el tamaño de línea de caché de datos del procesador menos uno, para asegurarse de que los búferes usados en la E/S directa se alinean correctamente. Después de que IoCreateDevice devuelva, los controladores de dispositivos físicos de nivel más bajo deben hacer lo siguiente:

  1. Resta uno del requisito de alineación del dispositivo.

  2. Compare el resultado del paso 1 con el valor actual del objeto AlignmentRequirement del objeto de dispositivo.

  3. Si el requisito de alineación del dispositivo es mayor, establezca AlignmentRequirement en el resultado del paso 1. De lo contrario, deje el valor AlignmentRequirement establecido por IoCreateDevice.

Después de que cualquier controlador de nivel superior se encadene a otro controlador mediante una llamada a IoGetDeviceObjectPointer, el controlador de nivel superior debe establecer el campo AlignmentRequirement de su objeto de dispositivo recién creado en el del objeto de dispositivo del controlador de nivel inferior siguiente. Como regla general, un controlador de nivel superior no debe cambiar este valor. Si un controlador de nivel superior llama a IoAttachDevice o IoAttachDeviceToDeviceStack, esas rutinas establecen automáticamente el campo AlignmentRequirement en el objeto de dispositivo en el del objeto de dispositivo del controlador de nivel inferior.

IoGetDeviceObjectPointer devuelve punteros tanto al objeto de dispositivo del controlador de nivel inferior como al objeto de archivo asociado. Solo un FSD (o, posiblemente, otro controlador de nivel superior) puede usar el puntero de objeto de archivo devuelto. Un controlador intermedio que llama a IoGetDeviceObjectPointer debe guardar este puntero de objeto de archivo para que se pueda desreferenciar llamando a ObDereferenceObject cuando se descarga el controlador.

Después de que un FSD monte el volumen que contiene el objeto de archivo que representa el objeto de dispositivo del controlador inferior, un controlador intermedio no se puede encadenar entre el sistema de archivos y el controlador inferior llamando a IoAttachDevice o IoAttachDeviceToDeviceStack. Además, un FSD puede establecer el miembro SectorSize del objeto de dispositivo en función de la geometría del hardware del volumen subyacente cuando se produce un montaje. Para obtener más información, consulte DEVICE_OBJECT.

Un controlador intermedio o de nivel inferior también establece un poco en las marcas del objeto de dispositivo, ya sea con DO_DIRECT_IO o con DO_BUFFERED_IO en cada objeto de dispositivo que crea. Los controladores de nivel más alto de los dispositivos lógicos o virtuales pueden evitar establecer marcas para E/S almacenadas en búfer o directa si el escritor de controladores decide que el trabajo adicional implicado pagará en un mejor rendimiento del controlador. Un controlador intermedio debe configurar el campo Flags (Marcas ) de su objeto de dispositivo para que coincida con el del objeto de dispositivo del controlador siguiente inferior.

La configuración de un campo Marcas de objeto de dispositivo con DO_DIRECT_IO o DO_BUFFERED_IO determina cómo el administrador de E/S pasa el acceso a los búferes de usuario en todas las solicitudes de transferencia de datos enviadas posteriormente al controlador.

A continuación, el controlador puede establecer cualquier otro valor dependiente del dispositivo en el objeto de dispositivo. Por ejemplo, los controladores que no son WDM para dispositivos multimedia extraíbles deben O el miembro Flags del objeto de dispositivo con DO_VERIFY_VOLUME si detectan (o sospechan) un cambio en los medios durante las operaciones de E/S. (Consulte Compatibilidad con medios extraíbles para obtener más información). Los controladores de dispositivos que requieren alimentación de entrada deben SER O el miembro Flags con DO_POWER_INRUSH y los controladores de dispositivos que no están en la ruta de acceso de paginación del sistema deben O el miembro Flags con DO_POWER_PAGABLE. Los controladores de función y filtro deben borrar la marca DO_DEVICE_INITIALIZING.

Después de inicializar el objeto de dispositivo, un controlador también puede inicializar los objetos definidos por kernel y otras estructuras de datos definidas por el sistema para las que ha proporcionado almacenamiento en la extensión del dispositivo. Precisamente cuando un controlador realiza estas tareas depende de su dispositivo, del tipo del objeto o de la naturaleza de los datos. En general, los objetos o estructuras de datos que se pueden conservar a través de las solicitudes de inicio y detención de PnP se pueden inicializar en la rutina AddDevice . Aquellos que requieren información de recursos proporcionada con una solicitud de IRP_MN_START_DEVICE PnP, o que pueden requerir cambios cuando se detiene o reinicia el dispositivo, se deben inicializar cuando el controlador controla la solicitud de IRP_MN_START_DEVICE . Para obtener más información sobre las rutinas AddDevice , vea Escribir una rutina AddDevice.