Gina & LogOff
От: Баранюк Тарас Николаевич Россия  
Дата: 18.02.02 11:24
Оценка:
Hi!

Ситуация в следующем: Переписываю msgina.dll, все прекрасно работает кроме одной маленькой вещи — при попытке сделать Log off система слегка задумывается, а затем выдает сообщение а-ля "теперь питание вашего компьютера можно выключить" в NT4 и w2k, а в XP просто тихо подвисает в непонятном состоянии с темным экраном... Если понатыкивать MessageBox-ов при вызове Wlx-функций, чтобы дать системе подумать пока я их закрываю =) , то WlxloggedOutSAS проходит, но не проходит авторизация, т.е. пассворд и логин не принимаются...PLZ Help, я просто уже не знаю в каком направлении рыть.
ICQ# 23928287
Re: Gina & LogOff
От: Lexey Россия  
Дата: 18.02.02 12:41
Оценка:
Здравствуйте Баранюк Тарас Николаевич, Вы писали:

БТН>Hi!


БТН>Ситуация в следующем: Переписываю msgina.dll, все прекрасно работает кроме одной маленькой вещи — при попытке сделать Log off система слегка задумывается, а затем выдает сообщение а-ля "теперь питание вашего компьютера можно выключить" в NT4 и w2k, а в XP просто тихо подвисает в непонятном состоянии с темным экраном... Если понатыкивать MessageBox-ов при вызове Wlx-функций, чтобы дать системе подумать пока я их закрываю =) , то WlxloggedOutSAS проходит, но не проходит авторизация, т.е. пассворд и логин не принимаются...PLZ Help, я просто уже не знаю в каком направлении рыть.


Код в студию!
Re[2]: Gina & LogOff
От: Баранюк Тарас Николаевич Россия  
Дата: 18.02.02 14:19
Оценка:
Здравствуйте Lexey, Вы писали:

L>Здравствуйте Баранюк Тарас Николаевич, Вы писали:


БТН>>Hi!


БТН>>Ситуация в следующем: Переписываю msgina.dll, все прекрасно работает кроме одной маленькой вещи — при попытке сделать Log off система слегка задумывается, а затем выдает сообщение а-ля "теперь питание вашего компьютера можно выключить" в NT4 и w2k, а в XP просто тихо подвисает в непонятном состоянии с темным экраном... Если понатыкивать MessageBox-ов при вызове Wlx-функций, чтобы дать системе подумать пока я их закрываю =) , то WlxloggedOutSAS проходит, но не проходит авторизация, т.е. пассворд и логин не принимаются...PLZ Help, я просто уже не знаю в каком направлении рыть.


L>Код в студию!

А что именно?
Ну для примера вот:

HINSTANCE hDllInstance; // My instance, for resource loading
HANDLE hGlobalWlx; // Handle to tell winlogon who's calling
PWLX_DISPATCH_VERSION_1_1 pWlxFuncs;
#define WINLOGON_APP TEXT("Winlogon")
#define USERINIT TEXT("Userinit")
#define USERINIT_DEFAULT TEXT("Userinit.exe")

SYSTEMTIME stLocalLogonTime; // logon time
PWSTR szLocalUserName;
PWSTR szLocalDomainName;
PGlobals pGlobals;
PRegData regData;
//////////////////////////////////////////////////////

BOOL WINAPI DllMain(
HINSTANCE hInstance,
DWORD dwReason,
LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls ( hInstance );
hDllInstance = hInstance;
case DLL_PROCESS_DETACH:
default:
return(TRUE);
}
}


BOOL WINAPI WlxNegotiate(
DWORD dwWinlogonVersion,
DWORD *pdwDllVersion
)
{
// SCGinaInitialize();
if (dwWinlogonVersion < WLX_CURRENT_VERSION)
{
return(FALSE);
}
*pdwDllVersion = WLX_CURRENT_VERSION;
return(TRUE);

}


BOOL WINAPI WlxInitialize(
LPWSTR lpWinsta,
HANDLE hWlx,
PVOID pvReserved,
PVOID pWinlogonFunctions,
PVOID *pWlxContext
)
{
pWlxFuncs = (PWLX_DISPATCH_VERSION_1_1) pWinlogonFunctions;
hGlobalWlx = hWlx;
pGlobals = (PGlobals)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, sizeof(Globals));
*pWlxContext = (PVOID) pGlobals;
pWlxFuncs->WlxUseCtrlAltDel(hWlx);
InitCommonControls();
return(TRUE);
}


VOID WINAPI WlxDisplaySASNotice(PVOID pContext)
{
MessageBox(0,TEXT("WlxDisplaySASNotice"),TEXT("WlxDisplaySASNotice"),MB_OK);
return;
}


int WINAPI WlxLoggedOutSAS(
PVOID pWlxContext,
DWORD dwSasType,
PLUID pAuthenticationId,
PSID pLogonSid,
PDWORD pdwOptions,
PHANDLE phToken,
PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
PVOID * pProfile
)
{
MessageBox(0,TEXT("WlxLoggedOutSAS"),TEXT("WlxLoggedOutSAS"),MB_OK);
int result;
LoadRegKey();
result = pWlxFuncs->WlxDialogBoxParam( hGlobalWlx,
hDllInstance,
(LPWSTR) MAKEINTRESOURCE(IDD_LOGON_DIALOG_2K),
NULL,
(DLGPROC)LogonDlgProc,
(LPARAM) pGlobals );
if (result == WLX_SAS_ACTION_LOGON)
{
result = AttemptLogon(pGlobals, pGlobals->pAccount,
pLogonSid, pAuthenticationId);

if (result == WLX_SAS_ACTION_LOGON)
{
*pdwOptions = 0;
*phToken = pGlobals->hUserToken;
*pProfile = NULL;

pMprNotifyInfo->pszUserName = DupString(pGlobals->pAccount->pszUsername);
pMprNotifyInfo->pszDomain = DupString(pGlobals->pAccount->pszDomain);
pMprNotifyInfo->pszPassword = DupString(pGlobals->pAccount->pszPassword);
pMprNotifyInfo->pszOldPassword = NULL;

regData->pszDefaultUserName=pMprNotifyInfo->pszUserName;
SaveRegKey(regData);
GetLocalTime(&stLocalLogonTime);
szLocalUserName = DupString(pGlobals->pAccount->pszUsername);;
szLocalDomainName = DupString(pGlobals->pAccount->pszDomain);;
}
}
return(result);
}

BOOL WINAPI WlxActivateUserShell(
PVOID pWlxContext,
PWSTR pszDesktop,
PWSTR pszMprLogonScript,
PVOID pEnvironment
)
{
WCHAR szText[MAX_PATH];
PWSTR pszScan;
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD StartCount;
GetProfileString(WINLOGON_APP, USERINIT, USERINIT_DEFAULT, szText, MAX_PATH);
StartCount = 0;
pszScan = wcstok(szText, TEXT(","));
while (pszScan)
{
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(STARTUPINFO);
si.lpTitle = pszScan;
si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0L;
si.dwFlags = 0;
si.wShowWindow = SW_SHOW; // at least let the guy see it
si.lpReserved2 = NULL;
si.cbReserved2 = 0;
si.lpDesktop = pszDesktop;
ImpersonateLoggedOnUser(pGlobals->hUserToken);

if (CreateProcessAsUser(pGlobals->hUserToken, // Token to run as
NULL, // App name
pszScan, // Command Line
NULL, // Process SD
NULL, // Thread SD
FALSE, // No inherit
CREATE_UNICODE_ENVIRONMENT,
pEnvironment,
NULL,
&si,
&pi))
{
StartCount++;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
RevertToSelf();
pszScan = wcstok(NULL, TEXT(","));
}

return(StartCount > 0);
}


int WINAPI WlxLoggedOnSAS(
PVOID pWlxContext,
DWORD dwSasType,
PVOID pReserved
)
{
MessageBox(0,TEXT("WlxLoggedOnSAS"),TEXT("WlxLoggedOnSAS"),MB_OK);
int result;
result = pWlxFuncs->WlxDialogBoxParam( hGlobalWlx,
hDllInstance,
(LPTSTR) MAKEINTRESOURCE(IDD_OPTIONS_DIALOG),
NULL,
OptionsDlgProc,
(LPARAM) pWlxContext );
return result;
}


BOOL WINAPI WlxIsLockOk(
PVOID pWlxContext
)
{
return(TRUE);
}

VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
{
int Result;
Result = pWlxFuncs->WlxDialogBoxParam( hGlobalWlx,
hDllInstance,
(LPTSTR) MAKEINTRESOURCE(IDD_WKSTA_LOCKED),
NULL,
WelcomeDlgProc,
0 );
return;
}


int WINAPI WlxWkstaLockedSAS(
PVOID pWlxContext,
DWORD dwSasType
)
{
return(WLX_SAS_ACTION_UNLOCK_WKSTA);
}


BOOL WINAPI WlxIsLogoffOk(
PVOID pWlxContext
)
{
return TRUE;
}


VOID WINAPI WlxLogoff(
PVOID pWlxContext
)
{

MessageBox(0,TEXT("WlxLogoff"),TEXT("WlxLogoff"),MB_OK);
pGlobals->hUserToken = NULL;
pGlobals->pAccount = NULL;
}

VOID WINAPI WlxShutdown(
PVOID pWlxContext,
DWORD ShutdownType
)
{
return;

}


BOOL WINAPI WlxScreenSaverNotify( PVOID pWlxContext, BOOL *pSecure )
{
if (*pSecure)
{
*pSecure = WlxIsLockOk(pWlxContext);
}
return(TRUE);

}


BOOL WINAPI WlxStartApplication (
PVOID pWlxContext,
PWSTR pszDesktopName,
PVOID pEnvironment,
PWSTR pszCmdLine)
{

MessageBox(0,TEXT("WlxStartApplication"),TEXT("WlxStartApplication"),MB_OK);
STARTUPINFO si;
PROCESS_INFORMATION pi;
BOOL bRet;

// Setup STARTUPINFO to pass to CreateProcessAsUser.
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpTitle = pszCmdLine;
si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0L;
si.dwFlags = 0;
si.wShowWindow = SW_SHOW;
si.lpReserved2 = NULL;
si.cbReserved2 = 0;
si.lpDesktop = pszDesktopName;

// Start the application.
bRet = CreateProcessAsUser(pGlobals->hUserToken,
NULL,
pszCmdLine,
NULL,
NULL,
FALSE,
CREATE_UNICODE_ENVIRONMENT,
pEnvironment,
NULL,
&si,
&pi);

// Release the memory winlogon allocated for the environment.
VirtualFree(pEnvironment, 0, MEM_RELEASE);
return bRet;
}


/////////////////////////////////////////////////////////


LogonDlgInit(
HWND hDlg,
LPARAM lParam)
{
SetWindowLong(hDlg, GWL_USERDATA, lParam);
pGlobals->pAccount = NULL;
CenterWindow(hDlg);
if (regData->pszDefaultUserName)
{
SetDlgItemText(hDlg,IDC_USERNAME,regData->pszDefaultUserName);
SetFocus(GetDlgItem(hDlg, IDC_PASSWORD));
}
else
SetFocus(GetDlgItem(hDlg, IDC_USERNAME));
if (regData->pszDefaultDomainName)
{
SetDlgItemText(hDlg,IDC_DOMAIN,regData->pszDefaultDomainName);
}



return(TRUE);

}

int CALLBACK LogonDlgProc(
HWND hDlg,
UINT Message,
WPARAM wParam,
LPARAM lParam)
{
int result;
switch (Message)
{
case WM_INITDIALOG:
return(LogonDlgInit(hDlg, lParam));

case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, WLX_SAS_ACTION_NONE);
}
if (LOWORD(wParam) == IDD_LOGON_BUTTON)
{
pGlobals->pAccount=(PAccount)LocalAlloc(LMEM_FIXED, sizeof(Account));
pGlobals->pAccount->pszUsername = AllocAndCaptureText(hDlg, IDC_USERNAME);
pGlobals->pAccount->pszPassword = AllocAndCaptureText(hDlg, IDC_PASSWORD);
pGlobals->pAccount->pNext = NULL;
if (regData)
pGlobals->pAccount->pszDomain = regData->pszDefaultDomainName;
else
pGlobals->pAccount->pszDomain = DupString(TEXT(""));
pGlobals->pAccount->pszComment = DupString(TEXT(""));
EndDialog(hDlg, WLX_SAS_ACTION_LOGON);
}
if (LOWORD(wParam) == IDD_SHUTDOWN_BUTTON)
{

ShowWindow(hDlg,SW_HIDE);
result = pWlxFuncs->WlxDialogBoxParam( hGlobalWlx,
hDllInstance,
(LPTSTR) MAKEINTRESOURCE(IDD_SHUTDOWN),
hDlg,
(DLGPROC) ShutdownDlgProc,
(LPARAM) pGlobals);
ShowWindow(hDlg,SW_SHOW);

if (result != WLX_SAS_ACTION_NONE)
{
EndDialog(hDlg, result);
}
}
return(TRUE);
break;
case WM_CLOSE:
return(TRUE);
}

return(FALSE);
}

int AttemptLogon(
PGlobals pGlobals,
PAccount pAccount,
PSID pLogonSid,
PLUID pLogonId)
{
HANDLE hUser;
TOKEN_STATISTICS TStats;
TOKEN_GROUPS * pGroups;
DWORD size;
DWORD i;


if (LogonUser( pAccount->pszUsername,
pAccount->pszDomain,
pAccount->pszPassword,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hUser))
{

pGlobals->hUserToken = hUser;

//
// Now, grovel the token we got back for interesting stuff:
//

GetTokenInformation(hUser,
TokenStatistics,
&TStats,
sizeof(TStats),
&size);

*pLogonId = TStats.AuthenticationId;

pGroups = (TOKEN_GROUPS *)LocalAlloc(LMEM_FIXED, 1024);

if (!pGroups)
{
CloseHandle(hUser);
return(WLX_SAS_ACTION_NONE);
}

//
// The tricky part. We need to get the Logon SID from the token,
// since that is what Winlogon will use to protect the windowstation
// and desktop.
//

GetTokenInformation(hUser,
TokenGroups,
pGroups,
1024,
&size);

if (size > 1024)
{
pGroups = (TOKEN_GROUPS *)LocalReAlloc(pGroups, LMEM_FIXED, size);
GetTokenInformation(hUser,
TokenGroups,
pGroups,
size,
&size);
}

for (i = 0; i < pGroups->GroupCount ; i++)
{
if ((pGroups->Groups[i].Attributes & SE_GROUP_LOGON_ID) == SE_GROUP_LOGON_ID)
{
CopySid(GetLengthSid(pLogonSid),
pLogonSid,
pGroups->Groups[i].Sid );
break;
}
}

LocalFree(pGroups);

return(WLX_SAS_ACTION_LOGON);
}

return(WLX_SAS_ACTION_NONE);
}
ICQ# 23928287
Re[3]: Gina & LogOff
От: Lexey Россия  
Дата: 18.02.02 15:05
Оценка:
Здравствуйте Баранюк Тарас Николаевич, Вы писали:

БТН>Здравствуйте Lexey, Вы писали:


L>>Здравствуйте Баранюк Тарас Николаевич, Вы писали:


БТН>>>Hi!


БТН>>>Ситуация в следующем: Переписываю msgina.dll, все прекрасно работает кроме одной маленькой вещи — при попытке сделать Log off система слегка задумывается, а затем выдает сообщение а-ля "теперь питание вашего компьютера можно выключить" в NT4 и w2k, а в XP просто тихо подвисает в непонятном состоянии с темным экраном... Если понатыкивать MessageBox-ов при вызове Wlx-функций, чтобы дать системе подумать пока я их закрываю =) , то WlxloggedOutSAS проходит, но не проходит авторизация, т.е. пассворд и логин не принимаются...PLZ Help, я просто уже не знаю в каком направлении рыть.


L>>Код в студию!

БТН>А что именно?

То, что не работает.

БТН>Ну для примера вот:


У.... как все запущено. Неужели вам реально нужно переписывать ВСЮ функциональность msgina?

БТН>HINSTANCE hDllInstance; // My instance, for resource loading

БТН>HANDLE hGlobalWlx; // Handle to tell winlogon who's calling
БТН>PWLX_DISPATCH_VERSION_1_1 pWlxFuncs;
БТН>#define WINLOGON_APP TEXT("Winlogon")
БТН>#define USERINIT TEXT("Userinit")
БТН>#define USERINIT_DEFAULT TEXT("Userinit.exe")

БТН>SYSTEMTIME stLocalLogonTime; // logon time

БТН>PWSTR szLocalUserName;
БТН>PWSTR szLocalDomainName;
БТН>PGlobals pGlobals;
БТН>PRegData regData;
БТН>//////////////////////////////////////////////////////

БТН>BOOL WINAPI DllMain(

БТН> HINSTANCE hInstance,
БТН> DWORD dwReason,
БТН> LPVOID lpReserved)
БТН>{
БТН> switch (dwReason)
БТН> {
БТН> case DLL_PROCESS_ATTACH:
БТН> DisableThreadLibraryCalls ( hInstance );
БТН> hDllInstance = hInstance;
БТН> case DLL_PROCESS_DETACH:
БТН> default:
БТН> return(TRUE);
БТН> }
БТН>}


БТН>BOOL WINAPI WlxNegotiate(

БТН> DWORD dwWinlogonVersion,
БТН> DWORD *pdwDllVersion
БТН> )
БТН>{
БТН>// SCGinaInitialize();
БТН> if (dwWinlogonVersion < WLX_CURRENT_VERSION)
БТН> {
БТН> return(FALSE);
БТН> }
БТН> *pdwDllVersion = WLX_CURRENT_VERSION;
БТН> return(TRUE);

БТН>}



БТН>BOOL WINAPI WlxInitialize(

БТН> LPWSTR lpWinsta,
БТН> HANDLE hWlx,
БТН> PVOID pvReserved,
БТН> PVOID pWinlogonFunctions,
БТН> PVOID *pWlxContext
БТН> )
БТН>{
БТН> pWlxFuncs = (PWLX_DISPATCH_VERSION_1_1) pWinlogonFunctions;
БТН> hGlobalWlx = hWlx;
БТН> pGlobals = (PGlobals)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, sizeof(Globals));
БТН> *pWlxContext = (PVOID) pGlobals;
БТН> pWlxFuncs->WlxUseCtrlAltDel(hWlx);
БТН> InitCommonControls();

Зачем это?

БТН> return(TRUE);

БТН>}


БТН>VOID WINAPI WlxDisplaySASNotice(PVOID pContext)

БТН>{
БТН> MessageBox(0,TEXT("WlxDisplaySASNotice"),TEXT("WlxDisplaySASNotice"),MB_OK);

В Gina нельзя использовать стандартные виндовые контролы. У Winlogon'а есть свои специальные варианты диалоговых функций.

Skip...

В общем, тут черт ногу сломит. Интересен именно участок, который не работает. Но все равно, я бы для начала хорошо подумал, а стоит ли так извращаться?
Re[4]: Gina & LogOff
От: Аноним  
Дата: 20.02.02 08:29
Оценка:
Здравствуйте Lexey, Вы писали:

БТН>>>>Ситуация в следующем: Переписываю msgina.dll, все прекрасно работает кроме одной маленькой вещи — при попытке сделать Log off система слегка задумывается, а затем выдает сообщение а-ля "теперь питание вашего компьютера можно выключить" в NT4 и w2k, а в XP просто тихо подвисает в непонятном состоянии с темным экраном... Если понатыкивать MessageBox-ов при вызове Wlx-функций, чтобы дать системе подумать пока я их закрываю =) , то WlxloggedOutSAS проходит, но не проходит авторизация, т.е. пассворд и логин не принимаются...PLZ Help, я просто уже не знаю в каком направлении рыть.


L>>>Код в студию!

БТН>>А что именно?
L>То, что не работает.
Знал бы где грабли, исправил бы...

L>У.... как все запущено. Неужели вам реально нужно переписывать ВСЮ функциональность msgina?

да, без вариантов...
БТН>> MessageBox(0,TEXT("WlxDisplaySASNotice"),TEXT("WlxDisplaySASNotice"),MB_OK);

L>В Gina нельзя использовать стандартные виндовые контролы. У Winlogon'а есть свои специальные варианты диалоговых функций.

это я знаю =) я их использую для того, "чтобы дать системе подумать пока я их закрываю" (c)

L>В общем, тут черт ногу сломит. Интересен именно участок, который не работает. Но все равно, я бы для >начала хорошо подумал, а стоит ли так извращаться?


дык я еще раз говорю, что я не знаю вообще откуда ноги растут =( Если ты реально сталкивался с переписыванием джины, то могу выслать проект...В любом случае, спасибо , что откликнулся... ты был единственным =(
Re[5]: Gina & LogOff
От: Lexey Россия  
Дата: 20.02.02 10:05
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Lexey, Вы писали:


L>>>>Код в студию!

БТН>>>А что именно?
L>>То, что не работает.
А>Знал бы где грабли, исправил бы...

А логи Winlogon'а ничего не дают?

L>>У.... как все запущено. Неужели вам реально нужно переписывать ВСЮ функциональность msgina?

А>да, без вариантов...
БТН>>> MessageBox(0,TEXT("WlxDisplaySASNotice"),TEXT("WlxDisplaySASNotice"),MB_OK);

L>>В Gina нельзя использовать стандартные виндовые контролы. У Winlogon'а есть свои специальные варианты диалоговых функций.

А>это я знаю =) я их использую для того, "чтобы дать системе подумать пока я их закрываю" (c)

L>>В общем, тут черт ногу сломит. Интересен именно участок, который не работает. Но все равно, я бы для >начала хорошо подумал, а стоит ли так извращаться?


А>дык я еще раз говорю, что я не знаю вообще откуда ноги растут =( Если ты реально сталкивался с переписыванием джины,


Увы, целиком я ее не переписывал — только довески приделывал.

>то могу выслать проект...В любом случае, спасибо , что откликнулся... ты был единственным =(


Да не за что. А в чем все-таки исходная задача состоит?
Re[6]: Gina & LogOff
От: Аноним  
Дата: 20.02.02 10:43
Оценка:
Здравствуйте Lexey, Вы писали:


L>:( А логи Winlogon'а ничего не дают?

где взять отладочную версию winlogon-a? У меня в NTDDK нет...
Re[7]: Gina & LogOff
От: Lexey Россия  
Дата: 20.02.02 12:08
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Lexey, Вы писали:


L>> А логи Winlogon'а ничего не дают?

А> где взять отладочную версию winlogon-a? У меня в NTDDK нет...

Выдрать из Checked-билда.
Re[5]: Gina & LogOff
От: Игорь Вартанов Ниоткуда  
Дата: 20.02.02 17:35
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Lexey, Вы писали:


БТН>>>>>Ситуация в следующем: Переписываю msgina.dll, все прекрасно работает кроме одной маленькой вещи — при попытке сделать Log off система слегка задумывается, а затем выдает сообщение а-ля "теперь питание вашего компьютера можно выключить" в NT4 и w2k, а в XP просто тихо подвисает в непонятном состоянии с темным экраном... Если понатыкивать MessageBox-ов при вызове Wlx-функций, чтобы дать системе подумать пока я их закрываю =) , то WlxloggedOutSAS проходит, но не проходит авторизация, т.е. пассворд и логин не принимаются...PLZ Help, я просто уже не знаю в каком направлении рыть.


Можно мне встрять в вашу занимательную беседу? Спасибо :-)

Надеюсь, дефайн WLX_CURRENT_VERSION реально означает WLX_VERSION_1_1 (сие никак не видно из исходника)?

Больше вроде ничего подозрительного не увидел, хотя использование MessageBox вместо WlxMessageBox явно против правил, и мне не совсем понятно назначение цикла while() в WlxActivateUserShell. Ну и, соответственно, игры с сидами групп. Хотелось бы увидеть весь проект и прогнать самому. Интересно также узнать происхождение комментариев на английском. И кода вцелом.

Я совсем недавно из интересу писал собственную реализацию гины (никаких изысков, обычный вход-выход), так что по свежим воспоминаниям возможно чем-то смогу помочь.

Кстати, я бы для начала выбросил все эксперименты и проверил работу классического варианта, и только после этого добавлял бы перцу понемногу... :-)
---
С уважением,
Игорь
Re: Gina & LogOff
От: Игорь Вартанов Ниоткуда  
Дата: 05.03.02 11:15
Оценка:
Здравствуйте Баранюк Тарас Николаевич, Вы писали:

БТН>Ситуация в следующем: Переписываю msgina.dll, все прекрасно работает кроме одной маленькой вещи — при попытке сделать Log off система слегка задумывается, а затем выдает сообщение а-ля "теперь питание вашего компьютера можно выключить" в NT4 и w2k, а в XP просто тихо подвисает в непонятном состоянии с темным экраном...


Наконец-то я пофиксил твою проблему. Как выяснилось, дело было в том, что пользоваться глобальными данными в качестве контекста гины запрещено.
Ровно после того, как я упаковал все по-правильному (в PGlobals, сохранив ее в pWlxContext) — тут же все и заработало. Похоже (буду еще детально разбираться) Winlogon грузит гину при каждом входе, а не единожды. Если необходимо, проект в текущем состоянии могу прислать обратно.
---
С уважением,
Игорь
Re[2]: Gina & LogOff
От: Alex Fedotov США  
Дата: 05.03.02 18:19
Оценка:
Здравствуйте Игорь Вартанов, Вы писали:

ИВ>Похоже (буду еще детально разбираться) Winlogon грузит гину при каждом входе, а не единожды.


Ты имеешь в виду XP? Потому что в NT4/Win2K это определенно не так.
-- Alex Fedotov
Re[3]: Gina & LogOff
От: Игорь Вартанов Ниоткуда  
Дата: 05.03.02 19:37
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

ИВ>>Похоже (буду еще детально разбираться) Winlogon грузит гину при каждом входе, а не единожды.


AF>Ты имеешь в виду XP? Потому что в NT4/Win2K это определенно не так.


Alex, я же говорю — буду разбираться. Но вот что меня сегодня сбило с толку: вхожу на машину (NT4r) с гиной предыдущей компиляции (с теми самыми глюками), пересобираю гину, переименовываю текущую, копирую в system32 новую сборку, делаю logoff (а глючило именно на нем, точнее сразу после него)... и получаю нормально работающий диалог логина. Делаю вывод — гину последней сборки только что загрузили
---
С уважением,
Игорь
Re[6]: Gina & LogOff
От: Аноним  
Дата: 19.07.04 17:49
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:

ИВ>Здравствуйте Аноним, Вы писали:


А>>Здравствуйте Lexey, Вы писали:


БТН>>>>>>Ситуация в следующем: Переписываю msgina.dll, все прекрасно работает кроме одной маленькой вещи — при попытке сделать Log off система слегка задумывается, а затем выдает сообщение а-ля "теперь питание вашего компьютера можно выключить" в NT4 и w2k, а в XP просто тихо подвисает в непонятном состоянии с темным экраном... Если понатыкивать MessageBox-ов при вызове Wlx-функций, чтобы дать системе подумать пока я их закрываю =) , то WlxloggedOutSAS проходит, но не проходит авторизация, т.е. пассворд и логин не принимаются...PLZ Help, я просто уже не знаю в каком направлении рыть.


ИВ>Можно мне встрять в вашу занимательную беседу? Спасибо


Разрешите и мне тогда уж подключиться к вашей беседе!

ИВ>Надеюсь, дефайн WLX_CURRENT_VERSION реально означает WLX_VERSION_1_1 (сие никак не видно из исходника)?


ИВ>Больше вроде ничего подозрительного не увидел, хотя использование MessageBox вместо WlxMessageBox явно против правил, и мне не совсем понятно назначение цикла while() в WlxActivateUserShell. Ну и, соответственно, игры с сидами групп. Хотелось бы увидеть весь проект и прогнать самому. Интересно также узнать происхождение комментариев на английском. И кода вцелом.


Согласен, возможны проблемы именно из-за неопределенностей в использовании различных версий (1_1, 1_3 и т.д.)

ИВ>Я совсем недавно из интересу писал собственную реализацию гины (никаких изысков, обычный вход-выход), так что по свежим воспоминаниям возможно чем-то смогу помочь.


А вот теперь прошу помощи в решении моей маааааленькой проблемки
функция WlxLoggedOnSas вызывается только один раз, причем выход после ее первого выполнения ничем не завершается (типа ACTION_NONE). Подозрения падают именно на WlxActivateUserShell! Что-то там не так не делается!

Вроде всё старался сделать по минимуму:

extern "C" BOOL __export WINAPI WlxActivateUserShell(PVOID pWlxContext,PWSTR pszDesktopName,PWSTR pszMprLogonScript,PWCHAR pEnvironment)
{
PGLOBALS pGlobals;
STARTUPINFO si;
PROCESS_INFORMATION pi;
BOOL bRet;
int i;
AnsiString temp;


pGlobals = (PGLOBALS) pWlxContext;

ZeroMemory( &si, sizeof( si ) );
//Setup STARTUPINFO to pass to CreateProcessAsUser.
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpTitle = "userinit.exe";
si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0L;
si.dwFlags = 0;
si.wShowWindow = SW_SHOW;
si.lpReserved2 = NULL;
si.cbReserved2 = 0;
temp = AnsiString(pszDesktopName);
si.lpDesktop = temp.c_str();


GetProfileStringW( WINLOGON_APP, USERINIT, USERINIT_DEFAULT, szText, MAX_PATH );

ImpersonateLoggedOnUser( pGlobals->hUserToken );

bRet = CreateProcessAsUser(pGlobals->hUserToken,
NULL,
"userinit.exe",
NULL, NULL, FALSE,
CREATE_UNICODE_ENVIRONMENT,
pEnvironment,
NULL,
&si, &pi );
RevertToSelf();

VirtualFree(pEnvironment, 0, MEM_RELEASE);

if (!bRet) MessageDlg("Shit...", mtError, TMsgDlgButtons() << mbOK, 0);
else
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
return bRet;
}



extern "C" int __export WINAPI WlxLoggedOnSAS(PVOID pWlxContext,DWORD dwSasType,PVOID pReserved)
{
PGLOBALS pGlobals;
int result;

if ( dwSasType != WLX_SAS_TYPE_CTRL_ALT_DEL ) return WLX_SAS_ACTION_NONE;

pGlobals = (PGLOBALS) pWlxContext;

TFormLoggedOnSas *FormLoggedOnSas = new TFormLoggedOnSas(NULL);
result = FormLoggedOnSas->ShowModal();
delete FormLoggedOnSas;
FormLoggedOnSas = NULL;

switch (result)
{
case 1: return WLX_SAS_ACTION_LOCK_WKSTA; //lock
case 2: return WLX_SAS_ACTION_NONE; //change pass (nedodelano)
case 3: return WLX_SAS_ACTION_FORCE_LOGOFF; //logoff
case 4: return WLX_SAS_ACTION_TASKLIST; //tasks
case 6: return WLX_SAS_ACTION_NONE; //none
case 10:return WLX_SAS_ACTION_SHUTDOWN_POWER_OFF; //shutdown
case 11:return WLX_SAS_ACTION_SHUTDOWN_REBOOT; //reboot
default:return WLX_SAS_ACTION_NONE;
}
}

Заранее благодарен за любую помощь!

ИВ>Кстати, я бы для начала выбросил все эксперименты и проверил работу классического варианта, и только после этого добавлял бы перцу понемногу...
Re[2]: Gina & LogOff
От: Lonely Dog Россия  
Дата: 17.01.05 12:33
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:


ИВ>Наконец-то я пофиксил твою проблему. Как выяснилось, дело было в том, что пользоваться глобальными данными в качестве контекста гины запрещено.

ИВ>Ровно после того, как я упаковал все по-правильному (в PGlobals, сохранив ее в pWlxContext) — тут же все и заработало. Похоже (буду еще детально разбираться) Winlogon грузит гину при каждом входе, а не единожды. Если необходимо, проект в текущем состоянии могу прислать обратно.

Привет всем!
Я тоже пишу свою GINA и наблюдаю такое же поведение. При logoff вызывается моя функция WlxIsLogoffOk, которая возвращает TRUE, а дальше ничего не происходит. Черный экран и курсор мыши. Если нажать Ctrl-Shift-Esc, то появляется диспетчер задач. В нем можно запустить снова explorer. Однако, если в нем сделать снова logoff, то просто ничего не произойдет.
Запустил GINA на отладочной версии XP SP1, там ничего не видно.
Может ли кто-нибудь помочь?
Заранее спасибо.
Re[3]: Gina & LogOff
От: Lonely Dog Россия  
Дата: 17.01.05 13:45
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Привет всем!

LD>Я тоже пишу свою GINA и наблюдаю такое же поведение. При logoff вызывается моя функция WlxIsLogoffOk, которая возвращает TRUE, а дальше ничего не происходит. Черный экран и курсор мыши.
Оказывается, это не просто черный экран, а мои обои. То есть, даже профиль не выгружается.
Re[4]: Gina & LogOff
От: Lonely Dog Россия  
Дата: 18.01.05 11:16
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, Lonely Dog, Вы писали:


LD>>Привет всем!

LD>>Я тоже пишу свою GINA и наблюдаю такое же поведение. При logoff вызывается моя функция WlxIsLogoffOk, которая возвращает TRUE, а дальше ничего не происходит. Черный экран и курсор мыши.
LD>Оказывается, это не просто черный экран, а мои обои. То есть, даже профиль не выгружается.
Запуск GINA в отладочной версии винды показывает, что не срабатывает какой-то RPC вызов. Перед этим есть сообщения о том, что не сработал LPC для explorer-а. Блин, может это все-таки бага винды. Знаю, что нечто подобное было на nt4 terminal server edition.
Re[5]: Gina & LogOff
От: Lonely Dog Россия  
Дата: 18.01.05 18:21
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

Проблема была в неправильном заполнении pAuthenticationId в функции WlxLoggedOutSas.
Re[6]: Gina & LogOff
От: Merovingian  
Дата: 06.06.05 07:24
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, Lonely Dog, Вы писали:


LD>Проблема была в неправильном заполнении pAuthenticationId в функции WlxLoggedOutSas.


У меня та же проблема, вроде pAuthenticationId заполняю верно:



BOOL GetRet = GetTokenInformation(pgContext->UserToken,
                          TokenStatistics,
                          &userStats,
                          sizeof(userStats),
                          &cbStats);
    if(GetRet==0)
    return(WLX_SAS_ACTION_NONE);

    
    //pAuthId = (PLUID)LocalAlloc(LPTR,sizeof(LUID));
    *pAuthId = userStats.AuthenticationId;


Кто еще знает, какие траблы могут быть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.