Compartir a través de


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 MyAddDevicede 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).