Author: gadamopoulos
Date: Fri Feb 18 20:16:43 2011
New Revision: 50813

URL: http://svn.reactos.org/svn/reactos?rev=50813&view=rev
Log:
[user32/win32k]
- Implement MessageBeep and SetLogonNotifyWindow

[winlogon]
- Implement receiving notifications from win32k to play sounds of MessageBeep

Modified:
    trunk/reactos/base/system/winlogon/sas.c
    trunk/reactos/base/system/winlogon/winlogon.c
    trunk/reactos/base/system/winlogon/winlogon.h
    trunk/reactos/dll/win32/user32/misc/misc.c
    trunk/reactos/dll/win32/user32/windows/messagebox.c
    trunk/reactos/include/reactos/undocuser.h
    trunk/reactos/include/reactos/winlogon.h
    trunk/reactos/subsystems/win32/win32k/include/winsta.h
    trunk/reactos/subsystems/win32/win32k/ntuser/ntstubs.c
    trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c
    trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c

Modified: trunk/reactos/base/system/winlogon/sas.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/sas.c?rev=50813&r1=50812&r2=50813&view=diff
==============================================================================
--- trunk/reactos/base/system/winlogon/sas.c [iso-8859-1] (original)
+++ trunk/reactos/base/system/winlogon/sas.c [iso-8859-1] Fri Feb 18 20:16:43 
2011
@@ -24,8 +24,6 @@
 
 #define HK_CTRL_ALT_DEL   0
 #define HK_CTRL_SHIFT_ESC 1
-
-extern BOOL WINAPI SetLogonNotifyWindow(HWND Wnd, HWINSTA WinSta);
 
 /* FUNCTIONS ****************************************************************/
 
@@ -843,6 +841,40 @@
        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
 SASWindowProc(
        IN HWND hwndDlg,
@@ -902,6 +934,21 @@
                        }
                        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:
                {
                        DispatchSAS(Session, (DWORD)wParam);

Modified: trunk/reactos/base/system/winlogon/winlogon.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/winlogon.c?rev=50813&r1=50812&r2=50813&view=diff
==============================================================================
--- trunk/reactos/base/system/winlogon/winlogon.c [iso-8859-1] (original)
+++ trunk/reactos/base/system/winlogon/winlogon.c [iso-8859-1] Fri Feb 18 
20:16:43 2011
@@ -23,6 +23,49 @@
 
 /* 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
 WINAPI
 PlayLogonSoundThread(
@@ -32,10 +75,8 @@
        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)
@@ -94,17 +135,7 @@
                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);
-               }
+               PlaySoundRoutine(szDest, TRUE, SND_FILENAME);
        }
        ExitThread(0);
 }

Modified: trunk/reactos/base/system/winlogon/winlogon.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/winlogon/winlogon.h?rev=50813&r1=50812&r2=50813&view=diff
==============================================================================
--- trunk/reactos/base/system/winlogon/winlogon.h [iso-8859-1] (original)
+++ trunk/reactos/base/system/winlogon/winlogon.h [iso-8859-1] Fri Feb 18 
20:16:43 2011
@@ -40,6 +40,7 @@
 #include <accctrl.h>
 #include <aclapi.h>
 
+#include <reactos/undocuser.h>
 #include <reactos/winlogon.h>
 
 #include "setup.h"
@@ -203,6 +204,13 @@
        IN PWLSESSION Session);
 
 /* winlogon.c */
+
+BOOL
+PlaySoundRoutine(
+       IN LPCWSTR FileName,
+       IN UINT Logon,
+       IN UINT Flags);
+
 BOOL
 DisplayStatusMessage(
        IN PWLSESSION Session,

Modified: trunk/reactos/dll/win32/user32/misc/misc.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/misc.c?rev=50813&r1=50812&r2=50813&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/misc/misc.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/misc/misc.c [iso-8859-1] Fri Feb 18 20:16:43 
2011
@@ -72,7 +72,7 @@
       return(FALSE);
     }
 
-  return(TRUE);
+  return NtUserSetLogonNotifyWindow(Wnd);
 }
 
 /*

Modified: trunk/reactos/dll/win32/user32/windows/messagebox.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/messagebox.c?rev=50813&r1=50812&r2=50813&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/messagebox.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/messagebox.c [iso-8859-1] Fri Feb 18 
20:16:43 2011
@@ -890,36 +890,7 @@
 WINAPI
 MessageBeep(UINT uType)
 {
-#if 0
-  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
+    return (BOOL)NtUserCallOneParam(ONEPARAM_ROUTINE_MESSAGEBEEP, uType);
 }
 
 

Modified: trunk/reactos/include/reactos/undocuser.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/undocuser.h?rev=50813&r1=50812&r2=50813&view=diff
==============================================================================
--- trunk/reactos/include/reactos/undocuser.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/undocuser.h [iso-8859-1] Fri Feb 18 20:16:43 
2011
@@ -92,7 +92,7 @@
 #define SBRG_PAGEDOWNLEFT  4 /* the page down or page left region */
 #define SBRG_BOTTOMLEFTBTN 5 /* the bottom or left button */
 
-
+BOOL WINAPI SetLogonNotifyWindow(HWND Wnd, HWINSTA WinSta);
 BOOL WINAPI KillSystemTimer(HWND,UINT_PTR);
 UINT_PTR WINAPI SetSystemTimer(HWND,UINT_PTR,UINT,TIMERPROC);
 DWORD_PTR WINAPI SetSysColorsTemp(const COLORREF *, const HBRUSH *, DWORD_PTR);

Modified: trunk/reactos/include/reactos/winlogon.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/winlogon.h?rev=50813&r1=50812&r2=50813&view=diff
==============================================================================
--- trunk/reactos/include/reactos/winlogon.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/winlogon.h [iso-8859-1] Fri Feb 18 20:16:43 
2011
@@ -17,14 +17,6 @@
 #define EWX_INTERNAL_KILL_ALL_APPS  (EWX_INTERNAL_FLAG | 0x200)
 #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 */
 
 /* EOF */

Modified: trunk/reactos/subsystems/win32/win32k/include/winsta.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/winsta.h?rev=50813&r1=50812&r2=50813&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/winsta.h [iso-8859-1] 
(original)
+++ trunk/reactos/subsystems/win32/win32k/include/winsta.h [iso-8859-1] Fri Feb 
18 20:16:43 2011
@@ -61,6 +61,7 @@
 
 extern WINSTATION_OBJECT *InputWindowStation;
 extern PPROCESSINFO LogonProcess;
+extern HWND hwndSAS;
 
 INIT_FUNCTION
 NTSTATUS

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/ntstubs.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/ntstubs.c?rev=50813&r1=50812&r2=50813&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/ntstubs.c [iso-8859-1] 
(original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/ntstubs.c [iso-8859-1] Fri Feb 
18 20:16:43 2011
@@ -1275,17 +1275,6 @@
 /*
  * @unimplemented
  */
-BOOL APIENTRY
-NtUserSetLogonNotifyWindow(HWND hWnd)
-{
-   UNIMPLEMENTED
-
-   return 0;
-}
-
-/*
- * @unimplemented
- */
 BOOL
 APIENTRY
 NtUserUpdateLayeredWindow(

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c?rev=50813&r1=50812&r2=50813&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c [iso-8859-1] 
(original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c [iso-8859-1] Fri 
Feb 18 20:16:43 2011
@@ -341,6 +341,9 @@
       }
       case ONEPARAM_ROUTINE_REPLYMESSAGE:
           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",
            Routine, Param);

Modified: trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c?rev=50813&r1=50812&r2=50813&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c [iso-8859-1] 
(original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c [iso-8859-1] Fri Feb 
18 20:16:43 2011
@@ -42,6 +42,9 @@
 
 /* Currently active window station */
 PWINSTATION_OBJECT InputWindowStation = NULL;
+
+/* Winlogon sas window*/
+HWND hwndSAS = NULL;
 
 /* INITALIZATION FUNCTIONS 
****************************************************/
 
@@ -1455,4 +1458,25 @@
           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 */


Reply via email to