2

В XP, когда обновления Windows готовы к установке, они запускаются в специальном пользовательском интерфейсе во время завершения работы после выхода всех пользователей из системы.

Как это достигается?

Запускает ли CSRSS или другой компонент управления окнами приложение пользовательского интерфейса Центра обновления Windows как особый случай, недоступный обычным программистам?

Это работает как сценарий выключения?

Или он использует режим ядра?

Что, если таковые имеются, исполняемый файл или модуль отвечает за отображение этого пользовательского интерфейса?

1 ответ1

2

Этот пользовательский интерфейс принадлежит Winlogon, который специально загружает и вызывает Windows Update DLL во время последовательности завершения работы. Текст приходит из Центра обновления Windows через обратный вызов.

Winlogon вызывает различные внутренние функции в ответ на изменения состояния сеанса (вход в систему, выход из системы, запуск, завершение работы и т.д.) Где я исследовал, в XP одна из функций, вызываемых во время выключения, - это WUNotify. Он динамически загружает wuaueng.dll, вызывает GetProcAddress для порядкового номера 5 (WUAutoUpdateAtShutdown) и вызывает эту функцию с флагом bool и указателем на функцию StatusMessage2. WUAutoUpdateAtShutdown, в свою очередь, связывается вне процесса со службой Центра обновления Windows для выполнения своей работы и использует StatusMessage2 для обновления текста пользовательского интерфейса Winlogon ("Установка обновления 1 из 10" и т.д.)

До Vista вы могли создать свою собственную DLL-библиотеку уведомлений Winlogon, и с соответствующими ключами реестра Winlogon загружал бы ваш модуль и вызывал ваши экспорты для получения уведомлений, которые вас интересуют. Еще один способ сделать это, также до появления Vista, заключался в написании собственной библиотеки GINA DLL.

В настоящее время вы можете запускаться при завершении работы с помощью служебного уведомления (хотя у вас не так много времени здесь) или сценария завершения работы объекта групповой политики (который ограничен тайм-аутом реестра). Я не знаю, существует ли окно состояния Winlogon, когда эти вещи запускаются, но если это так, вы можете найти HWND и использовать SetWindowText напрямую, чтобы изменить сообщение о состоянии Winlogon. (Вот как в итоге работает StatusMessage2. Хотя это может быть полезно сделать из сценария завершения работы в качестве "доказательства концепции", это явно не поддерживаемое или рекомендуемое поведение.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .