diff --git a/reactos/base/system/userinit/userinit.c b/reactos/base/system/userinit/userinit.c index 2e14ce3aed0..f1bc33933e6 100644 --- a/reactos/base/system/userinit/userinit.c +++ b/reactos/base/system/userinit/userinit.c @@ -447,51 +447,6 @@ VOID SetUserWallpaper(VOID) WARN("RegOpenKeyEx() failed with error %lu\n", rc); } -static VOID -PlayLogonSound() -{ - HKEY hKey; - WCHAR szBuffer[MAX_PATH] = {0}; - WCHAR szDest[MAX_PATH]; - DWORD dwSize = sizeof(szBuffer); - HMODULE hLibrary; - typedef BOOL WINAPI (*PLAYSOUNDW)(LPCWSTR,HMODULE,DWORD); - PLAYSOUNDW Play; - - if (RegOpenKeyExW(HKEY_CURRENT_USER, L"AppEvents\\Schemes\\Apps\\.Default\\WindowsLogon\\.Current", 0, KEY_READ, &hKey) != ERROR_SUCCESS) - { - return; - } - - if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)szBuffer, &dwSize) != ERROR_SUCCESS) - { - RegCloseKey(hKey); - return; - } - - - RegCloseKey(hKey); - - if (!szBuffer[0]) - return; - - - szBuffer[MAX_PATH-1] = L'\0'; - if (ExpandEnvironmentStringsW(szBuffer, szDest, MAX_PATH)) - { - hLibrary = LoadLibraryW(L"winmm.dll"); - if (hLibrary) - { - Play = (PLAYSOUNDW)GetProcAddress(hLibrary, "PlaySoundW"); - if (Play) - { - Play(szDest, NULL, SND_FILENAME); - } - FreeLibrary(hLibrary); - } - } -} - static VOID SetUserSettings(VOID) { @@ -540,7 +495,6 @@ wWinMain(IN HINSTANCE hInst, SetUserSettings(); StartShell(); NotifyLogon(); - PlayLogonSound(); return 0; } diff --git a/reactos/base/system/winlogon/winlogon.c b/reactos/base/system/winlogon/winlogon.c index 199c01b6f11..77ee72bab86 100644 --- a/reactos/base/system/winlogon/winlogon.c +++ b/reactos/base/system/winlogon/winlogon.c @@ -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"sysaudio", GENERIC_READ); + if (!hService) + { + CloseServiceHandle(hSCManager); + TRACE("WL: failed to open sysaudio Status %x", 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,6 +406,13 @@ 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);