[Win32k]
[reactos.git] / reactos / subsystems / win32 / win32k / ntuser / simplecall.c
index 91d58db..1e74111 100644 (file)
@@ -8,7 +8,7 @@
  *       2008/03/20  Split from misc.c
  */
 
-#include <w32k.h>
+#include <win32k.h>
 
 #define NDEBUG
 #include <debug.h>
@@ -28,7 +28,7 @@ co_IntRegisterLogonProcess(HANDLE ProcessId, BOOL Register)
                                        &Process);
    if (!NT_SUCCESS(Status))
    {
-      SetLastWin32Error(RtlNtStatusToDosError(Status));
+      EngSetLastError(RtlNtStatusToDosError(Status));
       return FALSE;
    }
 
@@ -74,12 +74,12 @@ co_IntRegisterLogonProcess(HANDLE ProcessId, BOOL Register)
 /*
  * @unimplemented
  */
-DWORD
+DWORD_PTR
 APIENTRY
 NtUserCallNoParam(DWORD Routine)
 {
-   DWORD Result = 0;
-   DECLARE_RETURN(DWORD);
+   DWORD_PTR Result = 0;
+   DECLARE_RETURN(DWORD_PTR);
 
    DPRINT("Enter NtUserCallNoParam\n");
    UserEnterExclusive();
@@ -87,43 +87,41 @@ NtUserCallNoParam(DWORD Routine)
    switch(Routine)
    {
       case NOPARAM_ROUTINE_CREATEMENU:
-         Result = (DWORD)UserCreateMenu(FALSE);
+         Result = (DWORD_PTR)UserCreateMenu(FALSE);
          break;
 
       case NOPARAM_ROUTINE_CREATEMENUPOPUP:
-         Result = (DWORD)UserCreateMenu(TRUE);
+         Result = (DWORD_PTR)UserCreateMenu(TRUE);
          break;
 
       case NOPARAM_ROUTINE_DESTROY_CARET:
-         Result = (DWORD)co_IntDestroyCaret(PsGetCurrentThread()->Tcb.Win32Thread);
+         Result = (DWORD_PTR)co_IntDestroyCaret(PsGetCurrentThread()->Tcb.Win32Thread);
          break;
 
       case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP:
-         Result = (DWORD)IntInitMessagePumpHook();
+         Result = (DWORD_PTR)IntInitMessagePumpHook();
          break;
 
       case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP:
-         Result = (DWORD)IntUninitMessagePumpHook();
+         Result = (DWORD_PTR)IntUninitMessagePumpHook();
          break;
 
       case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO:
-         Result = (DWORD)MsqGetMessageExtraInfo();
-         break;
-
-      case NOPARAM_ROUTINE_ANYPOPUP:
-         Result = (DWORD)IntAnyPopup();
-         break;
-
-      case NOPARAM_ROUTINE_CSRSS_INITIALIZED:
-         Result = (DWORD)CsrInit();
+         Result = (DWORD_PTR)MsqGetMessageExtraInfo();
          break;
 
       case NOPARAM_ROUTINE_MSQCLEARWAKEMASK:
-         RETURN( (DWORD)IntMsqClearWakeMask());
+         RETURN( (DWORD_PTR)IntMsqClearWakeMask());
+
+      case NOPARAM_ROUTINE_GETMSESSAGEPOS:
+      {
+         PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
+         RETURN( (DWORD_PTR)MAKELONG(pti->ptLast.x, pti->ptLast.y));
+      }
 
       default:
          DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine);
-         SetLastWin32Error(ERROR_INVALID_PARAMETER);
+         EngSetLastError(ERROR_INVALID_PARAMETER);
          break;
    }
    RETURN(Result);
@@ -138,13 +136,13 @@ CLEANUP:
 /*
  * @implemented
  */
-DWORD
+DWORD_PTR
 APIENTRY
 NtUserCallOneParam(
-   DWORD Param,
+   DWORD_PTR Param,
    DWORD Routine)
 {
-   DECLARE_RETURN(DWORD);
+   DECLARE_RETURN(DWORD_PTR);
 
    DPRINT("Enter NtUserCallOneParam\n");
 
@@ -159,8 +157,40 @@ NtUserCallOneParam(
                 MsqPostQuitMessage(pti->MessageQueue, Param);
                 RETURN(TRUE);
           }
+
+      case ONEPARAM_ROUTINE_BEGINDEFERWNDPOS:
+         {
+             PSMWP psmwp;
+             HDWP hDwp = NULL;
+             if (Param < 0)
+             {
+                EngSetLastError(ERROR_INVALID_PARAMETER);
+                RETURN(0);
+             }
+             /* Windows allows zero count, in which case it allocates context for 8 moves */
+             if (Param == 0) Param = 8;
+
+             psmwp = (PSMWP) UserCreateObject( gHandleTable,
+                                               NULL,
+                                              (PHANDLE)&hDwp,
+                                               otSMWP,
+                                               sizeof(SMWP));
+             if (!psmwp) RETURN(0);
+             psmwp->acvr = ExAllocatePoolWithTag(PagedPool, Param * sizeof(CVR), USERTAG_SWP);
+             if (!psmwp->acvr)
+             {
+                UserDeleteObject(hDwp, otSMWP);
+                RETURN(0);
+             }
+             RtlZeroMemory(psmwp->acvr, Param * sizeof(CVR));
+             psmwp->bHandle = TRUE;
+             psmwp->ccvr = 0;          // actualCount
+             psmwp->ccvrAlloc = Param; // suggestedCount             
+             RETURN((DWORD_PTR)hDwp);
+         }
+
       case ONEPARAM_ROUTINE_SHOWCURSOR:
-         RETURN( (DWORD)UserShowCursor((BOOL)Param) );
+         RETURN( (DWORD_PTR)UserShowCursor((BOOL)Param) );
 
       case ONEPARAM_ROUTINE_GETDESKTOPMAPPING:
          {
@@ -170,7 +200,7 @@ NtUserCallOneParam(
              {
                 /* Try convert the pointer to a user mode pointer if the desktop is
                    mapped into the process */
-                RETURN((DWORD)DesktopHeapAddressToUser((PVOID)Param));
+                RETURN((DWORD_PTR)DesktopHeapAddressToUser((PVOID)Param));
              }
              else
              {
@@ -179,11 +209,11 @@ NtUserCallOneParam(
          }
 
       case ONEPARAM_ROUTINE_WINDOWFROMDC:
-         RETURN( (DWORD)IntWindowFromDC((HDC)Param));
+         RETURN( (DWORD_PTR)IntWindowFromDC((HDC)Param));
 
       case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON:
          {
-            DWORD Result;
+            DWORD_PTR Result;
 
             Result = gspv.bMouseBtnSwap;
             gspv.bMouseBtnSwap = Param ? TRUE : FALSE;
@@ -192,25 +222,28 @@ NtUserCallOneParam(
          }
 
       case ONEPARAM_ROUTINE_SWITCHCARETSHOWING:
-         RETURN( (DWORD)IntSwitchCaretShowing((PVOID)Param));
+         RETURN( (DWORD_PTR)IntSwitchCaretShowing((PVOID)Param));
 
       case ONEPARAM_ROUTINE_SETCARETBLINKTIME:
-         RETURN( (DWORD)IntSetCaretBlinkTime((UINT)Param));
+         RETURN( (DWORD_PTR)IntSetCaretBlinkTime((UINT)Param));
 
       case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO:
-         RETURN( (DWORD)MsqSetMessageExtraInfo((LPARAM)Param));
+         RETURN( (DWORD_PTR)MsqSetMessageExtraInfo((LPARAM)Param));
 
-      case ONEPARAM_ROUTINE_CREATECURICONHANDLE:
+      case ONEPARAM_ROUTINE_CREATEEMPTYCUROBJECT:
          {
             PCURICON_OBJECT CurIcon;
+                       DWORD_PTR Result ;
 
             if (!(CurIcon = IntCreateCurIconHandle()))
             {
-               SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
+               EngSetLastError(ERROR_NOT_ENOUGH_MEMORY);
                RETURN(0);
             }
 
-            RETURN((DWORD)CurIcon->Self);
+            Result = (DWORD_PTR)CurIcon->Self;
+                       UserDereferenceObject(CurIcon);
+                       RETURN(Result);
          }
 
       case ONEPARAM_ROUTINE_GETCURSORPOSITION:
@@ -233,21 +266,6 @@ NtUserCallOneParam(
             RETURN (ret);
          }
 
-      case ONEPARAM_ROUTINE_ISWINDOWINDESTROY:
-         {
-            PWINDOW_OBJECT Window;
-            DWORD Result;
-
-            if(!(Window = UserGetWindowObject((HWND)Param)))
-            {
-               RETURN( FALSE);
-            }
-
-            Result = (DWORD)IntIsWindowInDestroy(Window);
-
-            RETURN( Result);
-         }
-
       case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING:
          {
             BOOL Enable;
@@ -272,14 +290,14 @@ NtUserCallOneParam(
             RETURN( FALSE);
          }
 
-      case ONEPARAM_ROUTINE_MSQSETWAKEMASK:
-         RETURN( (DWORD)IntMsqSetWakeMask(Param));
+      case ONEPARAM_ROUTINE_GETINPUTEVENT:
+         RETURN( (DWORD_PTR)IntMsqSetWakeMask(Param));
 
       case ONEPARAM_ROUTINE_GETKEYBOARDTYPE:
          RETURN( UserGetKeyboardType(Param));
 
       case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT:
-         RETURN( (DWORD)UserGetKeyboardLayout(Param));
+         RETURN( (DWORD_PTR)UserGetKeyboardLayout(Param));
 
       case ONEPARAM_ROUTINE_RELEASEDC:
          RETURN (UserReleaseDC(NULL, (HDC) Param, FALSE));
@@ -289,12 +307,7 @@ NtUserCallOneParam(
 
       case ONEPARAM_ROUTINE_GETQUEUESTATUS:
       {
-         DWORD Ret;
-         WORD changed_bits, wake_bits;
-         Ret = IntGetQueueStatus(FALSE);
-         changed_bits = LOWORD(Ret);
-         wake_bits = HIWORD(Ret);
-         RETURN( MAKELONG(changed_bits & Param, wake_bits & Param));
+         RETURN (IntGetQueueStatus((DWORD)Param));
       }
       case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS:
          /* FIXME: Should use UserEnterShared */
@@ -309,7 +322,7 @@ NtUserCallOneParam(
           BOOL Ret = TRUE;
           PPOINTL pptl;
           PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
-          if (pti->hDesktop != InputDesktopHandle) RETURN(FALSE);
+          if (pti->hdesk != InputDesktopHandle) RETURN(FALSE);
           _SEH2_TRY
           {
              pptl = (PPOINTL)Param;
@@ -322,10 +335,51 @@ NtUserCallOneParam(
           _SEH2_END;
           RETURN(Ret);
       }
+      case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT:
+      {
+          PPROCESSINFO ppi;
+          if (Param & LAYOUT_ORIENTATIONMASK)
+          {
+             ppi = PsGetCurrentProcessWin32Process();
+             ppi->dwLayout = Param;
+             RETURN(TRUE);
+          }
+          EngSetLastError(ERROR_INVALID_PARAMETER);
+          RETURN(FALSE);
+      }
+      case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT:
+      {
+          BOOL Ret = TRUE;
+          PPROCESSINFO ppi;
+          PDWORD pdwLayout;
+          if ( PsGetCurrentProcess() == CsrProcess)
+          {
+             EngSetLastError(ERROR_INVALID_ACCESS);
+             RETURN(FALSE);
+          }
+          ppi = PsGetCurrentProcessWin32Process();
+          _SEH2_TRY
+          {
+             pdwLayout = (PDWORD)Param;
+             *pdwLayout = ppi->dwLayout;
+          }
+          _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+          {
+             SetLastNtError(_SEH2_GetExceptionCode());
+             Ret = FALSE;
+          }
+          _SEH2_END;
+          RETURN(Ret);
+      }
+      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);
-   SetLastWin32Error(ERROR_INVALID_PARAMETER);
+   EngSetLastError(ERROR_INVALID_PARAMETER);
    RETURN( 0);
 
 CLEANUP:
@@ -338,48 +392,24 @@ CLEANUP:
 /*
  * @implemented
  */
-DWORD
+DWORD_PTR
 APIENTRY
 NtUserCallTwoParam(
-   DWORD Param1,
-   DWORD Param2,
+   DWORD_PTR Param1,
+   DWORD_PTR Param2,
    DWORD Routine)
 {
-   NTSTATUS Status;
-   PWINDOW_OBJECT Window;
-   DECLARE_RETURN(DWORD);
+   PWND Window;
+   DECLARE_RETURN(DWORD_PTR);
 
    DPRINT("Enter NtUserCallTwoParam\n");
    UserEnterExclusive();
 
    switch(Routine)
    {
-      case TWOPARAM_ROUTINE_GETWINDOWRGNBOX:
-         {
-            DWORD Ret;
-            RECTL rcRect;
-            Window = UserGetWindowObject((HWND)Param1);
-            if (!Window) RETURN(ERROR);
-
-            Ret = (DWORD)IntGetWindowRgnBox(Window, &rcRect);
-            Status = MmCopyToCaller((PVOID)Param2, &rcRect, sizeof(RECT));
-            if(!NT_SUCCESS(Status))
-            {
-               SetLastNtError(Status);
-               RETURN( ERROR);
-            }
-            RETURN( Ret);
-         }
-      case TWOPARAM_ROUTINE_GETWINDOWRGN:
-         {
-            Window = UserGetWindowObject((HWND)Param1);
-            if (!Window) RETURN(ERROR);
-
-            RETURN( (DWORD)IntGetWindowRgn(Window, (HRGN)Param2));
-         }
       case TWOPARAM_ROUTINE_SETMENUBARHEIGHT:
          {
-            DWORD Ret;
+            DWORD_PTR Ret;
             PMENU_OBJECT MenuObject = IntGetMenuObject((HMENU)Param1);
             if(!MenuObject)
                RETURN( 0);
@@ -390,7 +420,7 @@ NtUserCallTwoParam(
                MenuObject->MenuInfo.Height = (int)Param2;
             }
             else
-               Ret = (DWORD)MenuObject->MenuInfo.Height;
+               Ret = (DWORD_PTR)MenuObject->MenuInfo.Height;
             IntReleaseMenuObject(MenuObject);
             RETURN( Ret);
          }
@@ -400,7 +430,7 @@ NtUserCallTwoParam(
             PUSER_MESSAGE_QUEUE MsgQueue = ((PTHREADINFO)PsGetCurrentThread()->Tcb.Win32Thread)->MessageQueue;
 
             ASSERT(MsgQueue);
-            RETURN( (DWORD)MsqSetStateWindow(MsgQueue, (ULONG)Param1, (HWND)Param2));
+            RETURN( (DWORD_PTR)MsqSetStateWindow(MsgQueue, (ULONG)Param1, (HWND)Param2));
          }
 
       case TWOPARAM_ROUTINE_ENABLEWINDOW:
@@ -412,7 +442,7 @@ NtUserCallTwoParam(
          Window = UserGetWindowObject((HWND)Param1);
          if (!Window) RETURN(0);
 
-         RETURN( (DWORD)IntShowOwnedPopups(Window, (BOOL) Param2));
+         RETURN( (DWORD_PTR)IntShowOwnedPopups(Window, (BOOL) Param2));
       }
 
       case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE:
@@ -425,7 +455,7 @@ NtUserCallTwoParam(
           wParam = MAKEWPARAM((Param2 >> 3) & 0x3,
                               Param2 & (UISF_HIDEFOCUS | UISF_HIDEACCEL | UISF_ACTIVE));
 
-          RETURN( UserUpdateUiState(Window->Wnd, wParam) );
+          RETURN( UserUpdateUiState(Window, wParam) );
       }
 
       case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW:
@@ -434,14 +464,20 @@ NtUserCallTwoParam(
 
 
       case TWOPARAM_ROUTINE_SETCARETPOS:
-         RETURN( (DWORD)co_IntSetCaretPos((int)Param1, (int)Param2));
+         RETURN( (DWORD_PTR)co_IntSetCaretPos((int)Param1, (int)Param2));
 
       case TWOPARAM_ROUTINE_REGISTERLOGONPROC:
-         RETURN( (DWORD)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2));
+         RETURN( (DWORD_PTR)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2));
+
+      case TWOPARAM_ROUTINE_SETCURSORPOS:
+         RETURN( (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2, FALSE));
+
+      case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK:
+         RETURN( IntUnhookWindowsHook((int)Param1, (HOOKPROC)Param2));
    }
    DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
            Routine, Param1, Param2);
-   SetLastWin32Error(ERROR_INVALID_PARAMETER);
+   EngSetLastError(ERROR_INVALID_PARAMETER);
    RETURN( 0);
 
 CLEANUP:
@@ -461,22 +497,19 @@ NtUserCallHwndLock(
    DWORD Routine)
 {
    BOOL Ret = 0;
-   PWINDOW_OBJECT Window;
-   PWND Wnd;
+   PWND Window;
    USER_REFERENCE_ENTRY Ref;
    DECLARE_RETURN(BOOLEAN);
 
    DPRINT("Enter NtUserCallHwndLock\n");
    UserEnterExclusive();
 
-   if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd)
+   if (!(Window = UserGetWindowObject(hWnd)))
    {
       RETURN( FALSE);
    }
    UserRefObjectCo(Window, &Ref);
 
-   Wnd = Window->Wnd;
-
    /* FIXME: Routine can be 0x53 - 0x5E */
    switch (Routine)
    {
@@ -486,28 +519,17 @@ NtUserCallHwndLock(
 
       case HWNDLOCK_ROUTINE_DRAWMENUBAR:
          {
-            PMENU_OBJECT Menu;
             DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
-            Ret = FALSE;
-            if (!((Wnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD))
-               break;
-
-            if(!(Menu = UserGetMenuObject((HMENU) Wnd->IDMenu)))
-               break;
-
-            Menu->MenuInfo.WndOwner = hWnd;
-            Menu->MenuInfo.Height = 0;
-
-            co_WinPosSetWindowPos( Window,
-                                   HWND_DESKTOP,
-                                   0,0,0,0,
-                                   SWP_NOSIZE|
-                                   SWP_NOMOVE|
-                                   SWP_NOZORDER|
-                                   SWP_NOACTIVATE|
-                                   SWP_FRAMECHANGED );
-
             Ret = TRUE;
+            if ((Window->style & (WS_CHILD | WS_POPUP)) != WS_CHILD)
+               co_WinPosSetWindowPos( Window,
+                                      HWND_DESKTOP,
+                                      0,0,0,0,
+                                      SWP_NOSIZE|
+                                      SWP_NOMOVE|
+                                      SWP_NOZORDER|
+                                      SWP_NOACTIVATE|
+                                      SWP_FRAMECHANGED );
             break;
          }
 
@@ -532,7 +554,7 @@ NtUserCallHwndLock(
                                 SWP_NOZORDER|
                                 SWP_NOACTIVATE|
                                 SWP_FRAMECHANGED );
-         if (!IntGetOwner(Window) && !IntGetParent(Window))
+         if (!Window->spwndOwner && !IntGetParent(Window))
          {
             co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) hWnd);
          }
@@ -591,13 +613,13 @@ NtUserCallHwnd(
    {
       case HWND_ROUTINE_GETWNDCONTEXTHLPID:
       {
-         PWINDOW_OBJECT Window;
+         PWND Window;
          PPROPERTY HelpId;
          USER_REFERENCE_ENTRY Ref;
 
          UserEnterExclusive();
 
-         if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd)
+         if (!(Window = UserGetWindowObject(hWnd)))
          {
             UserLeave();
             return 0;
@@ -640,7 +662,7 @@ NtUserCallHwndParam(
 
       case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID:
       {
-         PWINDOW_OBJECT Window;
+         PWND Window;
 
          UserEnterExclusive();
          if(!(Window = UserGetWindowObject(hWnd)))
@@ -660,20 +682,18 @@ NtUserCallHwndParam(
 
       case HWNDPARAM_ROUTINE_SETDIALOGPOINTER:
       {
-         PWINDOW_OBJECT Window;
          PWND pWnd;
          USER_REFERENCE_ENTRY Ref;
 
          UserEnterExclusive();
 
-         if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd)
+         if (!(pWnd = UserGetWindowObject(hWnd)))
          {
             UserLeave();
             return 0;
          }
-         UserRefObjectCo(Window, &Ref);
+         UserRefObjectCo(pWnd, &Ref);
 
-         pWnd = Window->Wnd;
          if (pWnd->head.pti->ppi == PsGetCurrentProcessWin32Process() &&
              pWnd->cbwndExtra == DLGWINDOWEXTRA && 
              !(pWnd->state & WNDS_SERVERSIDEWINDOWPROC))
@@ -690,7 +710,22 @@ NtUserCallHwndParam(
             }
          }
          
-         UserDerefObjectCo(Window);
+         UserDerefObjectCo(pWnd);
+         UserLeave();
+         return 0;
+      }
+
+      case HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT:
+      {
+         PWND pWnd;
+         PNOTIFYEVENT pne;
+         UserEnterExclusive();
+         pne = (PNOTIFYEVENT)Param;
+         if (hWnd)
+            pWnd = UserGetWindowObject(hWnd);
+         else
+            pWnd = NULL;
+         IntNotifyWinEvent(pne->event, pWnd, pne->idObject, pne->idChild, pne->flags);
          UserLeave();
          return 0;
       }
@@ -708,9 +743,36 @@ NtUserCallHwndParamLock(
    DWORD Param,
    DWORD Routine)
 {
-   UNIMPLEMENTED;
+   DWORD Ret = 0;
+   PWND Window;
+   USER_REFERENCE_ENTRY Ref;
+   DECLARE_RETURN(DWORD);
+
+   DPRINT("Enter NtUserCallHwndParamLock\n");
+   UserEnterExclusive();
+
+   if (!(Window = UserGetWindowObject(hWnd)))
+   {
+      RETURN( FALSE);
+   }
+   UserRefObjectCo(Window, &Ref);
+
+   switch (Routine)
+   {
+      case TWOPARAM_ROUTINE_VALIDATERGN:
+         Ret = (DWORD)co_UserRedrawWindow( Window, NULL, (HRGN)Param, RDW_VALIDATE);
+         break;
+   }
+
+   UserDerefObjectCo(Window);
+
+   RETURN( Ret);
+
+CLEANUP:
+   DPRINT("Leave NtUserCallHwndParamLock, ret=%i\n",_ret_);
+   UserLeave();
+   END_CLEANUP;
 
-   return 0;
 }
 
 /* EOF */