2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: NtUserCallXxx call stubs
5 * FILE: subsystem/win32/win32k/ntuser/simplecall.c
6 * PROGRAMER: Ge van Geldorp (ge@gse.nl)
8 * 2008/03/20 Split from misc.c
17 /* registered Logon process */
18 PW32PROCESS LogonProcess
= NULL
;
21 co_IntRegisterLogonProcess(HANDLE ProcessId
, BOOL Register
)
25 CSR_API_MESSAGE Request
;
27 Status
= PsLookupProcessByProcessId(ProcessId
,
29 if (!NT_SUCCESS(Status
))
31 SetLastWin32Error(RtlNtStatusToDosError(Status
));
37 /* Register the logon process */
38 if (LogonProcess
!= NULL
)
40 ObDereferenceObject(Process
);
44 LogonProcess
= (PW32PROCESS
)Process
->Win32Process
;
48 /* Deregister the logon process */
49 if (LogonProcess
!= (PW32PROCESS
)Process
->Win32Process
)
51 ObDereferenceObject(Process
);
58 ObDereferenceObject(Process
);
60 Request
.Type
= MAKE_CSR_API(REGISTER_LOGON_PROCESS
, CSR_GUI
);
61 Request
.Data
.RegisterLogonProcessRequest
.ProcessId
= ProcessId
;
62 Request
.Data
.RegisterLogonProcessRequest
.Register
= Register
;
64 Status
= co_CsrNotify(&Request
);
65 if (! NT_SUCCESS(Status
))
67 DPRINT1("Failed to register logon process with CSRSS\n");
79 NtUserCallNoParam(DWORD Routine
)
82 DECLARE_RETURN(DWORD
);
84 DPRINT("Enter NtUserCallNoParam\n");
89 case NOPARAM_ROUTINE_CREATEMENU
:
90 Result
= (DWORD
)UserCreateMenu(FALSE
);
93 case NOPARAM_ROUTINE_CREATEMENUPOPUP
:
94 Result
= (DWORD
)UserCreateMenu(TRUE
);
97 case NOPARAM_ROUTINE_DESTROY_CARET
:
98 Result
= (DWORD
)co_IntDestroyCaret(PsGetCurrentThread()->Tcb
.Win32Thread
);
101 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
102 Result
= (DWORD
)IntInitMessagePumpHook();
105 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
106 Result
= (DWORD
)IntUninitMessagePumpHook();
109 case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO
:
110 Result
= (DWORD
)MsqGetMessageExtraInfo();
113 case NOPARAM_ROUTINE_ANYPOPUP
:
114 Result
= (DWORD
)IntAnyPopup();
117 case NOPARAM_ROUTINE_CSRSS_INITIALIZED
:
118 Result
= (DWORD
)CsrInit();
121 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
122 RETURN( (DWORD
)IntMsqClearWakeMask());
125 DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
126 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
132 DPRINT("Leave NtUserCallNoParam, ret=%i\n",_ret_
);
147 DECLARE_RETURN(DWORD
);
149 DPRINT("Enter NtUserCallOneParam\n");
151 UserEnterExclusive();
155 case ONEPARAM_ROUTINE_POSTQUITMESSAGE
:
158 pti
= PsGetCurrentThreadWin32Thread();
159 MsqPostQuitMessage(pti
->MessageQueue
, Param
);
162 case ONEPARAM_ROUTINE_SHOWCURSOR
:
163 RETURN( (DWORD
)UserShowCursor((BOOL
)Param
) );
165 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING
:
168 ti
= GetW32ThreadInfo();
171 /* Try convert the pointer to a user mode pointer if the desktop is
172 mapped into the process */
173 RETURN((DWORD
)DesktopHeapAddressToUser((PVOID
)Param
));
181 case ONEPARAM_ROUTINE_GETMENU
:
183 PWINDOW_OBJECT Window
;
186 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
191 Result
= (DWORD
)Window
->Wnd
->IDMenu
;
196 case ONEPARAM_ROUTINE_ISWINDOWUNICODE
:
198 PWINDOW_OBJECT Window
;
201 Window
= UserGetWindowObject((HWND
)Param
);
206 Result
= Window
->Wnd
->Unicode
;
210 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
211 RETURN( (DWORD
)IntWindowFromDC((HDC
)Param
));
213 case ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID
:
215 PWINDOW_OBJECT Window
;
218 Window
= UserGetWindowObject((HWND
)Param
);
224 Result
= Window
->Wnd
->ContextHelpId
;
229 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
231 PWINSTATION_OBJECT WinSta
;
235 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
239 if (!NT_SUCCESS(Status
))
240 RETURN( (DWORD
)FALSE
);
243 Result = (DWORD)IntSwapMouseButton(WinStaObject, (BOOL)Param); */
246 ObDereferenceObject(WinSta
);
250 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
251 RETURN( (DWORD
)IntSwitchCaretShowing((PVOID
)Param
));
253 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
254 RETURN( (DWORD
)IntSetCaretBlinkTime((UINT
)Param
));
256 case ONEPARAM_ROUTINE_GETWINDOWINSTANCE
:
258 PWINDOW_OBJECT Window
;
261 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
266 Result
= (DWORD
)Window
->Wnd
->Instance
;
270 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
271 RETURN( (DWORD
)MsqSetMessageExtraInfo((LPARAM
)Param
));
273 case ONEPARAM_ROUTINE_CREATECURICONHANDLE
:
275 PCURICON_OBJECT CurIcon
;
276 PWINSTATION_OBJECT WinSta
;
278 WinSta
= IntGetWinStaObj();
284 if (!(CurIcon
= IntCreateCurIconHandle(WinSta
)))
286 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
287 ObDereferenceObject(WinSta
);
291 ObDereferenceObject(WinSta
);
292 RETURN((DWORD
)CurIcon
->Self
);
295 case ONEPARAM_ROUTINE_GETCURSORPOSITION
:
297 PWINSTATION_OBJECT WinSta
;
302 RETURN( (DWORD
)FALSE
);
303 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
307 if (!NT_SUCCESS(Status
))
308 RETURN( (DWORD
)FALSE
);
310 /* FIXME - check if process has WINSTA_READATTRIBUTES */
311 IntGetCursorLocation(WinSta
, &Pos
);
313 Status
= MmCopyToCaller((PPOINT
)Param
, &Pos
, sizeof(POINT
));
314 if(!NT_SUCCESS(Status
))
316 ObDereferenceObject(WinSta
);
317 SetLastNtError(Status
);
321 ObDereferenceObject(WinSta
);
323 RETURN( (DWORD
)TRUE
);
326 case ONEPARAM_ROUTINE_ISWINDOWINDESTROY
:
328 PWINDOW_OBJECT Window
;
331 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
336 Result
= (DWORD
)IntIsWindowInDestroy(Window
);
341 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
344 PW32PROCESS Process
= PsGetCurrentProcessWin32Process();
348 Enable
= (BOOL
)(Param
!= 0);
352 Process
->W32PF_flags
&= ~W32PF_NOWINDOWGHOSTING
;
356 Process
->W32PF_flags
|= W32PF_NOWINDOWGHOSTING
;
365 case ONEPARAM_ROUTINE_MSQSETWAKEMASK
:
366 RETURN( (DWORD
)IntMsqSetWakeMask(Param
));
368 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
369 RETURN( UserGetKeyboardType(Param
));
371 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
372 RETURN( (DWORD
)UserGetKeyboardLayout(Param
));
374 case ONEPARAM_ROUTINE_REGISTERUSERMODULE
:
378 ti
= GetW32ThreadInfo();
381 DPRINT1("Cannot register user32 module instance!\n");
382 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
386 if (InterlockedCompareExchangePointer(&ti
->ppi
->hModUser
,
393 case ONEPARAM_ROUTINE_RELEASEDC
:
394 RETURN (UserReleaseDC(NULL
, (HDC
) Param
, FALSE
));
396 case ONEPARAM_ROUTINE_REALIZEPALETTE
:
397 RETURN (UserRealizePalette((HDC
) Param
));
399 case ONEPARAM_ROUTINE_GETQUEUESTATUS
:
402 WORD changed_bits
, wake_bits
;
403 Ret
= IntGetQueueStatus(FALSE
);
404 changed_bits
= LOWORD(Ret
);
405 wake_bits
= HIWORD(Ret
);
406 RETURN( MAKELONG(changed_bits
& Param
, wake_bits
& Param
));
408 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
409 /* FIXME: Should use UserEnterShared */
410 RETURN(IntEnumClipboardFormats(Param
));
412 case ONEPARAM_ROUTINE_CSRSS_GUICHECK
:
413 IntUserManualGuiCheck(Param
);
416 case ONEPARAM_ROUTINE_GETCURSORPOS
:
420 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
421 if (pti
->hDesktop
!= InputDesktopHandle
) RETURN(FALSE
);
424 pptl
= (PPOINTL
)Param
;
425 *pptl
= gpsi
->ptCursor
;
427 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
435 DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
437 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
441 DPRINT("Leave NtUserCallOneParam, ret=%i\n",_ret_
);
458 PWINDOW_OBJECT Window
;
459 DECLARE_RETURN(DWORD
);
461 DPRINT("Enter NtUserCallTwoParam\n");
462 UserEnterExclusive();
466 case TWOPARAM_ROUTINE_GETWINDOWRGNBOX
:
470 Window
= UserGetWindowObject((HWND
)Param1
);
471 if (!Window
) RETURN(ERROR
);
473 Ret
= (DWORD
)IntGetWindowRgnBox(Window
, &rcRect
);
474 Status
= MmCopyToCaller((PVOID
)Param2
, &rcRect
, sizeof(RECT
));
475 if(!NT_SUCCESS(Status
))
477 SetLastNtError(Status
);
482 case TWOPARAM_ROUTINE_GETWINDOWRGN
:
484 Window
= UserGetWindowObject((HWND
)Param1
);
485 if (!Window
) RETURN(ERROR
);
487 RETURN( (DWORD
)IntGetWindowRgn(Window
, (HRGN
)Param2
));
489 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
492 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
498 Ret
= (MenuObject
->MenuInfo
.Height
== (int)Param2
);
499 MenuObject
->MenuInfo
.Height
= (int)Param2
;
502 Ret
= (DWORD
)MenuObject
->MenuInfo
.Height
;
503 IntReleaseMenuObject(MenuObject
);
506 case TWOPARAM_ROUTINE_SETMENUITEMRECT
:
509 SETMENUITEMRECT smir
;
510 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
514 if(!NT_SUCCESS(MmCopyFromCaller(&smir
, (PVOID
)Param2
, sizeof(SETMENUITEMRECT
))))
516 IntReleaseMenuObject(MenuObject
);
520 Ret
= IntSetMenuItemRect(MenuObject
, smir
.uItem
, smir
.fByPosition
, &smir
.rcRect
);
522 IntReleaseMenuObject(MenuObject
);
526 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
528 PUSER_MESSAGE_QUEUE MsgQueue
= ((PTHREADINFO
)PsGetCurrentThread()->Tcb
.Win32Thread
)->MessageQueue
;
531 RETURN( (DWORD
)MsqSetStateWindow(MsgQueue
, (ULONG
)Param1
, (HWND
)Param2
));
534 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
538 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
540 Window
= UserGetWindowObject((HWND
)Param1
);
541 if (!Window
) RETURN(0);
543 RETURN( (DWORD
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
546 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
:
549 Window
= UserGetWindowObject((HWND
)Param1
);
550 if (!Window
) RETURN(0);
553 wParam
= MAKEWPARAM((Param2
>> 3) & 0x3,
554 Param2
& (UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
));
556 RETURN( UserUpdateUiState(Window
->Wnd
, wParam
) );
559 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
563 case TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
565 if(!(Window
= UserGetWindowObject((HWND
)Param1
)))
567 RETURN( (DWORD
)FALSE
);
570 Window
->Wnd
->ContextHelpId
= Param2
;
572 RETURN( (DWORD
)TRUE
);
574 case TWOPARAM_ROUTINE_SETCARETPOS
:
575 RETURN( (DWORD
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
577 case TWOPARAM_ROUTINE_GETWINDOWINFO
:
582 if(!(Window
= UserGetWindowObject((HWND
)Param1
)))
589 * According to WINE, Windows' doesn't check the cbSize field
592 Status
= MmCopyFromCaller(&wi
.cbSize
, (PVOID
)Param2
, sizeof(wi
.cbSize
));
593 if(!NT_SUCCESS(Status
))
595 SetLastNtError(Status
);
599 if(wi
.cbSize
!= sizeof(WINDOWINFO
))
601 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
606 if((Ret
= (DWORD
)IntGetWindowInfo(Window
, &wi
)))
608 Status
= MmCopyToCaller((PVOID
)Param2
, &wi
, sizeof(WINDOWINFO
));
609 if(!NT_SUCCESS(Status
))
611 SetLastNtError(Status
);
619 case TWOPARAM_ROUTINE_REGISTERLOGONPROC
:
620 RETURN( (DWORD
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
622 case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES
:
623 case TWOPARAM_ROUTINE_GETSYSCOLORPENS
:
624 case TWOPARAM_ROUTINE_GETSYSCOLORS
:
635 /* FIXME - we should make use of SEH here... */
637 Buffer
.Pointer
= ExAllocatePool(PagedPool
, Param2
* sizeof(HANDLE
));
638 if(Buffer
.Pointer
!= NULL
)
642 case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES
:
643 Ret
= (DWORD
)IntGetSysColorBrushes(Buffer
.Brushes
, (UINT
)Param2
);
645 case TWOPARAM_ROUTINE_GETSYSCOLORPENS
:
646 Ret
= (DWORD
)IntGetSysColorPens(Buffer
.Pens
, (UINT
)Param2
);
648 case TWOPARAM_ROUTINE_GETSYSCOLORS
:
649 Ret
= (DWORD
)IntGetSysColors(Buffer
.Colors
, (UINT
)Param2
);
658 Status
= MmCopyToCaller((PVOID
)Param1
, Buffer
.Pointer
, Param2
* sizeof(HANDLE
));
659 if(!NT_SUCCESS(Status
))
661 SetLastNtError(Status
);
666 ExFreePool(Buffer
.Pointer
);
671 case TWOPARAM_ROUTINE_ROS_REGSYSCLASSES
:
674 DWORD Count
= Param1
;
675 PREGISTER_SYSCLASS RegSysClassArray
= (PREGISTER_SYSCLASS
)Param2
;
677 if (Count
!= 0 && RegSysClassArray
!= NULL
)
681 ProbeArrayForRead(RegSysClassArray
,
682 sizeof(RegSysClassArray
[0]),
686 Ret
= (DWORD
)UserRegisterSystemClasses(Count
,
689 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
691 SetLastNtError(_SEH2_GetExceptionCode());
699 DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
700 Routine
, Param1
, Param2
);
701 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
705 DPRINT("Leave NtUserCallTwoParam, ret=%i\n",_ret_
);
721 PWINDOW_OBJECT Window
;
723 USER_REFERENCE_ENTRY Ref
;
724 DECLARE_RETURN(BOOLEAN
);
726 DPRINT("Enter NtUserCallHwndLock\n");
727 UserEnterExclusive();
729 if (!(Window
= UserGetWindowObject(hWnd
)) || !Window
->Wnd
)
733 UserRefObjectCo(Window
, &Ref
);
737 /* FIXME: Routine can be 0x53 - 0x5E */
740 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
741 co_WinPosArrangeIconicWindows(Window
);
744 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
747 DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
749 if (!((Wnd
->Style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
))
752 if(!(Menu
= UserGetMenuObject((HMENU
) Wnd
->IDMenu
)))
755 Menu
->MenuInfo
.WndOwner
= hWnd
;
756 Menu
->MenuInfo
.Height
= 0;
758 co_WinPosSetWindowPos( Window
,
771 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
772 co_WinPosSetWindowPos( Window
,
783 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK
:
784 co_WinPosSetWindowPos( Window
,
792 if (!IntGetOwner(Window
) && !IntGetParent(Window
))
794 co_IntShellHookNotify(HSHELL_REDRAW
, (LPARAM
) hWnd
);
799 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
800 Ret
= co_IntSetForegroundWindow(Window
);
803 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
804 Ret
= co_UserRedrawWindow( Window
, NULL
, 0, RDW_UPDATENOW
| RDW_ALLCHILDREN
);
808 UserDerefObjectCo(Window
);
813 DPRINT("Leave NtUserCallHwndLock, ret=%i\n",_ret_
);
829 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
830 GetW32ThreadInfo()->pDeskInfo
->hProgmanWindow
= hWnd
;
833 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
834 GetW32ThreadInfo()->pDeskInfo
->hTaskManWindow
= hWnd
;
849 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW
:
850 if (IntIsWindow(hWnd
))
851 return IntRegisterShellHookWindow(hWnd
);
854 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW
:
855 if (IntIsWindow(hWnd
))
856 return IntDeRegisterShellHookWindow(hWnd
);
874 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER
:
875 return IntKillTimer(hWnd
, (UINT_PTR
)Param
, TRUE
);
885 NtUserCallHwndParamLock(