Расширение MSGINA — это просто.
Автор: Алексей Остапенко
NetInvest
Опубликовано: 12.10.2001
Исправлено: 13.03.2005
Версия текста: 1.0.1
Что такое GINA.
GINA или Graphical Identification and Authentication dll отвечает за пользовательский интерфейс логона в системах линии Windows NT. GINA загружается и используется процессом Winlogon, отвечающим за аутентификацию пользователей. Именно она ответственна за выдачу окошек с надписями «Нажмите CTRL-ALT-DEL» и т.п. В большинстве случаев пользователю вполне достаточно возможностей стандартной реализации GINA — msgina.dll, но иногда возникают ситуации, когда нужно реализовать собственную систему логона или выполнять блокировку станции при возникновении определенного события. Именно для таких случаев программисты Microsoft оставили возможность написания собственной GINA DLL. Однако, написание собственной GINA с нуля — очень трудоемкая задача. Гораздо проще написать DLL, экспортирующую нужные по стандарту GINA функции, большинство из которых являются просто обертками над функциями уже установленной ранее GINA (например, стандартной msgina.dll). Далее я предлагаю вариант построения такой DLL.
Взаимодействие Winlogon и GINA
Winlogon оповещает GINA о возникновении какого-либо события при помощи вызова одной из экспортируемых GINA функций. То, какая функция вызывается, зависит как от самого события (нажатие CTRL-ALT-DEL или запуск скринсейвера), так и от текущего состояния Winlogon. GINA также может оповещать Winlogon о возникновении определенных событий или использовать API Winlogon для вывода диалогов взаимодействия с пользователем.
Когда Winlogon загружает GINA.DLL, он в первую очередь вызывает функцию WlxNegotiate , чтобы сообщить GINA.DLL свою версию и выяснить, какую версию Winlogon она поддерживает. Затем Winlogon вызывает функцию WlxInitialize , передавая GINA свой дескриптор, указатель на таблицу сервисных функций и имя window-станции и ожидая на выходе контекст GINA (набор данных GINA, относящихся к данной window-станции). После этого Winlogon переходит в состояние «Нет залогиненого пользователя» .
В состоянии «Нет залогиненого пользователя» Winlogon ожидает прихода SAS (secure attention sequence=защищенная последовательность активации) либо от пользователя, нажавшего CTRL-ALT-DEL, либо от GINA DLL (она может генерировать свои SAS, отличные от стандартных, и оповещать Winlogon при помощи функции WlxSasNotify ). В случае возникновения SAS Winlogon вызывает в GINA функцию WlxLoggedOutSAS . GINA, обработав данное событие, может либо перевести Winlogon в состояние «Есть залогиненный пользователь. Станция разблокирована» , либо оставить его в текущем состоянии.
При возникновении SAS в состоянии «Есть залогиненный пользователь. Станция разблокирована» Winlogon вызывает функцию WlxLoggedOnSAS , после чего он может быть переведен в состояние «Нет залогиненого пользователя» или в состояние «Есть залогиненный пользователь. Станция заблокирована» , либо оставлен в текущем состоянии.
В состоянии «Есть залогиненный пользователь. Станция заблокирована» вызывается обработчик WlxWkstaLockedSAS . В этом случае GINA может перевести Winlogon в любое из 3-х состояний (как и в предыдущем случае).
Состояния Winlogon и возможные переходы между ними схематически показаны на рисунке.
Также Winlogon следит за нажатиями клавиш и движениями мыши и при длительной неактивности пользователя вызывает в GINA функцию WlxScreenSaverNotify , позволяя GINA определить возможность запуска скринсейвера.
Если пользователь перезагружает машину, Winlogon оповещает GINA посредством вызова WlxShutdown . При этом GINA может освободить все используемые ей ресурсы.
Помимо перечисленных событий Winlogon может оповещать GINA и о других событиях (например, рестарт пользовательской оболочки), но их рассмотрение выходит за рамки этой статьи (более подробно о взаимодействии GINA DLL и Winlogon можно почитать в MSDN).
Реализация DLL-обертки
Сначала я приведу список тех функций, которые должна экспортировать GINA DLL (согласно спецификации Winlogon v1.4 для Windows XP). Их всего 21 штука (часть из них является необязательной. При отсутствии такой функции Winlogon использует свою внутреннюю реализацию. Однако, это может урезать функциональность MSGINA, поэтому мы будем экспортировать все функции):
- WlxActivateUserShell
- WlxDisplayLockedNotice
- WlxDisplaySASNotice
- WlxDisplayStatusMessage
- WlxGetStatusMessage
- WlxInitialize
- WlxIsLockOk
- WlxIsLogoffOk
- WlxLoggedOnSAS
- WlxLoggedOutSAS
- WlxLogoff
- WlxNegotiate
- WlxNetworkProviderLoad
- WlxRemoveStatusMessage
- WlxScreenSaverNotify
- WlxShutdown
- WlxStartApplication
- WlxWkstaLockedSAS
- WlxGetConsoleSwitchCredentials
- WlxReconnectNotify
- WlxDisconnectNotify
Поскольку мы пишем обертку, то большая часть функций будет выглядеть следующим образом:
Инициализация таблицы указателей будет производиться внутри функции DllMain . В ней мы будем считывать название предыдущей GINA DLL из реестра. Его должен будет поместить туда инсталлятор, устанавливающий GINA DLL. Но, поскольку создание инсталляторов здесь не рассматривается, вам нужно будет просто скопировать содержимое значения GinaDLL из ключа в значение PreviousGina ключа если исходное значение существет (если же его нет, то эту операцию можно спокойно опустить). Затем будет производиться попытка загрузить предыдущую GINA DLL, а если это не удалось, будет загружена msgina.dll (такая последовательность необходима для обеспечения нормальной загрузки системы, если предыдущая GINA DLL будет деинсталирована).
где ImportFunctions — это массив строк с именами функций, импортируемых из msgina.dll.
ПРИМЕЧАНИЕ Помимо инициализации таблицы функций, здесь также формируется имя некоего ресурсного файла. В этом файле будет храниться список процессов, обрабатываемых рабочим примеров. Зачем он нужен, станет понятно после того, как я расскажу, в чем же собственно будет заключаться этот пример. 🙂 |
Реализация WlxInitialize.
В отличие от простой обертки, эту функцию нам придется слегка видоизменить, т.к. нам потребуется дескриптор Winlogon и указатель на таблицу его сервисных функций:
ПРИМЕЧАНИЕ Заметим, что здесь использована таблица функций Winlogon версии 1.0. Это гарантирует работоспособность кода с любыми версиями Winlogon. Впрочем, тут можно было бы спокойно использовать таблицу версии 1.3 (Winlogon в Windows 2000), поскольку в дальнейшем пример использует код, не работающий на версиях NT ниже, чем Windows 2000. Однако, дополнительные функции, присутствующие в этой версии, нам не понадобятся. |
Рабочий пример — блокировка запуска скринсейвера, если запущено приложение из списка.
Итак, наш пример будет блокировать запуск скринсейвера, если уже запущено одно из приложений из заданного списка (вот зачем нам нужен дополнительный файл). Вы можете сказать, что этот пример непрактичен, т.к. такого же эффекта можно добиться и другими способами, или попросту бесполезен. Насчет непрактичности сложно что-либо возразить, просто это всего лишь пример, и не более. А вот насчет полезности я мог бы и поспорить. Мне, например, уже надоело выскакивание скринсейвера, когда я смотрю дома любимый фильм в ASUS Live , а отключать каждый раз скринсейвер очень не удобно. Вот я и решил совместить приятное (написание примера) с полезным. 🙂
Как уже упоминалось ранее, Winlogon запрашивает у GINA возможность запуска скринсейвера посредством вызова функции WlxScreenSaverNotify . При этом GINA может либо разрешить, либо запретить запуск. Мы будем анализировать наличие в системе запущенного процесса из заданного списка и блокировать запуск, если такой процесс существует.
Список процессов перечисляется в файле ginaext.lst через пробел или любой другой разумный разделитель. Все названия нужно вводить в нижнем регистре . |
Вот как выглядит моя реализация WlxScreenSaverNotify :
Стоит отметить, что функция WlxScreenSaverNotify является опциональной, поэтому она может не экспортироваться ранее установленной GINA DLL. В этом случае указатель Wlxtbl.WlxScreenSaverNotify будет нулевым, и попытка вызова по нему приведет к краху системы (эта проблема не может возникнуть с msgina.dll, т.к. она экспортирует все функции Wlx. ). В этом случае мы используем способ, которым пользуется Winlogon при отсутствии реализации WlxScreenSaverNotify . Аналогичные проверки на допустимость указателя встроены и в функции WlxStartApplication (при этом полностью вырезана ее функциональность, т.к. при попытка нормальной реализации этой функции возникает большое количество проблем. Остается лишь надеяться, что ранее установленная GINA DLL будет экспортировать эту функцию), WlxReconnectNotify , WlxDisconnectNotify (у меня нет информации насчет обязательности реализации двух последних функций пользовательской GINA, поэтому я решил перестраховаться). |
Установка GINA
Отладка GINA
Отладка GINA DLL — сложное и утомительное занятие. Любая фатальная ошибка приводит к перезагрузке системы, что сильно увеличивает временные и моральные затраты на поиск и устранение ошибок.
Впрочем, Winlogon предоставляет вам некоторые дополнительные возможности по отладке вашей GINA в виде файла с логом событий. Для того чтобы его получить, вам нужно заменить стандартный winlogon.exe на его отладочную версию из Checked-билда или из NT DDK. После этого нужно создать запись в win.ini вида:
Если вы отлаживаете GINA на своей рабочей машине, то я бы порекомендовал также установить на нее Recovery Console (она ставится из дистрибутива Windows 2000 или Windows XP командой winnt32 /cmdcons ) и разрешить копирование файлов в Recovery Console с помощью Policy Editor. Это позволит вам в крайнем случае заменить вашу неработающую GINA DLL на msgina.dll и восстановить работоспособность системы. |
Заключение.
Несмотря на краткость данной статьи, я надеюсь, что она сможет облегчить нелегкий труд системных программистов по созданию собственных расширений GINA и может быть даст кому-нибудь спокойно посмотреть любимый фильм без этого назойливого скринсейвера. 🙂
Как удалить ошибку gina.dll.
“Недавно установленные программы имеют инвалидов Fast User Switching в экране Приветствия.Чтобы восстановить функции, вы должны удалить эту программу.Следующее имя файла,возможно, поможет вам определить программу, которая внесла изменения: ”
p, blockquote 1,0,0,0,0 —>
Примечание: в приведенном выше сообщение об ошибке, варьируется к DLL от сторонней программы которая у вас установлена.Например, если у вас установлен Cisco Systems VPN Dialer-Программа, будет csgina.dll.
p, blockquote 2,0,0,0,0 —>
Причина ошибки
p, blockquote 3,0,1,0,0 —>
Вышеуказанная проблема возникает, когда третья сторона — программа заменяет файл графической идентификации Microsoft и проверку подлинности файла,которыми является msgina.dll.
p, blockquote 4,0,0,0,0 —>
Шаги разрешения проблемы
p, blockquote 5,0,0,0,0 —>
Чтобы исправить эту ситуацию и восстановить функции быстрое Переключение Пользователей и экран приветствия Добро Пожаловать, выполните следующие действия:
p, blockquote 6,1,0,0,0 —>
Примечание: Шаги показанные ниже,требуют редактирования реестра.Будьте осторожны при принятии каких-либо прямых изменений в реестре,потому что любые неправильные изменения реестра могут нанести непоправимый ущерб вашей системе. Поэтому рекомендуется сделать резервную копию реестра,прежде чем вы измените его.Это позволяет вам восстановить реестр в случае возникновения каких-либо осложнений.Вы можете создать резервную копию реестра вручную или использовать продвинутые утилиты для очистки реестра, такие,как RegGenie.
p, blockquote 7,0,0,0,0 —>
Перейдите на Пуск и нажмите на пункт Выполнить.
p, blockquote 8,0,0,0,0 —>
- В поле Открыть введите : regedit и нажмите кнопку OK.
- В левой панели окна Редактор Реестра,перейдите в следующему разделу реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion \ Winlogon
p, blockquote 9,0,0,1,0 —>
- Далее, в правой панели, щелкните правой кнопкой мыши GinaDLL и выберите пункт Удалить.
- Перезагрузите компьютер.
После этих действий при загрузке системы Вы можете увидеть ваш радушный экран .
p, blockquote 10,0,0,0,0 —>
Вредоносные программы,такие как вирусы могут также удалять или изменять msgina.dll string — значение в реестре и тем самым предотвращения вход в систему Пользовательского Интерфейса при загрузке.Это может привести к сообщению об ошибке,которое появляется, когда вы начинаете загружать вашу систему.Вот почему крайне важно,что бы вы хранили вашу систему безопасности от вредоносных программ.Я рекомендую установить надежные вредоносные инструменты,такие,как Antivirus Plus и StopZilla,и установить расписание сканирования всей вашей системы на наличие вредоносных программ.
p, blockquote 11,0,0,0,0 —>
[note]P.P.S. Если у Вас есть вопросы, желание прокомментировать или поделиться опытом, напишите, пожалуйста, в комментариях ниже.[/note]
(Пока оценок нет)
Как удалить ошибку gina.dll.
“Недавно установленные программы имеют инвалидов Fast User Switching в экране Приветствия.Чтобы восстановить функции, вы должны удалить эту программу.Следующее имя файла,возможно, поможет вам определить программу, которая внесла изменения: ”
Примечание: в приведенном выше сообщение об ошибке, варьируется к DLL от сторонней программы которая у вас установлена.Например, если у вас установлен Cisco Systems VPN Dialer-Программа, будет csgina.dll.
Причина ошибки
Вышеуказанная проблема возникает, когда третья сторона — программа заменяет файл графической идентификации Microsoft и проверку подлинности файла,которыми является msgina.dll.
Шаги разрешения проблемы
Чтобы исправить эту ситуацию и восстановить функции быстрое Переключение Пользователей и экран приветствия Добро Пожаловать, выполните следующие действия:
Примечание: Шаги показанные ниже,требуют редактирования реестра.Будьте осторожны при принятии каких-либо прямых изменений в реестре,потому что любые неправильные изменения реестра могут нанести непоправимый ущерб вашей системе. Поэтому рекомендуется сделать резервную копию реестра,прежде чем вы измените его.Это позволяет вам восстановить реестр в случае возникновения каких-либо осложнений.Вы можете создать резервную копию реестра вручную или использовать продвинутые утилиты для очистки реестра, такие,как RegGenie.
Перейдите на Пуск и нажмите на пункт Выполнить.
- В поле Открыть введите : regedit и нажмите кнопку OK.
- В левой панели окна Редактор Реестра,перейдите в следующему разделу реестра:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NT CurrentVersion Winlogon
- Далее, в правой панели, щелкните правой кнопкой мыши GinaDLL и выберите пункт Удалить.
- Перезагрузите компьютер.
После этих действий при загрузке системы Вы можете увидеть ваш радушный экран .