VBoxGINA.cpp revision 1ab1576a9b15fe6c522370e781354682de5396ac
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * VBoxGINA -- Windows Logon DLL for VirtualBox
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * available from http://www.virtualbox.org. This file is free software;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * you can redistribute it and/or modify it under the terms of the GNU
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * General Public License (GPL) as published by the Free Software
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * additional information or have any questions.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Global variables
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** DLL instance handle */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** Version of Winlogon */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** Handle to Winlogon service */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** Winlog function dispatch table */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Function pointers to MSGINA entry points
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/* GINA 1.1 */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/* GINA 1.3 */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/* GINA 1.4 */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncPGWLXGETCONSOLESWITCHCREDENTIALS GWlxGetConsoleSwitchCredentials;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * DLL entry point.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /// @todo RTR3Term();
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* enable full log output */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync RTLogGroupSettings(RTLogDefaultInstance(), "all=~0");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: dwWinlogonVersion: %d\n", dwWinlogonVersion));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* load the standard Microsoft GINA DLL */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed loading MSGINA! last error = %d\n", GetLastError()));
968c867cc19737e4e1fd97c396fcf75a3d52dd27vboxsync * Now get the entry points of the MSGINA
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxNegotiate = (PGWLXNEGOTIATE)GetProcAddress(hDll, "WlxNegotiate");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxNegotiate\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxInitialize = (PGWLXINITIALIZE)GetProcAddress(hDll, "WlxInitialize");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxInitialize\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync (PGWLXDISPLAYSASNOTICE)GetProcAddress(hDll, "WlxDisplaySASNotice");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxDisplaySASNotice\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync (PGWLXLOGGEDOUTSAS)GetProcAddress(hDll, "WlxLoggedOutSAS");
968c867cc19737e4e1fd97c396fcf75a3d52dd27vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxLoggedOutSAS\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync (PGWLXACTIVATEUSERSHELL)GetProcAddress(hDll, "WlxActivateUserShell");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxActivateUserShell\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync (PGWLXLOGGEDONSAS)GetProcAddress(hDll, "WlxLoggedOnSAS");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxLoggedOnSAS\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync (PGWLXDISPLAYLOCKEDNOTICE)GetProcAddress(hDll, "WlxDisplayLockedNotice");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxDisplayLockedNotice\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxIsLockOk = (PGWLXISLOCKOK)GetProcAddress(hDll, "WlxIsLockOk");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxIsLockOk\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync (PGWLXWKSTALOCKEDSAS)GetProcAddress(hDll, "WlxWkstaLockedSAS");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxWkstaLockedSAS\n"));
b84a3f2aac9529d5c5840512b12d81bc62d0e665vboxsync GWlxIsLogoffOk = (PGWLXISLOGOFFOK)GetProcAddress(hDll, "WlxIsLogoffOk");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxIsLogoffOk\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxLogoff = (PGWLXLOGOFF)GetProcAddress(hDll, "WlxLogoff");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxLogoff\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxShutdown = (PGWLXSHUTDOWN)GetProcAddress(hDll, "WlxShutdown");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: failed resolving WlxShutdown\n"));
968c867cc19737e4e1fd97c396fcf75a3d52dd27vboxsync /* GINA 1.1, optional */
b84a3f2aac9529d5c5840512b12d81bc62d0e665vboxsync GWlxStartApplication = (PGWLXSTARTAPPLICATION)GetProcAddress(hDll, "WlxStartApplication");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxScreenSaverNotify = (PGWLXSCREENSAVERNOTIFY)GetProcAddress(hDll, "WlxScreenSaverNotify");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* GINA 1.3, optional */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxNetworkProviderLoad = (PGWLXNETWORKPROVIDERLOAD)GetProcAddress( hDll, "WlxNetworkProviderLoad");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxDisplayStatusMessage = (PGWLXDISPLAYSTATUSMESSAGE)GetProcAddress( hDll, "WlxDisplayStatusMessage");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxGetStatusMessage = (PGWLXGETSTATUSMESSAGE)GetProcAddress( hDll, "WlxGetStatusMessage");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxRemoveStatusMessage = (PGWLXREMOVESTATUSMESSAGE)GetProcAddress( hDll, "WlxRemoveStatusMessage");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* GINA 1.4, optional */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync (PGWLXGETCONSOLESWITCHCREDENTIALS)GetProcAddress(hDll, "WlxGetConsoleSwitchCredentials");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxReconnectNotify = (PGWLXRECONNECTNOTIFY)GetProcAddress(hDll, "WlxReconnectNotify");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxDisconnectNotify = (PGWLXDISCONNECTNOTIFY)GetProcAddress(hDll, "WlxDisconnectNotify");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxNegotiate: optional function pointers:\n"
968c867cc19737e4e1fd97c396fcf75a3d52dd27vboxsync " WlxStartApplication: %p\n"
b84a3f2aac9529d5c5840512b12d81bc62d0e665vboxsync " WlxScreenSaverNotify: %p\n"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync " WlxNetworkProviderLoad: %p\n"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync " WlxDisplayStatusMessage: %p\n"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync " WlxGetStatusMessage: %p\n"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync " WlxRemoveStatusMessage: %p\n"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync " WlxGetConsoleSwitchCredentials: %p\n"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync " WlxReconnectNotify: %p\n"
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync " WlxDisconnectNotify: %p\n",
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxStartApplication, GWlxScreenSaverNotify, GWlxNetworkProviderLoad,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxDisplayStatusMessage, GWlxGetStatusMessage, GWlxRemoveStatusMessage,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync GWlxGetConsoleSwitchCredentials, GWlxReconnectNotify, GWlxDisconnectNotify));
b84a3f2aac9529d5c5840512b12d81bc62d0e665vboxsync /* forward call */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return GWlxNegotiate(dwWinlogonVersion, pdwDllVersion);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncBOOL WINAPI WlxInitialize(LPWSTR lpWinsta, HANDLE hWlx, PVOID pvReserved,
1823a2b6757096c699825898c33f8d93089a1b4bvboxsync /* store Winlogon function table */
1823a2b6757096c699825898c33f8d93089a1b4bvboxsync pWlxFuncs = (PWLX_DISPATCH_VERSION_1_1)pWinlogonFunctions;
1823a2b6757096c699825898c33f8d93089a1b4bvboxsync /* store handle to Winlogon service*/
1823a2b6757096c699825898c33f8d93089a1b4bvboxsync /* hook the dialogs */
1823a2b6757096c699825898c33f8d93089a1b4bvboxsync /* forward call */
1823a2b6757096c699825898c33f8d93089a1b4bvboxsync return GWlxInitialize(lpWinsta, hWlx, pvReserved, pWinlogonFunctions, pWlxContext);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* check if there are credentials for us, if so simulat C-A-D */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxDisplaySASNotice: simulating C-A-D\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* automatic C-A-D */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync pWlxFuncs->WlxSasNotify(hGinaWlx, WLX_SAS_TYPE_CTRL_ALT_DEL);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxDisplaySASNotice: starting credentials poller\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* start the credentials poller thread */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward call to MSGINA */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncint WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType, PLUID pAuthenticationId,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync PSID pLogonSid, PDWORD pdwOptions, PHANDLE phToken,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync PWLX_MPR_NOTIFY_INFO pMprNotifyInfo, PVOID *pProfile)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* when performing a direct logon without C-A-D, our poller might not be running */
b84a3f2aac9529d5c5840512b12d81bc62d0e665vboxsync iRet = GWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId, pLogonSid,
1823a2b6757096c699825898c33f8d93089a1b4bvboxsync // copy pMprNotifyInfo and pLogonSid for later use
1823a2b6757096c699825898c33f8d93089a1b4bvboxsync // pMprNotifyInfo->pszUserName
1823a2b6757096c699825898c33f8d93089a1b4bvboxsync // pMprNotifyInfo->pszDomain
1823a2b6757096c699825898c33f8d93089a1b4bvboxsync // pMprNotifyInfo->pszPassword
1823a2b6757096c699825898c33f8d93089a1b4bvboxsync // pMprNotifyInfo->pszOldPassword
968c867cc19737e4e1fd97c396fcf75a3d52dd27vboxsyncBOOL WINAPI WlxActivateUserShell(PVOID pWlxContext, PWSTR pszDesktopName,
968c867cc19737e4e1fd97c396fcf75a3d52dd27vboxsync /* forward call to MSGINA */
968c867cc19737e4e1fd97c396fcf75a3d52dd27vboxsync return GWlxActivateUserShell(pWlxContext, pszDesktopName, pszMprLogonScript, pEnvironment);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncint WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* Winlogon registry path */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync static TCHAR szPath[] = TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon");
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync if (!RegOpenKey(HKEY_LOCAL_MACHINE, szPath, &hKey))
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync RegQueryValueEx(hKey, TEXT("SAS_S"), 0, &dwType, (PBYTE)&dwValue, &dwSize);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxLoggedOnSAS: could not open registry key! last error: %d\n", GetLastError()));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward call to MSGINA */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return GWlxLoggedOnSAS(pWlxContext, dwSasType, pReserved);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward call to MSGINA */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward call to MSGINA */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncint WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward call to MSGINA */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync // if it's ok to logoff, finish with the stored credentials
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync // and scrub the buffers
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward call to MSGINA */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncVOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward call to MSGINA */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * GINA 1.1 entry points
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncBOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL *pSecure)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward to MSGINA if present */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return GWlxScreenSaverNotify(pWlxContext, pSecure);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* return something intelligent */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncBOOL WINAPI WlxStartApplication(PVOID pWlxContext, PWSTR pszDesktopName,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward to MSGINA if present */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return GWlxStartApplication(pWlxContext, pszDesktopName, pEnvironment, pszCmdLine);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * GINA 1.3 entry points
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncBOOL WINAPI WlxNetworkProviderLoad (PVOID pWlxContext, PWLX_MPR_NOTIFY_INFO pNprNotifyInfo)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward to MSGINA if present */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return GWlxNetworkProviderLoad(pWlxContext, pNprNotifyInfo);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncBOOL WINAPI WlxDisplayStatusMessage(PVOID pWlxContext, HDESK hDesktop, DWORD dwOptions,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward to MSGINA if present */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return GWlxDisplayStatusMessage(pWlxContext, hDesktop, dwOptions, pTitle, pMessage);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncBOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext, DWORD *pdwOptions,
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward to MSGINA if present */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return GWlxGetStatusMessage(pWlxContext, pdwOptions, pMessage, dwBufferSize);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncBOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward to MSGINA if present */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * GINA 1.4 entry points
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncBOOL WINAPI WlxGetConsoleSwitchCredentials(PVOID pWlxContext,PVOID pCredInfo)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync Log(("VBoxGINA::WlxGetConsoleSwitchCredentials\n"));
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward call to MSGINA if present */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync return GWlxGetConsoleSwitchCredentials(pWlxContext,pCredInfo);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward to MSGINA if present */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync /* forward to MSGINA if present */