estructura DRIVER_OBJECT (wdm.h)
Cada objeto de controlador representa la imagen de un controlador en modo kernel cargado. Un puntero al objeto de controlador es un parámetro de entrada para driver's DriverEntry, AddDevice y opcional Reinitialize routines y a su rutina Unload , si existe.
Un objeto de controlador es parcialmente opaco. Los escritores de controladores deben conocer determinados miembros de un objeto de controlador para inicializar un controlador y descargarlo si el controlador es descargable. Los siguientes miembros del objeto driver son accesibles para los controladores.
Sintaxis
typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
UNICODE_STRING DriverName;
PUNICODE_STRING HardwareDatabase;
PFAST_IO_DISPATCH FastIoDispatch;
PDRIVER_INITIALIZE DriverInit;
PDRIVER_STARTIO DriverStartIo;
PDRIVER_UNLOAD DriverUnload;
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT, *PDRIVER_OBJECT;
Miembros
Type
Define el tipo de miembro de CSHORT.
Size
Define el tamaño del miembro de CSHORT.
DeviceObject
Puntero a los objetos de dispositivo creados por el controlador. Este miembro se actualiza automáticamente cuando el controlador llama a IoCreateDevice correctamente. Un controlador puede usar este miembro y el miembro NextDevice de DEVICE_OBJECT para recorrer una lista de todos los objetos de dispositivo creados por el controlador.
Flags
Define las marcas de miembro de ULONG.
DriverStart
Define el miembro PVOIDDriverStart.
DriverSize
Define el driverSize miembro de ULONG.
DriverSection
Define el elemento miembro PVOIDDriverSection.
DriverExtension
Puntero a la extensión del controlador. El único miembro accesible de la extensión del controlador es DriverExtension-AddDevice>, en el que la rutina DriverEntry de un controlador almacena la rutina AddDevice del controlador.
DriverName
Define el UNICODE_STRING miembro DriverName.
HardwareDatabase
Puntero a la ruta de acceso \Registry\Machine\Hardware a la información de configuración de hardware del Registro.
FastIoDispatch
Puntero a una estructura que define los puntos de entrada de E/S rápidos del controlador. Este miembro solo lo usan FSD y controladores de transporte de red.
DriverInit
El punto de entrada de la rutina DriverEntry , que el administrador de E/S configura.
DriverStartIo
Punto de entrada de la rutina StartIo del controlador, si existe, que establece la rutina DriverEntry cuando se inicializa el controlador. Si un controlador no tiene ninguna rutina StartIo , este miembro es NULL.
DriverUnload
El punto de entrada de la rutina Unload del controlador, si existe, que establece la rutina DriverEntry cuando se inicializa el controlador. Si un controlador no tiene ninguna rutina Unload , este miembro es NULL.
MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]
Tabla de distribución que consta de una matriz de puntos de entrada para las rutinas DispatchXxx del controlador. Los valores de índice de la matriz son los valores IRP_MJ_XXX que representan cada código de función principal de IRP. Cada controlador debe establecer puntos de entrada en esta matriz para las solicitudes IRP_MJ_XXX que controla el controlador. Para obtener más información, vea Escribir rutinas de distribución.
Para ayudar a análisis de código para controladores, comprobador de controladores estáticos (SDV) y otras herramientas de comprobación, cada rutina DispatchXxx se declara mediante el tipo DRIVER_DISPATCH, como se muestra en este ejemplo de código:
DRIVER_DISPATCH DispatchXxx;
A continuación, la rutina de devolución de llamada se implementa de la siguiente manera:
_Use_decl_annotations_
NTSTATUS
DispatchXxx(
struct _DEVICE_OBJECT *DeviceObject,
struct _IRP *Irp
)
{
// Function body
}
El tipo de función DRIVER_DISPATCH se define en el archivo de encabezado Wdm.h. Para identificar con mayor precisión los errores al ejecutar las herramientas de análisis de código, asegúrese de agregar la anotación _ a la _Use_decl_annotations
definición de la función. La _Use_decl_annotations_
anotación garantiza que se usen las anotaciones que se aplican al tipo de función DRIVER_DISPATCH en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, vea Declarar funciones mediante tipos de rol de función para controladores WDM. Para obtener información sobre _Use_decl_annotations_
, vea Anotación del comportamiento de la función.
Comentarios
Cada rutina de inicialización del controlador en modo kernel debe denominarse DriverEntry , por lo que el sistema cargará el controlador automáticamente. Si el nombre de esta rutina es algo más, el escritor del controlador debe definir el nombre de la rutina de inicialización para el enlazador; de lo contrario, el cargador del sistema o el administrador de E/S no pueden encontrar la dirección de transferencia del controlador. Los nombres de otras rutinas de controlador estándar se pueden elegir a discreción del escritor de controladores.
Un controlador debe establecer sus puntos de entrada DispatchXxx en el objeto de controlador que se pasa a la rutina DriverEntry cuando se carga el controlador. Un controlador de dispositivo debe establecer uno o varios puntos de entrada DispatchXxx para el IRP_MJ_XXX que cualquier controlador del mismo tipo de dispositivo debe controlar. Un controlador de nivel superior debe establecer uno o varios puntos de entrada DispatchXxx para todos los IRP_MJ_XXX que debe pasar al controlador de dispositivo subyacente. De lo contrario, un controlador no se envía IRP para ninguna IRP_MJ_XXX para la que no configura una rutina DispatchXxx en el objeto de controlador. Para obtener más información sobre el conjunto de IRP_MJ_XXX que los controladores para distintos tipos de dispositivos subyacentes son necesarios para controlar, consulte IrP Major Function Codes(Códigos de función principales de IRP).
La rutina DriverEntry también establece los puntos de entrada AddDevice, StartIo o Unload del controlador, si los hay, en el objeto del controlador.
Los controladores de dispositivo pueden usar la cadena HardwareDatabase para obtener información de configuración de hardware del Registro cuando se carga el controlador. A un controlador se le concede acceso de solo lectura a esta cadena.
La entrada RegistryPath de la rutina DriverEntry apunta a la clave \Registry\Machine\System\CurrentControlSet\Services\DriverName , donde la entrada de valor driverName identifica el controlador. En cuanto a HardwareDatabase en el objeto de controlador de entrada, se concede acceso de solo lectura a esta cadena.
Los miembros no documentados de un objeto de controlador deben considerarse inaccesibles. Es posible que los controladores con dependencias en ubicaciones de miembros de objeto o en el acceso a miembros no documentados no permanezcan portátiles e interoperables con otros controladores a lo largo del tiempo.
Requisitos
Requisito | Valor |
---|---|
Header | wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h) |