Partager via


Déchargement d’un pilote de légende

Pour décharger un pilote de légende, le système d’exploitation appelle la fonction de déchargement du pilote de légende. Pour plus d’informations sur la façon de spécifier la fonction de déchargement d’un pilote de légende, consultez Spécification d’une fonction de déchargement.

La fonction de déchargement d’un pilote de légende garantit que les légendes du pilote de légende sont désinscrits du moteur de filtre avant que le pilote de légende ne soit déchargé de la mémoire système. Un pilote de légende appelle la fonction FwpsCalloutUnregisterById0 ou la fonction FwpsCalloutUnregisterByKey0 pour annuler l’inscription d’une légende du moteur de filtre. Un pilote de légende ne doit pas retourner à partir de sa fonction de déchargement tant qu’il n’a pas correctement désinscrit toutes ses légendes du moteur de filtre.

Une fois qu’un pilote de légende a désinscrit toutes ses légendes du moteur de filtre, il doit supprimer l’objet de périphérique qu’il a créé avant d’inscrire ses légendes à l’origine. Un pilote de légende basé sur le modèle de pilote Windows (WDM) appelle la fonction IoDeleteDevice pour supprimer l’objet de périphérique. Un pilote de légende basé sur les frameworks de pilotes Windows (WDF) appelle la fonction WdfObjectDelete pour supprimer l’objet de périphérique du framework.

Un pilote de légende doit également détruire tout handle d’injection de paquets qu’il a créé précédemment en appelant la fonction FwpsInjectionHandleDestroy0 avant de retourner à partir de sa fonction de déchargement.

Par exemple :

// Device object
PDEVICE_OBJECT deviceObject;

// Variable for the run-time callout identifier
UINT32 CalloutId;

// Injection handle
HANDLE injectionHandle;

// Unload function
VOID
 Unload(
    IN PDRIVER_OBJECT DriverObject
    )
{
  NTSTATUS status;

  // Unregister the callout
 status =
 FwpsCalloutUnregisterById0(
 CalloutId
      );

  // Check result
 if (status == STATUS_DEVICE_BUSY)
  {
    // For each data flow that is being processed by the
    // callout that has an associated context, clean up
    // the context and then call FwpsFlowRemoveContext0
    // to remove the context from the data flow.
    ...

    // Finish unregistering the callout
 status =
 FwpsCalloutUnregisterById0(
 CalloutId
        );
  }

  // Check status
 if (status != STATUS_SUCCESS)
  {
    // Handle error
    ...
  }

  // Delete the device object
 IoDeleteDevice(
 deviceObject
    );

  // Destroy the injection handle
 status =
 FwpsInjectionHandleDestroy0(
 injectionHandle
      );

  // Check status
 if (status != STATUS_SUCCESS)
  {
    // Handle error
    ...
  }
}

L’exemple précédent suppose un pilote de légende basé sur WDM. Pour un pilote de légende basé sur WDF, la seule différence est le paramètre qui est passé à la fonction de déchargement du pilote de légende et la façon dont le pilote de légende supprime l’objet de périphérique d’infrastructure.

WDFDEVICE wdfDevice;

VOID
 Unload(
    IN WDFDRIVER Driver;
    )
{

  ...

  // Delete the framework device object
 WdfObjectDelete(
 wdfDevice
    );

  ...
}