3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Misc User funcs
6 * FILE: subsys/win32k/ntuser/misc.c
7 * PROGRAMER: Ge van Geldorp (ge@gse.nl)
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_DESTROY_CARET
:
90 Result
= (DWORD
)co_IntDestroyCaret(PsGetCurrentThread()->Tcb
.Win32Thread
);
93 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
94 Result
= (DWORD
)IntInitMessagePumpHook();
97 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
98 Result
= (DWORD
)IntUninitMessagePumpHook();
101 case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO
:
102 Result
= (DWORD
)MsqGetMessageExtraInfo();
105 case NOPARAM_ROUTINE_ANYPOPUP
:
106 Result
= (DWORD
)IntAnyPopup();
109 case NOPARAM_ROUTINE_CSRSS_INITIALIZED
:
110 Result
= (DWORD
)CsrInit();
113 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
114 RETURN( (DWORD
)IntMsqClearWakeMask());
117 DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
118 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
124 DPRINT("Leave NtUserCallNoParam, ret=%i\n",_ret_
);
139 DECLARE_RETURN(DWORD
);
142 DPRINT("Enter NtUserCallOneParam\n");
145 if (Routine
== ONEPARAM_ROUTINE_SHOWCURSOR
)
147 PWINSTATION_OBJECT WinSta
= PsGetCurrentThreadWin32Thread()->Desktop
->WindowStation
;
148 PSYSTEM_CURSORINFO CurInfo
;
153 BITMAPOBJ
*BitmapObj
;
158 if(!(Screen
= IntGetScreenDC()))
160 return showpointer
; /* No mouse */
163 dc
= DC_LockDc(Screen
);
167 return showpointer
; /* No mouse */
170 dcbmp
= dc
->w
.hBitmap
;
173 BitmapObj
= BITMAPOBJ_LockBitmap(dcbmp
);
176 BITMAPOBJ_UnlockBitmap(BitmapObj
);
177 return showpointer
; /* No Mouse */
180 SurfObj
= &BitmapObj
->SurfObj
;
183 BITMAPOBJ_UnlockBitmap(BitmapObj
);
184 return showpointer
; /* No mouse */
187 ppdev
= GDIDEV(SurfObj
);
191 BITMAPOBJ_UnlockBitmap(BitmapObj
);
192 return showpointer
; /* No mouse */
195 pgp
= &ppdev
->Pointer
;
197 CurInfo
= IntGetSysCursorInfo(WinSta
);
202 showpointer
= pgp
->ShowPointer
;
204 if (showpointer
>= 0)
206 //ppdev->SafetyRemoveCount = 1;
207 //ppdev->SafetyRemoveLevel = 1;
208 EngMovePointer(SurfObj
,-1,-1,NULL
);
209 CurInfo
->ShowingCursor
= 0;
216 showpointer
= pgp
->ShowPointer
;
221 //ppdev->SafetyRemoveCount = 0;
222 //ppdev->SafetyRemoveLevel = 0;
223 EngMovePointer(SurfObj
,-1,-1,NULL
);
224 CurInfo
->ShowingCursor
= CURSOR_SHOWING
;
228 BITMAPOBJ_UnlockBitmap(BitmapObj
);
233 UserEnterExclusive();
237 case ONEPARAM_ROUTINE_GETMENU
:
239 PWINDOW_OBJECT Window
;
242 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
247 Result
= (DWORD
)Window
->IDMenu
;
252 case ONEPARAM_ROUTINE_ISWINDOWUNICODE
:
254 PWINDOW_OBJECT Window
;
257 Window
= UserGetWindowObject((HWND
)Param
);
262 Result
= Window
->Unicode
;
266 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
267 RETURN( (DWORD
)IntWindowFromDC((HDC
)Param
));
269 case ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID
:
271 PWINDOW_OBJECT Window
;
274 Window
= UserGetWindowObject((HWND
)Param
);
280 Result
= Window
->ContextHelpId
;
285 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
287 PWINSTATION_OBJECT WinSta
;
291 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
295 if (!NT_SUCCESS(Status
))
296 RETURN( (DWORD
)FALSE
);
299 Result = (DWORD)IntSwapMouseButton(WinStaObject, (BOOL)Param); */
302 ObDereferenceObject(WinSta
);
306 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
307 RETURN( (DWORD
)IntSwitchCaretShowing((PVOID
)Param
));
309 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
310 RETURN( (DWORD
)IntSetCaretBlinkTime((UINT
)Param
));
312 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
313 RETURN( (DWORD
)IntEnumClipboardFormats((UINT
)Param
));
315 case ONEPARAM_ROUTINE_GETWINDOWINSTANCE
:
317 PWINDOW_OBJECT Window
;
320 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
325 Result
= (DWORD
)Window
->Instance
;
329 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
330 RETURN( (DWORD
)MsqSetMessageExtraInfo((LPARAM
)Param
));
332 case ONEPARAM_ROUTINE_GETCURSORPOSITION
:
334 PWINSTATION_OBJECT WinSta
;
339 RETURN( (DWORD
)FALSE
);
340 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
344 if (!NT_SUCCESS(Status
))
345 RETURN( (DWORD
)FALSE
);
347 /* FIXME - check if process has WINSTA_READATTRIBUTES */
348 IntGetCursorLocation(WinSta
, &Pos
);
350 Status
= MmCopyToCaller((PPOINT
)Param
, &Pos
, sizeof(POINT
));
351 if(!NT_SUCCESS(Status
))
353 ObDereferenceObject(WinSta
);
354 SetLastNtError(Status
);
358 ObDereferenceObject(WinSta
);
360 RETURN( (DWORD
)TRUE
);
363 case ONEPARAM_ROUTINE_ISWINDOWINDESTROY
:
365 PWINDOW_OBJECT Window
;
368 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
373 Result
= (DWORD
)IntIsWindowInDestroy(Window
);
378 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
381 PW32PROCESS Process
= PsGetCurrentProcessWin32Process();
385 Enable
= (BOOL
)(Param
!= 0);
389 Process
->Flags
&= ~W32PF_NOWINDOWGHOSTING
;
393 Process
->Flags
|= W32PF_NOWINDOWGHOSTING
;
402 case ONEPARAM_ROUTINE_MSQSETWAKEMASK
:
403 RETURN( (DWORD
)IntMsqSetWakeMask(Param
));
405 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
406 RETURN( UserGetKeyboardType(Param
));
408 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
409 RETURN( (DWORD
)UserGetKeyboardLayout(Param
));
411 DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
413 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
417 DPRINT("Leave NtUserCallOneParam, ret=%i\n",_ret_
);
434 PWINDOW_OBJECT Window
;
435 DECLARE_RETURN(DWORD
);
437 DPRINT("Enter NtUserCallTwoParam\n");
438 UserEnterExclusive();
442 case TWOPARAM_ROUTINE_SETDCPENCOLOR
:
444 RETURN( (DWORD
)IntSetDCColor((HDC
)Param1
, OBJ_PEN
, (COLORREF
)Param2
));
446 case TWOPARAM_ROUTINE_SETDCBRUSHCOLOR
:
448 RETURN( (DWORD
)IntSetDCColor((HDC
)Param1
, OBJ_BRUSH
, (COLORREF
)Param2
));
450 case TWOPARAM_ROUTINE_GETDCCOLOR
:
452 RETURN( (DWORD
)IntGetDCColor((HDC
)Param1
, (ULONG
)Param2
));
454 case TWOPARAM_ROUTINE_GETWINDOWRGNBOX
:
458 Window
= UserGetWindowObject((HWND
)Param1
);
459 if (!Window
) RETURN(ERROR
);
461 Ret
= (DWORD
)IntGetWindowRgnBox(Window
, &rcRect
);
462 Status
= MmCopyToCaller((PVOID
)Param2
, &rcRect
, sizeof(RECT
));
463 if(!NT_SUCCESS(Status
))
465 SetLastNtError(Status
);
470 case TWOPARAM_ROUTINE_GETWINDOWRGN
:
472 Window
= UserGetWindowObject((HWND
)Param1
);
473 if (!Window
) RETURN(ERROR
);
475 RETURN( (DWORD
)IntGetWindowRgn(Window
, (HRGN
)Param2
));
477 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
480 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
486 Ret
= (MenuObject
->MenuInfo
.Height
== (int)Param2
);
487 MenuObject
->MenuInfo
.Height
= (int)Param2
;
490 Ret
= (DWORD
)MenuObject
->MenuInfo
.Height
;
491 IntReleaseMenuObject(MenuObject
);
494 case TWOPARAM_ROUTINE_SETMENUITEMRECT
:
497 SETMENUITEMRECT smir
;
498 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
502 if(!NT_SUCCESS(MmCopyFromCaller(&smir
, (PVOID
)Param2
, sizeof(SETMENUITEMRECT
))))
504 IntReleaseMenuObject(MenuObject
);
508 Ret
= IntSetMenuItemRect(MenuObject
, smir
.uItem
, smir
.fByPosition
, &smir
.rcRect
);
510 IntReleaseMenuObject(MenuObject
);
514 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
516 PUSER_MESSAGE_QUEUE MsgQueue
= ((PW32THREAD
)PsGetCurrentThread()->Tcb
.Win32Thread
)->MessageQueue
;
519 RETURN( (DWORD
)MsqSetStateWindow(MsgQueue
, (ULONG
)Param1
, (HWND
)Param2
));
522 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
526 case TWOPARAM_ROUTINE_UNKNOWN
:
530 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
532 Window
= UserGetWindowObject((HWND
)Param1
);
533 if (!Window
) RETURN(0);
535 RETURN( (DWORD
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
538 case TWOPARAM_ROUTINE_ROS_SHOWWINDOW
:
540 #define WIN_NEEDS_SHOW_OWNEDPOPUP (0x00000040)
541 DPRINT1("ROS_SHOWWINDOW\n");
543 if (!(Window
= UserGetWindowObject((HWND
)Param1
)))
550 if (!(Window
->Flags
& WIN_NEEDS_SHOW_OWNEDPOPUP
))
554 Window
->Flags
&= ~WIN_NEEDS_SHOW_OWNEDPOPUP
;
557 Window
->Flags
|= WIN_NEEDS_SHOW_OWNEDPOPUP
;
559 DPRINT1("ROS_SHOWWINDOW ---> 0x%x\n",Window
->Flags
);
563 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
567 case TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
569 if(!(Window
= UserGetWindowObject((HWND
)Param1
)))
571 RETURN( (DWORD
)FALSE
);
574 Window
->ContextHelpId
= Param2
;
576 RETURN( (DWORD
)TRUE
);
578 case TWOPARAM_ROUTINE_SETCARETPOS
:
579 RETURN( (DWORD
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
581 case TWOPARAM_ROUTINE_GETWINDOWINFO
:
586 if(!(Window
= UserGetWindowObject((HWND
)Param1
)))
593 * According to WINE, Windows' doesn't check the cbSize field
596 Status
= MmCopyFromCaller(&wi
.cbSize
, (PVOID
)Param2
, sizeof(wi
.cbSize
));
597 if(!NT_SUCCESS(Status
))
599 SetLastNtError(Status
);
603 if(wi
.cbSize
!= sizeof(WINDOWINFO
))
605 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
610 if((Ret
= (DWORD
)IntGetWindowInfo(Window
, &wi
)))
612 Status
= MmCopyToCaller((PVOID
)Param2
, &wi
, sizeof(WINDOWINFO
));
613 if(!NT_SUCCESS(Status
))
615 SetLastNtError(Status
);
623 case TWOPARAM_ROUTINE_REGISTERLOGONPROC
:
624 RETURN( (DWORD
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
626 case TWOPARAM_ROUTINE_SETSYSCOLORS
:
637 /* FIXME - we should make use of SEH here... */
639 Status
= MmCopyFromCaller(&ChangeSysColors
, (PVOID
)Param1
, sizeof(ChangeSysColors
));
640 if(!NT_SUCCESS(Status
))
642 SetLastNtError(Status
);
646 Buffer
= ExAllocatePool(PagedPool
, (Param2
* sizeof(INT
)) + (Param2
* sizeof(COLORREF
)));
649 INT
*Elements
= (INT
*)Buffer
;
650 COLORREF
*Colors
= (COLORREF
*)Buffer
+ Param2
;
652 Status
= MmCopyFromCaller(Elements
, ChangeSysColors
.Elements
, Param2
* sizeof(INT
));
653 if(NT_SUCCESS(Status
))
655 Status
= MmCopyFromCaller(Colors
, ChangeSysColors
.Colors
, Param2
* sizeof(COLORREF
));
656 if(NT_SUCCESS(Status
))
658 Ret
= (DWORD
)IntSetSysColors((UINT
)Param2
, Elements
, Colors
);
661 SetLastNtError(Status
);
664 SetLastNtError(Status
);
673 case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES
:
674 case TWOPARAM_ROUTINE_GETSYSCOLORPENS
:
675 case TWOPARAM_ROUTINE_GETSYSCOLORS
:
686 /* FIXME - we should make use of SEH here... */
688 Buffer
.Pointer
= ExAllocatePool(PagedPool
, Param2
* sizeof(HANDLE
));
689 if(Buffer
.Pointer
!= NULL
)
693 case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES
:
694 Ret
= (DWORD
)IntGetSysColorBrushes(Buffer
.Brushes
, (UINT
)Param2
);
696 case TWOPARAM_ROUTINE_GETSYSCOLORPENS
:
697 Ret
= (DWORD
)IntGetSysColorPens(Buffer
.Pens
, (UINT
)Param2
);
699 case TWOPARAM_ROUTINE_GETSYSCOLORS
:
700 Ret
= (DWORD
)IntGetSysColors(Buffer
.Colors
, (UINT
)Param2
);
709 Status
= MmCopyToCaller((PVOID
)Param1
, Buffer
.Pointer
, Param2
* sizeof(HANDLE
));
710 if(!NT_SUCCESS(Status
))
712 SetLastNtError(Status
);
717 ExFreePool(Buffer
.Pointer
);
723 DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
724 Routine
, Param1
, Param2
);
725 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
729 DPRINT("Leave NtUserCallTwoParam, ret=%i\n",_ret_
);
745 PWINDOW_OBJECT Window
;
746 USER_REFERENCE_ENTRY Ref
;
747 DECLARE_RETURN(BOOLEAN
);
749 DPRINT("Enter NtUserCallHwndLock\n");
750 UserEnterExclusive();
752 if (!(Window
= UserGetWindowObject(hWnd
)))
756 UserRefObjectCo(Window
, &Ref
);
758 /* FIXME: Routine can be 0x53 - 0x5E */
761 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
762 co_WinPosArrangeIconicWindows(Window
);
765 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
768 DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
770 if (!((Window
->Style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
))
773 if(!(Menu
= UserGetMenuObject((HMENU
) Window
->IDMenu
)))
776 Menu
->MenuInfo
.WndOwner
= hWnd
;
777 Menu
->MenuInfo
.Height
= 0;
779 co_WinPosSetWindowPos(Window
, 0, 0, 0, 0, 0, SWP_NOSIZE
| SWP_NOMOVE
|
780 SWP_NOACTIVATE
| SWP_NOZORDER
| SWP_FRAMECHANGED
);
786 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
790 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
791 Ret
= co_IntSetForegroundWindow(Window
);
794 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
799 UserDerefObjectCo(Window
);
804 DPRINT("Leave NtUserCallHwndLock, ret=%i\n",_ret_
);
820 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
821 GetW32ThreadInfo()->Desktop
->hProgmanWindow
= Param
;
824 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
825 GetW32ThreadInfo()->Desktop
->hTaskManWindow
= Param
;
836 NtUserGetThreadState(
839 DECLARE_RETURN(DWORD
);
841 DPRINT("Enter NtUserGetThreadState\n");
842 if (Routine
!= THREADSTATE_GETTHREADINFO
)
848 UserEnterExclusive();
853 case THREADSTATE_GETTHREADINFO
:
857 case THREADSTATE_FOCUSWINDOW
:
858 RETURN( (DWORD
)IntGetThreadFocusWindow());
859 case THREADSTATE_PROGMANWINDOW
:
860 RETURN( (DWORD
)GetW32ThreadInfo()->Desktop
->hProgmanWindow
);
861 case THREADSTATE_TASKMANWINDOW
:
862 RETURN( (DWORD
)GetW32ThreadInfo()->Desktop
->hTaskManWindow
);
867 DPRINT("Leave NtUserGetThreadState, ret=%i\n",_ret_
);
873 IntGetFontMetricSetting(LPWSTR lpValueName
, PLOGFONTW font
)
875 RTL_QUERY_REGISTRY_TABLE QueryTable
[2];
877 /* Firefox 1.0.7 depends on the lfHeight value being negative */
878 static LOGFONTW DefaultFont
= {
879 -11, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
880 0, 0, DEFAULT_QUALITY
, VARIABLE_PITCH
| FF_SWISS
,
884 RtlZeroMemory(&QueryTable
, sizeof(QueryTable
));
886 QueryTable
[0].Name
= lpValueName
;
887 QueryTable
[0].Flags
= RTL_QUERY_REGISTRY_DIRECT
| RTL_QUERY_REGISTRY_REQUIRED
;
888 QueryTable
[0].EntryContext
= font
;
890 Status
= RtlQueryRegistryValues(
892 L
"Control Panel\\Desktop\\WindowMetrics",
897 if (!NT_SUCCESS(Status
))
899 RtlCopyMemory(font
, &DefaultFont
, sizeof(LOGFONTW
));
904 IntSystemParametersInfo(
910 PWINSTATION_OBJECT WinStaObject
;
913 static BOOL bInitialized
= FALSE
;
914 static LOGFONTW IconFont
;
915 static NONCLIENTMETRICSW pMetrics
;
916 static MINIMIZEDMETRICS MinimizedMetrics
;
917 static BOOL GradientCaptions
= TRUE
;
918 static UINT FocusBorderHeight
= 1;
919 static UINT FocusBorderWidth
= 1;
923 RtlZeroMemory(&IconFont
, sizeof(LOGFONTW
));
924 RtlZeroMemory(&pMetrics
, sizeof(NONCLIENTMETRICSW
));
926 IntGetFontMetricSetting(L
"CaptionFont", &pMetrics
.lfCaptionFont
);
927 IntGetFontMetricSetting(L
"SmCaptionFont", &pMetrics
.lfSmCaptionFont
);
928 IntGetFontMetricSetting(L
"MenuFont", &pMetrics
.lfMenuFont
);
929 IntGetFontMetricSetting(L
"StatusFont", &pMetrics
.lfStatusFont
);
930 IntGetFontMetricSetting(L
"MessageFont", &pMetrics
.lfMessageFont
);
931 IntGetFontMetricSetting(L
"IconFont", &IconFont
);
933 pMetrics
.iBorderWidth
= 1;
934 pMetrics
.iScrollWidth
= UserGetSystemMetrics(SM_CXVSCROLL
);
935 pMetrics
.iScrollHeight
= UserGetSystemMetrics(SM_CYHSCROLL
);
936 pMetrics
.iCaptionWidth
= UserGetSystemMetrics(SM_CXSIZE
);
937 pMetrics
.iCaptionHeight
= UserGetSystemMetrics(SM_CYSIZE
);
938 pMetrics
.iSmCaptionWidth
= UserGetSystemMetrics(SM_CXSMSIZE
);
939 pMetrics
.iSmCaptionHeight
= UserGetSystemMetrics(SM_CYSMSIZE
);
940 pMetrics
.iMenuWidth
= UserGetSystemMetrics(SM_CXMENUSIZE
);
941 pMetrics
.iMenuHeight
= UserGetSystemMetrics(SM_CYMENUSIZE
);
942 pMetrics
.cbSize
= sizeof(NONCLIENTMETRICSW
);
944 MinimizedMetrics
.cbSize
= sizeof(MINIMIZEDMETRICS
);
945 MinimizedMetrics
.iWidth
= UserGetSystemMetrics(SM_CXMINIMIZED
);
946 MinimizedMetrics
.iHorzGap
= UserGetSystemMetrics(SM_CXMINSPACING
);
947 MinimizedMetrics
.iVertGap
= UserGetSystemMetrics(SM_CYMINSPACING
);
948 MinimizedMetrics
.iArrange
= ARW_HIDE
;
955 case SPI_SETDOUBLECLKWIDTH
:
956 case SPI_SETDOUBLECLKHEIGHT
:
957 case SPI_SETDOUBLECLICKTIME
:
958 case SPI_SETDESKWALLPAPER
:
959 case SPI_GETDESKWALLPAPER
:
960 case SPI_GETWHEELSCROLLLINES
:
961 case SPI_GETWHEELSCROLLCHARS
:
962 case SPI_SETSCREENSAVERRUNNING
:
963 case SPI_GETSCREENSAVERRUNNING
:
964 case SPI_GETSCREENSAVETIMEOUT
:
965 case SPI_SETSCREENSAVETIMEOUT
:
966 case SPI_GETSCREENSAVEACTIVE
:
967 case SPI_GETFLATMENU
:
968 case SPI_SETFLATMENU
:
970 PSYSTEM_CURSORINFO CurInfo
;
972 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
976 if(!NT_SUCCESS(Status
))
978 SetLastNtError(Status
);
984 case SPI_GETFLATMENU
:
985 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = WinStaObject
->FlatMenu
;
988 case SPI_SETFLATMENU
:
989 WinStaObject
->FlatMenu
= uiParam
;
991 case SPI_GETSCREENSAVETIMEOUT
:
992 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = WinStaObject
->ScreenSaverTimeOut
;
995 case SPI_SETSCREENSAVETIMEOUT
:
996 WinStaObject
->ScreenSaverTimeOut
= uiParam
;
998 case SPI_GETSCREENSAVERRUNNING
:
999 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
1002 case SPI_SETSCREENSAVERRUNNING
:
1003 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
1004 WinStaObject
->ScreenSaverRunning
= uiParam
;
1006 case SPI_GETSCREENSAVEACTIVE
:
1007 /* FIXME: how to disable the screensaver? */
1008 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = TRUE
;
1011 case SPI_GETWHEELSCROLLLINES
:
1012 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1013 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = CurInfo
->WheelScroLines
;
1014 /* FIXME add this value to scroll list as scroll value ?? */
1017 case SPI_GETWHEELSCROLLCHARS
:
1018 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1019 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = CurInfo
->WheelScroChars
;
1020 // FIXME add this value to scroll list as scroll value ??
1023 case SPI_SETDOUBLECLKWIDTH
:
1024 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1025 /* FIXME limit the maximum value? */
1026 CurInfo
->DblClickWidth
= uiParam
;
1028 case SPI_SETDOUBLECLKHEIGHT
:
1029 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1030 /* FIXME limit the maximum value? */
1031 CurInfo
->DblClickHeight
= uiParam
;
1033 case SPI_SETDOUBLECLICKTIME
:
1034 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1035 /* FIXME limit the maximum time to 1000 ms? */
1036 CurInfo
->DblClickSpeed
= uiParam
;
1038 case SPI_SETDESKWALLPAPER
:
1040 /* This function expects different parameters than the user mode version!
1042 We let the user mode code load the bitmap, it passed the handle to
1043 the bitmap. We'll change it's ownership to system and replace it with
1044 the current wallpaper bitmap */
1045 HBITMAP hOldBitmap
, hNewBitmap
;
1046 UNICODE_STRING Key
= RTL_CONSTANT_STRING(L
"Control Panel\\Desktop");
1047 UNICODE_STRING Tile
= RTL_CONSTANT_STRING(L
"TileWallpaper");
1048 UNICODE_STRING Style
= RTL_CONSTANT_STRING(L
"WallpaperStyle");
1049 UNICODE_STRING KeyPath
;
1050 OBJECT_ATTRIBUTES KeyAttributes
;
1051 OBJECT_ATTRIBUTES ObjectAttributes
;
1053 HANDLE CurrentUserKey
= NULL
;
1054 HANDLE KeyHandle
= NULL
;
1055 PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo
;
1057 ULONG ResLength
= 0;
1062 hNewBitmap
= *(HBITMAP
*)pvParam
;
1063 if(hNewBitmap
!= NULL
)
1066 /* try to get the size of the wallpaper */
1067 if(!(bmp
= BITMAPOBJ_LockBitmap(hNewBitmap
)))
1069 ObDereferenceObject(WinStaObject
);
1072 WinStaObject
->cxWallpaper
= bmp
->SurfObj
.sizlBitmap
.cx
;
1073 WinStaObject
->cyWallpaper
= bmp
->SurfObj
.sizlBitmap
.cy
;
1075 BITMAPOBJ_UnlockBitmap(bmp
);
1077 /* change the bitmap's ownership */
1078 GDIOBJ_SetOwnership(GdiHandleTable
, hNewBitmap
, NULL
);
1080 hOldBitmap
= (HBITMAP
)InterlockedExchange((LONG
*)&WinStaObject
->hbmWallpaper
, (LONG
)hNewBitmap
);
1081 if(hOldBitmap
!= NULL
)
1083 /* delete the old wallpaper */
1084 NtGdiDeleteObject(hOldBitmap
);
1089 /*default value is center */
1090 WinStaObject
->WallpaperMode
= wmCenter
;
1094 /* Get a handle to the current users settings */
1095 RtlFormatCurrentUserKeyPath(&KeyPath
);
1096 InitializeObjectAttributes(&ObjectAttributes
,&KeyPath
,OBJ_CASE_INSENSITIVE
,NULL
,NULL
);
1097 ZwOpenKey(&CurrentUserKey
, KEY_READ
, &ObjectAttributes
);
1098 RtlFreeUnicodeString(&KeyPath
);
1100 /* open up the settings to read the values */
1101 InitializeObjectAttributes(&KeyAttributes
, &Key
, OBJ_CASE_INSENSITIVE
,
1102 CurrentUserKey
, NULL
);
1103 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
1104 ZwClose(CurrentUserKey
);
1106 /* read the tile value in the registry */
1107 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1110 /* fall back to .DEFAULT if we didnt find values */
1111 if(Status
== STATUS_INVALID_HANDLE
)
1113 RtlInitUnicodeString (&KeyPath
,L
"\\Registry\\User\\.Default\\Control Panel\\Desktop");
1114 InitializeObjectAttributes(&KeyAttributes
, &KeyPath
, OBJ_CASE_INSENSITIVE
,
1116 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
1117 ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1121 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
1122 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
1125 if(!KeyValuePartialInfo
)
1131 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1132 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
1133 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
1136 ExFreePool(KeyValuePartialInfo
);
1140 Tile
.Length
= KeyValuePartialInfo
->DataLength
;
1141 Tile
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
1142 Tile
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
1144 Status
= RtlUnicodeStringToInteger(&Tile
, 0, &TileNum
);
1145 if(!NT_SUCCESS(Status
))
1149 ExFreePool(KeyValuePartialInfo
);
1151 /* start over again and look for the style*/
1153 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
1156 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
1157 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
1160 if(!KeyValuePartialInfo
)
1166 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
1167 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
1168 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
1171 ExFreePool(KeyValuePartialInfo
);
1175 Style
.Length
= KeyValuePartialInfo
->DataLength
;
1176 Style
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
1177 Style
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
1179 Status
= RtlUnicodeStringToInteger(&Style
, 0, &StyleNum
);
1180 if(!NT_SUCCESS(Status
))
1184 ExFreePool(KeyValuePartialInfo
);
1186 /* Check the values we found in the registry */
1187 if(TileNum
&& !StyleNum
)
1189 WinStaObject
->WallpaperMode
= wmTile
;
1191 else if(!TileNum
&& StyleNum
== 2)
1193 WinStaObject
->WallpaperMode
= wmStretch
;
1199 case SPI_GETDESKWALLPAPER
:
1200 /* This function expects different parameters than the user mode version!
1202 We basically return the current wallpaper handle - if any. The user
1203 mode version should load the string from the registry and return it
1204 without calling this function */
1206 *(HBITMAP
*)pvParam
= (HBITMAP
)WinStaObject
->hbmWallpaper
;
1210 /* FIXME save the value to the registry */
1212 ObDereferenceObject(WinStaObject
);
1215 case SPI_SETWORKAREA
:
1218 PDESKTOP_OBJECT Desktop
= PsGetCurrentThreadWin32Thread()->Desktop
;
1222 /* FIXME - Set last error */
1227 rc
= (RECT
*)pvParam
;
1228 Desktop
->WorkArea
= *rc
;
1232 case SPI_GETWORKAREA
:
1234 PDESKTOP_OBJECT Desktop
= PsGetCurrentThreadWin32Thread()->Desktop
;
1238 /* FIXME - Set last error */
1243 IntGetDesktopWorkArea(Desktop
, (PRECT
)pvParam
);
1247 case SPI_SETGRADIENTCAPTIONS
:
1249 GradientCaptions
= (pvParam
!= NULL
);
1250 /* FIXME - should be checked if the color depth is higher than 8bpp? */
1253 case SPI_GETGRADIENTCAPTIONS
:
1256 BOOL Ret
= GradientCaptions
;
1258 hDC
= IntGetScreenDC();
1261 Ret
= (NtGdiGetDeviceCaps(hDC
, BITSPIXEL
) > 8) && Ret
;
1264 *((PBOOL
)pvParam
) = Ret
;
1269 case SPI_SETFONTSMOOTHING
:
1271 IntEnableFontRendering(uiParam
!= 0);
1274 case SPI_GETFONTSMOOTHING
:
1277 *((BOOL
*)pvParam
) = IntIsFontRenderingEnabled();
1280 case SPI_GETICONTITLELOGFONT
:
1283 *((LOGFONTW
*)pvParam
) = IconFont
;
1286 case SPI_GETNONCLIENTMETRICS
:
1289 *((NONCLIENTMETRICSW
*)pvParam
) = pMetrics
;
1292 case SPI_SETNONCLIENTMETRICS
:
1295 pMetrics
= *((NONCLIENTMETRICSW
*)pvParam
);
1298 case SPI_GETMINIMIZEDMETRICS
:
1301 *((MINIMIZEDMETRICS
*)pvParam
) = MinimizedMetrics
;
1304 case SPI_SETMINIMIZEDMETRICS
:
1307 MinimizedMetrics
= *((MINIMIZEDMETRICS
*)pvParam
);
1310 case SPI_GETFOCUSBORDERHEIGHT
:
1313 *((UINT
*)pvParam
) = FocusBorderHeight
;
1316 case SPI_GETFOCUSBORDERWIDTH
:
1319 *((UINT
*)pvParam
) = FocusBorderWidth
;
1322 case SPI_SETFOCUSBORDERHEIGHT
:
1324 FocusBorderHeight
= (UINT
)pvParam
;
1327 case SPI_SETFOCUSBORDERWIDTH
:
1329 FocusBorderWidth
= (UINT
)pvParam
;
1335 DPRINT1("SystemParametersInfo: Unsupported Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n",
1336 uiAction
, uiParam
, pvParam
, fWinIni
);
1347 UserSystemParametersInfo(
1357 case SPI_SETDOUBLECLKWIDTH
:
1358 case SPI_SETDOUBLECLKHEIGHT
:
1359 case SPI_SETDOUBLECLICKTIME
:
1360 case SPI_SETGRADIENTCAPTIONS
:
1361 case SPI_SETFONTSMOOTHING
:
1362 case SPI_SETFOCUSBORDERHEIGHT
:
1363 case SPI_SETFOCUSBORDERWIDTH
:
1365 return (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
);
1367 case SPI_SETWORKAREA
:
1370 Status
= MmCopyFromCaller(&rc
, (PRECT
)pvParam
, sizeof(RECT
));
1371 if(!NT_SUCCESS(Status
))
1373 SetLastNtError(Status
);
1376 return( (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
));
1378 case SPI_GETWORKAREA
:
1382 if(!IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
))
1387 Status
= MmCopyToCaller((PRECT
)pvParam
, &rc
, sizeof(RECT
));
1388 if(!NT_SUCCESS(Status
))
1390 SetLastNtError(Status
);
1395 case SPI_GETFONTSMOOTHING
:
1396 case SPI_GETGRADIENTCAPTIONS
:
1397 case SPI_GETFOCUSBORDERHEIGHT
:
1398 case SPI_GETFOCUSBORDERWIDTH
:
1399 case SPI_GETWHEELSCROLLLINES
:
1400 case SPI_GETWHEELSCROLLCHARS
:
1401 case SPI_GETSCREENSAVERRUNNING
:
1402 case SPI_SETSCREENSAVERRUNNING
:
1403 case SPI_GETSCREENSAVETIMEOUT
:
1404 case SPI_SETSCREENSAVETIMEOUT
:
1405 case SPI_GETSCREENSAVEACTIVE
:
1406 case SPI_GETFLATMENU
:
1407 case SPI_SETFLATMENU
:
1411 if(!IntSystemParametersInfo(uiAction
, uiParam
, &Ret
, fWinIni
))
1416 Status
= MmCopyToCaller(pvParam
, &Ret
, sizeof(BOOL
));
1417 if(!NT_SUCCESS(Status
))
1419 SetLastNtError(Status
);
1424 case SPI_SETDESKWALLPAPER
:
1426 /* !!! As opposed to the user mode version this version accepts a handle
1428 HBITMAP hbmWallpaper
;
1430 Status
= MmCopyFromCaller(&hbmWallpaper
, pvParam
, sizeof(HBITMAP
));
1431 if(!NT_SUCCESS(Status
))
1433 SetLastNtError(Status
);
1436 return( IntSystemParametersInfo(SPI_SETDESKWALLPAPER
, 0, &hbmWallpaper
, fWinIni
));
1438 case SPI_GETDESKWALLPAPER
:
1440 /* !!! As opposed to the user mode version this version returns a handle
1442 HBITMAP hbmWallpaper
;
1445 Ret
= IntSystemParametersInfo(SPI_GETDESKWALLPAPER
, 0, &hbmWallpaper
, fWinIni
);
1447 Status
= MmCopyToCaller(pvParam
, &hbmWallpaper
, sizeof(HBITMAP
));
1448 if(!NT_SUCCESS(Status
))
1450 SetLastNtError(Status
);
1455 case SPI_GETICONTITLELOGFONT
:
1459 if(!IntSystemParametersInfo(uiAction
, uiParam
, &IconFont
, fWinIni
))
1464 Status
= MmCopyToCaller(pvParam
, &IconFont
, sizeof(LOGFONTW
));
1465 if(!NT_SUCCESS(Status
))
1467 SetLastNtError(Status
);
1472 case SPI_GETNONCLIENTMETRICS
:
1473 case SPI_SETNONCLIENTMETRICS
:
1475 NONCLIENTMETRICSW metrics
;
1477 Status
= MmCopyFromCaller(&metrics
, pvParam
, sizeof(NONCLIENTMETRICSW
));
1478 if(!NT_SUCCESS(Status
))
1480 SetLastNtError(Status
);
1483 if(metrics
.cbSize
!= sizeof(NONCLIENTMETRICSW
))
1485 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1489 if(!IntSystemParametersInfo(uiAction
, uiParam
, &metrics
, fWinIni
))
1494 Status
= MmCopyToCaller(pvParam
, &metrics
, sizeof(NONCLIENTMETRICSW
));
1495 if(!NT_SUCCESS(Status
))
1497 SetLastNtError(Status
);
1502 case SPI_GETMINIMIZEDMETRICS
:
1503 case SPI_SETMINIMIZEDMETRICS
:
1505 MINIMIZEDMETRICS minimetrics
;
1507 Status
= MmCopyFromCaller(&minimetrics
, pvParam
, sizeof(MINIMIZEDMETRICS
));
1508 if(!NT_SUCCESS(Status
))
1510 SetLastNtError(Status
);
1513 if(minimetrics
.cbSize
!= sizeof(MINIMIZEDMETRICS
))
1515 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1518 if(!IntSystemParametersInfo(uiAction
, uiParam
, &minimetrics
, fWinIni
))
1523 Status
= MmCopyToCaller(pvParam
, &minimetrics
, sizeof(MINIMIZEDMETRICS
));
1524 if(!NT_SUCCESS(Status
))
1526 SetLastNtError(Status
);
1533 DPRINT1("FIXME: UNIMPLEMENTED SPI Code: %lx \n",uiAction
);
1548 NtUserSystemParametersInfo(
1554 DECLARE_RETURN(BOOLEAN
);
1556 DPRINT("Enter NtUserSystemParametersInfo\n");
1557 UserEnterExclusive();
1559 RETURN( UserSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
));
1562 DPRINT("Leave NtUserSystemParametersInfo, ret=%i\n",_ret_
);
1571 NtUserGetDoubleClickTime(VOID
)
1575 PWINSTATION_OBJECT WinStaObject
;
1576 PSYSTEM_CURSORINFO CurInfo
;
1577 DECLARE_RETURN(UINT
);
1579 DPRINT("Enter NtUserGetDoubleClickTime\n");
1582 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
1586 if (!NT_SUCCESS(Status
))
1587 RETURN( (DWORD
)FALSE
);
1589 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1590 Result
= CurInfo
->DblClickSpeed
;
1592 ObDereferenceObject(WinStaObject
);
1596 DPRINT("Leave NtUserGetDoubleClickTime, ret=%i\n",_ret_
);
1603 NtUserGetGUIThreadInfo(
1604 DWORD idThread
, /* if NULL use foreground thread */
1605 LPGUITHREADINFO lpgui
)
1608 PTHRDCARETINFO CaretInfo
;
1609 GUITHREADINFO SafeGui
;
1610 PDESKTOP_OBJECT Desktop
;
1611 PUSER_MESSAGE_QUEUE MsgQueue
;
1612 PETHREAD Thread
= NULL
;
1613 DECLARE_RETURN(BOOLEAN
);
1615 DPRINT("Enter NtUserGetGUIThreadInfo\n");
1618 Status
= MmCopyFromCaller(&SafeGui
, lpgui
, sizeof(DWORD
));
1619 if(!NT_SUCCESS(Status
))
1621 SetLastNtError(Status
);
1625 if(SafeGui
.cbSize
!= sizeof(GUITHREADINFO
))
1627 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1633 Status
= PsLookupThreadByThreadId((HANDLE
)idThread
, &Thread
);
1634 if(!NT_SUCCESS(Status
))
1636 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1639 Desktop
= ((PW32THREAD
)Thread
->Tcb
.Win32Thread
)->Desktop
;
1643 /* get the foreground thread */
1644 PW32THREAD W32Thread
= (PW32THREAD
)PsGetCurrentThread()->Tcb
.Win32Thread
;
1645 Desktop
= W32Thread
->Desktop
;
1648 MsgQueue
= Desktop
->ActiveMessageQueue
;
1651 Thread
= MsgQueue
->Thread
;
1656 if(!Thread
|| !Desktop
)
1658 if(idThread
&& Thread
)
1659 ObDereferenceObject(Thread
);
1660 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1664 MsgQueue
= (PUSER_MESSAGE_QUEUE
)Desktop
->ActiveMessageQueue
;
1665 CaretInfo
= MsgQueue
->CaretInfo
;
1667 SafeGui
.flags
= (CaretInfo
->Visible
? GUI_CARETBLINKING
: 0);
1668 if(MsgQueue
->MenuOwner
)
1669 SafeGui
.flags
|= GUI_INMENUMODE
| MsgQueue
->MenuState
;
1670 if(MsgQueue
->MoveSize
)
1671 SafeGui
.flags
|= GUI_INMOVESIZE
;
1673 /* FIXME add flag GUI_16BITTASK */
1675 SafeGui
.hwndActive
= MsgQueue
->ActiveWindow
;
1676 SafeGui
.hwndFocus
= MsgQueue
->FocusWindow
;
1677 SafeGui
.hwndCapture
= MsgQueue
->CaptureWindow
;
1678 SafeGui
.hwndMenuOwner
= MsgQueue
->MenuOwner
;
1679 SafeGui
.hwndMoveSize
= MsgQueue
->MoveSize
;
1680 SafeGui
.hwndCaret
= CaretInfo
->hWnd
;
1682 SafeGui
.rcCaret
.left
= CaretInfo
->Pos
.x
;
1683 SafeGui
.rcCaret
.top
= CaretInfo
->Pos
.y
;
1684 SafeGui
.rcCaret
.right
= SafeGui
.rcCaret
.left
+ CaretInfo
->Size
.cx
;
1685 SafeGui
.rcCaret
.bottom
= SafeGui
.rcCaret
.top
+ CaretInfo
->Size
.cy
;
1688 ObDereferenceObject(Thread
);
1690 Status
= MmCopyToCaller(lpgui
, &SafeGui
, sizeof(GUITHREADINFO
));
1691 if(!NT_SUCCESS(Status
))
1693 SetLastNtError(Status
);
1700 DPRINT("Leave NtUserGetGUIThreadInfo, ret=%i\n",_ret_
);
1708 NtUserGetGuiResources(
1713 PW32PROCESS W32Process
;
1716 DECLARE_RETURN(DWORD
);
1718 DPRINT("Enter NtUserGetGuiResources\n");
1721 Status
= ObReferenceObjectByHandle(hProcess
,
1722 PROCESS_QUERY_INFORMATION
,
1724 ExGetPreviousMode(),
1728 if(!NT_SUCCESS(Status
))
1730 SetLastNtError(Status
);
1734 W32Process
= (PW32PROCESS
)Process
->Win32Process
;
1737 ObDereferenceObject(Process
);
1738 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1746 Ret
= (DWORD
)W32Process
->GDIObjects
;
1749 case GR_USEROBJECTS
:
1751 Ret
= (DWORD
)W32Process
->UserObjects
;
1756 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1761 ObDereferenceObject(Process
);
1766 DPRINT("Leave NtUserGetGuiResources, ret=%i\n",_ret_
);
1772 IntSafeCopyUnicodeString(PUNICODE_STRING Dest
,
1773 PUNICODE_STRING Source
)
1778 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1779 if(!NT_SUCCESS(Status
))
1784 if(Dest
->Length
> 0x4000)
1786 return STATUS_UNSUCCESSFUL
;
1790 Dest
->Buffer
= NULL
;
1792 if(Dest
->Length
> 0 && Src
)
1794 Dest
->MaximumLength
= Dest
->Length
;
1795 Dest
->Buffer
= ExAllocatePoolWithTag(PagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1798 return STATUS_NO_MEMORY
;
1801 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1802 if(!NT_SUCCESS(Status
))
1804 ExFreePool(Dest
->Buffer
);
1805 Dest
->Buffer
= NULL
;
1810 return STATUS_SUCCESS
;
1813 /* string is empty */
1814 return STATUS_SUCCESS
;
1818 IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest
,
1819 PUNICODE_STRING Source
)
1824 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1825 if(!NT_SUCCESS(Status
))
1830 if(Dest
->Length
> 0x4000)
1832 return STATUS_UNSUCCESSFUL
;
1836 Dest
->Buffer
= NULL
;
1838 if(Dest
->Length
> 0 && Src
)
1840 Dest
->MaximumLength
= Dest
->Length
+ sizeof(WCHAR
);
1841 Dest
->Buffer
= ExAllocatePoolWithTag(PagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1844 return STATUS_NO_MEMORY
;
1847 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1848 if(!NT_SUCCESS(Status
))
1850 ExFreePool(Dest
->Buffer
);
1851 Dest
->Buffer
= NULL
;
1855 /* make sure the string is null-terminated */
1856 Src
= (PWSTR
)((PBYTE
)Dest
->Buffer
+ Dest
->Length
);
1859 return STATUS_SUCCESS
;
1862 /* string is empty */
1863 return STATUS_SUCCESS
;
1867 IntUnicodeStringToNULLTerminated(PWSTR
*Dest
, PUNICODE_STRING Src
)
1869 if (Src
->Length
+ sizeof(WCHAR
) <= Src
->MaximumLength
1870 && L
'\0' == Src
->Buffer
[Src
->Length
/ sizeof(WCHAR
)])
1872 /* The unicode_string is already nul terminated. Just reuse it. */
1873 *Dest
= Src
->Buffer
;
1874 return STATUS_SUCCESS
;
1877 *Dest
= ExAllocatePoolWithTag(PagedPool
, Src
->Length
+ sizeof(WCHAR
), TAG_STRING
);
1880 return STATUS_NO_MEMORY
;
1882 RtlCopyMemory(*Dest
, Src
->Buffer
, Src
->Length
);
1883 (*Dest
)[Src
->Length
/ 2] = L
'\0';
1885 return STATUS_SUCCESS
;
1889 IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated
, PUNICODE_STRING UnicodeString
)
1891 if (NullTerminated
!= UnicodeString
->Buffer
)
1893 ExFreePool(NullTerminated
);
1898 NtUserUpdatePerUserSystemParameters(
1903 DECLARE_RETURN(BOOLEAN
);
1905 DPRINT("Enter NtUserUpdatePerUserSystemParameters\n");
1906 UserEnterExclusive();
1908 Result
&= IntDesktopUpdatePerUserSettings(bEnable
);
1912 DPRINT("Leave NtUserUpdatePerUserSystemParameters, ret=%i\n",_ret_
);
1918 GetW32ProcessInfo(VOID
)
1921 PW32PROCESS W32Process
= PsGetCurrentProcessWin32Process();
1923 if (W32Process
== NULL
)
1925 /* FIXME - temporary hack for system threads... */
1929 if (W32Process
->ProcessInfo
== NULL
)
1931 pi
= UserHeapAlloc(sizeof(W32PROCESSINFO
));
1935 sizeof(W32PROCESSINFO
));
1938 pi
->UserHandleTable
= gHandleTable
;
1940 if (InterlockedCompareExchangePointer(&W32Process
->ProcessInfo
,
1949 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
1953 return W32Process
->ProcessInfo
;
1957 GetW32ThreadInfo(VOID
)
1961 PW32THREAD W32Thread
= PsGetCurrentThreadWin32Thread();
1963 if (W32Thread
== NULL
)
1965 /* FIXME - temporary hack for system threads... */
1969 /* allocate a W32THREAD structure if neccessary */
1970 if (W32Thread
->ThreadInfo
== NULL
)
1972 ti
= UserHeapAlloc(sizeof(W32THREADINFO
));
1976 sizeof(W32THREADINFO
));
1979 ti
->kpi
= GetW32ProcessInfo();
1980 ti
->pi
= UserHeapAddressToUser(ti
->kpi
);
1981 if (W32Thread
->Desktop
!= NULL
)
1983 ti
->Desktop
= W32Thread
->Desktop
->DesktopInfo
;
1984 ti
->DesktopHeapDelta
= DesktopHeapGetUserDelta();
1989 ti
->DesktopHeapDelta
= 0;
1992 W32Thread
->ThreadInfo
= ti
;
1993 /* update the TEB */
1994 Teb
= NtCurrentTeb();
2001 Teb
->Win32ThreadInfo
= UserHeapAddressToUser(W32Thread
->ThreadInfo
);
2005 SetLastNtError(_SEH_GetExceptionCode());
2011 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
2015 return W32Thread
->ThreadInfo
;