mirror of
https://github.com/reactos/reactos.git
synced 2025-06-14 07:38:28 +00:00
[user32/win32k]
- Implement MessageBeep and SetLogonNotifyWindow [winlogon] - Implement receiving notifications from win32k to play sounds of MessageBeep svn path=/trunk/; revision=50813
This commit is contained in:
parent
bc92849c38
commit
c7b9d6f0df
11 changed files with 133 additions and 67 deletions
|
@ -25,8 +25,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(winlogon);
|
||||||
#define HK_CTRL_ALT_DEL 0
|
#define HK_CTRL_ALT_DEL 0
|
||||||
#define HK_CTRL_SHIFT_ESC 1
|
#define HK_CTRL_SHIFT_ESC 1
|
||||||
|
|
||||||
extern BOOL WINAPI SetLogonNotifyWindow(HWND Wnd, HWINSTA WinSta);
|
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
|
@ -843,6 +841,40 @@ CheckForShutdownPrivilege(
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
HandleMessageBeep(UINT uType)
|
||||||
|
{
|
||||||
|
LPWSTR EventName;
|
||||||
|
|
||||||
|
switch(uType)
|
||||||
|
{
|
||||||
|
case 0xFFFFFFFF:
|
||||||
|
EventName = NULL;
|
||||||
|
break;
|
||||||
|
case MB_OK:
|
||||||
|
EventName = L"SystemDefault";
|
||||||
|
break;
|
||||||
|
case MB_ICONASTERISK:
|
||||||
|
EventName = L"SystemAsterisk";
|
||||||
|
break;
|
||||||
|
case MB_ICONEXCLAMATION:
|
||||||
|
EventName = L"SystemExclamation";
|
||||||
|
break;
|
||||||
|
case MB_ICONHAND:
|
||||||
|
EventName = L"SystemHand";
|
||||||
|
break;
|
||||||
|
case MB_ICONQUESTION:
|
||||||
|
EventName = L"SystemQuestion";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
WARN("Unhandled type %d\n", uType);
|
||||||
|
EventName = L"SystemDefault";
|
||||||
|
}
|
||||||
|
|
||||||
|
return PlaySoundRoutine(EventName, FALSE, SND_ALIAS | SND_NOWAIT | SND_NOSTOP | SND_ASYNC);
|
||||||
|
}
|
||||||
|
|
||||||
static LRESULT CALLBACK
|
static LRESULT CALLBACK
|
||||||
SASWindowProc(
|
SASWindowProc(
|
||||||
IN HWND hwndDlg,
|
IN HWND hwndDlg,
|
||||||
|
@ -902,6 +934,21 @@ SASWindowProc(
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
case WM_LOGONNOTIFY:
|
||||||
|
{
|
||||||
|
switch(wParam)
|
||||||
|
{
|
||||||
|
case LN_MESSAGE_BEEP:
|
||||||
|
{
|
||||||
|
return HandleMessageBeep(lParam);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
ERR("WM_LOGONNOTIFY case %d is unimplemented\n", wParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
case WLX_WM_SAS:
|
case WLX_WM_SAS:
|
||||||
{
|
{
|
||||||
DispatchSAS(Session, (DWORD)wParam);
|
DispatchSAS(Session, (DWORD)wParam);
|
||||||
|
|
|
@ -23,6 +23,49 @@ PWLSESSION WLSession = NULL;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
PlaySoundRoutine(
|
||||||
|
IN LPCWSTR FileName,
|
||||||
|
IN UINT bLogon,
|
||||||
|
IN UINT Flags)
|
||||||
|
{
|
||||||
|
typedef BOOL (WINAPI *PLAYSOUNDW)(LPCWSTR,HMODULE,DWORD);
|
||||||
|
typedef UINT (WINAPI *WAVEOUTGETNUMDEVS)(VOID);
|
||||||
|
PLAYSOUNDW Play;
|
||||||
|
WAVEOUTGETNUMDEVS waveOutGetNumDevs;
|
||||||
|
UINT NumDevs;
|
||||||
|
HMODULE hLibrary;
|
||||||
|
BOOL Ret = FALSE;
|
||||||
|
|
||||||
|
hLibrary = LoadLibraryW(L"winmm.dll");
|
||||||
|
if (hLibrary)
|
||||||
|
{
|
||||||
|
waveOutGetNumDevs = (WAVEOUTGETNUMDEVS)GetProcAddress(hLibrary, "waveOutGetNumDevs");
|
||||||
|
if (waveOutGetNumDevs)
|
||||||
|
{
|
||||||
|
NumDevs = waveOutGetNumDevs();
|
||||||
|
if (!NumDevs)
|
||||||
|
{
|
||||||
|
if (!bLogon)
|
||||||
|
{
|
||||||
|
Beep(500, 500);
|
||||||
|
}
|
||||||
|
FreeLibrary(hLibrary);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Play = (PLAYSOUNDW)GetProcAddress(hLibrary, "PlaySoundW");
|
||||||
|
if (Play)
|
||||||
|
{
|
||||||
|
Ret = Play(FileName, NULL, Flags);
|
||||||
|
}
|
||||||
|
FreeLibrary(hLibrary);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ret;
|
||||||
|
}
|
||||||
|
|
||||||
DWORD
|
DWORD
|
||||||
WINAPI
|
WINAPI
|
||||||
PlayLogonSoundThread(
|
PlayLogonSoundThread(
|
||||||
|
@ -32,10 +75,8 @@ PlayLogonSoundThread(
|
||||||
WCHAR szBuffer[MAX_PATH] = {0};
|
WCHAR szBuffer[MAX_PATH] = {0};
|
||||||
WCHAR szDest[MAX_PATH];
|
WCHAR szDest[MAX_PATH];
|
||||||
DWORD dwSize = sizeof(szBuffer);
|
DWORD dwSize = sizeof(szBuffer);
|
||||||
HMODULE hLibrary;
|
|
||||||
SERVICE_STATUS_PROCESS Info;
|
SERVICE_STATUS_PROCESS Info;
|
||||||
typedef BOOL (WINAPI *PLAYSOUNDW)(LPCWSTR,HMODULE,DWORD);
|
|
||||||
PLAYSOUNDW Play;
|
|
||||||
ULONG Index = 0;
|
ULONG Index = 0;
|
||||||
|
|
||||||
if (RegOpenKeyExW(HKEY_CURRENT_USER, L"AppEvents\\Schemes\\Apps\\.Default\\WindowsLogon\\.Current", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
|
if (RegOpenKeyExW(HKEY_CURRENT_USER, L"AppEvents\\Schemes\\Apps\\.Default\\WindowsLogon\\.Current", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
|
||||||
|
@ -94,17 +135,7 @@ PlayLogonSoundThread(
|
||||||
if (Info.dwCurrentState != SERVICE_RUNNING)
|
if (Info.dwCurrentState != SERVICE_RUNNING)
|
||||||
ExitThread(0);
|
ExitThread(0);
|
||||||
|
|
||||||
|
PlaySoundRoutine(szDest, TRUE, SND_FILENAME);
|
||||||
hLibrary = LoadLibraryW(L"winmm.dll");
|
|
||||||
if (hLibrary)
|
|
||||||
{
|
|
||||||
Play = (PLAYSOUNDW)GetProcAddress(hLibrary, "PlaySoundW");
|
|
||||||
if (Play)
|
|
||||||
{
|
|
||||||
Play(szDest, NULL, SND_FILENAME);
|
|
||||||
}
|
|
||||||
FreeLibrary(hLibrary);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ExitThread(0);
|
ExitThread(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include <accctrl.h>
|
#include <accctrl.h>
|
||||||
#include <aclapi.h>
|
#include <aclapi.h>
|
||||||
|
|
||||||
|
#include <reactos/undocuser.h>
|
||||||
#include <reactos/winlogon.h>
|
#include <reactos/winlogon.h>
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
@ -203,6 +204,13 @@ StartScreenSaver(
|
||||||
IN PWLSESSION Session);
|
IN PWLSESSION Session);
|
||||||
|
|
||||||
/* winlogon.c */
|
/* winlogon.c */
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
PlaySoundRoutine(
|
||||||
|
IN LPCWSTR FileName,
|
||||||
|
IN UINT Logon,
|
||||||
|
IN UINT Flags);
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
DisplayStatusMessage(
|
DisplayStatusMessage(
|
||||||
IN PWLSESSION Session,
|
IN PWLSESSION Session,
|
||||||
|
|
|
@ -72,7 +72,7 @@ SetLogonNotifyWindow (HWND Wnd, HWINSTA WinSta)
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(TRUE);
|
return NtUserSetLogonNotifyWindow(Wnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -890,36 +890,7 @@ BOOL
|
||||||
WINAPI
|
WINAPI
|
||||||
MessageBeep(UINT uType)
|
MessageBeep(UINT uType)
|
||||||
{
|
{
|
||||||
#if 0
|
return (BOOL)NtUserCallOneParam(ONEPARAM_ROUTINE_MESSAGEBEEP, uType);
|
||||||
LPWSTR EventName;
|
|
||||||
|
|
||||||
switch(uType)
|
|
||||||
{
|
|
||||||
case 0xFFFFFFFF:
|
|
||||||
if(waveOutGetNumDevs() == 0)
|
|
||||||
return Beep(500, 100); // Beep through speaker
|
|
||||||
/* fall through */
|
|
||||||
case MB_OK:
|
|
||||||
EventName = L"SystemDefault";
|
|
||||||
break;
|
|
||||||
case MB_ICONASTERISK:
|
|
||||||
EventName = L"SystemAsterisk";
|
|
||||||
break;
|
|
||||||
case MB_ICONEXCLAMATION:
|
|
||||||
EventName = L"SystemExclamation";
|
|
||||||
break;
|
|
||||||
case MB_ICONHAND:
|
|
||||||
EventName = L"SystemHand";
|
|
||||||
break;
|
|
||||||
case MB_ICONQUESTION:
|
|
||||||
EventName = L"SystemQuestion";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return PlaySoundW((LPCWSTR)EventName, NULL, SND_ALIAS | SND_NOWAIT | SND_NOSTOP | SND_ASYNC);
|
|
||||||
#else
|
|
||||||
return Beep(500, 100); // Beep through speaker
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@
|
||||||
#define SBRG_PAGEDOWNLEFT 4 /* the page down or page left region */
|
#define SBRG_PAGEDOWNLEFT 4 /* the page down or page left region */
|
||||||
#define SBRG_BOTTOMLEFTBTN 5 /* the bottom or left button */
|
#define SBRG_BOTTOMLEFTBTN 5 /* the bottom or left button */
|
||||||
|
|
||||||
|
BOOL WINAPI SetLogonNotifyWindow(HWND Wnd, HWINSTA WinSta);
|
||||||
BOOL WINAPI KillSystemTimer(HWND,UINT_PTR);
|
BOOL WINAPI KillSystemTimer(HWND,UINT_PTR);
|
||||||
UINT_PTR WINAPI SetSystemTimer(HWND,UINT_PTR,UINT,TIMERPROC);
|
UINT_PTR WINAPI SetSystemTimer(HWND,UINT_PTR,UINT,TIMERPROC);
|
||||||
DWORD_PTR WINAPI SetSysColorsTemp(const COLORREF *, const HBRUSH *, DWORD_PTR);
|
DWORD_PTR WINAPI SetSysColorsTemp(const COLORREF *, const HBRUSH *, DWORD_PTR);
|
||||||
|
|
|
@ -17,14 +17,6 @@
|
||||||
#define EWX_INTERNAL_KILL_ALL_APPS (EWX_INTERNAL_FLAG | 0x200)
|
#define EWX_INTERNAL_KILL_ALL_APPS (EWX_INTERNAL_FLAG | 0x200)
|
||||||
#define EWX_INTERNAL_FLAG_LOGOFF 0x1000
|
#define EWX_INTERNAL_FLAG_LOGOFF 0x1000
|
||||||
|
|
||||||
#define WM_LOGONNOTIFY 0x0000004c
|
|
||||||
|
|
||||||
/* WPARAM values for WM_LOGONNOTIFY */
|
|
||||||
#define LN_START_TASK_MANAGER 0x4
|
|
||||||
#define LN_LOCK_WORKSTATION 0x5
|
|
||||||
#define LN_UNLOCK_WORKSTATION 0x6
|
|
||||||
#define LN_MESSAGE_BEEP 0x9
|
|
||||||
|
|
||||||
#endif /* REACTOS_WINLOGON_H_INCLUDED */
|
#endif /* REACTOS_WINLOGON_H_INCLUDED */
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -61,6 +61,7 @@ typedef struct _WINSTATION_OBJECT
|
||||||
|
|
||||||
extern WINSTATION_OBJECT *InputWindowStation;
|
extern WINSTATION_OBJECT *InputWindowStation;
|
||||||
extern PPROCESSINFO LogonProcess;
|
extern PPROCESSINFO LogonProcess;
|
||||||
|
extern HWND hwndSAS;
|
||||||
|
|
||||||
INIT_FUNCTION
|
INIT_FUNCTION
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
|
|
@ -1272,17 +1272,6 @@ NtUserSetLayeredWindowAttributes(HWND hwnd,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
BOOL APIENTRY
|
|
||||||
NtUserSetLogonNotifyWindow(HWND hWnd)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @unimplemented
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -341,6 +341,9 @@ NtUserCallOneParam(
|
||||||
}
|
}
|
||||||
case ONEPARAM_ROUTINE_REPLYMESSAGE:
|
case ONEPARAM_ROUTINE_REPLYMESSAGE:
|
||||||
RETURN (co_MsqReplyMessage((LRESULT) Param));
|
RETURN (co_MsqReplyMessage((LRESULT) Param));
|
||||||
|
case ONEPARAM_ROUTINE_MESSAGEBEEP:
|
||||||
|
RETURN ( UserPostMessage(hwndSAS, WM_LOGONNOTIFY, LN_MESSAGE_BEEP, Param) );
|
||||||
|
/* TODO: Implement sound sentry */
|
||||||
}
|
}
|
||||||
DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
|
DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
|
||||||
Routine, Param);
|
Routine, Param);
|
||||||
|
|
|
@ -43,6 +43,9 @@
|
||||||
/* Currently active window station */
|
/* Currently active window station */
|
||||||
PWINSTATION_OBJECT InputWindowStation = NULL;
|
PWINSTATION_OBJECT InputWindowStation = NULL;
|
||||||
|
|
||||||
|
/* Winlogon sas window*/
|
||||||
|
HWND hwndSAS = NULL;
|
||||||
|
|
||||||
/* INITALIZATION FUNCTIONS ****************************************************/
|
/* INITALIZATION FUNCTIONS ****************************************************/
|
||||||
|
|
||||||
static GENERIC_MAPPING IntWindowStationMapping =
|
static GENERIC_MAPPING IntWindowStationMapping =
|
||||||
|
@ -1455,4 +1458,25 @@ NtUserBuildNameList(
|
||||||
BuildDesktopNameList(hWindowStation, dwSize, lpBuffer, pRequiredSize);
|
BuildDesktopNameList(hWindowStation, dwSize, lpBuffer, pRequiredSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOL APIENTRY
|
||||||
|
NtUserSetLogonNotifyWindow(HWND hWnd)
|
||||||
|
{
|
||||||
|
if(LogonProcess != PsGetCurrentProcessWin32Process())
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!IntIsWindow(hWnd))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
hwndSAS = hWnd;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue