[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

svn path=/trunk/; revision=42051
This commit is contained in:
Johannes Anderwald 2009-07-18 15:19:57 +00:00
parent dac78ab19a
commit 2b9d1b809c
2 changed files with 96 additions and 46 deletions

View file

@ -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;
}

View 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"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);