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