Gestion des demandes d’arrêt d’un appareil
Il existe deux circonstances dans lesquelles, avant de demander aux pilotes d’un appareil d’arrêter un appareil, le gestionnaire PnP demande aux pilotes si l’arrêt de l’appareil est une bonne idée :
Un utilisateur a branché un nouvel appareil, et le gestionnaire PnP doit redistribuer les ressources matérielles du système pour prendre en charge le nouvel appareil.
Un utilisateur a indiqué qu’il souhaite supprimer l’appareil.
Il existe plusieurs façons pour un pilote de gérer ces situations :
Si votre pilote a appelé WdfDeviceSetSpecialFileSupport , car un appareil prend en charge un fichier spécial, et si un fichier spécial est ouvert sur l’appareil, l’infrastructure n’autorise pas l’arrêt de l’appareil.
Pour empêcher temporairement tous les arrêts pendant une période relativement courte, le pilote peut appeler WdfDeviceSetStaticStopRemove.
Pour évaluer et traiter chaque tentative d’arrêt individuellement, le pilote peut fournir des fonctions de rappel EvtDeviceQueryStop et EvtDeviceQueryRemove .
Si l’appareil ne prend pas en charge les fichiers spéciaux et si l’arrêt ou la suppression d’un appareil n’est jamais un problème pour le pilote ou le périphérique, le pilote ne fournit pas les fonctions de rappel EvtDeviceQueryStop et EvtDeviceQueryRemove et n’appelle jamais WdfDeviceSetStaticStopRemove. Dans ce cas, le gestionnaire PnP arrête toujours l’appareil sans vérifier d’abord si le pilote l’autorise.
Redistribuer des ressources
Parfois, le gestionnaire PnP doit redistribuer les ressources matérielles du système. En règle générale, cette redistribution se produit parce qu’un pilote de bus a signalé qu’un nouvel appareil a été branché et que le nouvel appareil nécessite des ressources déjà affectées. Les appareils doivent être arrêtés avant que les ressources ne soient réaffectées.
S’il est nécessaire que votre pilote empêche parfois le gestionnaire PnP d’arrêter un appareil occupé, il peut fournir une fonction de rappel EvtDeviceQueryStop . Si la fonction de rappel EvtDeviceQueryStop de votre pilote retourne une erreur status valeur, le gestionnaire PnP n’arrête pas l’appareil.
Si le pilote détermine qu’il est sûr d’arrêter l’appareil, la fonction de rappel retourne STATUS_SUCCESS. Si aucun des autres pilotes de l’appareil n’empêche l’arrêt, le gestionnaire PnP arrête temporairement l’appareil.
Pour plus d’informations sur l’ordre dans lequel l’infrastructure appelle les fonctions de rappel d’événements d’un pilote lorsque le gestionnaire PnP arrête un appareil pour redistribuer des ressources, consultez The PnP Manager Redistributes System Resources.
Un utilisateur supprime ou désactive un appareil
Un utilisateur peut supprimer ou désactiver certains appareils. Par exemple :
Si votre pilote a défini le membre Amovible (et non le membre SurpriseRemovalOK ) de la structure WDF_DEVICE_PNP_CAPABILITIES de l’appareil, l’utilisateur peut exécuter le programme Débrancher ou éjecter le matériel, puis débrancher ou éjecter l’appareil.
Si votre pilote n’a pas défini le membre NotDisable de la structure WDF_DEVICE_STATE de l’appareil, l’utilisateur peut utiliser Gestionnaire de périphériques pour désactiver l’appareil.
Dans ce cas, le gestionnaire PnP tente d’arrêter l’appareil avant que l’utilisateur ne le supprime.
S’il est nécessaire que votre pilote empêche parfois la suppression d’un appareil occupé, il peut fournir une fonction de rappel EvtDeviceQueryRemove . Si la fonction de rappel EvtDeviceQueryRemove d’un pilote retourne une erreur status valeur, le gestionnaire PnP n’arrête pas l’appareil.
Si le pilote détermine qu’il est sûr pour l’utilisateur de supprimer l’appareil, la fonction de rappel retourne STATUS_SUCCESS. Si aucun des autres pilotes de l’appareil n’empêche la suppression, le gestionnaire PnP arrête l’appareil.
Pour plus d’informations sur l’ordre dans lequel l’infrastructure appelle les fonctions de rappel d’événements d’un pilote lors de l’arrêt d’un appareil pour suppression, consultez Un utilisateur débranche un appareil.