Jak działa narzędzie Windows Windows Updater podczas zamykania?

2

W systemie Windows XP, gdy aktualizacje systemu Windows są gotowe do zainstalowania, działają one w specjalnym interfejsie użytkownika podczas procesu zamykania systemu po wylogowaniu wszystkich użytkowników.

Jak to się osiąga?

Czy CSRSS lub inny komponent zarządzania Windows uruchamia aplikację Windows Update UI jako specjalny przypadek niedostępny dla zwykłych programistów?

Czy działa jak jakiś skrypt zamykający?

Czy używa trybu jądra?

Co, jeśli w ogóle, plik wykonywalny lub moduł jest odpowiedzialny za wyświetlanie tego interfejsu użytkownika?


źródło

Odpowiedzi:

2

Ten interfejs użytkownika należy do Winlogon, który ładuje i wywołuje bibliotekę DLL Windows Update podczas sekwencji zamykania. Tekst pochodzi z usługi Windows Update za pośrednictwem wywołania zwrotnego.

Winlogon wywołuje różne funkcje wewnętrzne w odpowiedzi na zmiany stanu sesji (logowanie, wylogowanie, uruchomienie, zamknięcie itd.). W przypadku, gdy badałem, w XP jedną z funkcji wywoływanych podczas zamykania jest WUNotify. Dynamicznie ładuje wuaueng.dll, wywołuje GetProcAddress na porządek 5 (WUAutoUpdateAtShutdown) i wywołuje tę funkcję z flagą bool i wskaźnikiem funkcji do StatusMessage2. WUAutoUpdateAtShutdown z kolei komunikuje się poza procesem z usługą Windows Update, aby wykonać swoją pracę, i używa StatusMessage2 do aktualizacji tekstu interfejsu użytkownika Winlogon („Instalowanie aktualizacji 1 z 10” itp.)

W wersjach wcześniejszych niż Vista można było utworzyć własną bibliotekę DLL powiadomień Winlogon, a przy użyciu odpowiednich kluczy rejestru Winlogon załadowałby moduł i wywołał eksport w celu uzyskania interesujących cię powiadomień. Innym sposobem na zrobienie tego, także wcześniejszym niż Vista, było napisz własną bibliotekę GINA DLL.

W dzisiejszych czasach możesz uruchamiać się przy wyłączaniu za pomocą powiadomienia serwisowego (chociaż nie masz tutaj dużo czasu) lub skryptu zamykającego GPO (który podlega ograniczeniom limitu czasu rejestru). Nie wiem, czy okno statusu Winlogon istnieje, gdy te rzeczy działają, ale jeśli tak, możesz być w stanie wyszukać HWND i użyć SetWindowText bezpośrednio do zmiany komunikatu o stanie Winlogon. (Tak właśnie ostatecznie działa StatusMessage2. Chociaż może to być fajne ze skryptu zamykającego jako „dowodu koncepcji”, oczywiście nie jest to obsługiwane ani zalecane zachowanie).

Kevin Thompson
źródło