VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/VBoxGINA/VBoxGINA.cpp@ 11444

Last change on this file since 11444 was 8155, checked in by vboxsync, 17 years ago

The Big Sun Rebranding Header Change

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.8 KB
Line 
1/** @file
2 *
3 * VBoxGINA -- Windows Logon DLL for VirtualBox
4 *
5 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
6 *
7 * This file is part of VirtualBox Open Source Edition (OSE), as
8 * available from http://www.virtualbox.org. This file is free software;
9 * you can redistribute it and/or modify it under the terms of the GNU
10 * General Public License (GPL) as published by the Free Software
11 * Foundation, in version 2 as it comes in the "COPYING" file of the
12 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
13 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
14 *
15 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
16 * Clara, CA 95054 USA or visit http://www.sun.com if you need
17 * additional information or have any questions.
18 */
19
20#include <stdio.h>
21#include <stdlib.h>
22#include <windows.h>
23#include "winwlx.h"
24#include "VBoxGINA.h"
25#include "Helper.h"
26#include "Dialog.h"
27
28/*
29 * Global variables
30 */
31
32
33/** DLL instance handle */
34HINSTANCE hDllInstance;
35
36/** Version of Winlogon */
37DWORD wlxVersion;
38
39/** Handle to Winlogon service */
40HANDLE hGinaWlx;
41/** Winlog function dispatch table */
42PWLX_DISPATCH_VERSION_1_1 pWlxFuncs;
43
44/**
45 * Function pointers to MSGINA entry points
46 */
47PGWLXNEGOTIATE GWlxNegotiate;
48PGWLXINITIALIZE GWlxInitialize;
49PGWLXDISPLAYSASNOTICE GWlxDisplaySASNotice;
50PGWLXLOGGEDOUTSAS GWlxLoggedOutSAS;
51PGWLXACTIVATEUSERSHELL GWlxActivateUserShell;
52PGWLXLOGGEDONSAS GWlxLoggedOnSAS;
53PGWLXDISPLAYLOCKEDNOTICE GWlxDisplayLockedNotice;
54PGWLXWKSTALOCKEDSAS GWlxWkstaLockedSAS;
55PGWLXISLOCKOK GWlxIsLockOk;
56PGWLXISLOGOFFOK GWlxIsLogoffOk;
57PGWLXLOGOFF GWlxLogoff;
58PGWLXSHUTDOWN GWlxShutdown;
59/* GINA 1.1 */
60PGWLXSTARTAPPLICATION GWlxStartApplication;
61PGWLXSCREENSAVERNOTIFY GWlxScreenSaverNotify;
62/* GINA 1.3 */
63PGWLXNETWORKPROVIDERLOAD GWlxNetworkProviderLoad;
64PGWLXDISPLAYSTATUSMESSAGE GWlxDisplayStatusMessage;
65PGWLXGETSTATUSMESSAGE GWlxGetStatusMessage;
66PGWLXREMOVESTATUSMESSAGE GWlxRemoveStatusMessage;
67/* GINA 1.4 */
68PGWLXGETCONSOLESWITCHCREDENTIALS GWlxGetConsoleSwitchCredentials;
69PGWLXRECONNECTNOTIFY GWlxReconnectNotify;
70PGWLXDISCONNECTNOTIFY GWlxDisconnectNotify;
71
72
73
74/**
75 * DLL entry point.
76 */
77BOOL WINAPI DllMain(HINSTANCE hInstance,
78 DWORD dwReason,
79 LPVOID lpReserved)
80{
81 switch (dwReason)
82 {
83 case DLL_PROCESS_ATTACH:
84 {
85 DisableThreadLibraryCalls(hInstance);
86 hDllInstance = hInstance;
87 break;
88 }
89
90 case DLL_PROCESS_DETACH:
91 default:
92 break;
93 }
94 return TRUE;
95}
96
97BOOL WINAPI WlxNegotiate(DWORD dwWinlogonVersion,
98 DWORD *pdwDllVersion)
99{
100 HINSTANCE hDll;
101
102#ifdef DEBUG
103 /* enable full log output */
104 RTLogGroupSettings(RTLogDefaultInstance(), "all=~0");
105#endif
106
107 Log(("VBoxGINA::WlxNegotiate: dwWinlogonVersion: %d\n", dwWinlogonVersion));
108
109 /* load the standard Microsoft GINA DLL */
110 if (!(hDll = LoadLibrary(TEXT("MSGINA.DLL"))))
111 {
112 Log(("VBoxGINA::WlxNegotiate: failed loading MSGINA! last error = %d\n", GetLastError()));
113 return FALSE;
114 }
115
116 /*
117 * Now get the entry points of the MSGINA
118 */
119 GWlxNegotiate = (PGWLXNEGOTIATE)GetProcAddress(hDll, "WlxNegotiate");
120 if (!GWlxNegotiate)
121 {
122 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxNegotiate\n"));
123 return FALSE;
124 }
125 GWlxInitialize = (PGWLXINITIALIZE)GetProcAddress(hDll, "WlxInitialize");
126 if (!GWlxInitialize)
127 {
128 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxInitialize\n"));
129 return FALSE;
130 }
131 GWlxDisplaySASNotice =
132 (PGWLXDISPLAYSASNOTICE)GetProcAddress(hDll, "WlxDisplaySASNotice");
133 if (!GWlxDisplaySASNotice)
134 {
135 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxDisplaySASNotice\n"));
136 return FALSE;
137 }
138 GWlxLoggedOutSAS =
139 (PGWLXLOGGEDOUTSAS)GetProcAddress(hDll, "WlxLoggedOutSAS");
140 if (!GWlxLoggedOutSAS)
141 {
142 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxLoggedOutSAS\n"));
143 return FALSE;
144 }
145 GWlxActivateUserShell =
146 (PGWLXACTIVATEUSERSHELL)GetProcAddress(hDll, "WlxActivateUserShell");
147 if (!GWlxActivateUserShell)
148 {
149 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxActivateUserShell\n"));
150 return FALSE;
151 }
152 GWlxLoggedOnSAS =
153 (PGWLXLOGGEDONSAS)GetProcAddress(hDll, "WlxLoggedOnSAS");
154 if (!GWlxLoggedOnSAS)
155 {
156 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxLoggedOnSAS\n"));
157 return FALSE;
158 }
159 GWlxDisplayLockedNotice =
160 (PGWLXDISPLAYLOCKEDNOTICE)GetProcAddress(hDll, "WlxDisplayLockedNotice");
161 if (!GWlxDisplayLockedNotice)
162 {
163 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxDisplayLockedNotice\n"));
164 return FALSE;
165 }
166 GWlxIsLockOk = (PGWLXISLOCKOK)GetProcAddress(hDll, "WlxIsLockOk");
167 if (!GWlxIsLockOk)
168 {
169 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxIsLockOk\n"));
170 return FALSE;
171 }
172 GWlxWkstaLockedSAS =
173 (PGWLXWKSTALOCKEDSAS)GetProcAddress(hDll, "WlxWkstaLockedSAS");
174 if (!GWlxWkstaLockedSAS)
175 {
176 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxWkstaLockedSAS\n"));
177 return FALSE;
178 }
179 GWlxIsLogoffOk = (PGWLXISLOGOFFOK)GetProcAddress(hDll, "WlxIsLogoffOk");
180 if (!GWlxIsLogoffOk)
181 {
182 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxIsLogoffOk\n"));
183 return FALSE;
184 }
185 GWlxLogoff = (PGWLXLOGOFF)GetProcAddress(hDll, "WlxLogoff");
186 if (!GWlxLogoff)
187 {
188 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxLogoff\n"));
189 return FALSE;
190 }
191 GWlxShutdown = (PGWLXSHUTDOWN)GetProcAddress(hDll, "WlxShutdown");
192 if (!GWlxShutdown)
193 {
194 Log(("VBoxGINA::WlxNegotiate: failed resolving WlxShutdown\n"));
195 return FALSE;
196 }
197 /* GINA 1.1, optional */
198 GWlxStartApplication = (PGWLXSTARTAPPLICATION)GetProcAddress(hDll, "WlxStartApplication");
199 GWlxScreenSaverNotify = (PGWLXSCREENSAVERNOTIFY)GetProcAddress(hDll, "WlxScreenSaverNotify");
200 /* GINA 1.3, optional */
201 GWlxNetworkProviderLoad = (PGWLXNETWORKPROVIDERLOAD)GetProcAddress( hDll, "WlxNetworkProviderLoad");
202 GWlxDisplayStatusMessage = (PGWLXDISPLAYSTATUSMESSAGE)GetProcAddress( hDll, "WlxDisplayStatusMessage");
203 GWlxGetStatusMessage = (PGWLXGETSTATUSMESSAGE)GetProcAddress( hDll, "WlxGetStatusMessage");
204 GWlxRemoveStatusMessage = (PGWLXREMOVESTATUSMESSAGE)GetProcAddress( hDll, "WlxRemoveStatusMessage");
205 /* GINA 1.4, optional */
206 GWlxGetConsoleSwitchCredentials =
207 (PGWLXGETCONSOLESWITCHCREDENTIALS)GetProcAddress(hDll, "WlxGetConsoleSwitchCredentials");
208 GWlxReconnectNotify = (PGWLXRECONNECTNOTIFY)GetProcAddress(hDll, "WlxReconnectNotify");
209 GWlxDisconnectNotify = (PGWLXDISCONNECTNOTIFY)GetProcAddress(hDll, "WlxDisconnectNotify");
210 Log(("VBoxGINA::WlxNegotiate: optional function pointers:\n"
211 " WlxStartApplication: %p\n"
212 " WlxScreenSaverNotify: %p\n"
213 " WlxNetworkProviderLoad: %p\n"
214 " WlxDisplayStatusMessage: %p\n"
215 " WlxGetStatusMessage: %p\n"
216 " WlxRemoveStatusMessage: %p\n"
217 " WlxGetConsoleSwitchCredentials: %p\n"
218 " WlxReconnectNotify: %p\n"
219 " WlxDisconnectNotify: %p\n",
220 GWlxStartApplication, GWlxScreenSaverNotify, GWlxNetworkProviderLoad,
221 GWlxDisplayStatusMessage, GWlxGetStatusMessage, GWlxRemoveStatusMessage,
222 GWlxGetConsoleSwitchCredentials, GWlxReconnectNotify, GWlxDisconnectNotify));
223
224 wlxVersion = dwWinlogonVersion;
225
226 /* forward call */
227 return GWlxNegotiate(dwWinlogonVersion, pdwDllVersion);
228}
229
230
231BOOL WINAPI WlxInitialize(LPWSTR lpWinsta, HANDLE hWlx, PVOID pvReserved,
232 PVOID pWinlogonFunctions, PVOID *pWlxContext)
233{
234 Log(("VBoxGINA::WlxInitialize\n"));
235
236 /* store Winlogon function table */
237 pWlxFuncs = (PWLX_DISPATCH_VERSION_1_1)pWinlogonFunctions;
238
239 /* store handle to Winlogon service*/
240 hGinaWlx = hWlx;
241
242 /* hook the dialogs */
243 hookDialogBoxes(pWlxFuncs, wlxVersion);
244
245 /* forward call */
246 return GWlxInitialize(lpWinsta, hWlx, pvReserved, pWinlogonFunctions, pWlxContext);
247}
248
249
250VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext)
251{
252 Log(("VBoxGINA::WlxDisplaySASNotice\n"));
253
254 /* check if there are credentials for us, if so simulat C-A-D */
255 if (credentialsAvailable())
256 {
257 Log(("VBoxGINA::WlxDisplaySASNotice: simulating C-A-D\n"));
258 /* automatic C-A-D */
259 pWlxFuncs->WlxSasNotify(hGinaWlx, WLX_SAS_TYPE_CTRL_ALT_DEL);
260 }
261 else
262 {
263 Log(("VBoxGINA::WlxDisplaySASNotice: starting credentials poller\n"));
264 /* start the credentials poller thread */
265 credentialsPollerCreate();
266 /* forward call to MSGINA */
267 GWlxDisplaySASNotice(pWlxContext);
268 }
269}
270
271
272int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType, PLUID pAuthenticationId,
273 PSID pLogonSid, PDWORD pdwOptions, PHANDLE phToken,
274 PWLX_MPR_NOTIFY_INFO pMprNotifyInfo, PVOID *pProfile)
275{
276 Log(("VBoxGINA::WlxLoggedOutSAS\n"));
277
278 /* when performing a direct logon without C-A-D, our poller might not be running */
279 if (!credentialsAvailable())
280 {
281 credentialsPollerCreate();
282 }
283
284 int iRet;
285 iRet = GWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId, pLogonSid,
286 pdwOptions, phToken, pMprNotifyInfo, pProfile);
287
288 if (iRet == WLX_SAS_ACTION_LOGON)
289 {
290 //
291 // copy pMprNotifyInfo and pLogonSid for later use
292 //
293
294 // pMprNotifyInfo->pszUserName
295 // pMprNotifyInfo->pszDomain
296 // pMprNotifyInfo->pszPassword
297 // pMprNotifyInfo->pszOldPassword
298
299 }
300
301 return iRet;
302}
303
304
305BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext, PWSTR pszDesktopName,
306 PWSTR pszMprLogonScript, PVOID pEnvironment)
307{
308 Log(("VBoxGINA::WlxActivateUserShell\n"));
309
310 /* forward call to MSGINA */
311 return GWlxActivateUserShell(pWlxContext, pszDesktopName, pszMprLogonScript, pEnvironment);
312}
313
314
315int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)
316{
317 HKEY hKey;
318 DWORD dwValue = 1;
319 DWORD dwSize;
320 DWORD dwType;
321
322 Log(("VBoxGINA::WlxLoggedOnSAS\n"));
323
324 /* Winlogon registry path */
325 static TCHAR szPath[] = TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon");
326
327 if (!RegOpenKey(HKEY_LOCAL_MACHINE, szPath, &hKey))
328 {
329 dwSize = sizeof(DWORD);
330 RegQueryValueEx(hKey, TEXT("SAS_S"), 0, &dwType, (PBYTE)&dwValue, &dwSize);
331 RegCloseKey(hKey);
332 }
333 else
334 Log(("VBoxGINA::WlxLoggedOnSAS: could not open registry key! last error: %d\n", GetLastError()));
335
336 if (dwValue)
337 return WLX_SAS_ACTION_NONE;
338 else
339 /* forward call to MSGINA */
340 return GWlxLoggedOnSAS(pWlxContext, dwSasType, pReserved);
341}
342
343VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
344{
345 Log(("VBoxGINA::WlxDisplayLockedNotice\n"));
346 /* forward call to MSGINA */
347 GWlxDisplayLockedNotice(pWlxContext);
348}
349
350
351BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)
352{
353 Log(("VBoxGINA::WlxIsLockOk\n"));
354 /* forward call to MSGINA */
355 return GWlxIsLockOk(pWlxContext);
356}
357
358int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
359{
360 Log(("VBoxGINA::WlxWkstaLockedSAS\n"));
361 /* forward call to MSGINA */
362 return GWlxWkstaLockedSAS(pWlxContext, dwSasType);
363}
364
365BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
366{
367 BOOL bSuccess;
368
369 Log(("VBoxGINA::WlxIsLogoffOk\n"));
370
371 bSuccess = GWlxIsLogoffOk(pWlxContext);
372
373 if (bSuccess)
374 {
375 //
376 // if it's ok to logoff, finish with the stored credentials
377 // and scrub the buffers
378 //
379
380 }
381 return bSuccess;
382}
383
384
385VOID WINAPI WlxLogoff(PVOID pWlxContext)
386{
387 Log(("VBoxGINA::WlxLogoff\n"));
388
389 /* forward call to MSGINA */
390 GWlxLogoff(pWlxContext);
391}
392
393
394VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
395{
396 Log(("VBoxGINA::WlxShutdown\n"));
397
398 /* forward call to MSGINA */
399 GWlxShutdown(pWlxContext, ShutdownType);
400}
401
402
403/*
404 * GINA 1.1 entry points
405 */
406
407BOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL *pSecure)
408{
409 Log(("VBoxGINA::WlxScreenSaverNotify\n"));
410
411 /* forward to MSGINA if present */
412 if (GWlxScreenSaverNotify)
413 return GWlxScreenSaverNotify(pWlxContext, pSecure);
414 /* return something intelligent */
415 *pSecure = TRUE;
416 return TRUE;
417}
418
419BOOL WINAPI WlxStartApplication(PVOID pWlxContext, PWSTR pszDesktopName,
420 PVOID pEnvironment, PWSTR pszCmdLine)
421{
422 Log(("VBoxGINA::WlxStartApplication\n"));
423
424 /* forward to MSGINA if present */
425 if (GWlxStartApplication)
426 return GWlxStartApplication(pWlxContext, pszDesktopName, pEnvironment, pszCmdLine);
427 return FALSE;
428}
429
430/*
431 * GINA 1.3 entry points
432 */
433BOOL WINAPI WlxNetworkProviderLoad (PVOID pWlxContext, PWLX_MPR_NOTIFY_INFO pNprNotifyInfo)
434{
435 Log(("VBoxGINA::WlxNetworkProviderLoad\n"));
436
437 /* forward to MSGINA if present */
438 if (GWlxNetworkProviderLoad)
439 return GWlxNetworkProviderLoad(pWlxContext, pNprNotifyInfo);
440 return FALSE;
441}
442
443
444BOOL WINAPI WlxDisplayStatusMessage(PVOID pWlxContext, HDESK hDesktop, DWORD dwOptions,
445 PWSTR pTitle, PWSTR pMessage)
446{
447 Log(("VBoxGINA::WlxDisplayStatusMessage\n"));
448
449 /* forward to MSGINA if present */
450 if (GWlxDisplayStatusMessage)
451 return GWlxDisplayStatusMessage(pWlxContext, hDesktop, dwOptions, pTitle, pMessage);
452 return FALSE;
453}
454
455
456BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext, DWORD *pdwOptions,
457 PWSTR pMessage, DWORD dwBufferSize)
458{
459 Log(("VBoxGINA::WlxGetStatusMessage\n"));
460
461 /* forward to MSGINA if present */
462 if (GWlxGetStatusMessage)
463 return GWlxGetStatusMessage(pWlxContext, pdwOptions, pMessage, dwBufferSize);
464 return FALSE;
465}
466
467
468BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext)
469{
470 Log(("VBoxGINA::WlxRemoveStatusMessage\n"));
471
472 /* forward to MSGINA if present */
473 if (GWlxRemoveStatusMessage)
474 return GWlxRemoveStatusMessage(pWlxContext);
475 return FALSE;
476}
477
478
479/*
480 * GINA 1.4 entry points
481 */
482
483BOOL WINAPI WlxGetConsoleSwitchCredentials(PVOID pWlxContext,PVOID pCredInfo)
484{
485 Log(("VBoxGINA::WlxGetConsoleSwitchCredentials\n"));
486
487 /* forward call to MSGINA if present */
488 if (GWlxGetConsoleSwitchCredentials)
489 return GWlxGetConsoleSwitchCredentials(pWlxContext,pCredInfo);
490 return FALSE;
491}
492
493VOID WINAPI WlxReconnectNotify(PVOID pWlxContext)
494{
495 Log(("VBoxGINA::WlxReconnectNotify\n"));
496
497 /* forward to MSGINA if present */
498 if (GWlxReconnectNotify)
499 GWlxReconnectNotify(pWlxContext);
500}
501
502VOID WINAPI WlxDisconnectNotify(PVOID pWlxContext)
503{
504 Log(("VBoxGINA::WlxDisconnectNotify\n"));
505
506 /* forward to MSGINA if present */
507 if (GWlxDisconnectNotify)
508 GWlxDisconnectNotify(pWlxContext);
509}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette