Déchargement d’un module fournisseur
Pour décharger un module fournisseur, le système d’exploitation appelle la fonction Deload du module fournisseur. Consultez Initialisation et inscription d’un module fournisseur pour plus d’informations sur la façon de spécifier la fonction Deload d’un module de fournisseur pendant l’initialisation.
La fonction Unload d’un module fournisseur garantit que le module fournisseur est désinscrit du serveur d’enregistrement de modules réseau (NMR) avant que le module fournisseur ne soit déchargé de la mémoire système. Un module fournisseur lance la désinscription à partir de la NMR en appelant la fonction NmrDeregisterProvider , qu’il appelle généralement à partir de sa fonction Unload . Un module fournisseur ne doit pas retourner à partir de sa fonction Unload tant qu’il n’a pas été complètement désinscrit de la NMR. Si l’appel à NmrDeregisterProvider retourne STATUS_PENDING, le module fournisseur doit appeler la fonction NmrWaitForProviderDeregisterComplete pour attendre la fin de la désinscription avant de retourner à partir de sa fonction Unload .
Par exemple :
// Variable containing the handle for the registration
HANDLE ProviderHandle;
// Unload function
VOID
Unload(
IN PDRIVER_OBJECT DriverObject
)
{
NTSTATUS Status;
// Deregister the provider module from the NMR
Status =
NmrDeregisterProvider(
ProviderHandle
);
// Check if pending
if (Status == STATUS_PENDING)
{
// Wait for the deregistration to be completed
NmrWaitForProviderDeregisterComplete(
ProviderHandle
);
}
// An error occurred
else
{
// Handle error
...
}
}
Si un module fournisseur est inscrit en tant que fournisseur de plusieurs interfaces de programmation réseau (NPI), il doit appeler NmrDeregisterProvider pour chaque NPI qu’il prend en charge. Si un module réseau est inscrit en tant que module fournisseur et module client (autrement dit, il s’agit d’un fournisseur d’un NPI et d’un client d’un autre NPI), il doit appeler À la fois NmrDeregisterProvider et NmrDeregisterClient.
Un module réseau doit attendre que toutes les désinscriptions soient terminées avant de retourner à partir de sa fonction Unload .
Un module fournisseur n’est pas nécessaire pour appeler NmrDeregisterProvider à partir de sa fonction Unload . Par exemple, dans le cas où un module fournisseur est un sous-composant d’un pilote complexe, la désinscription du module fournisseur peut se produire lorsque le sous-composant du module fournisseur est désactivé. Toutefois, dans une telle situation, le pilote doit toujours s’assurer que le module fournisseur a été complètement désinscrit de la RMN avant de revenir à partir de sa fonction Unload .