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_SETNONCLIENTMETRICS
:
1288 pMetrics
= *((NONCLIENTMETRICSW
*)pvParam
);
1291 case SPI_GETFOCUSBORDERHEIGHT
:
1294 *((UINT
*)pvParam
) = FocusBorderHeight
;
1297 case SPI_GETFOCUSBORDERWIDTH
:
1300 *((UINT
*)pvParam
) = FocusBorderWidth
;
1303 case SPI_SETFOCUSBORDERHEIGHT
:
1305 FocusBorderHeight
= (UINT
)pvParam
;
1308 case SPI_SETFOCUSBORDERWIDTH
:
1310 FocusBorderWidth
= (UINT
)pvParam
;
1316 DPRINT1("SystemParametersInfo: Unsupported Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n",
1317 uiAction
, uiParam
, pvParam
, fWinIni
);
1328 UserSystemParametersInfo(
1338 case SPI_SETDOUBLECLKWIDTH
:
1339 case SPI_SETDOUBLECLKHEIGHT
:
1340 case SPI_SETDOUBLECLICKTIME
:
1341 case SPI_SETGRADIENTCAPTIONS
:
1342 case SPI_SETFONTSMOOTHING
:
1343 case SPI_SETFOCUSBORDERHEIGHT
:
1344 case SPI_SETFOCUSBORDERWIDTH
:
1346 return (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
);
1348 case SPI_SETWORKAREA
:
1351 Status
= MmCopyFromCaller(&rc
, (PRECT
)pvParam
, sizeof(RECT
));
1352 if(!NT_SUCCESS(Status
))
1354 SetLastNtError(Status
);
1357 return( (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
));
1359 case SPI_GETWORKAREA
:
1363 if(!IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
))
1368 Status
= MmCopyToCaller((PRECT
)pvParam
, &rc
, sizeof(RECT
));
1369 if(!NT_SUCCESS(Status
))
1371 SetLastNtError(Status
);
1376 case SPI_GETFONTSMOOTHING
:
1377 case SPI_GETGRADIENTCAPTIONS
:
1378 case SPI_GETFOCUSBORDERHEIGHT
:
1379 case SPI_GETFOCUSBORDERWIDTH
:
1380 case SPI_GETWHEELSCROLLLINES
:
1381 case SPI_GETWHEELSCROLLCHARS
:
1382 case SPI_GETSCREENSAVERRUNNING
:
1383 case SPI_SETSCREENSAVERRUNNING
:
1384 case SPI_GETSCREENSAVETIMEOUT
:
1385 case SPI_SETSCREENSAVETIMEOUT
:
1386 case SPI_GETSCREENSAVEACTIVE
:
1387 case SPI_GETFLATMENU
:
1388 case SPI_SETFLATMENU
:
1392 if(!IntSystemParametersInfo(uiAction
, uiParam
, &Ret
, fWinIni
))
1397 Status
= MmCopyToCaller(pvParam
, &Ret
, sizeof(BOOL
));
1398 if(!NT_SUCCESS(Status
))
1400 SetLastNtError(Status
);
1405 case SPI_SETDESKWALLPAPER
:
1407 /* !!! As opposed to the user mode version this version accepts a handle
1409 HBITMAP hbmWallpaper
;
1411 Status
= MmCopyFromCaller(&hbmWallpaper
, pvParam
, sizeof(HBITMAP
));
1412 if(!NT_SUCCESS(Status
))
1414 SetLastNtError(Status
);
1417 return( IntSystemParametersInfo(SPI_SETDESKWALLPAPER
, 0, &hbmWallpaper
, fWinIni
));
1419 case SPI_GETDESKWALLPAPER
:
1421 /* !!! As opposed to the user mode version this version returns a handle
1423 HBITMAP hbmWallpaper
;
1426 Ret
= IntSystemParametersInfo(SPI_GETDESKWALLPAPER
, 0, &hbmWallpaper
, fWinIni
);
1428 Status
= MmCopyToCaller(pvParam
, &hbmWallpaper
, sizeof(HBITMAP
));
1429 if(!NT_SUCCESS(Status
))
1431 SetLastNtError(Status
);
1436 case SPI_GETICONTITLELOGFONT
:
1440 if(!IntSystemParametersInfo(uiAction
, uiParam
, &IconFont
, fWinIni
))
1445 Status
= MmCopyToCaller(pvParam
, &IconFont
, sizeof(LOGFONTW
));
1446 if(!NT_SUCCESS(Status
))
1448 SetLastNtError(Status
);
1453 case SPI_GETNONCLIENTMETRICS
:
1454 case SPI_SETNONCLIENTMETRICS
:
1456 NONCLIENTMETRICSW metrics
;
1458 Status
= MmCopyFromCaller(&metrics
, pvParam
, sizeof(NONCLIENTMETRICSW
));
1459 if(!NT_SUCCESS(Status
))
1461 SetLastNtError(Status
);
1464 if(metrics
.cbSize
!= sizeof(NONCLIENTMETRICSW
))
1466 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1470 if(!IntSystemParametersInfo(uiAction
, uiParam
, &metrics
, fWinIni
))
1475 Status
= MmCopyToCaller(pvParam
, &metrics
, sizeof(NONCLIENTMETRICSW
));
1476 if(!NT_SUCCESS(Status
))
1478 SetLastNtError(Status
);
1485 DPRINT1("FIXME: UNIMPLEMENTED SPI Code: %lx \n",uiAction
);
1500 NtUserSystemParametersInfo(
1506 DECLARE_RETURN(BOOLEAN
);
1508 DPRINT("Enter NtUserSystemParametersInfo\n");
1509 UserEnterExclusive();
1511 RETURN( UserSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
));
1514 DPRINT("Leave NtUserSystemParametersInfo, ret=%i\n",_ret_
);
1523 NtUserGetDoubleClickTime(VOID
)
1527 PWINSTATION_OBJECT WinStaObject
;
1528 PSYSTEM_CURSORINFO CurInfo
;
1529 DECLARE_RETURN(UINT
);
1531 DPRINT("Enter NtUserGetDoubleClickTime\n");
1534 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
1538 if (!NT_SUCCESS(Status
))
1539 RETURN( (DWORD
)FALSE
);
1541 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1542 Result
= CurInfo
->DblClickSpeed
;
1544 ObDereferenceObject(WinStaObject
);
1548 DPRINT("Leave NtUserGetDoubleClickTime, ret=%i\n",_ret_
);
1555 NtUserGetGUIThreadInfo(
1556 DWORD idThread
, /* if NULL use foreground thread */
1557 LPGUITHREADINFO lpgui
)
1560 PTHRDCARETINFO CaretInfo
;
1561 GUITHREADINFO SafeGui
;
1562 PDESKTOP_OBJECT Desktop
;
1563 PUSER_MESSAGE_QUEUE MsgQueue
;
1564 PETHREAD Thread
= NULL
;
1565 DECLARE_RETURN(BOOLEAN
);
1567 DPRINT("Enter NtUserGetGUIThreadInfo\n");
1570 Status
= MmCopyFromCaller(&SafeGui
, lpgui
, sizeof(DWORD
));
1571 if(!NT_SUCCESS(Status
))
1573 SetLastNtError(Status
);
1577 if(SafeGui
.cbSize
!= sizeof(GUITHREADINFO
))
1579 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1585 Status
= PsLookupThreadByThreadId((HANDLE
)idThread
, &Thread
);
1586 if(!NT_SUCCESS(Status
))
1588 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1591 Desktop
= ((PW32THREAD
)Thread
->Tcb
.Win32Thread
)->Desktop
;
1595 /* get the foreground thread */
1596 PW32THREAD W32Thread
= (PW32THREAD
)PsGetCurrentThread()->Tcb
.Win32Thread
;
1597 Desktop
= W32Thread
->Desktop
;
1600 MsgQueue
= Desktop
->ActiveMessageQueue
;
1603 Thread
= MsgQueue
->Thread
;
1608 if(!Thread
|| !Desktop
)
1610 if(idThread
&& Thread
)
1611 ObDereferenceObject(Thread
);
1612 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1616 MsgQueue
= (PUSER_MESSAGE_QUEUE
)Desktop
->ActiveMessageQueue
;
1617 CaretInfo
= MsgQueue
->CaretInfo
;
1619 SafeGui
.flags
= (CaretInfo
->Visible
? GUI_CARETBLINKING
: 0);
1620 if(MsgQueue
->MenuOwner
)
1621 SafeGui
.flags
|= GUI_INMENUMODE
| MsgQueue
->MenuState
;
1622 if(MsgQueue
->MoveSize
)
1623 SafeGui
.flags
|= GUI_INMOVESIZE
;
1625 /* FIXME add flag GUI_16BITTASK */
1627 SafeGui
.hwndActive
= MsgQueue
->ActiveWindow
;
1628 SafeGui
.hwndFocus
= MsgQueue
->FocusWindow
;
1629 SafeGui
.hwndCapture
= MsgQueue
->CaptureWindow
;
1630 SafeGui
.hwndMenuOwner
= MsgQueue
->MenuOwner
;
1631 SafeGui
.hwndMoveSize
= MsgQueue
->MoveSize
;
1632 SafeGui
.hwndCaret
= CaretInfo
->hWnd
;
1634 SafeGui
.rcCaret
.left
= CaretInfo
->Pos
.x
;
1635 SafeGui
.rcCaret
.top
= CaretInfo
->Pos
.y
;
1636 SafeGui
.rcCaret
.right
= SafeGui
.rcCaret
.left
+ CaretInfo
->Size
.cx
;
1637 SafeGui
.rcCaret
.bottom
= SafeGui
.rcCaret
.top
+ CaretInfo
->Size
.cy
;
1640 ObDereferenceObject(Thread
);
1642 Status
= MmCopyToCaller(lpgui
, &SafeGui
, sizeof(GUITHREADINFO
));
1643 if(!NT_SUCCESS(Status
))
1645 SetLastNtError(Status
);
1652 DPRINT("Leave NtUserGetGUIThreadInfo, ret=%i\n",_ret_
);
1660 NtUserGetGuiResources(
1665 PW32PROCESS W32Process
;
1668 DECLARE_RETURN(DWORD
);
1670 DPRINT("Enter NtUserGetGuiResources\n");
1673 Status
= ObReferenceObjectByHandle(hProcess
,
1674 PROCESS_QUERY_INFORMATION
,
1676 ExGetPreviousMode(),
1680 if(!NT_SUCCESS(Status
))
1682 SetLastNtError(Status
);
1686 W32Process
= (PW32PROCESS
)Process
->Win32Process
;
1689 ObDereferenceObject(Process
);
1690 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1698 Ret
= (DWORD
)W32Process
->GDIObjects
;
1701 case GR_USEROBJECTS
:
1703 Ret
= (DWORD
)W32Process
->UserObjects
;
1708 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1713 ObDereferenceObject(Process
);
1718 DPRINT("Leave NtUserGetGuiResources, ret=%i\n",_ret_
);
1724 IntSafeCopyUnicodeString(PUNICODE_STRING Dest
,
1725 PUNICODE_STRING Source
)
1730 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1731 if(!NT_SUCCESS(Status
))
1736 if(Dest
->Length
> 0x4000)
1738 return STATUS_UNSUCCESSFUL
;
1742 Dest
->Buffer
= NULL
;
1744 if(Dest
->Length
> 0 && Src
)
1746 Dest
->MaximumLength
= Dest
->Length
;
1747 Dest
->Buffer
= ExAllocatePoolWithTag(PagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1750 return STATUS_NO_MEMORY
;
1753 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1754 if(!NT_SUCCESS(Status
))
1756 ExFreePool(Dest
->Buffer
);
1757 Dest
->Buffer
= NULL
;
1762 return STATUS_SUCCESS
;
1765 /* string is empty */
1766 return STATUS_SUCCESS
;
1770 IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest
,
1771 PUNICODE_STRING Source
)
1776 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1777 if(!NT_SUCCESS(Status
))
1782 if(Dest
->Length
> 0x4000)
1784 return STATUS_UNSUCCESSFUL
;
1788 Dest
->Buffer
= NULL
;
1790 if(Dest
->Length
> 0 && Src
)
1792 Dest
->MaximumLength
= Dest
->Length
+ sizeof(WCHAR
);
1793 Dest
->Buffer
= ExAllocatePoolWithTag(PagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1796 return STATUS_NO_MEMORY
;
1799 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1800 if(!NT_SUCCESS(Status
))
1802 ExFreePool(Dest
->Buffer
);
1803 Dest
->Buffer
= NULL
;
1807 /* make sure the string is null-terminated */
1808 Src
= (PWSTR
)((PBYTE
)Dest
->Buffer
+ Dest
->Length
);
1811 return STATUS_SUCCESS
;
1814 /* string is empty */
1815 return STATUS_SUCCESS
;
1819 IntUnicodeStringToNULLTerminated(PWSTR
*Dest
, PUNICODE_STRING Src
)
1821 if (Src
->Length
+ sizeof(WCHAR
) <= Src
->MaximumLength
1822 && L
'\0' == Src
->Buffer
[Src
->Length
/ sizeof(WCHAR
)])
1824 /* The unicode_string is already nul terminated. Just reuse it. */
1825 *Dest
= Src
->Buffer
;
1826 return STATUS_SUCCESS
;
1829 *Dest
= ExAllocatePoolWithTag(PagedPool
, Src
->Length
+ sizeof(WCHAR
), TAG_STRING
);
1832 return STATUS_NO_MEMORY
;
1834 RtlCopyMemory(*Dest
, Src
->Buffer
, Src
->Length
);
1835 (*Dest
)[Src
->Length
/ 2] = L
'\0';
1837 return STATUS_SUCCESS
;
1841 IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated
, PUNICODE_STRING UnicodeString
)
1843 if (NullTerminated
!= UnicodeString
->Buffer
)
1845 ExFreePool(NullTerminated
);
1850 NtUserUpdatePerUserSystemParameters(
1855 DECLARE_RETURN(BOOLEAN
);
1857 DPRINT("Enter NtUserUpdatePerUserSystemParameters\n");
1858 UserEnterExclusive();
1860 Result
&= IntDesktopUpdatePerUserSettings(bEnable
);
1864 DPRINT("Leave NtUserUpdatePerUserSystemParameters, ret=%i\n",_ret_
);
1870 GetW32ProcessInfo(VOID
)
1873 PW32PROCESS W32Process
= PsGetCurrentProcessWin32Process();
1875 if (W32Process
== NULL
)
1877 /* FIXME - temporary hack for system threads... */
1881 if (W32Process
->ProcessInfo
== NULL
)
1883 pi
= UserHeapAlloc(sizeof(W32PROCESSINFO
));
1887 sizeof(W32PROCESSINFO
));
1890 pi
->UserHandleTable
= gHandleTable
;
1892 if (InterlockedCompareExchangePointer(&W32Process
->ProcessInfo
,
1901 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
1905 return W32Process
->ProcessInfo
;
1909 GetW32ThreadInfo(VOID
)
1913 PW32THREAD W32Thread
= PsGetCurrentThreadWin32Thread();
1915 if (W32Thread
== NULL
)
1917 /* FIXME - temporary hack for system threads... */
1921 /* allocate a W32THREAD structure if neccessary */
1922 if (W32Thread
->ThreadInfo
== NULL
)
1924 ti
= UserHeapAlloc(sizeof(W32THREADINFO
));
1928 sizeof(W32THREADINFO
));
1931 ti
->kpi
= GetW32ProcessInfo();
1932 ti
->pi
= UserHeapAddressToUser(ti
->kpi
);
1933 if (W32Thread
->Desktop
!= NULL
)
1935 ti
->Desktop
= W32Thread
->Desktop
->DesktopInfo
;
1936 ti
->DesktopHeapDelta
= DesktopHeapGetUserDelta();
1941 ti
->DesktopHeapDelta
= 0;
1944 W32Thread
->ThreadInfo
= ti
;
1945 /* update the TEB */
1946 Teb
= NtCurrentTeb();
1953 Teb
->Win32ThreadInfo
= UserHeapAddressToUser(W32Thread
->ThreadInfo
);
1957 SetLastNtError(_SEH_GetExceptionCode());
1963 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
1967 return W32Thread
->ThreadInfo
;