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
;
20 VOID
W32kRegisterPrimitiveMessageQueue(VOID
)
22 extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue
;
23 if( !pmPrimitiveMessageQueue
)
26 pThread
= PsGetWin32Thread();
27 if( pThread
&& pThread
->MessageQueue
)
29 pmPrimitiveMessageQueue
= pThread
->MessageQueue
;
30 IntReferenceMessageQueue(pmPrimitiveMessageQueue
);
31 DPRINT( "Installed primitive input queue.\n" );
36 DPRINT1( "Alert! Someone is trying to steal the primitive queue.\n" );
40 VOID
W32kUnregisterPrimitiveMessageQueue(VOID
)
42 extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue
;
43 IntDereferenceMessageQueue(pmPrimitiveMessageQueue
);
44 pmPrimitiveMessageQueue
= NULL
;
47 PUSER_MESSAGE_QUEUE
W32kGetPrimitiveMessageQueue()
49 extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue
;
50 return pmPrimitiveMessageQueue
;
54 co_IntRegisterLogonProcess(HANDLE ProcessId
, BOOL Register
)
58 CSR_API_MESSAGE Request
;
60 Status
= PsLookupProcessByProcessId(ProcessId
,
62 if (!NT_SUCCESS(Status
))
64 SetLastWin32Error(RtlNtStatusToDosError(Status
));
70 /* Register the logon process */
71 if (LogonProcess
!= NULL
)
73 ObDereferenceObject(Process
);
77 LogonProcess
= (PW32PROCESS
)Process
->Win32Process
;
81 /* Deregister the logon process */
82 if (LogonProcess
!= (PW32PROCESS
)Process
->Win32Process
)
84 ObDereferenceObject(Process
);
91 ObDereferenceObject(Process
);
93 Request
.Type
= MAKE_CSR_API(REGISTER_LOGON_PROCESS
, CSR_GUI
);
94 Request
.Data
.RegisterLogonProcessRequest
.ProcessId
= ProcessId
;
95 Request
.Data
.RegisterLogonProcessRequest
.Register
= Register
;
97 Status
= co_CsrNotify(&Request
);
98 if (! NT_SUCCESS(Status
))
100 DPRINT1("Failed to register logon process with CSRSS\n");
112 NtUserCallNoParam(DWORD Routine
)
115 DECLARE_RETURN(DWORD
);
117 DPRINT("Enter NtUserCallNoParam\n");
118 UserEnterExclusive();
122 case NOPARAM_ROUTINE_REGISTER_PRIMITIVE
:
123 W32kRegisterPrimitiveMessageQueue();
124 Result
= (DWORD
)TRUE
;
127 case NOPARAM_ROUTINE_DESTROY_CARET
:
128 Result
= (DWORD
)co_IntDestroyCaret(PsGetCurrentThread()->Tcb
.Win32Thread
);
131 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
132 Result
= (DWORD
)IntInitMessagePumpHook();
135 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
136 Result
= (DWORD
)IntUninitMessagePumpHook();
139 case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO
:
140 Result
= (DWORD
)MsqGetMessageExtraInfo();
143 case NOPARAM_ROUTINE_ANYPOPUP
:
144 Result
= (DWORD
)IntAnyPopup();
147 case NOPARAM_ROUTINE_CSRSS_INITIALIZED
:
148 Result
= (DWORD
)CsrInit();
151 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
152 RETURN( (DWORD
)IntMsqClearWakeMask());
155 DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
156 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
162 DPRINT("Leave NtUserCallNoParam, ret=%i\n",_ret_
);
177 DECLARE_RETURN(DWORD
);
180 DPRINT("Enter NtUserCallOneParam\n");
183 if (Routine
== ONEPARAM_ROUTINE_SHOWCURSOR
)
185 PWINSTATION_OBJECT WinSta
= PsGetWin32Thread()->Desktop
->WindowStation
;
186 PSYSTEM_CURSORINFO CurInfo
;
191 BITMAPOBJ
*BitmapObj
;
196 if(!(Screen
= IntGetScreenDC()))
198 return showpointer
; /* No mouse */
201 dc
= DC_LockDc(Screen
);
205 return showpointer
; /* No mouse */
208 dcbmp
= dc
->w
.hBitmap
;
211 BitmapObj
= BITMAPOBJ_LockBitmap(dcbmp
);
214 BITMAPOBJ_UnlockBitmap(BitmapObj
);
215 return showpointer
; /* No Mouse */
218 SurfObj
= &BitmapObj
->SurfObj
;
221 BITMAPOBJ_UnlockBitmap(BitmapObj
);
222 return showpointer
; /* No mouse */
225 ppdev
= GDIDEV(SurfObj
);
229 BITMAPOBJ_UnlockBitmap(BitmapObj
);
230 return showpointer
; /* No mouse */
233 pgp
= &ppdev
->Pointer
;
235 CurInfo
= IntGetSysCursorInfo(WinSta
);
240 showpointer
= pgp
->ShowPointer
;
242 if (showpointer
>= 0)
244 //ppdev->SafetyRemoveCount = 1;
245 //ppdev->SafetyRemoveLevel = 1;
246 EngMovePointer(SurfObj
,-1,-1,NULL
);
247 CurInfo
->ShowingCursor
= 0;
254 showpointer
= pgp
->ShowPointer
;
259 //ppdev->SafetyRemoveCount = 0;
260 //ppdev->SafetyRemoveLevel = 0;
261 EngMovePointer(SurfObj
,-1,-1,NULL
);
262 CurInfo
->ShowingCursor
= CURSOR_SHOWING
;
266 BITMAPOBJ_UnlockBitmap(BitmapObj
);
271 UserEnterExclusive();
275 case ONEPARAM_ROUTINE_GETMENU
:
277 PWINDOW_OBJECT Window
;
280 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
285 Result
= (DWORD
)Window
->IDMenu
;
290 case ONEPARAM_ROUTINE_ISWINDOWUNICODE
:
292 PWINDOW_OBJECT Window
;
295 Window
= UserGetWindowObject((HWND
)Param
);
300 Result
= Window
->Unicode
;
304 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
305 RETURN( (DWORD
)IntWindowFromDC((HDC
)Param
));
307 case ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID
:
309 PWINDOW_OBJECT Window
;
312 Window
= UserGetWindowObject((HWND
)Param
);
318 Result
= Window
->ContextHelpId
;
323 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
325 PWINSTATION_OBJECT WinSta
;
329 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
333 if (!NT_SUCCESS(Status
))
334 RETURN( (DWORD
)FALSE
);
337 Result = (DWORD)IntSwapMouseButton(WinStaObject, (BOOL)Param); */
340 ObDereferenceObject(WinSta
);
344 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
345 RETURN( (DWORD
)IntSwitchCaretShowing((PVOID
)Param
));
347 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
348 RETURN( (DWORD
)IntSetCaretBlinkTime((UINT
)Param
));
350 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
351 RETURN( (DWORD
)IntEnumClipboardFormats((UINT
)Param
));
353 case ONEPARAM_ROUTINE_GETWINDOWINSTANCE
:
355 PWINDOW_OBJECT Window
;
358 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
363 Result
= (DWORD
)Window
->Instance
;
367 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
368 RETURN( (DWORD
)MsqSetMessageExtraInfo((LPARAM
)Param
));
370 case ONEPARAM_ROUTINE_GETCURSORPOSITION
:
372 PWINSTATION_OBJECT WinSta
;
377 RETURN( (DWORD
)FALSE
);
378 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
382 if (!NT_SUCCESS(Status
))
383 RETURN( (DWORD
)FALSE
);
385 /* FIXME - check if process has WINSTA_READATTRIBUTES */
386 IntGetCursorLocation(WinSta
, &Pos
);
388 Status
= MmCopyToCaller((PPOINT
)Param
, &Pos
, sizeof(POINT
));
389 if(!NT_SUCCESS(Status
))
391 ObDereferenceObject(WinSta
);
392 SetLastNtError(Status
);
396 ObDereferenceObject(WinSta
);
398 RETURN( (DWORD
)TRUE
);
401 case ONEPARAM_ROUTINE_ISWINDOWINDESTROY
:
403 PWINDOW_OBJECT Window
;
406 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
411 Result
= (DWORD
)IntIsWindowInDestroy(Window
);
416 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
419 PW32PROCESS Process
= PsGetWin32Process();
423 Enable
= (BOOL
)(Param
!= 0);
427 Process
->Flags
&= ~W32PF_NOWINDOWGHOSTING
;
431 Process
->Flags
|= W32PF_NOWINDOWGHOSTING
;
440 case ONEPARAM_ROUTINE_MSQSETWAKEMASK
:
441 RETURN( (DWORD
)IntMsqSetWakeMask(Param
));
443 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
444 RETURN( UserGetKeyboardType(Param
));
446 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
447 RETURN( (DWORD
)UserGetKeyboardLayout(Param
));
449 DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
451 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
455 DPRINT("Leave NtUserCallOneParam, ret=%i\n",_ret_
);
472 PWINDOW_OBJECT Window
;
473 DECLARE_RETURN(DWORD
);
475 DPRINT("Enter NtUserCallTwoParam\n");
476 UserEnterExclusive();
480 case TWOPARAM_ROUTINE_SETDCPENCOLOR
:
482 RETURN( (DWORD
)IntSetDCColor((HDC
)Param1
, OBJ_PEN
, (COLORREF
)Param2
));
484 case TWOPARAM_ROUTINE_SETDCBRUSHCOLOR
:
486 RETURN( (DWORD
)IntSetDCColor((HDC
)Param1
, OBJ_BRUSH
, (COLORREF
)Param2
));
488 case TWOPARAM_ROUTINE_GETDCCOLOR
:
490 RETURN( (DWORD
)IntGetDCColor((HDC
)Param1
, (ULONG
)Param2
));
492 case TWOPARAM_ROUTINE_GETWINDOWRGNBOX
:
496 Window
= UserGetWindowObject((HWND
)Param1
);
497 if (!Window
) RETURN(ERROR
);
499 Ret
= (DWORD
)IntGetWindowRgnBox(Window
, &rcRect
);
500 Status
= MmCopyToCaller((PVOID
)Param2
, &rcRect
, sizeof(RECT
));
501 if(!NT_SUCCESS(Status
))
503 SetLastNtError(Status
);
508 case TWOPARAM_ROUTINE_GETWINDOWRGN
:
510 Window
= UserGetWindowObject((HWND
)Param1
);
511 if (!Window
) RETURN(ERROR
);
513 RETURN( (DWORD
)IntGetWindowRgn(Window
, (HRGN
)Param2
));
515 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
518 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
524 Ret
= (MenuObject
->MenuInfo
.Height
== (int)Param2
);
525 MenuObject
->MenuInfo
.Height
= (int)Param2
;
528 Ret
= (DWORD
)MenuObject
->MenuInfo
.Height
;
529 IntReleaseMenuObject(MenuObject
);
532 case TWOPARAM_ROUTINE_SETMENUITEMRECT
:
535 SETMENUITEMRECT smir
;
536 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
540 if(!NT_SUCCESS(MmCopyFromCaller(&smir
, (PVOID
)Param2
, sizeof(SETMENUITEMRECT
))))
542 IntReleaseMenuObject(MenuObject
);
546 Ret
= IntSetMenuItemRect(MenuObject
, smir
.uItem
, smir
.fByPosition
, &smir
.rcRect
);
548 IntReleaseMenuObject(MenuObject
);
552 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
554 PUSER_MESSAGE_QUEUE MsgQueue
= ((PW32THREAD
)PsGetCurrentThread()->Tcb
.Win32Thread
)->MessageQueue
;
557 RETURN( (DWORD
)MsqSetStateWindow(MsgQueue
, (ULONG
)Param1
, (HWND
)Param2
));
560 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
564 case TWOPARAM_ROUTINE_UNKNOWN
:
568 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
570 Window
= UserGetWindowObject((HWND
)Param1
);
571 if (!Window
) RETURN(0);
573 RETURN( (DWORD
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
576 case TWOPARAM_ROUTINE_ROS_SHOWWINDOW
:
578 #define WIN_NEEDS_SHOW_OWNEDPOPUP (0x00000040)
579 DPRINT1("ROS_SHOWWINDOW\n");
581 if (!(Window
= UserGetWindowObject((HWND
)Param1
)))
588 if (!(Window
->Flags
& WIN_NEEDS_SHOW_OWNEDPOPUP
))
592 Window
->Flags
&= ~WIN_NEEDS_SHOW_OWNEDPOPUP
;
595 Window
->Flags
|= WIN_NEEDS_SHOW_OWNEDPOPUP
;
597 DPRINT1("ROS_SHOWWINDOW ---> 0x%x\n",Window
->Flags
);
601 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
605 case TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
607 if(!(Window
= UserGetWindowObject((HWND
)Param1
)))
609 RETURN( (DWORD
)FALSE
);
612 Window
->ContextHelpId
= Param2
;
614 RETURN( (DWORD
)TRUE
);
616 case TWOPARAM_ROUTINE_SETCARETPOS
:
617 RETURN( (DWORD
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
619 case TWOPARAM_ROUTINE_GETWINDOWINFO
:
624 if(!(Window
= UserGetWindowObject((HWND
)Param1
)))
631 * According to WINE, Windows' doesn't check the cbSize field
634 Status
= MmCopyFromCaller(&wi
.cbSize
, (PVOID
)Param2
, sizeof(wi
.cbSize
));
635 if(!NT_SUCCESS(Status
))
637 SetLastNtError(Status
);
641 if(wi
.cbSize
!= sizeof(WINDOWINFO
))
643 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
648 if((Ret
= (DWORD
)IntGetWindowInfo(Window
, &wi
)))
650 Status
= MmCopyToCaller((PVOID
)Param2
, &wi
, sizeof(WINDOWINFO
));
651 if(!NT_SUCCESS(Status
))
653 SetLastNtError(Status
);
661 case TWOPARAM_ROUTINE_REGISTERLOGONPROC
:
662 RETURN( (DWORD
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
664 case TWOPARAM_ROUTINE_SETSYSCOLORS
:
675 /* FIXME - we should make use of SEH here... */
677 Status
= MmCopyFromCaller(&ChangeSysColors
, (PVOID
)Param1
, sizeof(ChangeSysColors
));
678 if(!NT_SUCCESS(Status
))
680 SetLastNtError(Status
);
684 Buffer
= ExAllocatePool(PagedPool
, (Param2
* sizeof(INT
)) + (Param2
* sizeof(COLORREF
)));
687 INT
*Elements
= (INT
*)Buffer
;
688 COLORREF
*Colors
= (COLORREF
*)Buffer
+ Param2
;
690 Status
= MmCopyFromCaller(Elements
, ChangeSysColors
.Elements
, Param2
* sizeof(INT
));
691 if(NT_SUCCESS(Status
))
693 Status
= MmCopyFromCaller(Colors
, ChangeSysColors
.Colors
, Param2
* sizeof(COLORREF
));
694 if(NT_SUCCESS(Status
))
696 Ret
= (DWORD
)IntSetSysColors((UINT
)Param2
, Elements
, Colors
);
699 SetLastNtError(Status
);
702 SetLastNtError(Status
);
711 case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES
:
712 case TWOPARAM_ROUTINE_GETSYSCOLORPENS
:
713 case TWOPARAM_ROUTINE_GETSYSCOLORS
:
724 /* FIXME - we should make use of SEH here... */
726 Buffer
.Pointer
= ExAllocatePool(PagedPool
, Param2
* sizeof(HANDLE
));
727 if(Buffer
.Pointer
!= NULL
)
731 case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES
:
732 Ret
= (DWORD
)IntGetSysColorBrushes(Buffer
.Brushes
, (UINT
)Param2
);
734 case TWOPARAM_ROUTINE_GETSYSCOLORPENS
:
735 Ret
= (DWORD
)IntGetSysColorPens(Buffer
.Pens
, (UINT
)Param2
);
737 case TWOPARAM_ROUTINE_GETSYSCOLORS
:
738 Ret
= (DWORD
)IntGetSysColors(Buffer
.Colors
, (UINT
)Param2
);
747 Status
= MmCopyToCaller((PVOID
)Param1
, Buffer
.Pointer
, Param2
* sizeof(HANDLE
));
748 if(!NT_SUCCESS(Status
))
750 SetLastNtError(Status
);
755 ExFreePool(Buffer
.Pointer
);
761 DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
762 Routine
, Param1
, Param2
);
763 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
767 DPRINT("Leave NtUserCallTwoParam, ret=%i\n",_ret_
);
783 PWINDOW_OBJECT Window
;
784 USER_REFERENCE_ENTRY Ref
;
785 DECLARE_RETURN(BOOLEAN
);
787 DPRINT("Enter NtUserCallHwndLock\n");
788 UserEnterExclusive();
790 if (!(Window
= UserGetWindowObject(hWnd
)))
794 UserRefObjectCo(Window
, &Ref
);
796 /* FIXME: Routine can be 0x53 - 0x5E */
799 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
800 co_WinPosArrangeIconicWindows(Window
);
803 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
806 DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
808 if (!((Window
->Style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
))
811 if(!(Menu
= UserGetMenuObject((HMENU
) Window
->IDMenu
)))
814 Menu
->MenuInfo
.WndOwner
= hWnd
;
815 Menu
->MenuInfo
.Height
= 0;
817 co_WinPosSetWindowPos(Window
, 0, 0, 0, 0, 0, SWP_NOSIZE
| SWP_NOMOVE
|
818 SWP_NOACTIVATE
| SWP_NOZORDER
| SWP_FRAMECHANGED
);
824 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
828 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
829 Ret
= co_IntSetForegroundWindow(Window
);
832 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
837 UserDerefObjectCo(Window
);
842 DPRINT("Leave NtUserCallHwndLock, ret=%i\n",_ret_
);
858 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
861 * Nothing too hard...validate the hWnd and save it in the Desktop Info
863 DPRINT1("HWNDOPT_ROUTINE_SETPROGMANWINDOW UNIMPLEMENTED\n");
866 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
869 * Nothing too hard...validate the hWnd and save it in the Desktop Info
871 DPRINT1("HWNDOPT_ROUTINE_SETTASKMANWINDOW UNIMPLEMENTED\n");
882 NtUserGetThreadState(
885 DECLARE_RETURN(DWORD
);
887 DPRINT("Enter NtUserGetThreadState\n");
888 if (Routine
!= THREADSTATE_GETTHREADINFO
)
894 UserEnterExclusive();
899 case THREADSTATE_GETTHREADINFO
:
903 case THREADSTATE_FOCUSWINDOW
:
904 RETURN( (DWORD
)IntGetThreadFocusWindow());
909 DPRINT("Leave NtUserGetThreadState, ret=%i\n",_ret_
);
915 IntGetFontMetricSetting(LPWSTR lpValueName
, PLOGFONTW font
)
917 RTL_QUERY_REGISTRY_TABLE QueryTable
[2];
919 /* Firefox 1.0.7 depends on the lfHeight value being negative */
920 static LOGFONTW DefaultFont
= {
921 -11, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
922 0, 0, DEFAULT_QUALITY
, VARIABLE_PITCH
| FF_SWISS
,
923 L
"Bitstream Vera Sans"
926 RtlZeroMemory(&QueryTable
, sizeof(QueryTable
));
928 QueryTable
[0].Name
= lpValueName
;
929 QueryTable
[0].Flags
= RTL_QUERY_REGISTRY_DIRECT
| RTL_QUERY_REGISTRY_REQUIRED
;
930 QueryTable
[0].EntryContext
= font
;
932 Status
= RtlQueryRegistryValues(
934 L
"Control Panel\\Desktop\\WindowMetrics",
939 if (!NT_SUCCESS(Status
))
941 RtlCopyMemory(font
, &DefaultFont
, sizeof(LOGFONTW
));
946 IntSystemParametersInfo(
952 PWINSTATION_OBJECT WinStaObject
;
955 static BOOL bInitialized
= FALSE
;
956 static LOGFONTW IconFont
;
957 static NONCLIENTMETRICSW pMetrics
;
958 static BOOL GradientCaptions
= TRUE
;
959 static UINT FocusBorderHeight
= 1;
960 static UINT FocusBorderWidth
= 1;
964 RtlZeroMemory(&IconFont
, sizeof(LOGFONTW
));
965 RtlZeroMemory(&pMetrics
, sizeof(NONCLIENTMETRICSW
));
967 IntGetFontMetricSetting(L
"CaptionFont", &pMetrics
.lfCaptionFont
);
968 IntGetFontMetricSetting(L
"SmCaptionFont", &pMetrics
.lfSmCaptionFont
);
969 IntGetFontMetricSetting(L
"MenuFont", &pMetrics
.lfMenuFont
);
970 IntGetFontMetricSetting(L
"StatusFont", &pMetrics
.lfStatusFont
);
971 IntGetFontMetricSetting(L
"MessageFont", &pMetrics
.lfMessageFont
);
972 IntGetFontMetricSetting(L
"IconFont", &IconFont
);
974 pMetrics
.iBorderWidth
= 1;
975 pMetrics
.iScrollWidth
= UserGetSystemMetrics(SM_CXVSCROLL
);
976 pMetrics
.iScrollHeight
= UserGetSystemMetrics(SM_CYHSCROLL
);
977 pMetrics
.iCaptionWidth
= UserGetSystemMetrics(SM_CXSIZE
);
978 pMetrics
.iCaptionHeight
= UserGetSystemMetrics(SM_CYSIZE
);
979 pMetrics
.iSmCaptionWidth
= UserGetSystemMetrics(SM_CXSMSIZE
);
980 pMetrics
.iSmCaptionHeight
= UserGetSystemMetrics(SM_CYSMSIZE
);
981 pMetrics
.iMenuWidth
= UserGetSystemMetrics(SM_CXMENUSIZE
);
982 pMetrics
.iMenuHeight
= UserGetSystemMetrics(SM_CYMENUSIZE
);
983 pMetrics
.cbSize
= sizeof(NONCLIENTMETRICSW
);
990 case SPI_SETDOUBLECLKWIDTH
:
991 case SPI_SETDOUBLECLKHEIGHT
:
992 case SPI_SETDOUBLECLICKTIME
:
993 case SPI_SETDESKWALLPAPER
:
994 case SPI_GETDESKWALLPAPER
:
995 case SPI_GETWHEELSCROLLLINES
:
996 case SPI_GETWHEELSCROLLCHARS
:
997 case SPI_SETSCREENSAVERRUNNING
:
998 case SPI_GETSCREENSAVERRUNNING
:
999 case SPI_GETSCREENSAVETIMEOUT
:
1000 case SPI_SETSCREENSAVETIMEOUT
:
1001 case SPI_GETFLATMENU
:
1002 case SPI_SETFLATMENU
:
1004 PSYSTEM_CURSORINFO CurInfo
;
1006 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
1010 if(!NT_SUCCESS(Status
))
1012 SetLastNtError(Status
);
1013 return (DWORD
)FALSE
;
1018 case SPI_GETFLATMENU
:
1019 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = WinStaObject
->FlatMenu
;
1021 case SPI_SETFLATMENU
:
1022 WinStaObject
->FlatMenu
= uiParam
;
1024 case SPI_GETSCREENSAVETIMEOUT
:
1025 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = WinStaObject
->ScreenSaverTimeOut
;
1027 case SPI_SETSCREENSAVETIMEOUT
:
1028 WinStaObject
->ScreenSaverTimeOut
= uiParam
;
1030 case SPI_GETSCREENSAVERRUNNING
:
1031 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
1033 case SPI_SETSCREENSAVERRUNNING
:
1034 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
1035 WinStaObject
->ScreenSaverRunning
= uiParam
;
1037 case SPI_GETWHEELSCROLLLINES
:
1038 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1039 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = CurInfo
->WheelScroLines
;
1040 /* FIXME add this value to scroll list as scroll value ?? */
1042 case SPI_GETWHEELSCROLLCHARS
:
1043 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1044 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = CurInfo
->WheelScroChars
;
1045 // FIXME add this value to scroll list as scroll value ??
1047 case SPI_SETDOUBLECLKWIDTH
:
1048 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1049 /* FIXME limit the maximum value? */
1050 CurInfo
->DblClickWidth
= uiParam
;
1052 case SPI_SETDOUBLECLKHEIGHT
:
1053 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1054 /* FIXME limit the maximum value? */
1055 CurInfo
->DblClickHeight
= uiParam
;
1057 case SPI_SETDOUBLECLICKTIME
:
1058 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1059 /* FIXME limit the maximum time to 1000 ms? */
1060 CurInfo
->DblClickSpeed
= uiParam
;
1062 case SPI_SETDESKWALLPAPER
:
1064 /* This function expects different parameters than the user mode version!
1066 We let the user mode code load the bitmap, it passed the handle to
1067 the bitmap. We'll change it's ownership to system and replace it with
1068 the current wallpaper bitmap */
1069 HBITMAP hOldBitmap
, hNewBitmap
;
1070 UNICODE_STRING Key
= RTL_CONSTANT_STRING(L
"Control Panel\\Desktop");
1071 UNICODE_STRING Tile
= RTL_CONSTANT_STRING(L
"TileWallpaper");
1072 UNICODE_STRING Style
= RTL_CONSTANT_STRING(L
"WallpaperStyle");
1073 UNICODE_STRING KeyPath
;
1074 OBJECT_ATTRIBUTES KeyAttributes
;
1075 OBJECT_ATTRIBUTES ObjectAttributes
;
1077 HANDLE CurrentUserKey
= NULL
;
1078 HANDLE KeyHandle
= NULL
;
1079 PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo
;
1081 ULONG ResLength
= 0;
1086 hNewBitmap
= *(HBITMAP
*)pvParam
;
1087 if(hNewBitmap
!= NULL
)
1090 /* try to get the size of the wallpaper */
1091 if(!(bmp
= BITMAPOBJ_LockBitmap(hNewBitmap
)))
1093 ObDereferenceObject(WinStaObject
);
1096 WinStaObject
->cxWallpaper
= bmp
->SurfObj
.sizlBitmap
.cx
;
1097 WinStaObject
->cyWallpaper
= bmp
->SurfObj
.sizlBitmap
.cy
;
1099 BITMAPOBJ_UnlockBitmap(bmp
);
1101 /* change the bitmap's ownership */
1102 GDIOBJ_SetOwnership(GdiHandleTable
, hNewBitmap
, NULL
);
1104 hOldBitmap
= (HBITMAP
)InterlockedExchange((LONG
*)&WinStaObject
->hbmWallpaper
, (LONG
)hNewBitmap
);
1105 if(hOldBitmap
!= NULL
)
1107 /* delete the old wallpaper */
1108 NtGdiDeleteObject(hOldBitmap
);
1113 /*default value is center */
1114 WinStaObject
->WallpaperMode
= wmCenter
;
1118 /* Get a handle to the current users settings */
1119 RtlFormatCurrentUserKeyPath(&KeyPath
);
1120 InitializeObjectAttributes(&ObjectAttributes
,&KeyPath
,OBJ_CASE_INSENSITIVE
,NULL
,NULL
);
1121 ZwOpenKey(&CurrentUserKey
, KEY_READ
, &ObjectAttributes
);
1122 RtlFreeUnicodeString(&KeyPath
);
1124 /* open up the settings to read the values */
1125 InitializeObjectAttributes(&KeyAttributes
, &Key
, OBJ_CASE_INSENSITIVE
,
1126 CurrentUserKey
, NULL
);
1127 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
1128 ZwClose(CurrentUserKey
);
1130 /* read the tile value in the registry */
1131 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1134 /* fall back to .DEFAULT if we didnt find values */
1135 if(Status
== STATUS_INVALID_HANDLE
)
1137 RtlInitUnicodeString (&KeyPath
,L
"\\Registry\\User\\.Default\\Control Panel\\Desktop");
1138 InitializeObjectAttributes(&KeyAttributes
, &KeyPath
, OBJ_CASE_INSENSITIVE
,
1140 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
1141 ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1145 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
1146 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
1149 if(!KeyValuePartialInfo
)
1155 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1156 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
1157 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
1160 ExFreePool(KeyValuePartialInfo
);
1164 Tile
.Length
= KeyValuePartialInfo
->DataLength
;
1165 Tile
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
1166 Tile
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
1168 Status
= RtlUnicodeStringToInteger(&Tile
, 0, &TileNum
);
1169 if(!NT_SUCCESS(Status
))
1173 ExFreePool(KeyValuePartialInfo
);
1175 /* start over again and look for the style*/
1177 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
1180 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
1181 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
1184 if(!KeyValuePartialInfo
)
1190 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
1191 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
1192 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
1195 ExFreePool(KeyValuePartialInfo
);
1199 Style
.Length
= KeyValuePartialInfo
->DataLength
;
1200 Style
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
1201 Style
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
1203 Status
= RtlUnicodeStringToInteger(&Style
, 0, &StyleNum
);
1204 if(!NT_SUCCESS(Status
))
1208 ExFreePool(KeyValuePartialInfo
);
1210 /* Check the values we found in the registry */
1211 if(TileNum
&& !StyleNum
)
1213 WinStaObject
->WallpaperMode
= wmTile
;
1215 else if(!TileNum
&& StyleNum
== 2)
1217 WinStaObject
->WallpaperMode
= wmStretch
;
1223 case SPI_GETDESKWALLPAPER
:
1224 /* This function expects different parameters than the user mode version!
1226 We basically return the current wallpaper handle - if any. The user
1227 mode version should load the string from the registry and return it
1228 without calling this function */
1230 *(HBITMAP
*)pvParam
= (HBITMAP
)WinStaObject
->hbmWallpaper
;
1234 /* FIXME save the value to the registry */
1236 ObDereferenceObject(WinStaObject
);
1239 case SPI_SETWORKAREA
:
1242 PDESKTOP_OBJECT Desktop
= PsGetWin32Thread()->Desktop
;
1246 /* FIXME - Set last error */
1251 rc
= (RECT
*)pvParam
;
1252 Desktop
->WorkArea
= *rc
;
1256 case SPI_GETWORKAREA
:
1258 PDESKTOP_OBJECT Desktop
= PsGetWin32Thread()->Desktop
;
1262 /* FIXME - Set last error */
1267 IntGetDesktopWorkArea(Desktop
, (PRECT
)pvParam
);
1271 case SPI_SETGRADIENTCAPTIONS
:
1273 GradientCaptions
= (pvParam
!= NULL
);
1274 /* FIXME - should be checked if the color depth is higher than 8bpp? */
1277 case SPI_GETGRADIENTCAPTIONS
:
1280 BOOL Ret
= GradientCaptions
;
1282 hDC
= IntGetScreenDC();
1285 Ret
= (NtGdiGetDeviceCaps(hDC
, BITSPIXEL
) > 8) && Ret
;
1288 *((PBOOL
)pvParam
) = Ret
;
1293 case SPI_SETFONTSMOOTHING
:
1295 IntEnableFontRendering(uiParam
!= 0);
1298 case SPI_GETFONTSMOOTHING
:
1301 *((BOOL
*)pvParam
) = IntIsFontRenderingEnabled();
1304 case SPI_GETICONTITLELOGFONT
:
1307 *((LOGFONTW
*)pvParam
) = IconFont
;
1310 case SPI_GETNONCLIENTMETRICS
:
1313 *((NONCLIENTMETRICSW
*)pvParam
) = pMetrics
;
1316 case SPI_GETFOCUSBORDERHEIGHT
:
1319 *((UINT
*)pvParam
) = FocusBorderHeight
;
1322 case SPI_GETFOCUSBORDERWIDTH
:
1325 *((UINT
*)pvParam
) = FocusBorderWidth
;
1328 case SPI_SETFOCUSBORDERHEIGHT
:
1330 FocusBorderHeight
= (UINT
)pvParam
;
1333 case SPI_SETFOCUSBORDERWIDTH
:
1335 FocusBorderWidth
= (UINT
)pvParam
;
1341 DPRINT1("SystemParametersInfo: Unsupported Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n",
1342 uiAction
, uiParam
, pvParam
, fWinIni
);
1353 UserSystemParametersInfo(
1363 case SPI_SETDOUBLECLKWIDTH
:
1364 case SPI_SETDOUBLECLKHEIGHT
:
1365 case SPI_SETDOUBLECLICKTIME
:
1366 case SPI_SETGRADIENTCAPTIONS
:
1367 case SPI_SETFONTSMOOTHING
:
1368 case SPI_SETFOCUSBORDERHEIGHT
:
1369 case SPI_SETFOCUSBORDERWIDTH
:
1371 return (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
);
1373 case SPI_SETWORKAREA
:
1376 Status
= MmCopyFromCaller(&rc
, (PRECT
)pvParam
, sizeof(RECT
));
1377 if(!NT_SUCCESS(Status
))
1379 SetLastNtError(Status
);
1382 return( (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
));
1384 case SPI_GETWORKAREA
:
1388 if(!IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
))
1393 Status
= MmCopyToCaller((PRECT
)pvParam
, &rc
, sizeof(RECT
));
1394 if(!NT_SUCCESS(Status
))
1396 SetLastNtError(Status
);
1401 case SPI_GETFONTSMOOTHING
:
1402 case SPI_GETGRADIENTCAPTIONS
:
1403 case SPI_GETFOCUSBORDERHEIGHT
:
1404 case SPI_GETFOCUSBORDERWIDTH
:
1405 case SPI_GETWHEELSCROLLLINES
:
1406 case SPI_GETWHEELSCROLLCHARS
:
1407 case SPI_GETSCREENSAVERRUNNING
:
1408 case SPI_SETSCREENSAVERRUNNING
:
1409 case SPI_GETSCREENSAVETIMEOUT
:
1410 case SPI_SETSCREENSAVETIMEOUT
:
1411 case SPI_GETFLATMENU
:
1412 case SPI_SETFLATMENU
:
1416 if(!IntSystemParametersInfo(uiAction
, uiParam
, &Ret
, fWinIni
))
1421 Status
= MmCopyToCaller(pvParam
, &Ret
, sizeof(BOOL
));
1422 if(!NT_SUCCESS(Status
))
1424 SetLastNtError(Status
);
1429 case SPI_SETDESKWALLPAPER
:
1431 /* !!! As opposed to the user mode version this version accepts a handle
1433 HBITMAP hbmWallpaper
;
1435 Status
= MmCopyFromCaller(&hbmWallpaper
, pvParam
, sizeof(HBITMAP
));
1436 if(!NT_SUCCESS(Status
))
1438 SetLastNtError(Status
);
1441 return( IntSystemParametersInfo(SPI_SETDESKWALLPAPER
, 0, &hbmWallpaper
, fWinIni
));
1443 case SPI_GETDESKWALLPAPER
:
1445 /* !!! As opposed to the user mode version this version returns a handle
1447 HBITMAP hbmWallpaper
;
1450 Ret
= IntSystemParametersInfo(SPI_GETDESKWALLPAPER
, 0, &hbmWallpaper
, fWinIni
);
1452 Status
= MmCopyToCaller(pvParam
, &hbmWallpaper
, sizeof(HBITMAP
));
1453 if(!NT_SUCCESS(Status
))
1455 SetLastNtError(Status
);
1460 case SPI_GETICONTITLELOGFONT
:
1464 if(!IntSystemParametersInfo(uiAction
, uiParam
, &IconFont
, fWinIni
))
1469 Status
= MmCopyToCaller(pvParam
, &IconFont
, sizeof(LOGFONTW
));
1470 if(!NT_SUCCESS(Status
))
1472 SetLastNtError(Status
);
1477 case SPI_GETNONCLIENTMETRICS
:
1479 NONCLIENTMETRICSW metrics
;
1481 Status
= MmCopyFromCaller(&metrics
.cbSize
, pvParam
, sizeof(UINT
));
1482 if(!NT_SUCCESS(Status
))
1484 SetLastNtError(Status
);
1487 if(metrics
.cbSize
!= sizeof(NONCLIENTMETRICSW
))
1489 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1493 if(!IntSystemParametersInfo(uiAction
, uiParam
, &metrics
, fWinIni
))
1498 Status
= MmCopyToCaller(pvParam
, &metrics
.cbSize
, sizeof(NONCLIENTMETRICSW
));
1499 if(!NT_SUCCESS(Status
))
1501 SetLastNtError(Status
);
1508 DPRINT1("UserSystemParametersInfo : uiAction = %x \n",uiAction
);
1523 NtUserSystemParametersInfo(
1529 DECLARE_RETURN(BOOLEAN
);
1531 DPRINT("Enter NtUserSystemParametersInfo\n");
1532 UserEnterExclusive();
1534 RETURN( UserSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
));
1537 DPRINT("Leave NtUserSystemParametersInfo, ret=%i\n",_ret_
);
1546 NtUserGetDoubleClickTime(VOID
)
1550 PWINSTATION_OBJECT WinStaObject
;
1551 PSYSTEM_CURSORINFO CurInfo
;
1552 DECLARE_RETURN(UINT
);
1554 DPRINT("Enter NtUserGetDoubleClickTime\n");
1557 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
1561 if (!NT_SUCCESS(Status
))
1562 RETURN( (DWORD
)FALSE
);
1564 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1565 Result
= CurInfo
->DblClickSpeed
;
1567 ObDereferenceObject(WinStaObject
);
1571 DPRINT("Leave NtUserGetDoubleClickTime, ret=%i\n",_ret_
);
1578 NtUserGetGUIThreadInfo(
1579 DWORD idThread
, /* if NULL use foreground thread */
1580 LPGUITHREADINFO lpgui
)
1583 PTHRDCARETINFO CaretInfo
;
1584 GUITHREADINFO SafeGui
;
1585 PDESKTOP_OBJECT Desktop
;
1586 PUSER_MESSAGE_QUEUE MsgQueue
;
1587 PETHREAD Thread
= NULL
;
1588 DECLARE_RETURN(BOOLEAN
);
1590 DPRINT("Enter NtUserGetGUIThreadInfo\n");
1593 Status
= MmCopyFromCaller(&SafeGui
, lpgui
, sizeof(DWORD
));
1594 if(!NT_SUCCESS(Status
))
1596 SetLastNtError(Status
);
1600 if(SafeGui
.cbSize
!= sizeof(GUITHREADINFO
))
1602 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1608 Status
= PsLookupThreadByThreadId((HANDLE
)idThread
, &Thread
);
1609 if(!NT_SUCCESS(Status
))
1611 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1614 Desktop
= ((PW32THREAD
)Thread
->Tcb
.Win32Thread
)->Desktop
;
1618 /* get the foreground thread */
1619 PW32THREAD W32Thread
= (PW32THREAD
)PsGetCurrentThread()->Tcb
.Win32Thread
;
1620 Desktop
= W32Thread
->Desktop
;
1623 MsgQueue
= Desktop
->ActiveMessageQueue
;
1626 Thread
= MsgQueue
->Thread
;
1631 if(!Thread
|| !Desktop
)
1633 if(idThread
&& Thread
)
1634 ObDereferenceObject(Thread
);
1635 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1639 MsgQueue
= (PUSER_MESSAGE_QUEUE
)Desktop
->ActiveMessageQueue
;
1640 CaretInfo
= MsgQueue
->CaretInfo
;
1642 SafeGui
.flags
= (CaretInfo
->Visible
? GUI_CARETBLINKING
: 0);
1643 if(MsgQueue
->MenuOwner
)
1644 SafeGui
.flags
|= GUI_INMENUMODE
| MsgQueue
->MenuState
;
1645 if(MsgQueue
->MoveSize
)
1646 SafeGui
.flags
|= GUI_INMOVESIZE
;
1648 /* FIXME add flag GUI_16BITTASK */
1650 SafeGui
.hwndActive
= MsgQueue
->ActiveWindow
;
1651 SafeGui
.hwndFocus
= MsgQueue
->FocusWindow
;
1652 SafeGui
.hwndCapture
= MsgQueue
->CaptureWindow
;
1653 SafeGui
.hwndMenuOwner
= MsgQueue
->MenuOwner
;
1654 SafeGui
.hwndMoveSize
= MsgQueue
->MoveSize
;
1655 SafeGui
.hwndCaret
= CaretInfo
->hWnd
;
1657 SafeGui
.rcCaret
.left
= CaretInfo
->Pos
.x
;
1658 SafeGui
.rcCaret
.top
= CaretInfo
->Pos
.y
;
1659 SafeGui
.rcCaret
.right
= SafeGui
.rcCaret
.left
+ CaretInfo
->Size
.cx
;
1660 SafeGui
.rcCaret
.bottom
= SafeGui
.rcCaret
.top
+ CaretInfo
->Size
.cy
;
1663 ObDereferenceObject(Thread
);
1665 Status
= MmCopyToCaller(lpgui
, &SafeGui
, sizeof(GUITHREADINFO
));
1666 if(!NT_SUCCESS(Status
))
1668 SetLastNtError(Status
);
1675 DPRINT("Leave NtUserGetGUIThreadInfo, ret=%i\n",_ret_
);
1683 NtUserGetGuiResources(
1688 PW32PROCESS W32Process
;
1691 DECLARE_RETURN(DWORD
);
1693 DPRINT("Enter NtUserGetGuiResources\n");
1696 Status
= ObReferenceObjectByHandle(hProcess
,
1697 PROCESS_QUERY_INFORMATION
,
1699 ExGetPreviousMode(),
1703 if(!NT_SUCCESS(Status
))
1705 SetLastNtError(Status
);
1709 W32Process
= (PW32PROCESS
)Process
->Win32Process
;
1712 ObDereferenceObject(Process
);
1713 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1721 Ret
= (DWORD
)W32Process
->GDIObjects
;
1724 case GR_USEROBJECTS
:
1726 Ret
= (DWORD
)W32Process
->UserObjects
;
1731 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1736 ObDereferenceObject(Process
);
1741 DPRINT("Leave NtUserGetGuiResources, ret=%i\n",_ret_
);
1747 IntSafeCopyUnicodeString(PUNICODE_STRING Dest
,
1748 PUNICODE_STRING Source
)
1753 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1754 if(!NT_SUCCESS(Status
))
1759 if(Dest
->Length
> 0x4000)
1761 return STATUS_UNSUCCESSFUL
;
1765 Dest
->Buffer
= NULL
;
1767 if(Dest
->Length
> 0 && Src
)
1769 Dest
->MaximumLength
= Dest
->Length
;
1770 Dest
->Buffer
= ExAllocatePoolWithTag(PagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1773 return STATUS_NO_MEMORY
;
1776 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1777 if(!NT_SUCCESS(Status
))
1779 ExFreePool(Dest
->Buffer
);
1780 Dest
->Buffer
= NULL
;
1785 return STATUS_SUCCESS
;
1788 /* string is empty */
1789 return STATUS_SUCCESS
;
1793 IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest
,
1794 PUNICODE_STRING Source
)
1799 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1800 if(!NT_SUCCESS(Status
))
1805 if(Dest
->Length
> 0x4000)
1807 return STATUS_UNSUCCESSFUL
;
1811 Dest
->Buffer
= NULL
;
1813 if(Dest
->Length
> 0 && Src
)
1815 Dest
->MaximumLength
= Dest
->Length
+ sizeof(WCHAR
);
1816 Dest
->Buffer
= ExAllocatePoolWithTag(PagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1819 return STATUS_NO_MEMORY
;
1822 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1823 if(!NT_SUCCESS(Status
))
1825 ExFreePool(Dest
->Buffer
);
1826 Dest
->Buffer
= NULL
;
1830 /* make sure the string is null-terminated */
1831 Src
= (PWSTR
)((PBYTE
)Dest
->Buffer
+ Dest
->Length
);
1834 return STATUS_SUCCESS
;
1837 /* string is empty */
1838 return STATUS_SUCCESS
;
1842 IntUnicodeStringToNULLTerminated(PWSTR
*Dest
, PUNICODE_STRING Src
)
1844 if (Src
->Length
+ sizeof(WCHAR
) <= Src
->MaximumLength
1845 && L
'\0' == Src
->Buffer
[Src
->Length
/ sizeof(WCHAR
)])
1847 /* The unicode_string is already nul terminated. Just reuse it. */
1848 *Dest
= Src
->Buffer
;
1849 return STATUS_SUCCESS
;
1852 *Dest
= ExAllocatePoolWithTag(PagedPool
, Src
->Length
+ sizeof(WCHAR
), TAG_STRING
);
1855 return STATUS_NO_MEMORY
;
1857 RtlCopyMemory(*Dest
, Src
->Buffer
, Src
->Length
);
1858 (*Dest
)[Src
->Length
/ 2] = L
'\0';
1860 return STATUS_SUCCESS
;
1864 IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated
, PUNICODE_STRING UnicodeString
)
1866 if (NullTerminated
!= UnicodeString
->Buffer
)
1868 ExFreePool(NullTerminated
);
1873 NtUserUpdatePerUserSystemParameters(
1878 DECLARE_RETURN(BOOLEAN
);
1880 DPRINT("Enter NtUserUpdatePerUserSystemParameters\n");
1881 UserEnterExclusive();
1883 Result
&= IntDesktopUpdatePerUserSettings(bEnable
);
1887 DPRINT("Leave NtUserUpdatePerUserSystemParameters, ret=%i\n",_ret_
);
1893 GetW32ProcessInfo(VOID
)
1896 PW32PROCESS W32Process
= PsGetWin32Process();
1898 if (W32Process
== NULL
)
1900 /* FIXME - temporary hack for system threads... */
1904 if (W32Process
->ProcessInfo
== NULL
)
1906 pi
= UserHeapAlloc(sizeof(W32PROCESSINFO
));
1910 sizeof(W32PROCESSINFO
));
1913 pi
->UserHandleTable
= gHandleTable
;
1915 if (InterlockedCompareExchangePointer(&W32Process
->ProcessInfo
,
1924 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
1928 return W32Process
->ProcessInfo
;
1932 GetW32ThreadInfo(VOID
)
1936 PW32THREAD W32Thread
= PsGetWin32Thread();
1938 if (W32Thread
== NULL
)
1940 /* FIXME - temporary hack for system threads... */
1944 /* allocate a W32THREAD structure if neccessary */
1945 if (W32Thread
->ThreadInfo
== NULL
)
1947 ti
= UserHeapAlloc(sizeof(W32THREADINFO
));
1951 sizeof(W32THREADINFO
));
1954 ti
->kpi
= GetW32ProcessInfo();
1955 ti
->pi
= UserHeapAddressToUser(ti
->kpi
);
1956 if (W32Thread
->Desktop
!= NULL
)
1958 ti
->Desktop
= W32Thread
->Desktop
->DesktopInfo
;
1959 ti
->DesktopHeapDelta
= DesktopHeapGetUserDelta();
1964 ti
->DesktopHeapDelta
= 0;
1967 W32Thread
->ThreadInfo
= ti
;
1968 /* update the TEB */
1969 Teb
= NtCurrentTeb();
1976 Teb
->Win32ThreadInfo
= UserHeapAddressToUser(W32Thread
->ThreadInfo
);
1980 SetLastNtError(_SEH_GetExceptionCode());
1986 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
1990 return W32Thread
->ThreadInfo
;