Creación de subdispositivos

El término subdevice se usa para describir el enlace de los cuatro componentes que se enumeran en la tabla siguiente.

Componente Descripción

Miniport (objeto)

Objeto que expone la interfaz IMiniportXxx del controlador de miniport

Objeto Port

Objeto que expone la interfaz IPortXxx del controlador de puerto.

Objeto de lista de recursos

Objeto que contiene una lista de recursos del controlador de adaptador que se asignan al subdispositivo.

Cadena de referencia

Nombre agregado al nombre de la ruta de acceso del dispositivo para especificar un subdispositivo durante la creación del filtro.

Las interfaces IMiniportXxx e IPortXxx de un subdispositivo heredan de las interfaces base IMiniport e IPort, respectivamente.

El controlador del sistema PortCls no distingue entre el controlador de puerto y el controlador de minipuerto. Simplemente requiere un objeto, como el objeto de puerto, con una interfaz que pueda controlar las solicitudes generadas por el sistema.

Del mismo modo, PortCls no está implicado directamente en la administración de recursos. Solo necesita enlazar el controlador de solicitudes (el controlador de puerto) a una lista de recursos. El controlador del adaptador es responsable de enlazar juntos los objetos port, miniport y resource list.

En el ejemplo de código siguiente se muestra cómo realiza el controlador del adaptador estas acciones:

  //
  // Instantiate the port by calling a function supplied by PortCls.
  //
  PPORT    port;
  NTSTATUS ntStatus = PcNewPort(&port, PortClassId);

  if (NT_SUCCESS(ntStatus))
  {
      PUNKNOWN miniport;
      //
      // Create the miniport object.
      //
      if (MiniportCreate)   // a function to create a proprietary miniport
      {
          ntStatus = MiniportCreate(&miniport,
                                    MiniportClassId, NULL, NonPagedPool);
      }
      else   // Ask PortCls for one of its built-in miniports.
      {
          ntStatus = PcNewMiniport((PMINIPORT*)&miniport,
                                   MiniportClassId);
      }

      if (NT_SUCCESS(ntStatus))
      {
          //
          // Bind the port, miniport, and resources.
          //
          ntStatus = port->Init(DeviceObject,
                                Irp, miniport, UnknownAdapter, ResourceList);
          if (NT_SUCCESS(ntStatus))
          {
              //
              // Hand the port driver and the reference
              // string to PortCls.
              //
              ntStatus = PcRegisterSubdevice(DeviceObject,
                                             Name, port);
          }

          //
          // We no longer need to reference the miniport driver.
          // Either the port driver now references it,
          // or binding failed and it should be deleted.
          //
          miniport->Release();
      }

      //
      // Release the reference that existed when PcNewPort() gave us
      // the pointer in the first place. This reference must be released
      // regardless of whether the binding of the port and miniport
      // drivers succeeded.
      //
      port->Release();
  }

Para obtener información sobre las llamadas de función PortCls en el ejemplo de código anterior, vea PcNewPort, PcNewMiniport y PcRegisterSubdevice.