diff --git a/reactos/subsystems/win32/csrss/win32csr/dllmain.c b/reactos/subsystems/win32/csrss/win32csr/dllmain.c index 93c9f440d17..0ebc96a489d 100644 --- a/reactos/subsystems/win32/csrss/win32csr/dllmain.c +++ b/reactos/subsystems/win32/csrss/win32csr/dllmain.c @@ -91,6 +91,7 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = CSRSS_DEFINE_API(SET_HISTORY_INFO, CsrSetHistoryInfo), CSRSS_DEFINE_API(GET_TEMP_FILE, CsrGetTempFile), CSRSS_DEFINE_API(DEFINE_DOS_DEVICE, CsrDefineDosDevice), + CSRSS_DEFINE_API(SOUND_SENTRY, CsrSoundSentry), { 0, 0, NULL } }; diff --git a/reactos/subsystems/win32/csrss/win32csr/file.c b/reactos/subsystems/win32/csrss/win32csr/file.c index 6bbf7fb0398..638769fad28 100644 --- a/reactos/subsystems/win32/csrss/win32csr/file.c +++ b/reactos/subsystems/win32/csrss/win32csr/file.c @@ -16,12 +16,58 @@ /* GLOBALS *******************************************************************/ +typedef BOOL (WINAPI *PUSER_SOUND_SENTRY)(VOID); +BOOL +WINAPI +FirstSoundSentry(VOID); + UINT CsrGetTempFileUnique; LIST_ENTRY DosDeviceHistory; RTL_CRITICAL_SECTION Win32CsrDefineDosDeviceCritSec; +PUSER_SOUND_SENTRY _UserSoundSentry = FirstSoundSentry; /* FUNCTIONS *****************************************************************/ +BOOL +WINAPI +FailSoundSentry(VOID) +{ + /* In case the function can't be found/is unimplemented */ + return FALSE; +} + +BOOL +WINAPI +FirstSoundSentry(VOID) +{ + UNICODE_STRING DllString = RTL_CONSTANT_STRING(L"winsrv"); + STRING FuncString = RTL_CONSTANT_STRING("_UserSoundSentry"); + HANDLE DllHandle; + NTSTATUS Status; + PUSER_SOUND_SENTRY NewSoundSentry = FailSoundSentry; + + /* Load winsrv manually */ + Status = LdrGetDllHandle(NULL, NULL, &DllString, &DllHandle); + if (NT_SUCCESS(Status)) + { + /* If it was found, get SoundSentry export */ + Status = LdrGetProcedureAddress(DllHandle, + &FuncString, + 0, + (PVOID*)&NewSoundSentry); + } + + /* Set it as the callback for the future, and call it */ + _UserSoundSentry = NewSoundSentry; + return _UserSoundSentry(); +} + +CSR_API(CsrSoundSentry) +{ + /* Call the API and see if it suceeds */ + return _UserSoundSentry() ? STATUS_SUCCESS : STATUS_ACCESS_DENIED; +} + CSR_API(CsrGetTempFile) { DPRINT("CsrGetTempFile entered\n"); diff --git a/reactos/subsystems/win32/csrss/win32csr/w32csr.h b/reactos/subsystems/win32/csrss/win32csr/w32csr.h index 575ab2a73bc..00d42d478f8 100644 --- a/reactos/subsystems/win32/csrss/win32csr/w32csr.h +++ b/reactos/subsystems/win32/csrss/win32csr/w32csr.h @@ -5,7 +5,7 @@ #include #include #include - +#include #include /* External Winlogon Header */ diff --git a/reactos/subsystems/win32/csrss/win32csr/win32csr.h b/reactos/subsystems/win32/csrss/win32csr/win32csr.h index 0417740984e..32013b8070d 100644 --- a/reactos/subsystems/win32/csrss/win32csr/win32csr.h +++ b/reactos/subsystems/win32/csrss/win32csr/win32csr.h @@ -75,5 +75,6 @@ CSR_API(CsrExitReactos); CSR_API(CsrSetLogonNotifyWindow); CSR_API(CsrRegisterLogonProcess); +CSR_API(CsrSoundSentry); /* EOF */