1 /* $Id: misc.c,v 1.78 2004/06/16 06:09:40 gvg Exp $
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 /* FIXME - not yet defined in w32api :( */
21 #define SPI_GETFOCUSBORDERWIDTH (8206)
22 #define SPI_SETFOCUSBORDERWIDTH (8207)
23 #define SPI_GETFOCUSBORDERHEIGHT (8208)
24 #define SPI_SETFOCUSBORDERHEIGHT (8209)
26 void W32kRegisterPrimitiveMessageQueue() {
27 extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue
;
28 if( !pmPrimitiveMessageQueue
) {
30 pThread
= PsGetWin32Thread();
31 if( pThread
&& pThread
->MessageQueue
) {
32 pmPrimitiveMessageQueue
= pThread
->MessageQueue
;
33 DPRINT( "Installed primitive input queue.\n" );
36 DPRINT1( "Alert! Someone is trying to steal the primitive queue.\n" );
40 PUSER_MESSAGE_QUEUE
W32kGetPrimitiveMessageQueue() {
41 extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue
;
42 return pmPrimitiveMessageQueue
;
46 IntRegisterLogonProcess(HANDLE hProcess
, BOOL x
)
51 if(LogonProcess
!= NULL
&& LogonProcess
!= PsGetWin32Process())
53 SetLastWin32Error(ERROR_ACCESS_DENIED
);
59 Status
= ObReferenceObjectByHandle(hProcess
,
60 PROCESS_QUERY_INFORMATION
,
65 if(!NT_SUCCESS(Status
))
67 SetLastNtError(Status
);
71 LogonProcess
= Process
->Win32Process
;
72 ObDereferenceObject(Process
);
76 /* deregister the logon process */
87 NtUserCallNoParam(DWORD Routine
)
93 case NOPARAM_ROUTINE_REGISTER_PRIMITIVE
:
94 W32kRegisterPrimitiveMessageQueue();
98 case NOPARAM_ROUTINE_DESTROY_CARET
:
99 Result
= (DWORD
)IntDestroyCaret(PsGetCurrentThread()->Win32Thread
);
102 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
103 Result
= (DWORD
)IntInitMessagePumpHook();
106 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
107 Result
= (DWORD
)IntUninitMessagePumpHook();
110 case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO
:
111 Result
= (DWORD
)MsqGetMessageExtraInfo();
114 case NOPARAM_ROUTINE_ANYPOPUP
:
115 Result
= (DWORD
)IntAnyPopup();
118 case NOPARAM_ROUTINE_CSRSS_INITIALIZED
:
119 Result
= (DWORD
)CsrInit();
123 DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
124 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
141 case ONEPARAM_ROUTINE_GETMENU
:
143 PWINDOW_OBJECT WindowObject
;
146 WindowObject
= IntGetWindowObject((HWND
)Param
);
149 SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE
);
153 Result
= (DWORD
)WindowObject
->IDMenu
;
155 IntReleaseWindowObject(WindowObject
);
159 case ONEPARAM_ROUTINE_ISWINDOWUNICODE
:
161 PWINDOW_OBJECT WindowObject
;
164 WindowObject
= IntGetWindowObject((HWND
)Param
);
167 SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE
);
170 Result
= WindowObject
->Unicode
;
171 IntReleaseWindowObject(WindowObject
);
175 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
176 return (DWORD
)IntWindowFromDC((HDC
)Param
);
178 case ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID
:
180 PWINDOW_OBJECT WindowObject
;
183 WindowObject
= IntGetWindowObject((HWND
)Param
);
186 SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE
);
190 Result
= WindowObject
->ContextHelpId
;
192 IntReleaseWindowObject(WindowObject
);
196 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
198 PWINSTATION_OBJECT WinStaObject
;
202 Status
= IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
206 if (!NT_SUCCESS(Status
))
209 Result
= (DWORD
)IntSwapMouseButton(WinStaObject
, (BOOL
)Param
);
211 ObDereferenceObject(WinStaObject
);
215 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
216 return (DWORD
)IntSwitchCaretShowing((PVOID
)Param
);
218 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
219 return (DWORD
)IntSetCaretBlinkTime((UINT
)Param
);
221 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
222 return (DWORD
)IntEnumClipboardFormats((UINT
)Param
);
224 case ONEPARAM_ROUTINE_GETWINDOWINSTANCE
:
226 PWINDOW_OBJECT WindowObject
;
229 if(!(WindowObject
= IntGetWindowObject((HWND
)Param
)))
231 SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE
);
235 Result
= (DWORD
)WindowObject
->Instance
;
236 IntReleaseWindowObject(WindowObject
);
240 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
241 return (DWORD
)MsqSetMessageExtraInfo((LPARAM
)Param
);
243 case ONEPARAM_ROUTINE_GETCURSORPOSITION
:
245 PSYSTEM_CURSORINFO CurInfo
;
246 PWINSTATION_OBJECT WinStaObject
;
252 Status
= IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
256 if (!NT_SUCCESS(Status
))
259 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
260 /* FIXME - check if process has WINSTA_READATTRIBUTES */
264 Status
= MmCopyToCaller((PPOINT
)Param
, &Pos
, sizeof(POINT
));
265 if(!NT_SUCCESS(Status
))
267 ObDereferenceObject(WinStaObject
);
268 SetLastNtError(Status
);
272 ObDereferenceObject(WinStaObject
);
277 case ONEPARAM_ROUTINE_ISWINDOWINDESTROY
:
279 PWINDOW_OBJECT WindowObject
;
282 WindowObject
= IntGetWindowObject((HWND
)Param
);
285 SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE
);
289 Result
= (DWORD
)IntIsWindowInDestroy(WindowObject
);
291 IntReleaseWindowObject(WindowObject
);
295 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
298 PW32PROCESS Process
= PsGetWin32Process();
302 Enable
= (BOOL
)(Param
!= 0);
306 Process
->Flags
&= ~W32PF_NOWINDOWGHOSTING
;
310 Process
->Flags
|= W32PF_NOWINDOWGHOSTING
;
319 DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
321 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
337 PWINDOW_OBJECT WindowObject
;
341 case TWOPARAM_ROUTINE_SETDCPENCOLOR
:
343 return (DWORD
)IntSetDCColor((HDC
)Param1
, OBJ_PEN
, (COLORREF
)Param2
);
345 case TWOPARAM_ROUTINE_SETDCBRUSHCOLOR
:
347 return (DWORD
)IntSetDCColor((HDC
)Param1
, OBJ_BRUSH
, (COLORREF
)Param2
);
349 case TWOPARAM_ROUTINE_GETDCCOLOR
:
351 return (DWORD
)IntGetDCColor((HDC
)Param1
, (ULONG
)Param2
);
353 case TWOPARAM_ROUTINE_GETWINDOWRGNBOX
:
357 Ret
= (DWORD
)IntGetWindowRgnBox((HWND
)Param1
, &rcRect
);
358 Status
= MmCopyToCaller((PVOID
)Param2
, &rcRect
, sizeof(RECT
));
359 if(!NT_SUCCESS(Status
))
361 SetLastNtError(Status
);
366 case TWOPARAM_ROUTINE_GETWINDOWRGN
:
368 return (DWORD
)IntGetWindowRgn((HWND
)Param1
, (HRGN
)Param2
);
370 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
373 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
379 Ret
= (MenuObject
->MenuInfo
.Height
== (int)Param2
);
380 MenuObject
->MenuInfo
.Height
= (int)Param2
;
383 Ret
= (DWORD
)MenuObject
->MenuInfo
.Height
;
384 IntReleaseMenuObject(MenuObject
);
387 case TWOPARAM_ROUTINE_SETMENUITEMRECT
:
390 SETMENUITEMRECT smir
;
391 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
395 if(!NT_SUCCESS(MmCopyFromCaller(&smir
, (PVOID
)Param2
, sizeof(SETMENUITEMRECT
))))
397 IntReleaseMenuObject(MenuObject
);
401 Ret
= IntSetMenuItemRect(MenuObject
, smir
.uItem
, smir
.fByPosition
, &smir
.rcRect
);
403 IntReleaseMenuObject(MenuObject
);
407 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
409 PUSER_MESSAGE_QUEUE MsgQueue
= PsGetCurrentThread()->Win32Thread
->MessageQueue
;
412 return (DWORD
)MsqSetStateWindow(MsgQueue
, (ULONG
)Param1
, (HWND
)Param2
);
415 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
419 case TWOPARAM_ROUTINE_UNKNOWN
:
423 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
427 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
431 case TWOPARAM_ROUTINE_VALIDATERGN
:
432 return (DWORD
)NtUserValidateRgn((HWND
) Param1
, (HRGN
) Param2
);
434 case TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
435 WindowObject
= IntGetWindowObject((HWND
)Param1
);
438 SetLastWin32Error(ERROR_INVALID_HANDLE
);
442 WindowObject
->ContextHelpId
= Param2
;
444 IntReleaseWindowObject(WindowObject
);
447 case TWOPARAM_ROUTINE_SETCARETPOS
:
448 return (DWORD
)IntSetCaretPos((int)Param1
, (int)Param2
);
450 case TWOPARAM_ROUTINE_GETWINDOWINFO
:
455 if(!(WindowObject
= IntGetWindowObject((HWND
)Param1
)))
457 SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE
);
463 * According to WINE, Windows' doesn't check the cbSize field
466 Status
= MmCopyFromCaller(&wi
.cbSize
, (PVOID
)Param2
, sizeof(wi
.cbSize
));
467 if(!NT_SUCCESS(Status
))
469 IntReleaseWindowObject(WindowObject
);
470 SetLastNtError(Status
);
474 if(wi
.cbSize
!= sizeof(WINDOWINFO
))
476 IntReleaseWindowObject(WindowObject
);
477 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
482 if((Ret
= (DWORD
)IntGetWindowInfo(WindowObject
, &wi
)))
484 Status
= MmCopyToCaller((PVOID
)Param2
, &wi
, sizeof(WINDOWINFO
));
485 if(!NT_SUCCESS(Status
))
487 IntReleaseWindowObject(WindowObject
);
488 SetLastNtError(Status
);
493 IntReleaseWindowObject(WindowObject
);
497 case TWOPARAM_ROUTINE_REGISTERLOGONPROC
:
498 return (DWORD
)IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
);
501 DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
502 Routine
, Param1
, Param2
);
503 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
517 PWINDOW_OBJECT Window
;
519 Window
= IntGetWindowObject(hWnd
);
522 SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE
);
526 /* FIXME: Routine can be 0x53 - 0x5E */
529 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
533 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
537 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
541 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
542 Ret
= IntSetForegroundWindow(Window
);
545 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
550 IntReleaseWindowObject(Window
);
563 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
567 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
579 NtUserGetThreadState(
585 return (DWORD
)IntGetThreadFocusWindow();
591 IntGetFontMetricSetting(LPWSTR lpValueName
, PLOGFONTW font
)
593 RTL_QUERY_REGISTRY_TABLE QueryTable
[2];
595 static LOGFONTW DefaultFont
= {
596 11, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
597 0, 0, DEFAULT_QUALITY
, VARIABLE_PITCH
| FF_SWISS
,
598 L
"Bitstream Vera Sans"
601 RtlZeroMemory(&QueryTable
, sizeof(QueryTable
));
603 QueryTable
[0].Name
= lpValueName
;
604 QueryTable
[0].Flags
= RTL_QUERY_REGISTRY_DIRECT
| RTL_QUERY_REGISTRY_REQUIRED
;
605 QueryTable
[0].EntryContext
= font
;
607 Status
= RtlQueryRegistryValues(
609 L
"Control Panel\\Desktop\\WindowMetrics",
614 if (!NT_SUCCESS(Status
))
616 RtlCopyMemory(font
, &DefaultFont
, sizeof(LOGFONTW
));
621 IntSystemParametersInfo(
627 PWINSTATION_OBJECT WinStaObject
;
630 static BOOL bInitialized
= FALSE
;
631 static LOGFONTW IconFont
;
632 static NONCLIENTMETRICSW pMetrics
;
633 static BOOL GradientCaptions
= TRUE
;
634 static UINT FocusBorderHeight
= 1;
635 static UINT FocusBorderWidth
= 1;
639 ZeroMemory(&IconFont
, sizeof(LOGFONTW
));
640 ZeroMemory(&pMetrics
, sizeof(NONCLIENTMETRICSW
));
642 IntGetFontMetricSetting(L
"CaptionFont", &pMetrics
.lfCaptionFont
);
643 IntGetFontMetricSetting(L
"SmCaptionFont", &pMetrics
.lfSmCaptionFont
);
644 IntGetFontMetricSetting(L
"MenuFont", &pMetrics
.lfMenuFont
);
645 IntGetFontMetricSetting(L
"StatusFont", &pMetrics
.lfStatusFont
);
646 IntGetFontMetricSetting(L
"MessageFont", &pMetrics
.lfMessageFont
);
647 IntGetFontMetricSetting(L
"IconFont", &IconFont
);
649 pMetrics
.iBorderWidth
= 1;
650 pMetrics
.iScrollWidth
= NtUserGetSystemMetrics(SM_CXVSCROLL
);
651 pMetrics
.iScrollHeight
= NtUserGetSystemMetrics(SM_CYHSCROLL
);
652 pMetrics
.iCaptionWidth
= NtUserGetSystemMetrics(SM_CXSIZE
);
653 pMetrics
.iCaptionHeight
= NtUserGetSystemMetrics(SM_CYSIZE
);
654 pMetrics
.iSmCaptionWidth
= NtUserGetSystemMetrics(SM_CXSMSIZE
);
655 pMetrics
.iSmCaptionHeight
= NtUserGetSystemMetrics(SM_CYSMSIZE
);
656 pMetrics
.iMenuWidth
= NtUserGetSystemMetrics(SM_CXMENUSIZE
);
657 pMetrics
.iMenuHeight
= NtUserGetSystemMetrics(SM_CYMENUSIZE
);
658 pMetrics
.cbSize
= sizeof(LPNONCLIENTMETRICSW
);
665 case SPI_SETDOUBLECLKWIDTH
:
666 case SPI_SETDOUBLECLKHEIGHT
:
667 case SPI_SETDOUBLECLICKTIME
:
669 PSYSTEM_CURSORINFO CurInfo
;
671 Status
= IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
675 if(!NT_SUCCESS(Status
))
677 SetLastNtError(Status
);
681 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
684 case SPI_SETDOUBLECLKWIDTH
:
685 /* FIXME limit the maximum value? */
686 CurInfo
->DblClickWidth
= uiParam
;
688 case SPI_SETDOUBLECLKHEIGHT
:
689 /* FIXME limit the maximum value? */
690 CurInfo
->DblClickHeight
= uiParam
;
692 case SPI_SETDOUBLECLICKTIME
:
693 /* FIXME limit the maximum time to 1000 ms? */
694 CurInfo
->DblClickSpeed
= uiParam
;
698 /* FIXME save the value to the registry */
700 ObDereferenceObject(WinStaObject
);
703 case SPI_SETWORKAREA
:
706 PDESKTOP_OBJECT Desktop
= PsGetWin32Thread()->Desktop
;
710 /* FIXME - Set last error */
716 Desktop
->WorkArea
= *rc
;
720 case SPI_GETWORKAREA
:
722 PDESKTOP_OBJECT Desktop
= PsGetWin32Thread()->Desktop
;
726 /* FIXME - Set last error */
731 IntGetDesktopWorkArea(Desktop
, (PRECT
)pvParam
);
735 case SPI_SETGRADIENTCAPTIONS
:
737 GradientCaptions
= (pvParam
!= NULL
);
738 /* FIXME - should be checked if the color depth is higher than 8bpp? */
741 case SPI_GETGRADIENTCAPTIONS
:
746 BOOL Ret
= GradientCaptions
;
748 hDC
= IntGetScreenDC();
752 SurfObj
= (SURFOBJ
*)AccessUserObject((ULONG
) dc
->Surface
);
754 Ret
= (SurfObj
->iBitmapFormat
> BMF_8BPP
) && Ret
;
758 *((PBOOL
)pvParam
) = Ret
;
763 case SPI_SETFONTSMOOTHING
:
765 IntEnableFontRendering(uiParam
!= 0);
768 case SPI_GETFONTSMOOTHING
:
771 *((BOOL
*)pvParam
) = IntIsFontRenderingEnabled();
774 case SPI_GETICONTITLELOGFONT
:
777 *((LOGFONTW
*)pvParam
) = IconFont
;
780 case SPI_GETNONCLIENTMETRICS
:
783 *((NONCLIENTMETRICSW
*)pvParam
) = pMetrics
;
786 case SPI_GETFOCUSBORDERHEIGHT
:
789 *((UINT
*)pvParam
) = FocusBorderHeight
;
792 case SPI_GETFOCUSBORDERWIDTH
:
795 *((UINT
*)pvParam
) = FocusBorderWidth
;
798 case SPI_SETFOCUSBORDERHEIGHT
:
800 FocusBorderHeight
= (UINT
)pvParam
;
803 case SPI_SETFOCUSBORDERWIDTH
:
805 FocusBorderWidth
= (UINT
)pvParam
;
811 DPRINT1("SystemParametersInfo: Unsupported Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n",
812 uiAction
, uiParam
, pvParam
, fWinIni
);
824 NtUserSystemParametersInfo(
834 case SPI_SETDOUBLECLKWIDTH
:
835 case SPI_SETDOUBLECLKHEIGHT
:
836 case SPI_SETDOUBLECLICKTIME
:
837 case SPI_SETGRADIENTCAPTIONS
:
838 case SPI_SETFONTSMOOTHING
:
839 case SPI_SETFOCUSBORDERHEIGHT
:
840 case SPI_SETFOCUSBORDERWIDTH
:
842 return (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
);
844 case SPI_SETWORKAREA
:
847 Status
= MmCopyFromCaller(&rc
, (PRECT
)pvParam
, sizeof(RECT
));
848 if(!NT_SUCCESS(Status
))
850 SetLastNtError(Status
);
853 return (DWORD
)IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
);
855 case SPI_GETWORKAREA
:
859 if(!IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
))
864 Status
= MmCopyToCaller((PRECT
)pvParam
, &rc
, sizeof(RECT
));
865 if(!NT_SUCCESS(Status
))
867 SetLastNtError(Status
);
872 case SPI_GETFONTSMOOTHING
:
873 case SPI_GETGRADIENTCAPTIONS
:
874 case SPI_GETFOCUSBORDERHEIGHT
:
875 case SPI_GETFOCUSBORDERWIDTH
:
879 if(!IntSystemParametersInfo(uiAction
, uiParam
, &Ret
, fWinIni
))
884 Status
= MmCopyToCaller(pvParam
, &Ret
, sizeof(BOOL
));
885 if(!NT_SUCCESS(Status
))
887 SetLastNtError(Status
);
892 case SPI_GETICONTITLELOGFONT
:
896 if(!IntSystemParametersInfo(uiAction
, uiParam
, &IconFont
, fWinIni
))
901 Status
= MmCopyToCaller(pvParam
, &IconFont
, sizeof(LOGFONTW
));
902 if(!NT_SUCCESS(Status
))
904 SetLastNtError(Status
);
909 case SPI_GETNONCLIENTMETRICS
:
911 NONCLIENTMETRICSW metrics
;
913 Status
= MmCopyFromCaller(&metrics
.cbSize
, pvParam
, sizeof(UINT
));
914 if(!NT_SUCCESS(Status
))
916 SetLastNtError(Status
);
919 if((metrics
.cbSize
!= sizeof(NONCLIENTMETRICSW
)) ||
920 (uiParam
!= sizeof(NONCLIENTMETRICSW
)))
922 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
926 if(!IntSystemParametersInfo(uiAction
, uiParam
, &metrics
, fWinIni
))
931 Status
= MmCopyToCaller(pvParam
, &metrics
.cbSize
, sizeof(NONCLIENTMETRICSW
));
932 if(!NT_SUCCESS(Status
))
934 SetLastNtError(Status
);
945 NtUserGetDoubleClickTime(VOID
)
949 PWINSTATION_OBJECT WinStaObject
;
950 PSYSTEM_CURSORINFO CurInfo
;
952 Status
= IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
956 if (!NT_SUCCESS(Status
))
959 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
960 Result
= CurInfo
->DblClickSpeed
;
962 ObDereferenceObject(WinStaObject
);
968 NtUserGetGUIThreadInfo(
970 LPGUITHREADINFO lpgui
)
973 PTHRDCARETINFO CaretInfo
;
974 GUITHREADINFO SafeGui
;
975 PDESKTOP_OBJECT Desktop
;
976 PUSER_MESSAGE_QUEUE MsgQueue
;
977 PETHREAD Thread
= NULL
;
979 Status
= MmCopyFromCaller(&SafeGui
, lpgui
, sizeof(DWORD
));
980 if(!NT_SUCCESS(Status
))
982 SetLastNtError(Status
);
986 if(SafeGui
.cbSize
!= sizeof(GUITHREADINFO
))
988 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
994 Status
= PsLookupThreadByThreadId((PVOID
)idThread
, &Thread
);
995 if(!NT_SUCCESS(Status
))
997 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1000 Desktop
= Thread
->Win32Thread
->Desktop
;
1004 /* get the foreground thread */
1005 PW32THREAD W32Thread
= PsGetCurrentThread()->Win32Thread
;
1006 Desktop
= W32Thread
->Desktop
;
1009 MsgQueue
= Desktop
->ActiveMessageQueue
;
1012 Thread
= MsgQueue
->Thread
;
1017 if(!Thread
|| !Desktop
)
1019 if(idThread
&& Thread
)
1020 ObDereferenceObject(Thread
);
1021 SetLastWin32Error(ERROR_ACCESS_DENIED
);
1025 MsgQueue
= (PUSER_MESSAGE_QUEUE
)Desktop
->ActiveMessageQueue
;
1026 CaretInfo
= MsgQueue
->CaretInfo
;
1028 SafeGui
.flags
= (CaretInfo
->Visible
? GUI_CARETBLINKING
: 0);
1029 if(MsgQueue
->MenuOwner
)
1030 SafeGui
.flags
|= GUI_INMENUMODE
| MsgQueue
->MenuState
;
1031 if(MsgQueue
->MoveSize
)
1032 SafeGui
.flags
|= GUI_INMOVESIZE
;
1034 /* FIXME add flag GUI_16BITTASK */
1036 SafeGui
.hwndActive
= MsgQueue
->ActiveWindow
;
1037 SafeGui
.hwndFocus
= MsgQueue
->FocusWindow
;
1038 SafeGui
.hwndCapture
= MsgQueue
->CaptureWindow
;
1039 SafeGui
.hwndMenuOwner
= MsgQueue
->MenuOwner
;
1040 SafeGui
.hwndMoveSize
= MsgQueue
->MoveSize
;
1041 SafeGui
.hwndCaret
= CaretInfo
->hWnd
;
1043 SafeGui
.rcCaret
.left
= CaretInfo
->Pos
.x
;
1044 SafeGui
.rcCaret
.top
= CaretInfo
->Pos
.y
;
1045 SafeGui
.rcCaret
.right
= SafeGui
.rcCaret
.left
+ CaretInfo
->Size
.cx
;
1046 SafeGui
.rcCaret
.bottom
= SafeGui
.rcCaret
.top
+ CaretInfo
->Size
.cy
;
1049 ObDereferenceObject(Thread
);
1051 Status
= MmCopyToCaller(lpgui
, &SafeGui
, sizeof(GUITHREADINFO
));
1052 if(!NT_SUCCESS(Status
))
1054 SetLastNtError(Status
);
1064 NtUserGetGuiResources(
1069 PW32PROCESS W32Process
;
1073 Status
= ObReferenceObjectByHandle(hProcess
,
1074 PROCESS_QUERY_INFORMATION
,
1076 ExGetPreviousMode(),
1080 if(!NT_SUCCESS(Status
))
1082 SetLastNtError(Status
);
1086 W32Process
= Process
->Win32Process
;
1089 ObDereferenceObject(Process
);
1090 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1098 Ret
= (DWORD
)W32Process
->GDIObjects
;
1101 case GR_USEROBJECTS
:
1103 Ret
= (DWORD
)W32Process
->UserObjects
;
1108 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
1113 ObDereferenceObject(Process
);
1119 IntSafeCopyUnicodeString(PUNICODE_STRING Dest
,
1120 PUNICODE_STRING Source
)
1125 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1126 if(!NT_SUCCESS(Status
))
1131 if(Dest
->Length
> 0x4000)
1133 return STATUS_UNSUCCESSFUL
;
1137 Dest
->Buffer
= NULL
;
1139 if(Dest
->Length
> 0 && Src
)
1141 Dest
->MaximumLength
= Dest
->Length
;
1142 Dest
->Buffer
= ExAllocatePoolWithTag(NonPagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1145 return STATUS_NO_MEMORY
;
1148 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1149 if(!NT_SUCCESS(Status
))
1151 ExFreePool(Dest
->Buffer
);
1152 Dest
->Buffer
= NULL
;
1157 return STATUS_SUCCESS
;
1160 /* string is empty */
1161 return STATUS_SUCCESS
;
1165 IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest
,
1166 PUNICODE_STRING Source
)
1171 Status
= MmCopyFromCaller(Dest
, Source
, sizeof(UNICODE_STRING
));
1172 if(!NT_SUCCESS(Status
))
1177 if(Dest
->Length
> 0x4000)
1179 return STATUS_UNSUCCESSFUL
;
1183 Dest
->Buffer
= NULL
;
1185 if(Dest
->Length
> 0 && Src
)
1187 Dest
->MaximumLength
= Dest
->Length
+ sizeof(WCHAR
);
1188 Dest
->Buffer
= ExAllocatePoolWithTag(NonPagedPool
, Dest
->MaximumLength
, TAG_STRING
);
1191 return STATUS_NO_MEMORY
;
1194 Status
= MmCopyFromCaller(Dest
->Buffer
, Src
, Dest
->Length
);
1195 if(!NT_SUCCESS(Status
))
1197 ExFreePool(Dest
->Buffer
);
1198 Dest
->Buffer
= NULL
;
1202 /* make sure the string is null-terminated */
1203 Src
= (PWSTR
)((PBYTE
)Dest
->Buffer
+ Dest
->Length
);
1206 return STATUS_SUCCESS
;
1209 /* string is empty */
1210 return STATUS_SUCCESS
;
1214 IntUnicodeStringToNULLTerminated(PWSTR
*Dest
, PUNICODE_STRING Src
)
1216 if (Src
->Length
+ sizeof(WCHAR
) <= Src
->MaximumLength
1217 && L
'\0' == Src
->Buffer
[Src
->Length
/ sizeof(WCHAR
)])
1219 /* The unicode_string is already nul terminated. Just reuse it. */
1220 *Dest
= Src
->Buffer
;
1221 return STATUS_SUCCESS
;
1224 *Dest
= ExAllocatePoolWithTag(PagedPool
, Src
->Length
+ sizeof(WCHAR
), TAG_STRING
);
1227 return STATUS_NO_MEMORY
;
1229 RtlCopyMemory(*Dest
, Src
->Buffer
, Src
->Length
);
1230 (*Dest
)[Src
->Length
/ 2] = L
'\0';
1232 return STATUS_SUCCESS
;
1236 IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated
, PUNICODE_STRING UnicodeString
)
1238 if (NullTerminated
!= UnicodeString
->Buffer
)
1240 ExFreePool(NullTerminated
);