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
= PsGetCurrentThreadWin32Thread();
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
= PsGetCurrentThreadWin32Thread()->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
= PsGetCurrentProcessWin32Process();
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
:
859 GetW32ThreadInfo()->Desktop
->hProgmanWindow
= Param
;
862 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
863 GetW32ThreadInfo()->Desktop
->hTaskManWindow
= Param
;
874 NtUserGetThreadState(
877 DECLARE_RETURN(DWORD
);
879 DPRINT("Enter NtUserGetThreadState\n");
880 if (Routine
!= THREADSTATE_GETTHREADINFO
)
886 UserEnterExclusive();
891 case THREADSTATE_GETTHREADINFO
:
895 case THREADSTATE_FOCUSWINDOW
:
896 RETURN( (DWORD
)IntGetThreadFocusWindow());
897 case THREADSTATE_PROGMANWINDOW
:
898 RETURN( (DWORD
)GetW32ThreadInfo()->Desktop
->hProgmanWindow
);
899 case THREADSTATE_TASKMANWINDOW
:
900 RETURN( (DWORD
)GetW32ThreadInfo()->Desktop
->hTaskManWindow
);
905 DPRINT("Leave NtUserGetThreadState, ret=%i\n",_ret_
);
911 IntGetFontMetricSetting(LPWSTR lpValueName
, PLOGFONTW font
)
913 RTL_QUERY_REGISTRY_TABLE QueryTable
[2];
915 /* Firefox 1.0.7 depends on the lfHeight value being negative */
916 static LOGFONTW DefaultFont
= {
917 -11, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
918 0, 0, DEFAULT_QUALITY
, VARIABLE_PITCH
| FF_SWISS
,
922 RtlZeroMemory(&QueryTable
, sizeof(QueryTable
));
924 QueryTable
[0].Name
= lpValueName
;
925 QueryTable
[0].Flags
= RTL_QUERY_REGISTRY_DIRECT
| RTL_QUERY_REGISTRY_REQUIRED
;
926 QueryTable
[0].EntryContext
= font
;
928 Status
= RtlQueryRegistryValues(
930 L
"Control Panel\\Desktop\\WindowMetrics",
935 if (!NT_SUCCESS(Status
))
937 RtlCopyMemory(font
, &DefaultFont
, sizeof(LOGFONTW
));
942 IntSystemParametersInfo(
948 PWINSTATION_OBJECT WinStaObject
;
951 static BOOL bInitialized
= FALSE
;
952 static LOGFONTW IconFont
;
953 static NONCLIENTMETRICSW pMetrics
;
954 static BOOL GradientCaptions
= TRUE
;
955 static UINT FocusBorderHeight
= 1;
956 static UINT FocusBorderWidth
= 1;
960 RtlZeroMemory(&IconFont
, sizeof(LOGFONTW
));
961 RtlZeroMemory(&pMetrics
, sizeof(NONCLIENTMETRICSW
));
963 IntGetFontMetricSetting(L
"CaptionFont", &pMetrics
.lfCaptionFont
);
964 IntGetFontMetricSetting(L
"SmCaptionFont", &pMetrics
.lfSmCaptionFont
);
965 IntGetFontMetricSetting(L
"MenuFont", &pMetrics
.lfMenuFont
);
966 IntGetFontMetricSetting(L
"StatusFont", &pMetrics
.lfStatusFont
);
967 IntGetFontMetricSetting(L
"MessageFont", &pMetrics
.lfMessageFont
);
968 IntGetFontMetricSetting(L
"IconFont", &IconFont
);
970 pMetrics
.iBorderWidth
= 1;
971 pMetrics
.iScrollWidth
= UserGetSystemMetrics(SM_CXVSCROLL
);
972 pMetrics
.iScrollHeight
= UserGetSystemMetrics(SM_CYHSCROLL
);
973 pMetrics
.iCaptionWidth
= UserGetSystemMetrics(SM_CXSIZE
);
974 pMetrics
.iCaptionHeight
= UserGetSystemMetrics(SM_CYSIZE
);
975 pMetrics
.iSmCaptionWidth
= UserGetSystemMetrics(SM_CXSMSIZE
);
976 pMetrics
.iSmCaptionHeight
= UserGetSystemMetrics(SM_CYSMSIZE
);
977 pMetrics
.iMenuWidth
= UserGetSystemMetrics(SM_CXMENUSIZE
);
978 pMetrics
.iMenuHeight
= UserGetSystemMetrics(SM_CYMENUSIZE
);
979 pMetrics
.cbSize
= sizeof(NONCLIENTMETRICSW
);
986 case SPI_SETDOUBLECLKWIDTH
:
987 case SPI_SETDOUBLECLKHEIGHT
:
988 case SPI_SETDOUBLECLICKTIME
:
989 case SPI_SETDESKWALLPAPER
:
990 case SPI_GETDESKWALLPAPER
:
991 case SPI_GETWHEELSCROLLLINES
:
992 case SPI_GETWHEELSCROLLCHARS
:
993 case SPI_SETSCREENSAVERRUNNING
:
994 case SPI_GETSCREENSAVERRUNNING
:
995 case SPI_GETSCREENSAVETIMEOUT
:
996 case SPI_SETSCREENSAVETIMEOUT
:
997 case SPI_GETSCREENSAVEACTIVE
:
998 case SPI_GETFLATMENU
:
999 case SPI_SETFLATMENU
:
1001 PSYSTEM_CURSORINFO CurInfo
;
1003 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
1007 if(!NT_SUCCESS(Status
))
1009 SetLastNtError(Status
);
1010 return (DWORD
)FALSE
;
1015 case SPI_GETFLATMENU
:
1016 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = WinStaObject
->FlatMenu
;
1019 case SPI_SETFLATMENU
:
1020 WinStaObject
->FlatMenu
= uiParam
;
1022 case SPI_GETSCREENSAVETIMEOUT
:
1023 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = WinStaObject
->ScreenSaverTimeOut
;
1026 case SPI_SETSCREENSAVETIMEOUT
:
1027 WinStaObject
->ScreenSaverTimeOut
= uiParam
;
1029 case SPI_GETSCREENSAVERRUNNING
:
1030 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
1033 case SPI_SETSCREENSAVERRUNNING
:
1034 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
1035 WinStaObject
->ScreenSaverRunning
= uiParam
;
1037 case SPI_GETSCREENSAVEACTIVE
:
1038 /* FIXME: how to disable the screensaver? */
1039 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = TRUE
;
1042 case SPI_GETWHEELSCROLLLINES
:
1043 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1044 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = CurInfo
->WheelScroLines
;
1045 /* FIXME add this value to scroll list as scroll value ?? */
1048 case SPI_GETWHEELSCROLLCHARS
:
1049 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1050 if (pvParam
!= NULL
) *((UINT
*)pvParam
) = CurInfo
->WheelScroChars
;
1051 // FIXME add this value to scroll list as scroll value ??
1054 case SPI_SETDOUBLECLKWIDTH
:
1055 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1056 /* FIXME limit the maximum value? */
1057 CurInfo
->DblClickWidth
= uiParam
;
1059 case SPI_SETDOUBLECLKHEIGHT
:
1060 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1061 /* FIXME limit the maximum value? */
1062 CurInfo
->DblClickHeight
= uiParam
;
1064 case SPI_SETDOUBLECLICKTIME
:
1065 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
1066 /* FIXME limit the maximum time to 1000 ms? */
1067 CurInfo
->DblClickSpeed
= uiParam
;
1069 case SPI_SETDESKWALLPAPER
:
1071 /* This function expects different parameters than the user mode version!
1073 We let the user mode code load the bitmap, it passed the handle to
1074 the bitmap. We'll change it's ownership to system and replace it with
1075 the current wallpaper bitmap */
1076 HBITMAP hOldBitmap
, hNewBitmap
;
1077 UNICODE_STRING Key
= RTL_CONSTANT_STRING(L
"Control Panel\\Desktop");
1078 UNICODE_STRING Tile
= RTL_CONSTANT_STRING(L
"TileWallpaper");
1079 UNICODE_STRING Style
= RTL_CONSTANT_STRING(L
"WallpaperStyle");
1080 UNICODE_STRING KeyPath
;
1081 OBJECT_ATTRIBUTES KeyAttributes
;
1082 OBJECT_ATTRIBUTES ObjectAttributes
;
1084 HANDLE CurrentUserKey
= NULL
;
1085 HANDLE KeyHandle
= NULL
;
1086 PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo
;
1088 ULONG ResLength
= 0;
1093 hNewBitmap
= *(HBITMAP
*)pvParam
;
1094 if(hNewBitmap
!= NULL
)
1097 /* try to get the size of the wallpaper */
1098 if(!(bmp
= BITMAPOBJ_LockBitmap(hNewBitmap
)))
1100 ObDereferenceObject(WinStaObject
);
1103 WinStaObject
->cxWallpaper
= bmp
->SurfObj
.sizlBitmap
.cx
;
1104 WinStaObject
->cyWallpaper
= bmp
->SurfObj
.sizlBitmap
.cy
;
1106 BITMAPOBJ_UnlockBitmap(bmp
);
1108 /* change the bitmap's ownership */
1109 GDIOBJ_SetOwnership(GdiHandleTable
, hNewBitmap
, NULL
);
1111 hOldBitmap
= (HBITMAP
)InterlockedExchange((LONG
*)&WinStaObject
->hbmWallpaper
, (LONG
)hNewBitmap
);
1112 if(hOldBitmap
!= NULL
)
1114 /* delete the old wallpaper */
1115 NtGdiDeleteObject(hOldBitmap
);
1120 /*default value is center */
1121 WinStaObject
->WallpaperMode
= wmCenter
;
1125 /* Get a handle to the current users settings */
1126 RtlFormatCurrentUserKeyPath(&KeyPath
);
1127 InitializeObjectAttributes(&ObjectAttributes
,&KeyPath
,OBJ_CASE_INSENSITIVE
,NULL
,NULL
);
1128 ZwOpenKey(&CurrentUserKey
, KEY_READ
, &ObjectAttributes
);
1129 RtlFreeUnicodeString(&KeyPath
);
1131 /* open up the settings to read the values */
1132 InitializeObjectAttributes(&KeyAttributes
, &Key
, OBJ_CASE_INSENSITIVE
,
1133 CurrentUserKey
, NULL
);
1134 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
1135 ZwClose(CurrentUserKey
);
1137 /* read the tile value in the registry */
1138 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1141 /* fall back to .DEFAULT if we didnt find values */
1142 if(Status
== STATUS_INVALID_HANDLE
)
1144 RtlInitUnicodeString (&KeyPath
,L
"\\Registry\\User\\.Default\\Control Panel\\Desktop");
1145 InitializeObjectAttributes(&KeyAttributes
, &KeyPath
, OBJ_CASE_INSENSITIVE
,
1147 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
1148 ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1152 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
1153 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
1156 if(!KeyValuePartialInfo
)
1162 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
1163 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
1164 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
1167 ExFreePool(KeyValuePartialInfo
);
1171 Tile
.Length
= KeyValuePartialInfo
->DataLength
;
1172 Tile
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
1173 Tile
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
1175 Status
= RtlUnicodeStringToInteger(&Tile
, 0, &TileNum
);
1176 if(!NT_SUCCESS(Status
))
1180 ExFreePool(KeyValuePartialInfo
);
1182 /* start over again and look for the style*/
1184 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
1187 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
1188 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
1191 if(!KeyValuePartialInfo
)
1197 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
1198 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
1199 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
1202 ExFreePool(KeyValuePartialInfo
);
1206 Style
.Length
= KeyValuePartialInfo
->DataLength
;
1207 Style
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
1208 Style
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
1210 Status
= RtlUnicodeStringToInteger(&Style
, 0, &StyleNum
);
1211 if(!NT_SUCCESS(Status
))
1215 ExFreePool(KeyValuePartialInfo
);
1217 /* Check the values we found in the registry */
1218 if(TileNum
&& !StyleNum
)
1220 WinStaObject
->WallpaperMode
= wmTile
;
1222 else if(!TileNum
&& StyleNum
== 2)
1224 WinStaObject
->WallpaperMode
= wmStretch
;
1230 case SPI_GETDESKWALLPAPER
:
1231 /* This function expects different parameters than the user mode version!
1233 We basically return the current wallpaper handle - if any. The user
1234 mode version should load the string from the registry and return it
1235 without calling this function */
1237 *(HBITMAP
*)pvParam
= (HBITMAP
)WinStaObject
->hbmWallpaper
;
1241 /* FIXME save the value to the registry */
1243 ObDereferenceObject(WinStaObject
);
1246 case SPI_SETWORKAREA
:
1249 PDESKTOP_OBJECT Desktop
= PsGetCurrentThreadWin32Thread()->Desktop
;
1253 /* FIXME - Set last error */
1258 rc
= (RECT
*)pvParam
;
1259 Desktop
->WorkArea
= *rc
;
1263 case SPI_GETWORKAREA
:
1265 PDESKTOP_OBJECT Desktop
= PsGetCurrentThreadWin32Thread()->Desktop
;
1269 /* FIXME - Set last error */
1274 IntGetDesktopWorkArea(Desktop
, (PRECT
)pvParam
);
1278 case SPI_SETGRADIENTCAPTIONS
:
1280 GradientCaptions
= (pvParam
!= NULL
);
1281 /* FIXME - should be checked if the color depth is higher than 8bpp? */
1284 case SPI_GETGRADIENTCAPTIONS
:
1287 BOOL Ret
= GradientCaptions
;
1289 hDC
= IntGetScreenDC();
1292 Ret
= (NtGdiGetDeviceCaps(hDC
, BITSPIXEL
) > 8) && Ret
;
1295 *((PBOOL
)pvParam
) = Ret
;
1300 case SPI_SETFONTSMOOTHING
:
1302 IntEnableFontRendering(uiParam
!= 0);
1305 case SPI_GETFONTSMOOTHING
:
1308 *((BOOL
*)pvParam
) = IntIsFontRenderingEnabled();
1311 case SPI_GETICONTITLELOGFONT
:
1314 *((LOGFONTW
*)pvParam
) = IconFont
;
1317 case SPI_GETNONCLIENTMETRICS
:
1320 *((NONCLIENTMETRICSW
*)pvParam
) = pMetrics
;
1323 case SPI_GETFOCUSBORDERHEIGHT
:
1326 *((UINT
*)pvParam
) = FocusBorderHeight
;
1329 case SPI_GETFOCUSBORDERWIDTH
:
1332 *((UINT
*)pvParam
) = FocusBorderWidth
;
1335 case SPI_SETFOCUSBORDERHEIGHT
:
1337 FocusBorderHeight
= (UINT
)pvParam
;
1340 case SPI_SETFOCUSBORDERWIDTH
:
1342 FocusBorderWidth
= (UINT
)pvParam
;
1348 DPRINT1("SystemParametersInfo: Unsupported Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n",
1349 uiAction
, uiParam
, pvParam
, fWinIni
);
1360 UserSystemParametersInfo(
1370 case SPI_SETDOUBLECLKWIDTH
:
1371 case SPI_SETDOUBLECLKHEIGHT
:
1372 case SPI_SETDOUBLECLICKTIME
:
1373 case SPI_SETGRADIENTCAPTIONS
:
1374 case SPI_SETFONTSMOOTHING
:
1375 case SPI_SETFOCUSBORDERHEIGHT
:
1376 case SPI_SETFOCUSBORDERWIDTH
:
1378 return (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
);
1380 case SPI_SETWORKAREA
:
1383 Status
= MmCopyFromCaller(&rc
, (PRECT
)pvParam
, sizeof(RECT
));
1384 if(!NT_SUCCESS(Status
))
1386 SetLastNtError(Status
);
1389 return( (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
));
1391 case SPI_GETWORKAREA
:
1395 if(!IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
))
1400 Status
= MmCopyToCaller((PRECT
)pvParam
, &rc
, sizeof(RECT
));
1401 if(!NT_SUCCESS(Status
))
1403 SetLastNtError(Status
);
1408 case SPI_GETFONTSMOOTHING
:
1409 case SPI_GETGRADIENTCAPTIONS
:
1410 case SPI_GETFOCUSBORDERHEIGHT
:
1411 case SPI_GETFOCUSBORDERWIDTH
:
1412 case SPI_GETWHEELSCROLLLINES
:
1413 case SPI_GETWHEELSCROLLCHARS
:
1414 case SPI_GETSCREENSAVERRUNNING
:
1415 case SPI_SETSCREENSAVERRUNNING
:
1416 case SPI_GETSCREENSAVETIMEOUT
:
1417 case SPI_SETSCREENSAVETIMEOUT
:
1418 case SPI_GETSCREENSAVEACTIVE
:
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
= PsGetCurrentProcessWin32Process();
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
= PsGetCurrentThreadWin32Thread();
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
;