[ros-diffs] [janderwald] 42051: [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

janderwald at svn.reactos.org janderwald at svn.reactos.org
Sat Jul 18 17:19:57 CEST 2009


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/userinit.c?rev=42051&r1=42050&r2=42051&view=diff
==============================================================================
--- 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/winlogon.c?rev=42051&r1=42050&r2=42051&view=diff
==============================================================================
--- 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);



More information about the Ros-diffs mailing list