Zpracování požadavku na IRP_MN_QUERY_REMOVE_DEVICE
Správce PnP odešle tento IRP, aby informoval ovladače, že se zařízení chystá odebrat z počítače, a zeptat se, zda je možné zařízení odebrat bez přerušení počítače. Odešle také tento IRP, když uživatel požádá o aktualizaci ovladačů zařízení.
Správce PnP odešle tento IRP na úrovni IRQL PASSIVE_LEVEL v kontextu systémového vlákna.
Před odesláním tohoto protokolu IRP do ovladačů zařízení provede následující akce:
Upozorní všechny aplikace v uživatelském režimu, které se zaregistrovaly k oznámení na zařízení (nebo na souvisejícím zařízení).
To zahrnuje aplikace, které se zaregistrovaly k oznámení na zařízení, na jednom z potomků zařízení (podřízené zařízení, podřízené dítě atd.) nebo na jednom ze vztahů odebrání zařízení. Aplikace zaregistruje takové oznámení voláním CM_Register_Notification nebo RegisterDeviceNotification.
V reakci na toto oznámení se aplikace buď připraví na odebrání zařízení (uzavře popisovače k zařízení) nebo neuspěje v dotazu. Další informace o tom, jak tato oznámení zpracovat, najdete v tématech Registrace k oznámení o příchodu rozhraní zařízení a odebrání zařízení.
Upozorní všechny ovladače režimu jádra, které se zaregistrovaly k oznámení na zařízení (nebo na souvisejícím zařízení).
To zahrnuje ovladače, které se zaregistrovaly k oznámení na zařízení, na jednom z potomků zařízení nebo na jednom ze vztahů odebrání zařízení. Ovladač zaregistruje toto oznámení voláním IoRegisterPlugPlayNotification s kategorií události EventCategoryTargetDeviceChange.
V reakci na toto oznámení buď řadič připraví odebrání zařízení (zavře popisovače zařízení), nebo dotaz nepřijme.
Odešle IRP_MN_QUERY_REMOVE_DEVICE IRP ovladačům následníků zařízení. Další informace o tom, jak stack zařízení zpracovává tento IRP, najdete níže.
(Windows 2000 a novější systémy) Pokud je na zařízení připojený systém souborů, správce PnP odešle požadavek na odstranění k systému souborů a k filtrům systému souborů. Pokud zařízení obsahuje otevřené popisovače, systém souborů obvykle požadavek na odebrání dotazu selže. Pokud ne, systém souborů obvykle uzamkne svazek, aby se zabránilo úspěšnému vytvoření nových souborů v budoucnu. Pokud připojený systém souborů nepodporuje požadavek na odebrání, správce PnP neúspěšně zpracuje tento požadavek pro zařízení.
Pokud jsou všechny výše uvedené kroky úspěšné, správce PnP odešle IRP_MN_QUERY_REMOVE_DEVICE ovladačům zařízení.
Požadavek IRP_MN_QUERY_REMOVE_DEVICE je nejprve zpracován nejvyšším ovladačem v zásobníku zařízení, a poté každým dalším nižším ovladačem. Ovladač zpracovává odstranění IRP ve své rutině DispatchPnP.
V reakci na IRP_MN_QUERY_REMOVE_DEVICEmusí ovladač provést následující:
Určete, jestli je možné zařízení bezpečně odebrat z počítače.
Ovladač musí selhat ARP pro odebrání dotazu, pokud je splněna některá z následujících možností:
Pokud zařízení odeberete, může dojít ke ztrátě dat.
Pokud má komponenta otevřený popisovač k zařízení. (Toto je problém pouze ve Windows 98/Me. Windows 2000 a novější verze systému Windows sledují otevřené popisovače a dotaz selže, pokud jsou otevřené popisovače po dokončení IRP_MN_QUERY_REMOVE_DEVICE.)
Pokud byl ovladač upozorněn (prostřednictvím protokolu IRP IRP_MN_DEVICE_USAGE_NOTIFICATION), že je zařízení v cestě ke stránkování, výpisu stavu systému nebo souboru hibernace.
Pokud má ovladač vynikající odkaz na rozhraní pro zařízení. To znamená, že ovladač poskytl rozhraní v reakci na požadavek IRP_MN_QUERY_INTERFACE a toto rozhraní nebylo dereferencováno.
Pokud zařízení nejde odebrat, zamítněte dotaz pro odebrání IRP.
Nastavte
Irp– na odpovídající stav chyby (obvykle STATUS_UNSUCCESSFUL), zavolejteIoStatus.Status IO_NO_INCREMENT a vraťte se z rutiny dispatchPn PIoCompleteRequest ovladače. Nepředávejte IRP dalšímu nižšímu ovladači. Pokud ovladač dříve odeslal žádost IRP_MN_WAIT_WAKE o povolení probuzení zařízení, zrušte daný IRP pro čekání na probuzení.
Zaznamenejte předchozí stav PnP zařízení.
Ovladač by měl zaznamenat stav PnP, kdy ovladač obdržel požadavek IRP_MN_QUERY_REMOVE_DEVICE, protože ovladač musí vrátit zařízení do tohoto stavu, pokud je dotaz zrušen (IRP_MN_CANCEL_REMOVE_DEVICE). Předchozí stav je obvykle "spuštěn", což je stav, do kterého zařízení přechází, když ovladač úspěšně dokončí požadavek IRP_MN_START_DEVICE.
Jiné předchozí stavy jsou však možné. Uživatel může například zakázat zařízení prostřednictvím Správce zařízení. Nebo v reakci na požadavek IRP_MN_QUERY_CAPABILITIES mohl nadřazený ovladač sběrnice (nebo filtr na ovladači sběrnice) hlásit, že hardware zařízení je vypnuté. V obou případech může ovladač zakázaného zařízení obdržet žádost IRP_MN_QUERY_REMOVE_DEVICE předtím, než obdrží žádost IRP_MN_START_DEVICE.
Dokončete IRP:
V ovladači funkce nebo filtru:
Nastavte Irp–>IoStatus.Status na STATUS_SUCCESS.
Nastavte aktuální umístění zásobníku s IoSkipCurrentIrpStackLocation a předejte IRP dále nižšímu ovladači s IoCallDriver.
Předat stav z IoCallDriver jako návratový stav z rutiny DispatchPnP.
Neprovádějte IRP.
U řidiče autobusu:
Nastavte Irp–>IoStatus.Status na STATUS_SUCCESS.
Dokončete IRP (IoCompleteRequest) pomocí IO_NO_INCREMENT.
Vraťte se z rutiny DispatchPnP.
Pokud některý ovladač v zásobníku zařízení selže u IRP_MN_QUERY_REMOVE_DEVICE, správce PnP odešle IRP_MN_CANCEL_REMOVE_DEVICE do zásobníku zařízení. To brání ovladačům v vyžadování rutiny IoCompletion, aby nástroj IRP pro odebrání dotazu zjistil, jestli nižší ovladač selhal.
Jakmile ovladač úspěšně provede IRP_MN_QUERY_REMOVE_DEVICE a považuje zařízení za zařízení ve stavu čekání na odebrání, musí ovladač zamítnout všechny následné žádosti o vytvoření nového zařízení. Ovladač zpracovává všechny ostatní IRP jako obvykle, dokud ovladač neobdrží IRP_MN_CANCEL_REMOVE_DEVICE nebo IRP_MN_REMOVE_DEVICE.