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
;
1022 case SPI_SETFLATMENU
:
1023 WinStaObject
->FlatMenu
= uiParam
;
1026 case SPI_GETSCREENSAVETIMEOUT
:
1027 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = WinStaObject
->ScreenSaverTimeOut
;
1030 case SPI_SETSCREENSAVETIMEOUT
:
1031 WinStaObject
->ScreenSaverTimeOut
= uiParam
;
1034 case SPI_GETSCREENSAVERRUNNING
:
1035 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
1038 case SPI_SETSCREENSAVERRUNNING
:
1039 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
1040 WinStaObject
->ScreenSaverRunning
= uiParam
;
1043 case SPI_GETWHEELSCROLLLINES
:
1044 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1045 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = CurInfo
->WheelScroLines
;
1046 /* FIXME add this value to scroll list as scroll value ?? */
1049 case SPI_GETWHEELSCROLLCHARS
:
1050 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1051 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = CurInfo
->WheelScroChars
;
1052 // FIXME add this value to scroll list as scroll value ??
1055 case SPI_SETDOUBLECLKWIDTH
:
1056 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1057 /* FIXME limit the maximum value? */
1058 CurInfo
->DblClickWidth
= uiParam
;
1060 case SPI_SETDOUBLECLKHEIGHT
:
1061 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1062 /* FIXME limit the maximum value? */
1063 CurInfo
->DblClickHeight
= uiParam
;
1065 case SPI_SETDOUBLECLICKTIME
:
1066 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1067 /* FIXME limit the maximum time to 1000 ms? */
1068 CurInfo
->DblClickSpeed
= uiParam
;
1070 case SPI_SETDESKWALLPAPER
:
1072 /* This function expects different parameters than the user mode version!
1074 We let the user mode code load the bitmap, it passed the handle to
1075 the bitmap. We'll change it's ownership to system and replace it with
1076 the current wallpaper bitmap */
1077 HBITMAP hOldBitmap
, hNewBitmap
;
1078 UNICODE_STRING Key
= RTL_CONSTANT_STRING(L
"Control Panel\\Desktop");
1079 UNICODE_STRING Tile
= RTL_CONSTANT_STRING(L
"TileWallpaper");
1080 UNICODE_STRING Style
= RTL_CONSTANT_STRING(L
"WallpaperStyle");
1081 UNICODE_STRING KeyPath
;
1082 OBJECT_ATTRIBUTES KeyAttributes
;
1083 OBJECT_ATTRIBUTES ObjectAttributes
;
1085 HANDLE CurrentUserKey
= NULL
;
1086 HANDLE KeyHandle
= NULL
;
1087 PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo
;
1089 ULONG ResLength
= 0;
1094 hNewBitmap
= *(HBITMAP
*)pvParam
;
1095 if(hNewBitmap
!= NULL
)
1098 /* try to get the size of the wallpaper */
1099 if(!(bmp
= BITMAPOBJ_LockBitmap(hNewBitmap
)))
1101 ObDereferenceObject(WinStaObject
);
1104 WinStaObject
->cxWallpaper
= bmp
->SurfObj
.sizlBitmap
.cx
;
1105 WinStaObject
->cyWallpaper
= bmp
->SurfObj
.sizlBitmap
.cy
;
1107 BITMAPOBJ_UnlockBitmap(bmp
);
1109 /* change the bitmap's ownership */
1110 GDIOBJ_SetOwnership(GdiHandleTable
, hNewBitmap
, NULL
);
1112 hOldBitmap
= (HBITMAP
)InterlockedExchange((LONG
*)&WinStaObject
->hbmWallpaper
, (LONG
)hNewBitmap
);
1113 if(hOldBitmap
!= NULL
)
1115 /* delete the old wallpaper */
1116 NtGdiDeleteObject(hOldBitmap
);
1121 /*default value is center */
1122 WinStaObject
->WallpaperMode
= wmCenter
;
1126 /* Get a handle to the current users settings */
1127 RtlFormatCurrentUserKeyPath(&KeyPath
);
1128 InitializeObjectAttributes(&ObjectAttributes
,&KeyPath
,OBJ_CASE_INSENSITIVE
,NULL
,NULL
);
1129 ZwOpenKey(&CurrentUserKey
, KEY_READ
, &ObjectAttributes
);
1130 RtlFreeUnicodeString(&KeyPath
);
1132 /* open up the settings to read the values */
1133 InitializeObjectAttributes(&KeyAttributes
, &Key
, OBJ_CASE_INSENSITIVE
,
1134 CurrentUserKey
, NULL
);
1135 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
1136 ZwClose(CurrentUserKey
);
1138 /* read the tile value in the registry */
1139 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1142 /* fall back to .DEFAULT if we didnt find values */
1143 if(Status
== STATUS_INVALID_HANDLE
)
1145 RtlInitUnicodeString (&KeyPath
,L
"\\Registry\\User\\.Default\\Control Panel\\Desktop");
1146 InitializeObjectAttributes(&KeyAttributes
, &KeyPath
, OBJ_CASE_INSENSITIVE
,
1148 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
1149 ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1153 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
1154 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
1157 if(!KeyValuePartialInfo
)
1163 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1164 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
1165 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
1168 ExFreePool(KeyValuePartialInfo
);
1172 Tile
.Length
= KeyValuePartialInfo
->DataLength
;
1173 Tile
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
1174 Tile
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
1176 Status
= RtlUnicodeStringToInteger(&Tile
, 0, &TileNum
);
1177 if(!NT_SUCCESS(Status
))
1181 ExFreePool(KeyValuePartialInfo
);
1183 /* start over again and look for the style*/
1185 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
1188 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
1189 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
1192 if(!KeyValuePartialInfo
)
1198 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
1199 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
1200 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
1203 ExFreePool(KeyValuePartialInfo
);
1207 Style
.Length
= KeyValuePartialInfo
->DataLength
;
1208 Style
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
1209 Style
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
1211 Status
= RtlUnicodeStringToInteger(&Style
, 0, &StyleNum
);
1212 if(!NT_SUCCESS(Status
))
1216 ExFreePool(KeyValuePartialInfo
);
1218 /* Check the values we found in the registry */
1219 if(TileNum
&& !StyleNum
)
1221 WinStaObject
->WallpaperMode
= wmTile
;
1223 else if(!TileNum
&& StyleNum
== 2)
1225 WinStaObject
->WallpaperMode
= wmStretch
;
1231 case SPI_GETDESKWALLPAPER
:
1232 /* This function expects different parameters than the user mode version!
1234 We basically return the current wallpaper handle - if any. The user
1235 mode version should load the string from the registry and return it
1236 without calling this function */
1238 *(HBITMAP
*)pvParam
= (HBITMAP
)WinStaObject
->hbmWallpaper
;
1242 /* FIXME save the value to the registry */
1244 ObDereferenceObject(WinStaObject
);
1247 case SPI_SETWORKAREA
:
1250 PDESKTOP_OBJECT Desktop
= PsGetWin32Thread()->Desktop
;
1254 /* FIXME - Set last error */
1259 rc
= (RECT
*)pvParam
;
1260 Desktop
->WorkArea
= *rc
;
1264 case SPI_GETWORKAREA
:
1266 PDESKTOP_OBJECT Desktop
= PsGetWin32Thread()->Desktop
;
1270 /* FIXME - Set last error */
1275 IntGetDesktopWorkArea(Desktop
, (PRECT
)pvParam
);
1279 case SPI_SETGRADIENTCAPTIONS
:
1281 GradientCaptions
= (pvParam
!= NULL
);
1282 /* FIXME - should be checked if the color depth is higher than 8bpp? */
1285 case SPI_GETGRADIENTCAPTIONS
:
1288 BOOL Ret
= GradientCaptions
;
1290 hDC
= IntGetScreenDC();
1293 Ret
= (NtGdiGetDeviceCaps(hDC
, BITSPIXEL
) > 8) && Ret
;
1296 *((PBOOL
)pvParam
) = Ret
;
1301 case SPI_SETFONTSMOOTHING
:
1303 IntEnableFontRendering(uiParam
!= 0);
1306 case SPI_GETFONTSMOOTHING
:
1309 *((BOOL
*)pvParam
) = IntIsFontRenderingEnabled();
1312 case SPI_GETICONTITLELOGFONT
:
1315 *((LOGFONTW
*)pvParam
) = IconFont
;
1318 case SPI_GETNONCLIENTMETRICS
:
1321 *((NONCLIENTMETRICSW
*)pvParam
) = pMetrics
;
1324 case SPI_GETFOCUSBORDERHEIGHT
:
1327 *((UINT
*)pvParam
) = FocusBorderHeight
;
1330 case SPI_GETFOCUSBORDERWIDTH
:
1333 *((UINT
*)pvParam
) = FocusBorderWidth
;
1336 case SPI_SETFOCUSBORDERHEIGHT
:
1338 FocusBorderHeight
= (UINT
)pvParam
;
1341 case SPI_SETFOCUSBORDERWIDTH
:
1343 FocusBorderWidth
= (UINT
)pvParam
;
1349 DPRINT1("SystemParametersInfo: Unsupported Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n",
1350 uiAction
, uiParam
, pvParam
, fWinIni
);
1361 UserSystemParametersInfo(
1371 case SPI_SETDOUBLECLKWIDTH
:
1372 case SPI_SETDOUBLECLKHEIGHT
:
1373 case SPI_SETDOUBLECLICKTIME
:
1374 case SPI_SETGRADIENTCAPTIONS
:
1375 case SPI_SETFONTSMOOTHING
:
1376 case SPI_SETFOCUSBORDERHEIGHT
:
1377 case SPI_SETFOCUSBORDERWIDTH
:
1379 return (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
);
1381 case SPI_SETWORKAREA
:
1384 Status
= MmCopyFromCaller(&rc
, (PRECT
)pvParam
, sizeof(RECT
));
1385 if(!NT_SUCCESS(Status
))
1387 SetLastNtError(Status
);
1390 return( (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
));
1392 case SPI_GETWORKAREA
:
1396 if(!IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
))
1401 Status
= MmCopyToCaller((PRECT
)pvParam
, &rc
, sizeof(RECT
));
1402 if(!NT_SUCCESS(Status
))
1404 SetLastNtError(Status
);
1409 case SPI_GETFONTSMOOTHING
:
1410 case SPI_GETGRADIENTCAPTIONS
:
1411 case SPI_GETFOCUSBORDERHEIGHT
:
1412 case SPI_GETFOCUSBORDERWIDTH
:
1413 case SPI_GETWHEELSCROLLLINES
:
1414 case SPI_GETWHEELSCROLLCHARS
:
1415 case SPI_GETSCREENSAVERRUNNING
:
1416 case SPI_SETSCREENSAVERRUNNING
:
1417 case SPI_GETSCREENSAVETIMEOUT
:
1418 case SPI_SETSCREENSAVETIMEOUT
:
1419 case SPI_GETFLATMENU
:
1420 case SPI_SETFLATMENU
:
1424 if(!IntSystemParametersInfo(uiAction
, uiParam
, &Ret
, fWinIni
))
1429 Status
= MmCopyToCaller(pvParam
, &Ret
, sizeof(BOOL
));
1430 if(!NT_SUCCESS(Status
))
1432 SetLastNtError(Status
);
1437 case SPI_SETDESKWALLPAPER
:
1439 /* !!! As opposed to the user mode version this version accepts a handle
1441 HBITMAP hbmWallpaper
;
1443 Status
= MmCopyFromCaller(&hbmWallpaper
, pvParam
, sizeof(HBITMAP
));
1444 if(!NT_SUCCESS(Status
))
1446 SetLastNtError(Status
);
1449 return( IntSystemParametersInfo(SPI_SETDESKWALLPAPER
, 0, &hbmWallpaper
, fWinIni
));
1451 case SPI_GETDESKWALLPAPER
:
1453 /* !!! As opposed to the user mode version this version returns a handle
1455 HBITMAP hbmWallpaper
;
1458 Ret
= IntSystemParametersInfo(SPI_GETDESKWALLPAPER
, 0, &hbmWallpaper
, fWinIni
);
1460 Status
= MmCopyToCaller(pvParam
, &hbmWallpaper
, sizeof(HBITMAP
));
1461 if(!NT_SUCCESS(Status
))
1463 SetLastNtError(Status
);
1468 case SPI_GETICONTITLELOGFONT
:
1472 if(!IntSystemParametersInfo(uiAction
, uiParam
, &IconFont
, fWinIni
))
1477 Status
= MmCopyToCaller(pvParam
, &IconFont
, sizeof(LOGFONTW
));
1478 if(!NT_SUCCESS(Status
))
1480 SetLastNtError(Status
);
1485 case SPI_GETNONCLIENTMETRICS
:
1487 NONCLIENTMETRICSW metrics
;
1489 Status
= MmCopyFromCaller(&metrics
.cbSize
, pvParam
, sizeof(UINT
));
1490 if(!NT_SUCCESS(Status
))
1492 SetLastNtError(Status
);
1495 if(metrics
.cbSize
!= sizeof(NONCLIENTMETRICSW
))
1497 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1501 if(!IntSystemParametersInfo(uiAction
, uiParam
, &metrics
, fWinIni
))
1506 Status
= MmCopyToCaller(pvParam
, &metrics
.cbSize
, sizeof(NONCLIENTMETRICSW
));
1507 if(!NT_SUCCESS(Status
))
1509 SetLastNtError(Status
);
1516 DPRINT1("UserSystemParametersInfo : uiAction = %x \n",uiAction
);
1531 NtUserSystemParametersInfo(
1537 DECLARE_RETURN(BOOLEAN
);
1539 DPRINT("Enter NtUserSystemParametersInfo\n");
1540 UserEnterExclusive();
1542 RETURN( UserSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
));
1545 DPRINT("Leave NtUserSystemParametersInfo, ret=%i\n",_ret_
);
1554 NtUserGetDoubleClickTime(VOID
)
1558 PWINSTATION_OBJECT WinStaObject
;
1559 PSYSTEM_CURSORINFO CurInfo
;
1560 DECLARE_RETURN(UINT
);
1562 DPRINT("Enter NtUserGetDoubleClickTime\n");
1565 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
1569 if (!NT_SUCCESS(Status
))
1570 RETURN( (DWORD
)FALSE
);
1572 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1573 Result
= CurInfo
->DblClickSpeed
;
1575 ObDereferenceObject(WinStaObject
);
1579 DPRINT("Leave NtUserGetDoubleClickTime, ret=%i\n",_ret_
);
1586 NtUserGetGUIThreadInfo(
1587 DWORD idThread
, /* if NULL use foreground thread */
1588 LPGUITHREADINFO lpgui
)
1591 PTHRDCARETINFO CaretInfo
;
1592 GUITHREADINFO SafeGui
;
1593 PDESKTOP_OBJECT Desktop
;
1594 PUSER_MESSAGE_QUEUE MsgQueue
;
1595 PETHREAD Thread
= NULL
;
1596 DECLARE_RETURN(BOOLEAN
);
1598 DPRINT("Enter NtUserGetGUIThreadInfo\n");
1601 Status
= MmCopyFromCaller(&SafeGui
, lpgui
, sizeof(DWORD
));
1602 if(!NT_SUCCESS(Status
))
1604 SetLastNtError(Status
);
1608 if(SafeGui
.cbSize
!= sizeof(GUITHREADINFO
))
1610 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1616 Status
= PsLookupThreadByThreadId((HANDLE
)idThread
, &Thread
);
1617 if(!NT_SUCCESS(Status
))
1619 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1622 Desktop
= ((PW32THREAD
)Thread
->Tcb
.Win32Thread
)->Desktop
;
1626 /* get the foreground thread */
1627 PW32THREAD W32Thread
= (PW32THREAD
)PsGetCurrentThread()->Tcb
.Win32Thread
;
1628 Desktop
= W32Thread
->Desktop
;
1631 MsgQueue
= Desktop
->ActiveMessageQueue
;
1634 Thread
= MsgQueue
->Thread
;
1639 if(!Thread
|| !Desktop
)
1641 if(idThread
&& Thread
)
1642 ObDereferenceObject(Thread
);
1643 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1647 MsgQueue
= (PUSER_MESSAGE_QUEUE
)Desktop
->ActiveMessageQueue
;
1648 CaretInfo
= MsgQueue
->CaretInfo
;
1650 SafeGui
.flags
= (CaretInfo
->Visible
? GUI_CARETBLINKING
: 0);
1651 if(MsgQueue
->MenuOwner
)
1652 SafeGui
.flags
|= GUI_INMENUMODE
| MsgQueue
->MenuState
;
1653 if(MsgQueue
->MoveSize
)
1654 SafeGui
.flags
|= GUI_INMOVESIZE
;
1656 /* FIXME add flag GUI_16BITTASK */
1658 SafeGui
.hwndActive
= MsgQueue
->ActiveWindow
;
1659 SafeGui
.hwndFocus
= MsgQueue
->FocusWindow
;
1660 SafeGui
.hwndCapture
= MsgQueue
->CaptureWindow
;
1661 SafeGui
.hwndMenuOwner
= MsgQueue
->MenuOwner
;
1662 SafeGui
.hwndMoveSize
= MsgQueue
->MoveSize
;
1663 SafeGui
.hwndCaret
= CaretInfo
->hWnd
;
1665 SafeGui
.rcCaret
.left
= CaretInfo
->Pos
.x
;
1666 SafeGui
.rcCaret
.top
= CaretInfo
->Pos
.y
;
1667 SafeGui
.rcCaret
.right
= SafeGui
.rcCaret
.left
+ CaretInfo
->Size
.cx
;
1668 SafeGui
.rcCaret
.bottom
= SafeGui
.rcCaret
.top
+ CaretInfo
->Size
.cy
;
1671 ObDereferenceObject(Thread
);
1673 Status
= MmCopyToCaller(lpgui
, &SafeGui
, sizeof(GUITHREADINFO
));
1674 if(!NT_SUCCESS(Status
))
1676 SetLastNtError(Status
);
1683 DPRINT("Leave NtUserGetGUIThreadInfo, ret=%i\n",_ret_
);
1691 NtUserGetGuiResources(
1696 PW32PROCESS W32Process
;
1699 DECLARE_RETURN(DWORD
);
1701 DPRINT("Enter NtUserGetGuiResources\n");
1704 Status
= ObReferenceObjectByHandle(hProcess
,
1705 PROCESS_QUERY_INFORMATION
,
1707 ExGetPreviousMode(),
1711 if(!NT_SUCCESS(Status
))
1713 SetLastNtError(Status
);
1717 W32Process
= (PW32PROCESS
)Process
->Win32Process
;
1720 ObDereferenceObject(Process
);
1721 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1729 Ret
= (DWORD
)W32Process
->GDIObjects
;
1732 case GR_USEROBJECTS
:
1734 Ret
= (DWORD
)W32Process
->UserObjects
;
1739 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1744 ObDereferenceObject(Process
);
1749 DPRINT("Leave NtUserGetGuiResources, ret=%i\n",_ret_
);
1755 IntSafeCopyUnicodeString(PUNICODE_STRING Dest
,
1756 PUNICODE_STRING Source
)
1761 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1762 if(!NT_SUCCESS(Status
))
1767 if(Dest
->Length
> 0x4000)
1769 return STATUS_UNSUCCESSFUL
;
1773 Dest
->Buffer
= NULL
;
1775 if(Dest
->Length
> 0 && Src
)
1777 Dest
->MaximumLength
= Dest
->Length
;
1778 Dest
->Buffer
= ExAllocatePoolWithTag(PagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1781 return STATUS_NO_MEMORY
;
1784 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1785 if(!NT_SUCCESS(Status
))
1787 ExFreePool(Dest
->Buffer
);
1788 Dest
->Buffer
= NULL
;
1793 return STATUS_SUCCESS
;
1796 /* string is empty */
1797 return STATUS_SUCCESS
;
1801 IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest
,
1802 PUNICODE_STRING Source
)
1807 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1808 if(!NT_SUCCESS(Status
))
1813 if(Dest
->Length
> 0x4000)
1815 return STATUS_UNSUCCESSFUL
;
1819 Dest
->Buffer
= NULL
;
1821 if(Dest
->Length
> 0 && Src
)
1823 Dest
->MaximumLength
= Dest
->Length
+ sizeof(WCHAR
);
1824 Dest
->Buffer
= ExAllocatePoolWithTag(PagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1827 return STATUS_NO_MEMORY
;
1830 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1831 if(!NT_SUCCESS(Status
))
1833 ExFreePool(Dest
->Buffer
);
1834 Dest
->Buffer
= NULL
;
1838 /* make sure the string is null-terminated */
1839 Src
= (PWSTR
)((PBYTE
)Dest
->Buffer
+ Dest
->Length
);
1842 return STATUS_SUCCESS
;
1845 /* string is empty */
1846 return STATUS_SUCCESS
;
1850 IntUnicodeStringToNULLTerminated(PWSTR
*Dest
, PUNICODE_STRING Src
)
1852 if (Src
->Length
+ sizeof(WCHAR
) <= Src
->MaximumLength
1853 && L
'\0' == Src
->Buffer
[Src
->Length
/ sizeof(WCHAR
)])
1855 /* The unicode_string is already nul terminated. Just reuse it. */
1856 *Dest
= Src
->Buffer
;
1857 return STATUS_SUCCESS
;
1860 *Dest
= ExAllocatePoolWithTag(PagedPool
, Src
->Length
+ sizeof(WCHAR
), TAG_STRING
);
1863 return STATUS_NO_MEMORY
;
1865 RtlCopyMemory(*Dest
, Src
->Buffer
, Src
->Length
);
1866 (*Dest
)[Src
->Length
/ 2] = L
'\0';
1868 return STATUS_SUCCESS
;
1872 IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated
, PUNICODE_STRING UnicodeString
)
1874 if (NullTerminated
!= UnicodeString
->Buffer
)
1876 ExFreePool(NullTerminated
);
1881 NtUserUpdatePerUserSystemParameters(
1886 DECLARE_RETURN(BOOLEAN
);
1888 DPRINT("Enter NtUserUpdatePerUserSystemParameters\n");
1889 UserEnterExclusive();
1891 Result
&= IntDesktopUpdatePerUserSettings(bEnable
);
1895 DPRINT("Leave NtUserUpdatePerUserSystemParameters, ret=%i\n",_ret_
);
1901 GetW32ProcessInfo(VOID
)
1904 PW32PROCESS W32Process
= PsGetWin32Process();
1906 if (W32Process
== NULL
)
1908 /* FIXME - temporary hack for system threads... */
1912 if (W32Process
->ProcessInfo
== NULL
)
1914 pi
= UserHeapAlloc(sizeof(W32PROCESSINFO
));
1918 sizeof(W32PROCESSINFO
));
1921 pi
->UserHandleTable
= gHandleTable
;
1923 if (InterlockedCompareExchangePointer(&W32Process
->ProcessInfo
,
1932 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
1936 return W32Process
->ProcessInfo
;
1940 GetW32ThreadInfo(VOID
)
1944 PW32THREAD W32Thread
= PsGetWin32Thread();
1946 if (W32Thread
== NULL
)
1948 /* FIXME - temporary hack for system threads... */
1952 /* allocate a W32THREAD structure if neccessary */
1953 if (W32Thread
->ThreadInfo
== NULL
)
1955 ti
= UserHeapAlloc(sizeof(W32THREADINFO
));
1959 sizeof(W32THREADINFO
));
1962 ti
->kpi
= GetW32ProcessInfo();
1963 ti
->pi
= UserHeapAddressToUser(ti
->kpi
);
1964 if (W32Thread
->Desktop
!= NULL
)
1966 ti
->Desktop
= W32Thread
->Desktop
->DesktopInfo
;
1967 ti
->DesktopHeapDelta
= DesktopHeapGetUserDelta();
1972 ti
->DesktopHeapDelta
= 0;
1975 W32Thread
->ThreadInfo
= ti
;
1976 /* update the TEB */
1977 Teb
= NtCurrentTeb();
1984 Teb
->Win32ThreadInfo
= UserHeapAddressToUser(W32Thread
->ThreadInfo
);
1988 SetLastNtError(_SEH_GetExceptionCode());
1994 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
1998 return W32Thread
->ThreadInfo
;