Author: janderwald
Date: Sat Jul 18 17:19:57 2009
New Revision: 42051
URL:
http://svn.reactos.org/svn/reactos?rev=42051&view=rev
Log:
[USERINIT]
- Move code for playing logon sound to winlogon where it should belong
[WINLOGON]
- Create a thread for playing the logon sound
- Query the status of sysaudio. If sysaudio isnt running yet, wait a second.
- Wait for max 20 seconds to get sysaudio running
- Finally logon sound should work
Modified:
trunk/reactos/base/system/userinit/userinit.c
trunk/reactos/base/system/winlogon/winlogon.c
Modified: trunk/reactos/base/system/userinit/userinit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/userinit/useri…
==============================================================================
--- trunk/reactos/base/system/userinit/userinit.c [iso-8859-1] (original)
+++ trunk/reactos/base/system/userinit/userinit.c [iso-8859-1] Sat Jul 18 17:19:57 2009
@@ -447,51 +447,6 @@
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 @@
SetUserSettings();
StartShell();
NotifyLogon();
- PlayLogonSound();
return 0;
}
Modified: trunk/reactos/base/system/winlogon/winlogon.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/winlo…
==============================================================================
--- trunk/reactos/base/system/winlogon/winlogon.c [iso-8859-1] (original)
+++ trunk/reactos/base/system/winlogon/winlogon.c [iso-8859-1] Sat Jul 18 17:19:57 2009
@@ -22,6 +22,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 @@
#endif
ULONG HardErrorResponse;
MSG Msg;
+ HANDLE hThread;
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
@@ -317,6 +406,13 @@
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);