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 BOOL GradientCaptions
= TRUE
;
917 static UINT FocusBorderHeight
= 1;
918 static UINT FocusBorderWidth
= 1;
922 RtlZeroMemory(&IconFont
, sizeof(LOGFONTW
));
923 RtlZeroMemory(&pMetrics
, sizeof(NONCLIENTMETRICSW
));
925 IntGetFontMetricSetting(L
"CaptionFont", &pMetrics
.lfCaptionFont
);
926 IntGetFontMetricSetting(L
"SmCaptionFont", &pMetrics
.lfSmCaptionFont
);
927 IntGetFontMetricSetting(L
"MenuFont", &pMetrics
.lfMenuFont
);
928 IntGetFontMetricSetting(L
"StatusFont", &pMetrics
.lfStatusFont
);
929 IntGetFontMetricSetting(L
"MessageFont", &pMetrics
.lfMessageFont
);
930 IntGetFontMetricSetting(L
"IconFont", &IconFont
);
932 pMetrics
.iBorderWidth
= 1;
933 pMetrics
.iScrollWidth
= UserGetSystemMetrics(SM_CXVSCROLL
);
934 pMetrics
.iScrollHeight
= UserGetSystemMetrics(SM_CYHSCROLL
);
935 pMetrics
.iCaptionWidth
= UserGetSystemMetrics(SM_CXSIZE
);
936 pMetrics
.iCaptionHeight
= UserGetSystemMetrics(SM_CYSIZE
);
937 pMetrics
.iSmCaptionWidth
= UserGetSystemMetrics(SM_CXSMSIZE
);
938 pMetrics
.iSmCaptionHeight
= UserGetSystemMetrics(SM_CYSMSIZE
);
939 pMetrics
.iMenuWidth
= UserGetSystemMetrics(SM_CXMENUSIZE
);
940 pMetrics
.iMenuHeight
= UserGetSystemMetrics(SM_CYMENUSIZE
);
941 pMetrics
.cbSize
= sizeof(NONCLIENTMETRICSW
);
948 case SPI_SETDOUBLECLKWIDTH
:
949 case SPI_SETDOUBLECLKHEIGHT
:
950 case SPI_SETDOUBLECLICKTIME
:
951 case SPI_SETDESKWALLPAPER
:
952 case SPI_GETDESKWALLPAPER
:
953 case SPI_GETWHEELSCROLLLINES
:
954 case SPI_GETWHEELSCROLLCHARS
:
955 case SPI_SETSCREENSAVERRUNNING
:
956 case SPI_GETSCREENSAVERRUNNING
:
957 case SPI_GETSCREENSAVETIMEOUT
:
958 case SPI_SETSCREENSAVETIMEOUT
:
959 case SPI_GETSCREENSAVEACTIVE
:
960 case SPI_GETFLATMENU
:
961 case SPI_SETFLATMENU
:
963 PSYSTEM_CURSORINFO CurInfo
;
965 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
969 if(!NT_SUCCESS(Status
))
971 SetLastNtError(Status
);
977 case SPI_GETFLATMENU
:
978 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = WinStaObject
->FlatMenu
;
981 case SPI_SETFLATMENU
:
982 WinStaObject
->FlatMenu
= uiParam
;
984 case SPI_GETSCREENSAVETIMEOUT
:
985 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = WinStaObject
->ScreenSaverTimeOut
;
988 case SPI_SETSCREENSAVETIMEOUT
:
989 WinStaObject
->ScreenSaverTimeOut
= uiParam
;
991 case SPI_GETSCREENSAVERRUNNING
:
992 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
995 case SPI_SETSCREENSAVERRUNNING
:
996 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
997 WinStaObject
->ScreenSaverRunning
= uiParam
;
999 case SPI_GETSCREENSAVEACTIVE
:
1000 /* FIXME: how to disable the screensaver? */
1001 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = TRUE
;
1004 case SPI_GETWHEELSCROLLLINES
:
1005 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1006 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = CurInfo
->WheelScroLines
;
1007 /* FIXME add this value to scroll list as scroll value ?? */
1010 case SPI_GETWHEELSCROLLCHARS
:
1011 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1012 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = CurInfo
->WheelScroChars
;
1013 // FIXME add this value to scroll list as scroll value ??
1016 case SPI_SETDOUBLECLKWIDTH
:
1017 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1018 /* FIXME limit the maximum value? */
1019 CurInfo
->DblClickWidth
= uiParam
;
1021 case SPI_SETDOUBLECLKHEIGHT
:
1022 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1023 /* FIXME limit the maximum value? */
1024 CurInfo
->DblClickHeight
= uiParam
;
1026 case SPI_SETDOUBLECLICKTIME
:
1027 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1028 /* FIXME limit the maximum time to 1000 ms? */
1029 CurInfo
->DblClickSpeed
= uiParam
;
1031 case SPI_SETDESKWALLPAPER
:
1033 /* This function expects different parameters than the user mode version!
1035 We let the user mode code load the bitmap, it passed the handle to
1036 the bitmap. We'll change it's ownership to system and replace it with
1037 the current wallpaper bitmap */
1038 HBITMAP hOldBitmap
, hNewBitmap
;
1039 UNICODE_STRING Key
= RTL_CONSTANT_STRING(L
"Control Panel\\Desktop");
1040 UNICODE_STRING Tile
= RTL_CONSTANT_STRING(L
"TileWallpaper");
1041 UNICODE_STRING Style
= RTL_CONSTANT_STRING(L
"WallpaperStyle");
1042 UNICODE_STRING KeyPath
;
1043 OBJECT_ATTRIBUTES KeyAttributes
;
1044 OBJECT_ATTRIBUTES ObjectAttributes
;
1046 HANDLE CurrentUserKey
= NULL
;
1047 HANDLE KeyHandle
= NULL
;
1048 PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo
;
1050 ULONG ResLength
= 0;
1055 hNewBitmap
= *(HBITMAP
*)pvParam
;
1056 if(hNewBitmap
!= NULL
)
1059 /* try to get the size of the wallpaper */
1060 if(!(bmp
= BITMAPOBJ_LockBitmap(hNewBitmap
)))
1062 ObDereferenceObject(WinStaObject
);
1065 WinStaObject
->cxWallpaper
= bmp
->SurfObj
.sizlBitmap
.cx
;
1066 WinStaObject
->cyWallpaper
= bmp
->SurfObj
.sizlBitmap
.cy
;
1068 BITMAPOBJ_UnlockBitmap(bmp
);
1070 /* change the bitmap's ownership */
1071 GDIOBJ_SetOwnership(GdiHandleTable
, hNewBitmap
, NULL
);
1073 hOldBitmap
= (HBITMAP
)InterlockedExchange((LONG
*)&WinStaObject
->hbmWallpaper
, (LONG
)hNewBitmap
);
1074 if(hOldBitmap
!= NULL
)
1076 /* delete the old wallpaper */
1077 NtGdiDeleteObject(hOldBitmap
);
1082 /*default value is center */
1083 WinStaObject
->WallpaperMode
= wmCenter
;
1087 /* Get a handle to the current users settings */
1088 RtlFormatCurrentUserKeyPath(&KeyPath
);
1089 InitializeObjectAttributes(&ObjectAttributes
,&KeyPath
,OBJ_CASE_INSENSITIVE
,NULL
,NULL
);
1090 ZwOpenKey(&CurrentUserKey
, KEY_READ
, &ObjectAttributes
);
1091 RtlFreeUnicodeString(&KeyPath
);
1093 /* open up the settings to read the values */
1094 InitializeObjectAttributes(&KeyAttributes
, &Key
, OBJ_CASE_INSENSITIVE
,
1095 CurrentUserKey
, NULL
);
1096 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
1097 ZwClose(CurrentUserKey
);
1099 /* read the tile value in the registry */
1100 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1103 /* fall back to .DEFAULT if we didnt find values */
1104 if(Status
== STATUS_INVALID_HANDLE
)
1106 RtlInitUnicodeString (&KeyPath
,L
"\\Registry\\User\\.Default\\Control Panel\\Desktop");
1107 InitializeObjectAttributes(&KeyAttributes
, &KeyPath
, OBJ_CASE_INSENSITIVE
,
1109 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
1110 ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1114 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
1115 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
1118 if(!KeyValuePartialInfo
)
1124 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1125 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
1126 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
1129 ExFreePool(KeyValuePartialInfo
);
1133 Tile
.Length
= KeyValuePartialInfo
->DataLength
;
1134 Tile
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
1135 Tile
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
1137 Status
= RtlUnicodeStringToInteger(&Tile
, 0, &TileNum
);
1138 if(!NT_SUCCESS(Status
))
1142 ExFreePool(KeyValuePartialInfo
);
1144 /* start over again and look for the style*/
1146 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
1149 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
1150 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
1153 if(!KeyValuePartialInfo
)
1159 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
1160 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
1161 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
1164 ExFreePool(KeyValuePartialInfo
);
1168 Style
.Length
= KeyValuePartialInfo
->DataLength
;
1169 Style
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
1170 Style
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
1172 Status
= RtlUnicodeStringToInteger(&Style
, 0, &StyleNum
);
1173 if(!NT_SUCCESS(Status
))
1177 ExFreePool(KeyValuePartialInfo
);
1179 /* Check the values we found in the registry */
1180 if(TileNum
&& !StyleNum
)
1182 WinStaObject
->WallpaperMode
= wmTile
;
1184 else if(!TileNum
&& StyleNum
== 2)
1186 WinStaObject
->WallpaperMode
= wmStretch
;
1192 case SPI_GETDESKWALLPAPER
:
1193 /* This function expects different parameters than the user mode version!
1195 We basically return the current wallpaper handle - if any. The user
1196 mode version should load the string from the registry and return it
1197 without calling this function */
1199 *(HBITMAP
*)pvParam
= (HBITMAP
)WinStaObject
->hbmWallpaper
;
1203 /* FIXME save the value to the registry */
1205 ObDereferenceObject(WinStaObject
);
1208 case SPI_SETWORKAREA
:
1211 PDESKTOP_OBJECT Desktop
= PsGetCurrentThreadWin32Thread()->Desktop
;
1215 /* FIXME - Set last error */
1220 rc
= (RECT
*)pvParam
;
1221 Desktop
->WorkArea
= *rc
;
1225 case SPI_GETWORKAREA
:
1227 PDESKTOP_OBJECT Desktop
= PsGetCurrentThreadWin32Thread()->Desktop
;
1231 /* FIXME - Set last error */
1236 IntGetDesktopWorkArea(Desktop
, (PRECT
)pvParam
);
1240 case SPI_SETGRADIENTCAPTIONS
:
1242 GradientCaptions
= (pvParam
!= NULL
);
1243 /* FIXME - should be checked if the color depth is higher than 8bpp? */
1246 case SPI_GETGRADIENTCAPTIONS
:
1249 BOOL Ret
= GradientCaptions
;
1251 hDC
= IntGetScreenDC();
1254 Ret
= (NtGdiGetDeviceCaps(hDC
, BITSPIXEL
) > 8) && Ret
;
1257 *((PBOOL
)pvParam
) = Ret
;
1262 case SPI_SETFONTSMOOTHING
:
1264 IntEnableFontRendering(uiParam
!= 0);
1267 case SPI_GETFONTSMOOTHING
:
1270 *((BOOL
*)pvParam
) = IntIsFontRenderingEnabled();
1273 case SPI_GETICONTITLELOGFONT
:
1276 *((LOGFONTW
*)pvParam
) = IconFont
;
1279 case SPI_GETNONCLIENTMETRICS
:
1282 *((NONCLIENTMETRICSW
*)pvParam
) = pMetrics
;
1285 case SPI_GETFOCUSBORDERHEIGHT
:
1288 *((UINT
*)pvParam
) = FocusBorderHeight
;
1291 case SPI_GETFOCUSBORDERWIDTH
:
1294 *((UINT
*)pvParam
) = FocusBorderWidth
;
1297 case SPI_SETFOCUSBORDERHEIGHT
:
1299 FocusBorderHeight
= (UINT
)pvParam
;
1302 case SPI_SETFOCUSBORDERWIDTH
:
1304 FocusBorderWidth
= (UINT
)pvParam
;
1310 DPRINT1("SystemParametersInfo: Unsupported Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n",
1311 uiAction
, uiParam
, pvParam
, fWinIni
);
1322 UserSystemParametersInfo(
1332 case SPI_SETDOUBLECLKWIDTH
:
1333 case SPI_SETDOUBLECLKHEIGHT
:
1334 case SPI_SETDOUBLECLICKTIME
:
1335 case SPI_SETGRADIENTCAPTIONS
:
1336 case SPI_SETFONTSMOOTHING
:
1337 case SPI_SETFOCUSBORDERHEIGHT
:
1338 case SPI_SETFOCUSBORDERWIDTH
:
1340 return (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
);
1342 case SPI_SETWORKAREA
:
1345 Status
= MmCopyFromCaller(&rc
, (PRECT
)pvParam
, sizeof(RECT
));
1346 if(!NT_SUCCESS(Status
))
1348 SetLastNtError(Status
);
1351 return( (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
));
1353 case SPI_GETWORKAREA
:
1357 if(!IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
))
1362 Status
= MmCopyToCaller((PRECT
)pvParam
, &rc
, sizeof(RECT
));
1363 if(!NT_SUCCESS(Status
))
1365 SetLastNtError(Status
);
1370 case SPI_GETFONTSMOOTHING
:
1371 case SPI_GETGRADIENTCAPTIONS
:
1372 case SPI_GETFOCUSBORDERHEIGHT
:
1373 case SPI_GETFOCUSBORDERWIDTH
:
1374 case SPI_GETWHEELSCROLLLINES
:
1375 case SPI_GETWHEELSCROLLCHARS
:
1376 case SPI_GETSCREENSAVERRUNNING
:
1377 case SPI_SETSCREENSAVERRUNNING
:
1378 case SPI_GETSCREENSAVETIMEOUT
:
1379 case SPI_SETSCREENSAVETIMEOUT
:
1380 case SPI_GETSCREENSAVEACTIVE
:
1381 case SPI_GETFLATMENU
:
1382 case SPI_SETFLATMENU
:
1386 if(!IntSystemParametersInfo(uiAction
, uiParam
, &Ret
, fWinIni
))
1391 Status
= MmCopyToCaller(pvParam
, &Ret
, sizeof(BOOL
));
1392 if(!NT_SUCCESS(Status
))
1394 SetLastNtError(Status
);
1399 case SPI_SETDESKWALLPAPER
:
1401 /* !!! As opposed to the user mode version this version accepts a handle
1403 HBITMAP hbmWallpaper
;
1405 Status
= MmCopyFromCaller(&hbmWallpaper
, pvParam
, sizeof(HBITMAP
));
1406 if(!NT_SUCCESS(Status
))
1408 SetLastNtError(Status
);
1411 return( IntSystemParametersInfo(SPI_SETDESKWALLPAPER
, 0, &hbmWallpaper
, fWinIni
));
1413 case SPI_GETDESKWALLPAPER
:
1415 /* !!! As opposed to the user mode version this version returns a handle
1417 HBITMAP hbmWallpaper
;
1420 Ret
= IntSystemParametersInfo(SPI_GETDESKWALLPAPER
, 0, &hbmWallpaper
, fWinIni
);
1422 Status
= MmCopyToCaller(pvParam
, &hbmWallpaper
, sizeof(HBITMAP
));
1423 if(!NT_SUCCESS(Status
))
1425 SetLastNtError(Status
);
1430 case SPI_GETICONTITLELOGFONT
:
1434 if(!IntSystemParametersInfo(uiAction
, uiParam
, &IconFont
, fWinIni
))
1439 Status
= MmCopyToCaller(pvParam
, &IconFont
, sizeof(LOGFONTW
));
1440 if(!NT_SUCCESS(Status
))
1442 SetLastNtError(Status
);
1447 case SPI_GETNONCLIENTMETRICS
:
1449 NONCLIENTMETRICSW metrics
;
1451 Status
= MmCopyFromCaller(&metrics
.cbSize
, pvParam
, sizeof(UINT
));
1452 if(!NT_SUCCESS(Status
))
1454 SetLastNtError(Status
);
1457 if(metrics
.cbSize
!= sizeof(NONCLIENTMETRICSW
))
1459 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1463 if(!IntSystemParametersInfo(uiAction
, uiParam
, &metrics
, fWinIni
))
1468 Status
= MmCopyToCaller(pvParam
, &metrics
.cbSize
, sizeof(NONCLIENTMETRICSW
));
1469 if(!NT_SUCCESS(Status
))
1471 SetLastNtError(Status
);
1478 DPRINT1("UserSystemParametersInfo : uiAction = %x \n",uiAction
);
1493 NtUserSystemParametersInfo(
1499 DECLARE_RETURN(BOOLEAN
);
1501 DPRINT("Enter NtUserSystemParametersInfo\n");
1502 UserEnterExclusive();
1504 RETURN( UserSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
));
1507 DPRINT("Leave NtUserSystemParametersInfo, ret=%i\n",_ret_
);
1516 NtUserGetDoubleClickTime(VOID
)
1520 PWINSTATION_OBJECT WinStaObject
;
1521 PSYSTEM_CURSORINFO CurInfo
;
1522 DECLARE_RETURN(UINT
);
1524 DPRINT("Enter NtUserGetDoubleClickTime\n");
1527 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
1531 if (!NT_SUCCESS(Status
))
1532 RETURN( (DWORD
)FALSE
);
1534 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1535 Result
= CurInfo
->DblClickSpeed
;
1537 ObDereferenceObject(WinStaObject
);
1541 DPRINT("Leave NtUserGetDoubleClickTime, ret=%i\n",_ret_
);
1548 NtUserGetGUIThreadInfo(
1549 DWORD idThread
, /* if NULL use foreground thread */
1550 LPGUITHREADINFO lpgui
)
1553 PTHRDCARETINFO CaretInfo
;
1554 GUITHREADINFO SafeGui
;
1555 PDESKTOP_OBJECT Desktop
;
1556 PUSER_MESSAGE_QUEUE MsgQueue
;
1557 PETHREAD Thread
= NULL
;
1558 DECLARE_RETURN(BOOLEAN
);
1560 DPRINT("Enter NtUserGetGUIThreadInfo\n");
1563 Status
= MmCopyFromCaller(&SafeGui
, lpgui
, sizeof(DWORD
));
1564 if(!NT_SUCCESS(Status
))
1566 SetLastNtError(Status
);
1570 if(SafeGui
.cbSize
!= sizeof(GUITHREADINFO
))
1572 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1578 Status
= PsLookupThreadByThreadId((HANDLE
)idThread
, &Thread
);
1579 if(!NT_SUCCESS(Status
))
1581 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1584 Desktop
= ((PW32THREAD
)Thread
->Tcb
.Win32Thread
)->Desktop
;
1588 /* get the foreground thread */
1589 PW32THREAD W32Thread
= (PW32THREAD
)PsGetCurrentThread()->Tcb
.Win32Thread
;
1590 Desktop
= W32Thread
->Desktop
;
1593 MsgQueue
= Desktop
->ActiveMessageQueue
;
1596 Thread
= MsgQueue
->Thread
;
1601 if(!Thread
|| !Desktop
)
1603 if(idThread
&& Thread
)
1604 ObDereferenceObject(Thread
);
1605 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1609 MsgQueue
= (PUSER_MESSAGE_QUEUE
)Desktop
->ActiveMessageQueue
;
1610 CaretInfo
= MsgQueue
->CaretInfo
;
1612 SafeGui
.flags
= (CaretInfo
->Visible
? GUI_CARETBLINKING
: 0);
1613 if(MsgQueue
->MenuOwner
)
1614 SafeGui
.flags
|= GUI_INMENUMODE
| MsgQueue
->MenuState
;
1615 if(MsgQueue
->MoveSize
)
1616 SafeGui
.flags
|= GUI_INMOVESIZE
;
1618 /* FIXME add flag GUI_16BITTASK */
1620 SafeGui
.hwndActive
= MsgQueue
->ActiveWindow
;
1621 SafeGui
.hwndFocus
= MsgQueue
->FocusWindow
;
1622 SafeGui
.hwndCapture
= MsgQueue
->CaptureWindow
;
1623 SafeGui
.hwndMenuOwner
= MsgQueue
->MenuOwner
;
1624 SafeGui
.hwndMoveSize
= MsgQueue
->MoveSize
;
1625 SafeGui
.hwndCaret
= CaretInfo
->hWnd
;
1627 SafeGui
.rcCaret
.left
= CaretInfo
->Pos
.x
;
1628 SafeGui
.rcCaret
.top
= CaretInfo
->Pos
.y
;
1629 SafeGui
.rcCaret
.right
= SafeGui
.rcCaret
.left
+ CaretInfo
->Size
.cx
;
1630 SafeGui
.rcCaret
.bottom
= SafeGui
.rcCaret
.top
+ CaretInfo
->Size
.cy
;
1633 ObDereferenceObject(Thread
);
1635 Status
= MmCopyToCaller(lpgui
, &SafeGui
, sizeof(GUITHREADINFO
));
1636 if(!NT_SUCCESS(Status
))
1638 SetLastNtError(Status
);
1645 DPRINT("Leave NtUserGetGUIThreadInfo, ret=%i\n",_ret_
);
1653 NtUserGetGuiResources(
1658 PW32PROCESS W32Process
;
1661 DECLARE_RETURN(DWORD
);
1663 DPRINT("Enter NtUserGetGuiResources\n");
1666 Status
= ObReferenceObjectByHandle(hProcess
,
1667 PROCESS_QUERY_INFORMATION
,
1669 ExGetPreviousMode(),
1673 if(!NT_SUCCESS(Status
))
1675 SetLastNtError(Status
);
1679 W32Process
= (PW32PROCESS
)Process
->Win32Process
;
1682 ObDereferenceObject(Process
);
1683 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1691 Ret
= (DWORD
)W32Process
->GDIObjects
;
1694 case GR_USEROBJECTS
:
1696 Ret
= (DWORD
)W32Process
->UserObjects
;
1701 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1706 ObDereferenceObject(Process
);
1711 DPRINT("Leave NtUserGetGuiResources, ret=%i\n",_ret_
);
1717 IntSafeCopyUnicodeString(PUNICODE_STRING Dest
,
1718 PUNICODE_STRING Source
)
1723 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1724 if(!NT_SUCCESS(Status
))
1729 if(Dest
->Length
> 0x4000)
1731 return STATUS_UNSUCCESSFUL
;
1735 Dest
->Buffer
= NULL
;
1737 if(Dest
->Length
> 0 && Src
)
1739 Dest
->MaximumLength
= Dest
->Length
;
1740 Dest
->Buffer
= ExAllocatePoolWithTag(PagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1743 return STATUS_NO_MEMORY
;
1746 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1747 if(!NT_SUCCESS(Status
))
1749 ExFreePool(Dest
->Buffer
);
1750 Dest
->Buffer
= NULL
;
1755 return STATUS_SUCCESS
;
1758 /* string is empty */
1759 return STATUS_SUCCESS
;
1763 IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest
,
1764 PUNICODE_STRING Source
)
1769 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1770 if(!NT_SUCCESS(Status
))
1775 if(Dest
->Length
> 0x4000)
1777 return STATUS_UNSUCCESSFUL
;
1781 Dest
->Buffer
= NULL
;
1783 if(Dest
->Length
> 0 && Src
)
1785 Dest
->MaximumLength
= Dest
->Length
+ sizeof(WCHAR
);
1786 Dest
->Buffer
= ExAllocatePoolWithTag(PagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1789 return STATUS_NO_MEMORY
;
1792 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1793 if(!NT_SUCCESS(Status
))
1795 ExFreePool(Dest
->Buffer
);
1796 Dest
->Buffer
= NULL
;
1800 /* make sure the string is null-terminated */
1801 Src
= (PWSTR
)((PBYTE
)Dest
->Buffer
+ Dest
->Length
);
1804 return STATUS_SUCCESS
;
1807 /* string is empty */
1808 return STATUS_SUCCESS
;
1812 IntUnicodeStringToNULLTerminated(PWSTR
*Dest
, PUNICODE_STRING Src
)
1814 if (Src
->Length
+ sizeof(WCHAR
) <= Src
->MaximumLength
1815 && L
'\0' == Src
->Buffer
[Src
->Length
/ sizeof(WCHAR
)])
1817 /* The unicode_string is already nul terminated. Just reuse it. */
1818 *Dest
= Src
->Buffer
;
1819 return STATUS_SUCCESS
;
1822 *Dest
= ExAllocatePoolWithTag(PagedPool
, Src
->Length
+ sizeof(WCHAR
), TAG_STRING
);
1825 return STATUS_NO_MEMORY
;
1827 RtlCopyMemory(*Dest
, Src
->Buffer
, Src
->Length
);
1828 (*Dest
)[Src
->Length
/ 2] = L
'\0';
1830 return STATUS_SUCCESS
;
1834 IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated
, PUNICODE_STRING UnicodeString
)
1836 if (NullTerminated
!= UnicodeString
->Buffer
)
1838 ExFreePool(NullTerminated
);
1843 NtUserUpdatePerUserSystemParameters(
1848 DECLARE_RETURN(BOOLEAN
);
1850 DPRINT("Enter NtUserUpdatePerUserSystemParameters\n");
1851 UserEnterExclusive();
1853 Result
&= IntDesktopUpdatePerUserSettings(bEnable
);
1857 DPRINT("Leave NtUserUpdatePerUserSystemParameters, ret=%i\n",_ret_
);
1863 GetW32ProcessInfo(VOID
)
1866 PW32PROCESS W32Process
= PsGetCurrentProcessWin32Process();
1868 if (W32Process
== NULL
)
1870 /* FIXME - temporary hack for system threads... */
1874 if (W32Process
->ProcessInfo
== NULL
)
1876 pi
= UserHeapAlloc(sizeof(W32PROCESSINFO
));
1880 sizeof(W32PROCESSINFO
));
1883 pi
->UserHandleTable
= gHandleTable
;
1885 if (InterlockedCompareExchangePointer(&W32Process
->ProcessInfo
,
1894 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
1898 return W32Process
->ProcessInfo
;
1902 GetW32ThreadInfo(VOID
)
1906 PW32THREAD W32Thread
= PsGetCurrentThreadWin32Thread();
1908 if (W32Thread
== NULL
)
1910 /* FIXME - temporary hack for system threads... */
1914 /* allocate a W32THREAD structure if neccessary */
1915 if (W32Thread
->ThreadInfo
== NULL
)
1917 ti
= UserHeapAlloc(sizeof(W32THREADINFO
));
1921 sizeof(W32THREADINFO
));
1924 ti
->kpi
= GetW32ProcessInfo();
1925 ti
->pi
= UserHeapAddressToUser(ti
->kpi
);
1926 if (W32Thread
->Desktop
!= NULL
)
1928 ti
->Desktop
= W32Thread
->Desktop
->DesktopInfo
;
1929 ti
->DesktopHeapDelta
= DesktopHeapGetUserDelta();
1934 ti
->DesktopHeapDelta
= 0;
1937 W32Thread
->ThreadInfo
= ti
;
1938 /* update the TEB */
1939 Teb
= NtCurrentTeb();
1946 Teb
->Win32ThreadInfo
= UserHeapAddressToUser(W32Thread
->ThreadInfo
);
1950 SetLastNtError(_SEH_GetExceptionCode());
1956 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
1960 return W32Thread
->ThreadInfo
;