[WINLOGON]
[reactos.git] / reactos / base / system / winlogon / winlogon.c
index 199c01b..3329848 100644 (file)
@@ -23,6 +23,94 @@ PWLSESSION WLSession = NULL;
 
 /* FUNCTIONS *****************************************************************/
 
+DWORD
+WINAPI
+PlayLogonSoundThread(
+       IN LPVOID lpParameter)
+{
+       HKEY hKey;
+       WCHAR szBuffer[MAX_PATH] = {0};
+       WCHAR szDest[MAX_PATH];
+       DWORD dwSize = sizeof(szBuffer);
+       HMODULE hLibrary;
+       SERVICE_STATUS_PROCESS Info;
+       typedef BOOL (WINAPI *PLAYSOUNDW)(LPCWSTR,HMODULE,DWORD);
+       PLAYSOUNDW Play;
+       ULONG Index = 0;
+
+       if (RegOpenKeyExW(HKEY_CURRENT_USER, L"AppEvents\\Schemes\\Apps\\.Default\\WindowsLogon\\.Current", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
+       {
+               ExitThread(0);
+       }
+
+       if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)szBuffer, &dwSize) != ERROR_SUCCESS)
+       {
+               RegCloseKey(hKey);
+               ExitThread(0);
+       }
+
+
+       RegCloseKey(hKey);
+
+       if (!szBuffer[0])
+               ExitThread(0);
+
+
+       szBuffer[MAX_PATH-1] = L'\0';
+       if (ExpandEnvironmentStringsW(szBuffer, szDest, MAX_PATH))
+       {
+               SC_HANDLE hSCManager, hService;
+
+               hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
+               if (!hSCManager)
+                       ExitThread(0);;
+
+               hService = OpenServiceW(hSCManager, L"wdmaud", GENERIC_READ);
+               if (!hService)
+               {
+                       CloseServiceHandle(hSCManager);
+                       TRACE("WL: failed to open sysaudio Status %x\n", GetLastError());
+                       ExitThread(0);
+               }
+
+               do
+               {
+                       if (!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&Info, sizeof(SERVICE_STATUS_PROCESS), &dwSize))
+                       {
+                               TRACE("WL: QueryServiceStatusEx failed %x\n", GetLastError());
+                               break;
+                       }
+
+                       if (Info.dwCurrentState == SERVICE_RUNNING)
+                               break;
+
+                       Sleep(1000);
+
+               }while(Index++ < 20);
+
+               CloseServiceHandle(hService);
+               CloseServiceHandle(hSCManager);
+
+               if (Info.dwCurrentState != SERVICE_RUNNING)
+                       ExitThread(0);
+
+
+               hLibrary = LoadLibraryW(L"winmm.dll");
+               if (hLibrary)
+               {
+                       Play = (PLAYSOUNDW)GetProcAddress(hLibrary, "PlaySoundW");
+                       if (Play)
+                       {
+                               Play(szDest, NULL, SND_FILENAME);
+                       }
+                       FreeLibrary(hLibrary);
+               }
+       }
+       ExitThread(0);
+}
+
+
+
 static BOOL
 StartServicesManager(VOID)
 {
@@ -201,6 +289,7 @@ WinMain(
 #endif
        ULONG HardErrorResponse;
        MSG Msg;
+       HANDLE hThread;
 
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
@@ -317,9 +406,16 @@ WinMain(
        else
                PostMessageW(WLSession->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_TIMEOUT, 0);
 
+       /* Play logon sound */
+       hThread = CreateThread(NULL, 0, PlayLogonSoundThread, NULL, 0, NULL);
+       if (hThread)
+       {
+               CloseHandle(hThread);
+       }
+
        /* Tell kernel that CurrentControlSet is good (needed
         * to support Last good known configuration boot) */
-       NtInitializeRegistry(CM_BOOT_FLAG_ACCEPTED);
+       NtInitializeRegistry(CM_BOOT_FLAG_ACCEPTED | 1);
 
        /* Message loop for the SAS window */
        while (GetMessageW(&Msg, WLSession->SASWindow, 0, 0))