Création d’un sous-appareil

Le terme subdevice est utilisé pour décrire la liaison des quatre composants répertoriés dans le tableau suivant.

Composant Description

Objet Miniport

Objet qui expose l’interface IMiniportXxx du pilote miniport

Objet Port

Objet qui expose l’interface IPortXxx du pilote de port

Objet de liste de ressources

Objet contenant une liste de ressources de pilote d’adaptateur qui sont affectées au sous-appareil

Chaîne de référence

Nom ajouté au nom du chemin d’accès de l’appareil pour spécifier un sous-appareil lors de la création du filtre

Les interfaces IMiniportXxx et IPortXxx d’un sous-appareil héritent respectivement des interfaces de base IMiniport et IPort.

Le pilote système PortCls ne fait pas de distinction entre le pilote de port et le pilote miniport. Il nécessite simplement un objet, tel que l’objet port, avec une interface capable de gérer les requêtes générées par le système.

De même, PortCls n’est pas directement impliqué dans la gestion des ressources. Il doit uniquement lier le gestionnaire de requêtes (le pilote de port) à une liste de ressources. Le pilote de l’adaptateur est chargé de lier les objets de port, de miniport et de liste de ressources.

L’exemple de code suivant montre comment le pilote de l’adaptateur effectue ces actions :

  //
  // 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();
  }

Pour plus d’informations sur les appels de fonction PortCls dans l’exemple de code précédent, consultez PcNewPort, PcNewMiniport et PcRegisterSubdevice.