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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.