Secuencia de inicio
Dado que el controlador del adaptador se instala como un servicio de controlador en modo kernel, el sistema operativo carga el controlador del adaptador en tiempo de inicio del sistema y llama a la rutina DriverEntry del controlador. La rutina DriverEntry recibe dos parámetros: un objeto de controlador y un nombre de ruta de acceso del Registro. DriverEntry debe llamar a la función PortCls PcInitializeAdapterDriver con los parámetros driver-object y registry-path name más un tercer parámetro, que es un puntero a la función AddDevice del controlador del adaptador.
En el ejemplo siguiente, la función DriverEntry del controlador pasa el puntero MyAddDevice
de función , que apunta a la función AddDevice del controlador, como tercer parámetro a la rutina PcInitializeAdapterDriver .
NTSTATUS
DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
return PcInitializeAdapterDriver(DriverObject, RegistryPath, MyAddDevice);
}
La rutina PcInitializeAdapterDriver instala la rutina AddDevice proporcionada en la extensión del controlador del objeto de controlador e instala los controladores IRP del controlador PortCls en el propio objeto de controlador.
El código siguiente es una implementación de ejemplo de la función del MyAddDevice
controlador.
#define MAX_MINIPORTS 6 // maximum number of miniports
NTSTATUS
MyAddDevice(
PDRIVER_OBJECT DriverObject,
PDEVICE_OBJECT PhysicalDeviceObject
)
{
return PcAddAdapterDevice(DriverObject, PhysicalDeviceObject, MyStartDevice,
MAX_MINIPORTS, 0);
}
Esta función llama a la función PortCls PcAddAdapterDevice, que crea el dispositivo de adaptador especificado, asocia un controlador con el dispositivo y almacena un puntero a la función del controlador de MyStartDevice
adaptador, al que se llama cuando el sistema operativo inicia el dispositivo (vea Iniciar un dispositivo). La rutina PcAddAdapterDevice crea un objeto de dispositivo funcional (FDO) y lo asocia al objeto de dispositivo físico (PDO) proporcionado por el sistema. El nuevo FDO se crea con una extensión que PortCls usa para almacenar información de contexto sobre el dispositivo. Este contexto incluye el puntero de función MyStartDevice
proporcionado por MyAddDevice
.
Una vez que el sistema operativo determina qué recursos (interrupciones, canales DMA, direcciones de puerto de E/S, etc.) se asignan al dispositivo, envía una solicitud para iniciar (IRP_MN_START_DEVICE). En respuesta a esta solicitud, el controlador de solicitudes del controlador PortCls llama a la función del controlador del MyStartDevice
adaptador, que se muestra en el código de ejemplo siguiente:
NTSTATUS
MyStartDevice(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PRESOURCELIST ResourceList
)
{
...
}
El controlador de solicitudes proporciona MyStartDevice
punteros al objeto de dispositivo, IRP_MN_START_DEVICE solicitud y lista de recursos (consulte IResourceList). La MyStartDevice
función particiona la lista de recursos en los recursos necesarios para cada controlador de miniporte que se debe iniciar. A continuación, la función inicia cada controlador de minipuerto y devuelve el control a PortCls, que completa el IRP y devuelve el control al sistema operativo.
Para obtener más ejemplos de código de inicio del controlador, consulta los controladores de adaptador de audio de ejemplo en el Kit de controladores de Microsoft Windows (WDK).