Здравствуйте DelpH, Вы писали:
DH>1) вопрос по реализации функции WlxLoggedOutSAS (как MSDN) DH>Там проверяется так: if (!LogonUser( L"guest", L"earth", L"secret", LOGON32_LOGON_UNLOCK, DH>LOGON32_PROVIDER_DEFAULT, phToken)). Вопрос как и откуда получать реальные имя пользователя, домэин и пароль. А то в конце ф-ии это все запихивается в pMprNotifyInfo, а когда я испольщовал реализацию по умолчанию, я их как раз брал из pMprNotifyInfo?
При реализации своей GINA DLL возможны два подхода:
1) Проверку пользователей осуществляет MSGINA. В таком случае MSGINA рисует весь UI, MSGINA вызывает [Lsa]LogonUser и возвращает тебе токен пользователя и информацию о пользователе. Ты обязан вызывать одноименные функции MSGINA из своих функций (а если ты этого не делаешь, ты должен четко понимать, почему). Это просто, это продемонстрировано в статье "MSGINA — это просто".
2) Проверку пользователей осуществляешь ты. В таком случае, ты должен рисовать весь UI самостоятельно, ты не можешь вызывать ни одной функции из MSGINA. Так что ответ на твой вопрос — имя пользователя, пароль и домен ты получишь из своего диалога.
DH>2) В статье "MSGINA — это просто" свои функции задаются таблицей и адреса получаются так: DH>PDWlxActivateUserShell *pWlxFunc=(PDWlxActivateUserShell *)&Wlxtbl; DH>for(int i=0;i<ImportsNumber;i++) DH>{ pWlxFunc[i]=(PDWlxActivateUserShell)::GetProcAddress(hGina,ImportFunctions[i]); }
DH>Как правильно получать адреса, если я объявляю функции не таблицей, а по отдельности. Типа пробовал так: DH>HMODULE hGina = NULL; DH>hGina=LoadLibrary("msgina.dll"); DH>DWlxNegotiate = (PDWlxNegotiate) GetProcAddress(hGina, "WlxNegotiate"); DH>if(!DWlxNegotiate) DH>{ return FALSE; }
Должно работать, только имей в виду, что MSGINA.DLL должна быть загружена один раз в самом начале и выгружена в самом конце.
P.S. Примеры к GINA на MSDN не выдерживают никакой критики. Мало того, что они не демонстрируют на самом деле ничего, так в них еще есть и ошибки, в частности, пример для WlxLoggedOutSAS полностью игнорирует параметр pLogonSid. Последствия этого — DLL initialization failed для user32 при запуске userinit.exe.