ReactOS  0.4.14-dev-77-gd9e7c48
winlogon.c File Reference
#include "winlogon.h"
#include <ndk/cmfuncs.h>
Include dependency graph for winlogon.c:

Go to the source code of this file.

Functions

static BOOL StartServicesManager (VOID)
 
static BOOL StartLsass (VOID)
 
static VOID WaitForLsass (VOID)
 
static VOID UpdateTcpIpInformation (VOID)
 
static BOOL InitKeyboardLayouts (VOID)
 
BOOL DisplayStatusMessage (IN PWLSESSION Session, IN HDESK hDesktop, IN UINT ResourceId)
 
BOOL RemoveStatusMessage (IN PWLSESSION Session)
 
static INT_PTR CALLBACK GinaLoadFailedWindowProc (IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
 
int WINAPI WinMain (IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd)
 

Variables

HINSTANCE hAppInstance
 
PWLSESSION WLSession = NULL
 

Function Documentation

◆ DisplayStatusMessage()

BOOL DisplayStatusMessage ( IN PWLSESSION  Session,
IN HDESK  hDesktop,
IN UINT  ResourceId 
)

Definition at line 349 of file winlogon.c.

353 {
354  WCHAR StatusMsg[MAX_PATH];
355 
356  if (Session->Gina.Version < WLX_VERSION_1_3)
357  return TRUE;
358 
359  if (Session->SuppressStatus)
360  return TRUE;
361 
362  if (LoadStringW(hAppInstance, ResourceId, StatusMsg, MAX_PATH) == 0)
363  return FALSE;
364 
365  return Session->Gina.Functions.WlxDisplayStatusMessage(Session->Gina.Context, hDesktop, 0, NULL, StatusMsg);
366 }
#define TRUE
Definition: types.h:120
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
HINSTANCE hAppInstance
Definition: winlogon.c:19
smooth NULL
Definition: ftsmooth.c:416
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:26
#define WLX_VERSION_1_3
Definition: winwlx.h:31

Referenced by HandleLogoff(), HandleLogon(), HandleShutdown(), and WinMain().

◆ GinaLoadFailedWindowProc()

static INT_PTR CALLBACK GinaLoadFailedWindowProc ( IN HWND  hwndDlg,
IN UINT  uMsg,
IN WPARAM  wParam,
IN LPARAM  lParam 
)
static

Definition at line 383 of file winlogon.c.

388 {
389  switch (uMsg)
390  {
391  case WM_COMMAND:
392  {
393  switch (LOWORD(wParam))
394  {
395  case IDOK:
396  EndDialog(hwndDlg, IDOK);
397  return TRUE;
398  }
399  break;
400  }
401 
402  case WM_INITDIALOG:
403  {
404  int len;
405  WCHAR templateText[MAX_PATH], text[MAX_PATH];
406 
407  len = GetDlgItemTextW(hwndDlg, IDC_GINALOADFAILED, templateText, MAX_PATH);
408  if (len)
409  {
410  wsprintfW(text, templateText, (LPWSTR)lParam);
412  }
413 
414  SetFocus(GetDlgItem(hwndDlg, IDOK));
415  return TRUE;
416  }
417 
418  case WM_CLOSE:
419  {
420  EndDialog(hwndDlg, IDCANCEL);
421  return TRUE;
422  }
423  }
424 
425  return FALSE;
426 }
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2208
#define TRUE
Definition: types.h:120
#define IDOK
Definition: winuser.h:824
const WCHAR * text
Definition: package.c:1827
HWND WINAPI SetFocus(_In_opt_ HWND)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
WPARAM wParam
Definition: combotst.c:138
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define WM_CLOSE
Definition: winuser.h:1603
#define MAX_PATH
Definition: compat.h:26
GLenum GLsizei len
Definition: glext.h:6722
#define WM_COMMAND
Definition: winuser.h:1722
#define IDC_GINALOADFAILED
Definition: resource.h:13
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define IDCANCEL
Definition: winuser.h:825
#define WM_INITDIALOG
Definition: winuser.h:1721
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82

Referenced by WinMain().

◆ InitKeyboardLayouts()

static BOOL InitKeyboardLayouts ( VOID  )
static

Definition at line 285 of file winlogon.c.

286 {
287  WCHAR wszKeyName[12], wszKLID[10];
288  DWORD dwSize = sizeof(wszKLID), dwType, i = 1;
289  HKEY hKey;
290  UINT Flags;
291  BOOL bRet = FALSE;
292 
293  /* Open registry key with preloaded layouts */
294  if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Keyboard Layout\\Preload", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
295  {
296  while (TRUE)
297  {
298  /* Read values with integer names only */
299  swprintf(wszKeyName, L"%d", i++);
300  if (RegQueryValueExW(hKey, wszKeyName, NULL, &dwType, (LPBYTE)wszKLID, &dwSize) != ERROR_SUCCESS)
301  {
302  /* There is no more entries */
303  break;
304  }
305 
306  /* Only REG_SZ values are valid */
307  if (dwType != REG_SZ)
308  {
309  ERR("Wrong type: %ws!\n", wszKLID);
310  continue;
311  }
312 
313  /* Load keyboard layout with given locale id */
315  if (i > 1)
317  else // First layout
318  Flags |= KLF_ACTIVATE; // |0x40000000
319  if (!LoadKeyboardLayoutW(wszKLID, Flags))
320  {
321  ERR("LoadKeyboardLayoutW(%ws) failed!\n", wszKLID);
322  continue;
323  }
324  else
325  {
326  /* We loaded at least one layout - success */
327  bRet = TRUE;
328  }
329  }
330 
331  /* Close the key now */
332  RegCloseKey(hKey);
333  }
334  else
335  WARN("RegOpenKeyExW(Keyboard Layout\\Preload) failed!\n");
336 
337  if (!bRet)
338  {
339  /* If we failed, load US keyboard layout */
341  bRet = TRUE;
342  }
343 
344  return bRet;
345 }
#define TRUE
Definition: types.h:120
#define ERROR_SUCCESS
Definition: deptool.c:10
#define KEY_READ
Definition: nt_native.h:1023
#define KLF_ACTIVATE
Definition: winuser.h:111
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define WARN(fmt,...)
Definition: debug.h:111
#define KLF_NOTELLSHELL
Definition: winuser.h:116
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:52
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
#define KLF_SUBSTITUTE_OK
Definition: winuser.h:112
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4116
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define swprintf(buf, format,...)
Definition: sprintf.c:56
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR L[]
Definition: oid.c:1250
#define KLF_REPLACELANG
Definition: winuser.h:115
#define ERR(fmt,...)
Definition: debug.h:109
#define KLF_SETFORPROCESS
Definition: winuser.h:117
HKL WINAPI LoadKeyboardLayoutW(_In_ LPCWSTR, _In_ UINT)
unsigned int UINT
Definition: ndis.h:50
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3366
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54
#define REG_SZ
Definition: layer.c:22

Referenced by WinMain().

◆ RemoveStatusMessage()

BOOL RemoveStatusMessage ( IN PWLSESSION  Session)

Definition at line 370 of file winlogon.c.

372 {
373  if (Session->Gina.Version < WLX_VERSION_1_3)
374  return TRUE;
375 
376  return Session->Gina.Functions.WlxRemoveStatusMessage(Session->Gina.Context);
377 }
#define TRUE
Definition: types.h:120
#define WLX_VERSION_1_3
Definition: winwlx.h:31

Referenced by DoGenericAction(), HandleLogon(), and WinMain().

◆ StartLsass()

static BOOL StartLsass ( VOID  )
static

Definition at line 74 of file winlogon.c.

75 {
76  STARTUPINFOW StartupInfo;
77  PROCESS_INFORMATION ProcessInformation;
78  LPCWSTR ServiceString = L"lsass.exe";
79  BOOL res;
80 
81  /* Start the local security authority subsystem (lsass.exe) */
82  ZeroMemory(&StartupInfo, sizeof(STARTUPINFOW));
83  StartupInfo.cb = sizeof(StartupInfo);
84  StartupInfo.lpReserved = NULL;
85  StartupInfo.lpDesktop = NULL;
86  StartupInfo.lpTitle = NULL;
87  StartupInfo.dwFlags = 0;
88  StartupInfo.cbReserved2 = 0;
89  StartupInfo.lpReserved2 = 0;
90 
91  TRACE("WL: Creating new process - %S\n", ServiceString);
92 
93  res = CreateProcessW(ServiceString,
94  NULL,
95  NULL,
96  NULL,
97  FALSE,
99  NULL,
100  NULL,
101  &StartupInfo,
102  &ProcessInformation);
103 
104  TRACE("WL: Created new process - %S\n", ServiceString);
105 
106  CloseHandle(ProcessInformation.hThread);
107  CloseHandle(ProcessInformation.hProcess);
108 
109  return res;
110 }
#define CloseHandle
Definition: compat.h:398
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
LPWSTR lpReserved
Definition: winbase.h:818
PBYTE lpReserved2
Definition: winbase.h:831
#define ZeroMemory
Definition: winbase.h:1635
WORD cbReserved2
Definition: winbase.h:830
unsigned int BOOL
Definition: ntddk_ex.h:94
LPWSTR lpDesktop
Definition: winbase.h:819
smooth NULL
Definition: ftsmooth.c:416
LPWSTR lpTitle
Definition: winbase.h:820
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4593
#define TRACE(s)
Definition: solgame.cpp:4
DWORD cb
Definition: winbase.h:817
static const WCHAR L[]
Definition: oid.c:1250
#define DETACHED_PROCESS
Definition: winbase.h:179
GLuint res
Definition: glext.h:9613
DWORD dwFlags
Definition: winbase.h:828

Referenced by WinMain().

◆ StartServicesManager()

static BOOL StartServicesManager ( VOID  )
static

Definition at line 26 of file winlogon.c.

27 {
28  STARTUPINFOW StartupInfo;
29  PROCESS_INFORMATION ProcessInformation;
30  LPCWSTR ServiceString = L"services.exe";
31  BOOL res;
32 
33  /* Start the service control manager (services.exe) */
34  ZeroMemory(&StartupInfo, sizeof(STARTUPINFOW));
35  StartupInfo.cb = sizeof(StartupInfo);
36  StartupInfo.lpReserved = NULL;
37  StartupInfo.lpDesktop = NULL;
38  StartupInfo.lpTitle = NULL;
39  StartupInfo.dwFlags = 0;
40  StartupInfo.cbReserved2 = 0;
41  StartupInfo.lpReserved2 = 0;
42 
43  TRACE("WL: Creating new process - %S\n", ServiceString);
44 
45  res = CreateProcessW(ServiceString,
46  NULL,
47  NULL,
48  NULL,
49  FALSE,
51  NULL,
52  NULL,
53  &StartupInfo,
54  &ProcessInformation);
55  if (!res)
56  {
57  ERR("WL: Failed to execute services (error %lu)\n", GetLastError());
58  return FALSE;
59  }
60 
61  TRACE("WL: Created new process - %S\n", ServiceString);
62 
63  CloseHandle(ProcessInformation.hThread);
64  CloseHandle(ProcessInformation.hProcess);
65 
66  TRACE("WL: StartServicesManager() done.\n");
67 
68  return TRUE;
69 }
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
LPWSTR lpReserved
Definition: winbase.h:818
PBYTE lpReserved2
Definition: winbase.h:831
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define ZeroMemory
Definition: winbase.h:1635
WORD cbReserved2
Definition: winbase.h:830
unsigned int BOOL
Definition: ntddk_ex.h:94
LPWSTR lpDesktop
Definition: winbase.h:819
smooth NULL
Definition: ftsmooth.c:416
LPWSTR lpTitle
Definition: winbase.h:820
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4593
#define TRACE(s)
Definition: solgame.cpp:4
DWORD cb
Definition: winbase.h:817
static const WCHAR L[]
Definition: oid.c:1250
#define ERR(fmt,...)
Definition: debug.h:109
#define DETACHED_PROCESS
Definition: winbase.h:179
GLuint res
Definition: glext.h:9613
DWORD dwFlags
Definition: winbase.h:828

Referenced by WinMain().

◆ UpdateTcpIpInformation()

static VOID UpdateTcpIpInformation ( VOID  )
static

Definition at line 152 of file winlogon.c.

153 {
154  LONG lError;
155  HKEY hKey = NULL;
156  DWORD dwType, dwSize;
157  PWSTR pszBuffer;
158  WCHAR szBuffer[128] = L"";
159 
161  L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
162  0,
164  &hKey);
165  if (lError != ERROR_SUCCESS)
166  {
167  ERR("WL: RegOpenKeyExW(\"HKLM\\System\\CurrentControlSet\\Services\\Tcpip\\Parameters\") failed (error %lu)\n", lError);
168  return;
169  }
170 
171  /*
172  * Read the "NV Hostname" value and copy it into the "Hostname" value.
173  */
174 
175  pszBuffer = szBuffer;
176  dwSize = ARRAYSIZE(szBuffer);
177 
178  lError = RegQueryValueExW(hKey,
179  L"NV Hostname",
180  NULL,
181  &dwType,
182  (LPBYTE)pszBuffer,
183  &dwSize);
184  if (((lError == ERROR_INSUFFICIENT_BUFFER) || (lError == ERROR_MORE_DATA)) && (dwType == REG_SZ))
185  {
186  pszBuffer = HeapAlloc(GetProcessHeap(), 0, dwSize);
187  if (pszBuffer)
188  {
189  lError = RegQueryValueExW(hKey,
190  L"NV Hostname",
191  NULL,
192  &dwType,
193  (LPBYTE)pszBuffer,
194  &dwSize);
195  }
196  else
197  {
198  ERR("WL: Could not reallocate memory for pszBuffer\n");
199  }
200  }
201  if ((lError == ERROR_SUCCESS) && (dwType == REG_SZ))
202  {
203  TRACE("NV Hostname is '%S'.\n", pszBuffer);
204 
205  lError = RegSetValueExW(hKey,
206  L"Hostname",
207  0,
208  REG_SZ,
209  (LPBYTE)pszBuffer,
210  dwSize);
211  if (lError != ERROR_SUCCESS)
212  ERR("WL: RegSetValueExW(\"Hostname\") failed (error %lu)\n", lError);
213  }
214 
215  /*
216  * Read the "NV Domain" value and copy it into the "Domain" value.
217  */
218 
219  // pszBuffer = szBuffer;
220  // dwSize = ARRAYSIZE(szBuffer);
221 
222  lError = RegQueryValueExW(hKey,
223  L"NV Domain",
224  NULL,
225  &dwType,
226  (LPBYTE)pszBuffer,
227  &dwSize);
228  if (((lError == ERROR_INSUFFICIENT_BUFFER) || (lError == ERROR_MORE_DATA)) && (dwType == REG_SZ))
229  {
230  if (pszBuffer != szBuffer)
231  {
232  PWSTR pszNewBuffer;
233  pszNewBuffer = HeapReAlloc(GetProcessHeap(), 0, pszBuffer, dwSize);
234  if (pszNewBuffer)
235  {
236  pszBuffer = pszNewBuffer;
237  }
238  else
239  {
240  HeapFree(GetProcessHeap(), 0, pszBuffer);
241  pszBuffer = NULL;
242  }
243  }
244  else
245  {
246  pszBuffer = HeapAlloc(GetProcessHeap(), 0, dwSize);
247  }
248  if (pszBuffer)
249  {
250  lError = RegQueryValueExW(hKey,
251  L"NV Domain",
252  NULL,
253  &dwType,
254  (LPBYTE)pszBuffer,
255  &dwSize);
256  }
257  else
258  {
259  ERR("WL: Could not reallocate memory for pszBuffer\n");
260  }
261  }
262  if ((lError == ERROR_SUCCESS) && (dwType == REG_SZ))
263  {
264  TRACE("NV Domain is '%S'.\n", pszBuffer);
265 
266  lError = RegSetValueExW(hKey,
267  L"Domain",
268  0,
269  REG_SZ,
270  (LPBYTE)pszBuffer,
271  dwSize);
272  if (lError != ERROR_SUCCESS)
273  ERR("WL: RegSetValueExW(\"Domain\") failed (error %lu)\n", lError);
274  }
275 
276  if (pszBuffer != szBuffer)
277  HeapFree(GetProcessHeap(), 0, pszBuffer);
278 
279  RegCloseKey(hKey);
280 }
#define ERROR_SUCCESS
Definition: deptool.c:10
#define KEY_SET_VALUE
Definition: nt_native.h:1017
uint16_t * PWSTR
Definition: typedefs.h:54
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:52
long LONG
Definition: pedump.c:60
smooth NULL
Definition: ftsmooth.c:416
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4895
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4116
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR L[]
Definition: oid.c:1250
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define ERR(fmt,...)
Definition: debug.h:109
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
#define HeapReAlloc
Definition: compat.h:393
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3366
#define HeapFree(x, y, z)
Definition: compat.h:394
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define REG_SZ
Definition: layer.c:22

Referenced by WinMain().

◆ WaitForLsass()

static VOID WaitForLsass ( VOID  )
static

Definition at line 115 of file winlogon.c.

116 {
117  HANDLE hEvent;
118  DWORD dwError;
119 
121  TRUE,
122  FALSE,
123  L"LSA_RPC_SERVER_ACTIVE");
124  if (hEvent == NULL)
125  {
126  dwError = GetLastError();
127  TRACE("WL: Failed to create the notification event (Error %lu)\n", dwError);
128 
129  if (dwError == ERROR_ALREADY_EXISTS)
130  {
132  FALSE,
133  L"LSA_RPC_SERVER_ACTIVE");
134  if (hEvent == NULL)
135  {
136  ERR("WL: Could not open the notification event (Error %lu)\n", GetLastError());
137  return;
138  }
139  }
140  }
141 
142  TRACE("WL: Wait for the LSA server!\n");
144  TRACE("WL: LSA server running!\n");
145 
147 }
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651
HANDLE WINAPI DECLSPEC_HOTPATCH OpenEventW(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName)
Definition: synch.c:682
static HANDLE hEvent
Definition: comm.c:54
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR L[]
Definition: oid.c:1250
#define SYNCHRONIZE
Definition: nt_native.h:61
#define ERR(fmt,...)
Definition: debug.h:109
#define ERROR_ALREADY_EXISTS
Definition: disk.h:80
#define INFINITE
Definition: serial.h:102

Referenced by WinMain().

◆ WinMain()

int WINAPI WinMain ( IN HINSTANCE  hInstance,
IN HINSTANCE  hPrevInstance,
IN LPSTR  lpCmdLine,
IN int  nShowCmd 
)

Definition at line 431 of file winlogon.c.

436 {
437 #if 0
438  LSA_STRING ProcessName, PackageName;
441  BOOLEAN Old;
444 #endif
445  ULONG HardErrorResponse;
446  MSG Msg;
447 
448  UNREFERENCED_PARAMETER(hPrevInstance);
449  UNREFERENCED_PARAMETER(lpCmdLine);
450  UNREFERENCED_PARAMETER(nShowCmd);
451 
453 
454  /* Make us critical */
457 
458  /* Update the cached TCP/IP Information in the registry */
460 
462  {
463  ERR("WL: Could not register logon process\n");
464  NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
465  ExitProcess(1);
466  }
467 
469  if (!WLSession)
470  {
471  ERR("WL: Could not allocate memory for winlogon instance\n");
472  NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
473  ExitProcess(1);
474  }
475 
476  ZeroMemory(WLSession, sizeof(WLSESSION));
477  WLSession->DialogTimeout = 120; /* 2 minutes */
478 
479  /* Initialize the dialog tracking list */
481 
483  {
484  ERR("WL: Could not create window station and desktops\n");
485  NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
486  ExitProcess(1);
487  }
488 
490 
491  /* Load default keyboard layouts */
492  if (!InitKeyboardLayouts())
493  {
494  ERR("WL: Could not preload keyboard layouts\n");
495  NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
496  ExitProcess(1);
497  }
498 
499  if (!StartRpcServer())
500  {
501  ERR("WL: Could not start the RPC server\n");
502  NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
503  ExitProcess(1);
504  }
505 
506  if (!StartServicesManager())
507  {
508  ERR("WL: Could not start services.exe\n");
509  NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
510  ExitProcess(1);
511  }
512 
513  if (!StartLsass())
514  {
515  ERR("WL: Failed to start lsass.exe service (error %lu)\n", GetLastError());
516  NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, NULL, OptionOk, &HardErrorResponse);
517  ExitProcess(1);
518  }
519 
520  /* Wait for the LSA server */
521  WaitForLsass();
522 
523  /* Init Notifications */
525 
526  /* Load and initialize gina */
527  if (!GinaInit(WLSession))
528  {
529  ERR("WL: Failed to initialize Gina\n");
530  // FIXME: Retrieve the real name of the GINA DLL we were trying to load.
531  // It is known only inside the GinaInit function...
534  ExitProcess(1);
535  }
536 
538 
539 #if 0
540  /* Connect to NetLogon service (lsass.exe) */
541  /* Real winlogon uses "Winlogon" */
542  RtlInitUnicodeString((PUNICODE_STRING)&ProcessName, L"Winlogon");
543  Status = LsaRegisterLogonProcess(&ProcessName, &LsaHandle, &Mode);
545  {
546  /* Add the 'SeTcbPrivilege' privilege and try again */
548  if (!NT_SUCCESS(Status))
549  {
550  ERR("RtlAdjustPrivilege() failed with error %lu\n", LsaNtStatusToWinError(Status));
551  return 1;
552  }
553 
554  Status = LsaRegisterLogonProcess(&ProcessName, &LsaHandle, &Mode);
555  }
556 
557  if (!NT_SUCCESS(Status))
558  {
559  ERR("LsaRegisterLogonProcess() failed with error %lu\n", LsaNtStatusToWinError(Status));
560  return 1;
561  }
562 
565  if (!NT_SUCCESS(Status))
566  {
567  ERR("LsaLookupAuthenticationPackage() failed with error %lu\n", LsaNtStatusToWinError(Status));
569  return 1;
570  }
571 #endif
572 
574 
575  /* Create a hidden window to get SAS notifications */
576  if (!InitializeSAS(WLSession))
577  {
578  ERR("WL: Failed to initialize SAS\n");
579  ExitProcess(2);
580  }
581 
582  // DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_PREPARENETWORKCONNECTIONS);
583  // DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_APPLYINGCOMPUTERSETTINGS);
584 
585  /* Display logged out screen */
588 
589  /* Check for pending setup */
590  if (GetSetupType() != 0)
591  {
592  /* Run setup and reboot when done */
593  TRACE("WL: Setup mode detected\n");
594  RunSetup();
595  }
596  else
597  {
599  }
600 
601  (void)LoadLibraryW(L"sfc_os.dll");
602 
603  /* Tell kernel that CurrentControlSet is good (needed
604  * to support Last good known configuration boot) */
606 
607  /* Message loop for the SAS window */
608  while (GetMessageW(&Msg, WLSession->SASWindow, 0, 0))
609  {
612  }
613 
615 
616  /* We never go there */
617 
618  return 0;
619 }
PWLSESSION WLSession
Definition: winlogon.c:20
#define MAKEINTRESOURCE
Definition: winuser.h:591
BOOL DisplayStatusMessage(IN PWLSESSION Session, IN HDESK hDesktop, IN UINT ResourceId)
Definition: winlogon.c:349
BOOL RemoveStatusMessage(IN PWLSESSION Session)
Definition: winlogon.c:370
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define WLX_WM_SAS
Definition: winwlx.h:71
BOOL WINAPI RegisterLogonProcess(DWORD, BOOL)
Definition: logon.c:43
#define TRUE
Definition: types.h:120
struct _WLSESSION * PWLSESSION
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
HDESK WinlogonDesktop
Definition: winlogon.h:224
_In_ ULONG Mode
Definition: hubbusif.h:303
NTSTATUS NTAPI NtRaiseHardError(IN NTSTATUS ErrorStatus, IN ULONG NumberOfParameters, IN ULONG UnicodeStringParameterMask, IN PULONG_PTR Parameters, IN ULONG ValidResponseOptions, OUT PULONG Response)
Definition: harderr.c:553
static INT_PTR CALLBACK GinaLoadFailedWindowProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
Definition: winlogon.c:383
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:323
HWND SASWindow
Definition: winlogon.h:220
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define CM_BOOT_FLAG_ACCEPTED
Definition: cmtypes.h:153
BOOL InitializeSAS(IN OUT PWLSESSION Session)
Definition: sas.c:1578
LONG NTSTATUS
Definition: precomp.h:26
static VOID UpdateTcpIpInformation(VOID)
Definition: winlogon.c:152
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1487
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define ZeroMemory
Definition: winbase.h:1635
BOOL RunSetup(VOID)
Definition: setup.c:153
NTSYSAPI NTSTATUS NTAPI RtlAdjustPrivilege(_In_ ULONG Privilege, _In_ BOOLEAN NewValue, _In_ BOOLEAN ForThread, _Out_ PBOOLEAN OldValue)
NTSTATUS HandleShutdown(IN OUT PWLSESSION Session, IN DWORD wlxAction)
Definition: sas.c:1039
DWORD GetSetupType(VOID)
Definition: setup.c:16
static VOID WaitForLsass(VOID)
Definition: winlogon.c:115
HANDLE LsaHandle
Definition: logon.c:17
BOOL InitNotifications(VOID)
Definition: notify.c:200
#define STATUS_PORT_CONNECTION_REFUSED
Definition: ntstatus.h:287
HINSTANCE hInstance
Definition: charmap.c:20
struct @1576 Msg[]
#define SE_TCB_PRIVILEGE
Definition: security.c:661
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
static BOOL InitKeyboardLayouts(VOID)
Definition: winlogon.c:285
#define IDS_REACTOSISSTARTINGUP
Definition: resource.h:35
NTSTATUS NTAPI NtInitializeRegistry(IN USHORT Flag)
Definition: ntapi.c:1298
struct _WLSESSION WLSESSION
BOOL GinaInit(IN OUT PWLSESSION Session)
Definition: wlx.c:919
HINSTANCE hAppInstance
Definition: winlogon.c:19
unsigned char BOOLEAN
#define LoadLibraryW(x)
Definition: compat.h:404
smooth NULL
Definition: ftsmooth.c:416
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:652
LONG_PTR LPARAM
Definition: windef.h:208
NTSYSAPI NTSTATUS __cdecl RtlSetThreadIsCritical(_In_ BOOLEAN NewValue, _Out_opt_ PBOOLEAN OldValue, _In_ BOOLEAN NeedBreaks)
ULONG LSA_OPERATIONAL_MODE
Definition: ntsecapi.h:364
#define MICROSOFT_KERBEROS_NAME_W
Definition: ntsecapi.h:25
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
ULONG WINAPI LsaNtStatusToWinError(IN NTSTATUS Status)
Definition: lsa.c:1129
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
DWORD DialogTimeout
Definition: winlogon.h:230
#define LockWorkstation(Session)
Definition: winlogon.h:211
#define DialogBoxParam
Definition: winuser.h:5665
NTSTATUS NTAPI LsaDeregisterLogonProcess(HANDLE)
static const WCHAR L[]
Definition: oid.c:1250
BOOL StartRpcServer(VOID)
Definition: rpcserver.c:19
#define WLX_SAS_TYPE_CTRL_ALT_DEL
Definition: winwlx.h:36
static BOOL StartServicesManager(VOID)
Definition: winlogon.c:26
VOID CleanupNotifications(VOID)
Definition: notify.c:384
#define IDD_GINALOADFAILED
Definition: resource.h:12
ULONG AuthenticationPackage
Definition: logon.c:18
static BOOL StartLsass(VOID)
Definition: winlogon.c:74
Status
Definition: gdiplustypes.h:24
#define ERR(fmt,...)
Definition: debug.h:109
VOID CallNotificationDlls(PWLSESSION pSession, NOTIFICATION_TYPE Type)
Definition: notify.c:304
NTSTATUS NTAPI LsaLookupAuthenticationPackage(HANDLE, PLSA_STRING, PULONG)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
BOOL CreateWindowStationAndDesktops(IN OUT PWLSESSION Session)
Definition: wlx.c:1121
NTSYSAPI NTSTATUS __cdecl RtlSetProcessIsCritical(_In_ BOOLEAN NewValue, _Out_opt_ PBOOLEAN OldValue, _In_ BOOLEAN NeedBreaks)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WLX_SAS_ACTION_SHUTDOWN_REBOOT
Definition: winwlx.h:63
unsigned int ULONG
Definition: retypes.h:1
NTSTATUS NTAPI LsaRegisterLogonProcess(PLSA_STRING, PHANDLE, PLSA_OPERATIONAL_MODE)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define STATUS_SYSTEM_PROCESS_TERMINATED
Definition: ntstatus.h:656
VOID InitDialogListHead(VOID)
Definition: wlx.c:45
DWORD WINAPI GetCurrentProcessId(VOID)
Definition: proc.c:1158
LOGON_STATE LogonState
Definition: winlogon.h:229

Variable Documentation

◆ hAppInstance

HINSTANCE hAppInstance

Definition at line 19 of file winlogon.c.

Referenced by DisplayStatusMessage(), and WinMain().

◆ WLSession

PWLSESSION WLSession = NULL

Definition at line 20 of file winlogon.c.

Referenced by DefaultWlxScreenSaverNotify(), RunSetupThreadProc(), and WinMain().