ReactOS 0.4.16-dev-91-g764881a
misc.c File Reference
#include <win32k.h>
Include dependency graph for misc.c:

Go to the source code of this file.

Functions

 DBG_DEFAULT_CHANNEL (UserMisc)
 
int __cdecl _scwprintf (const wchar_t *format,...)
 
PTHREADINFO FASTCALL IntTID2PTI (HANDLE id)
 
DWORD FASTCALL UserGetLanguageToggle (_In_ PCWSTR pszType, _In_ DWORD dwDefaultValue)
 
USHORT FASTCALL UserGetLanguageID (VOID)
 
HBRUSH FASTCALL GetControlColor (PWND pwndParent, PWND pwnd, HDC hdc, UINT CtlMsg)
 
HBRUSH FASTCALL GetControlBrush (PWND pwnd, HDC hdc, UINT ctlType)
 
HBRUSH APIENTRY NtUserGetControlBrush (HWND hwnd, HDC hdc, UINT ctlType)
 
HBRUSH APIENTRY NtUserGetControlColor (HWND hwndParent, HWND hwnd, HDC hdc, UINT CtlMsg)
 
DWORD_PTR APIENTRY NtUserGetThreadState (DWORD Routine)
 
DWORD APIENTRY NtUserSetThreadState (DWORD Set, DWORD Flags)
 
UINT APIENTRY NtUserGetDoubleClickTime (VOID)
 
BOOL APIENTRY NtUserGetGUIThreadInfo (DWORD idThread, LPGUITHREADINFO lpgui)
 
DWORD APIENTRY NtUserGetGuiResources (HANDLE hProcess, DWORD uiFlags)
 
VOID FASTCALL IntSetWindowState (PWND pWnd, UINT Flag)
 
VOID FASTCALL IntClearWindowState (PWND pWnd, UINT Flag)
 
NTSTATUS FASTCALL IntSafeCopyUnicodeString (PUNICODE_STRING Dest, PUNICODE_STRING Source)
 
NTSTATUS FASTCALL IntSafeCopyUnicodeStringTerminateNULL (PUNICODE_STRING Dest, PUNICODE_STRING Source)
 
void UserDbgAssertThreadInfo (BOOL showCaller)
 
void NTAPI UserDbgPreServiceHook (ULONG ulSyscallId, PULONG_PTR pulArguments)
 
ULONG_PTR NTAPI UserDbgPostServiceHook (ULONG ulSyscallId, ULONG_PTR ulResult)
 
PPROCESSINFO GetW32ProcessInfo (VOID)
 
PTHREADINFO GetW32ThreadInfo (VOID)
 
NTSTATUS GetProcessLuid (IN PETHREAD Thread OPTIONAL, IN PEPROCESS Process OPTIONAL, OUT PLUID Luid)
 

Function Documentation

◆ _scwprintf()

int __cdecl _scwprintf ( const wchar_t format,
  ... 
)

Definition at line 21 of file misc.c.

24{
25 int len;
27
30 va_end(args);
31
32 return len;
33}
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
GLenum GLsizei len
Definition: glext.h:6722
_Check_return_ _CRTIMP int __cdecl _vscwprintf(_In_z_ _Printf_format_string_ const wchar_t *_Format, va_list _ArgList)
#define args
Definition: format.c:66
Definition: match.c:390
Definition: format.c:58

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( UserMisc  )

◆ GetControlBrush()

HBRUSH FASTCALL GetControlBrush ( PWND  pwnd,
HDC  hdc,
UINT  ctlType 
)

Definition at line 180 of file misc.c.

184{
185 PWND pwndParent = IntGetParent(pwnd);
186 return GetControlColor( pwndParent, pwnd, hdc, ctlType);
187}
HDC hdc
Definition: main.c:9
Definition: ntuser.h:694
HBRUSH FASTCALL GetControlColor(PWND pwndParent, PWND pwnd, HDC hdc, UINT CtlMsg)
Definition: misc.c:154
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:206

Referenced by EDIT_NotifyCtlColor(), IntDrawScrollInterior(), NtUserGetControlBrush(), and STATIC_SendWmCtlColorStatic().

◆ GetControlColor()

HBRUSH FASTCALL GetControlColor ( PWND  pwndParent,
PWND  pwnd,
HDC  hdc,
UINT  CtlMsg 
)

Definition at line 154 of file misc.c.

159{
160 HBRUSH hBrush;
161
162 if (!pwndParent) pwndParent = pwnd;
163
164 if ( pwndParent->head.pti->ppi != PsGetCurrentProcessWin32Process())
165 {
166 return (HBRUSH)IntDefWindowProc( pwndParent, CtlMsg, (WPARAM)hdc, (LPARAM)UserHMGetHandle(pwnd), FALSE);
167 }
168
169 hBrush = (HBRUSH)co_IntSendMessage( UserHMGetHandle(pwndParent), CtlMsg, (WPARAM)hdc, (LPARAM)UserHMGetHandle(pwnd));
170
171 if (!hBrush || !GreIsHandleValid(hBrush))
172 {
173 hBrush = (HBRUSH)IntDefWindowProc( pwndParent, CtlMsg, (WPARAM)hdc, (LPARAM)UserHMGetHandle(pwnd), FALSE);
174 }
175 return hBrush;
176}
#define FALSE
Definition: types.h:117
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
PVOID NTAPI PsGetCurrentProcessWin32Process(VOID)
Definition: process.c:1183
LRESULT FASTCALL IntDefWindowProc(PWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi)
Definition: defwnd.c:535
THRDESKHEAD head
Definition: ntuser.h:695
BOOL NTAPI GreIsHandleValid(HGDIOBJ hobj)
Definition: gdiobj.c:1146
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1495
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207

Referenced by ButtonWndProc_common(), CB_Paint(), COMBO_PrepareColors(), DEFDLG_Proc(), GB_Paint(), GetControlBrush(), IntFillWindow(), LISTBOX_Paint(), LISTBOX_RepaintItem(), ListBoxWndProc_common(), NtUserGetControlColor(), OB_Paint(), PB_Paint(), and UB_Paint().

◆ GetProcessLuid()

NTSTATUS GetProcessLuid ( IN PETHREAD Thread  OPTIONAL,
IN PEPROCESS Process  OPTIONAL,
OUT PLUID  Luid 
)

Definition at line 815 of file misc.c.

819{
824
825 if (Thread && Process)
827
828 /* If nothing has been specified, use the current thread */
829 if (!Thread && !Process)
831
832 if (Thread)
833 {
834 /* Use a thread token */
835 ASSERT(!Process);
837 &CopyOnOpen,
840
841 /* If we don't have a thread token, use a process token */
842 if (!Token)
844 }
845 if (!Token && Process)
846 {
847 /* Use a process token */
849
850 /* If we don't have a token, fail */
851 if (!Token)
852 return STATUS_NO_TOKEN;
853 }
854 ASSERT(Token);
855
856 /* Query the LUID */
858
859 /* Get rid of the token and return */
861 return Status;
862}
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
PEPROCESS __stdcall PsGetThreadProcess(_In_ PETHREAD Thread)
#define NULL
Definition: types.h:112
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:223
Status
Definition: gdiplustypes.h:25
enum _SECURITY_IMPERSONATION_LEVEL SECURITY_IMPERSONATION_LEVEL
#define ASSERT(a)
Definition: mode.c:44
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_ BOOLEAN EffectiveOnly
Definition: sefuncs.h:410
PACCESS_TOKEN NTAPI PsReferencePrimaryToken(PEPROCESS Process)
Definition: security.c:440
PACCESS_TOKEN NTAPI PsReferenceImpersonationToken(IN PETHREAD Thread, OUT PBOOLEAN CopyOnOpen, OUT PBOOLEAN EffectiveOnly, OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel)
Definition: security.c:871
NTSTATUS NTAPI SeQueryAuthenticationIdToken(_In_ PACCESS_TOKEN Token, _Out_ PLUID LogonId)
Queries the authentication ID of an access token.
Definition: token.c:2036
#define STATUS_NO_TOKEN
Definition: ntstatus.h:360
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define ObDereferenceObject
Definition: obfuncs.h:203
_Out_ PBOOLEAN CopyOnOpen
Definition: psfuncs.h:154
_Out_ PBOOLEAN _Out_ PBOOLEAN _Out_ PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel
Definition: psfuncs.h:156

Referenced by BuildUserModeWindowStationName(), IntResolveDesktop(), UserEndShutdown(), and UserInitiateShutdown().

◆ GetW32ProcessInfo()

◆ GetW32ThreadInfo()

PTHREADINFO GetW32ThreadInfo ( VOID  )

Definition at line 807 of file misc.c.

808{
811}
#define TRUE
Definition: types.h:120
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
void UserDbgAssertThreadInfo(BOOL showCaller)
Definition: misc.c:734

Referenced by NtUserGetThreadState().

◆ IntClearWindowState()

VOID FASTCALL IntClearWindowState ( PWND  pWnd,
UINT  Flag 
)

Definition at line 618 of file misc.c.

619{
620 UINT bit;
621 if (gptiCurrent->ppi != pWnd->head.pti->ppi) return;
622 bit = 1 << LOWORD(Flag);
623 TRACE("CWS %x\n",bit);
624 switch(HIWORD(Flag))
625 {
626 case 0:
627 pWnd->state &= ~bit;
628 break;
629 case 1:
630 pWnd->state2 &= ~bit;
631 break;
632 case 2:
633 pWnd->ExStyle2 &= ~bit;
634 break;
635 }
636}
unsigned int UINT
Definition: ndis.h:50
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
#define LOWORD(l)
Definition: pedump.c:82
#define TRACE(s)
Definition: solgame.cpp:4
Definition: xml2sdb.h:80
PPROCESSINFO ppi
Definition: win32.h:88
DWORD ExStyle2
Definition: ntuser.h:745
DWORD state2
Definition: ntuser.h:702
DWORD state
Definition: ntuser.h:701
#define HIWORD(l)
Definition: typedefs.h:247

Referenced by NtUserCallHwndParam().

◆ IntSafeCopyUnicodeString()

NTSTATUS FASTCALL IntSafeCopyUnicodeString ( PUNICODE_STRING  Dest,
PUNICODE_STRING  Source 
)

Definition at line 639 of file misc.c.

641{
643 PWSTR Src;
644
646 if(!NT_SUCCESS(Status))
647 {
648 return Status;
649 }
650
651 if(Dest->Length > 0x4000)
652 {
653 return STATUS_UNSUCCESSFUL;
654 }
655
656 Src = Dest->Buffer;
657 Dest->Buffer = NULL;
658 Dest->MaximumLength = Dest->Length;
659
660 if(Dest->Length > 0 && Src)
661 {
663 if(!Dest->Buffer)
664 {
665 return STATUS_NO_MEMORY;
666 }
667
668 Status = MmCopyFromCaller(Dest->Buffer, Src, Dest->Length);
669 if(!NT_SUCCESS(Status))
670 {
672 Dest->Buffer = NULL;
673 return Status;
674 }
675
676
677 return STATUS_SUCCESS;
678 }
679
680 /* String is empty */
681 return STATUS_SUCCESS;
682}
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3169
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define TAG_STRING
Definition: oslist.h:22
#define MmCopyFromCaller
Definition: polytest.cpp:29
#define STATUS_SUCCESS
Definition: shellext.h:65
USHORT MaximumLength
Definition: env_spec_w32.h:370
uint16_t * PWSTR
Definition: typedefs.h:56
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132

◆ IntSafeCopyUnicodeStringTerminateNULL()

NTSTATUS FASTCALL IntSafeCopyUnicodeStringTerminateNULL ( PUNICODE_STRING  Dest,
PUNICODE_STRING  Source 
)

Definition at line 685 of file misc.c.

687{
689 PWSTR Src;
690
692 if(!NT_SUCCESS(Status))
693 {
694 return Status;
695 }
696
697 if(Dest->Length > 0x4000)
698 {
699 return STATUS_UNSUCCESSFUL;
700 }
701
702 Src = Dest->Buffer;
703 Dest->Buffer = NULL;
704 Dest->MaximumLength = 0;
705
706 if(Dest->Length > 0 && Src)
707 {
708 Dest->MaximumLength = Dest->Length + sizeof(WCHAR);
710 if(!Dest->Buffer)
711 {
712 return STATUS_NO_MEMORY;
713 }
714
715 Status = MmCopyFromCaller(Dest->Buffer, Src, Dest->Length);
716 if(!NT_SUCCESS(Status))
717 {
719 Dest->Buffer = NULL;
720 return Status;
721 }
722
723 /* Make sure the string is null-terminated */
724 Src = (PWSTR)((PBYTE)Dest->Buffer + Dest->Length);
725 *Src = L'\0';
726
727 return STATUS_SUCCESS;
728 }
729
730 /* String is empty */
731 return STATUS_SUCCESS;
732}
#define L(x)
Definition: ntvdm.h:50
BYTE * PBYTE
Definition: pedump.c:66
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by InitThreadCallback(), and NtUserRegisterWindowMessage().

◆ IntSetWindowState()

VOID FASTCALL IntSetWindowState ( PWND  pWnd,
UINT  Flag 
)

Definition at line 597 of file misc.c.

598{
599 UINT bit;
600 if (gptiCurrent->ppi != pWnd->head.pti->ppi) return;
601 bit = 1 << LOWORD(Flag);
602 TRACE("SWS %x\n",bit);
603 switch(HIWORD(Flag))
604 {
605 case 0:
606 pWnd->state |= bit;
607 break;
608 case 1:
609 pWnd->state2 |= bit;
610 break;
611 case 2:
612 pWnd->ExStyle2 |= bit;
613 break;
614 }
615}

Referenced by NtUserCallHwndParam().

◆ IntTID2PTI()

PTHREADINFO FASTCALL IntTID2PTI ( HANDLE  id)

Definition at line 42 of file misc.c.

43{
46 PTHREADINFO pti;
48 if (!NT_SUCCESS(Status))
49 {
50 return NULL;
51 }
53 {
55 return NULL;
56 }
58 if (!pti)
59 {
61 return NULL;
62 }
63 // Validate and verify!
65 {
66 if (pti->TIF_flags & TIF_INCLEANUP) pti = NULL;
67 if (pti && !(pti->TIF_flags & TIF_GUITHREADINITIALIZED)) pti = NULL;
68 if (PsGetThreadId(Thread) != id) pti = NULL;
69 }
71 {
72 pti = NULL;
73 }
76 return pti;
77}
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
#define TIF_INCLEANUP
Definition: ntuser.h:263
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:287
HANDLE NTAPI PsGetThreadId(IN PETHREAD Thread)
Definition: thread.c:705
NTSTATUS NTAPI PsLookupThreadByThreadId(IN HANDLE ThreadId, OUT PETHREAD *Thread)
Definition: thread.c:643
PVOID NTAPI PsGetThreadWin32Thread(IN PETHREAD Thread)
Definition: thread.c:795
BOOLEAN NTAPI PsIsThreadTerminating(IN PETHREAD Thread)
Definition: thread.c:868
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:66
FLONG TIF_flags
Definition: win32.h:95

Referenced by NtUserAttachThreadInput(), NtUserBuildHimcList(), NtUserDisableThreadIme(), NtUserGetGUIThreadInfo(), NtUserGetThreadDesktop(), NtUserGetThreadState(), and NtUserSetWindowsHookEx().

◆ NtUserGetControlBrush()

HBRUSH APIENTRY NtUserGetControlBrush ( HWND  hwnd,
HDC  hdc,
UINT  ctlType 
)

Definition at line 191 of file misc.c.

195{
196 PWND pwnd;
197 HBRUSH hBrush = NULL;
198
200 if ( (pwnd = UserGetWindowObject(hwnd)) &&
201 ((ctlType - WM_CTLCOLORMSGBOX) < CTLCOLOR_MAX) &&
202 hdc )
203 {
204 hBrush = GetControlBrush(pwnd, hdc, ctlType);
205 }
206 UserLeave();
207 return hBrush;
208}
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:249
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:124
HBRUSH FASTCALL GetControlBrush(PWND pwnd, HDC hdc, UINT ctlType)
Definition: misc.c:180
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WM_CTLCOLORMSGBOX
Definition: winuser.h:1769
#define CTLCOLOR_MAX
Definition: winuser.h:961

Referenced by GetControlBrush().

◆ NtUserGetControlColor()

HBRUSH APIENTRY NtUserGetControlColor ( HWND  hwndParent,
HWND  hwnd,
HDC  hdc,
UINT  CtlMsg 
)

Definition at line 215 of file misc.c.

220{
221 PWND pwnd, pwndParent = NULL;
222 HBRUSH hBrush = NULL;
223
225 if ( (pwnd = UserGetWindowObject(hwnd)) &&
226 ((CtlMsg - WM_CTLCOLORMSGBOX) < CTLCOLOR_MAX) &&
227 hdc )
228 {
229 if (hwndParent) pwndParent = UserGetWindowObject(hwndParent);
230 hBrush = GetControlColor( pwndParent, pwnd, hdc, CtlMsg);
231 }
232 UserLeave();
233 return hBrush;
234}
static HWND hwndParent
Definition: cryptui.c:300

Referenced by GetControlColor().

◆ NtUserGetDoubleClickTime()

UINT APIENTRY NtUserGetDoubleClickTime ( VOID  )

Definition at line 388 of file misc.c.

389{
390 UINT Result;
391
392 TRACE("Enter NtUserGetDoubleClickTime\n");
394
395 // FIXME: Check if this works on non-interactive winsta
397
398 TRACE("Leave NtUserGetDoubleClickTime, ret=%u\n", Result);
399 UserLeave();
400 return Result;
401}
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:242
INT iDblClickTime
Definition: sysparams.h:90
SPIVALUES gspv
Definition: sysparams.c:17
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409

Referenced by GetDoubleClickTime().

◆ NtUserGetGuiResources()

DWORD APIENTRY NtUserGetGuiResources ( HANDLE  hProcess,
DWORD  uiFlags 
)

Definition at line 536 of file misc.c.

539{
541 PPROCESSINFO W32Process;
543 DWORD Ret = 0;
544
545 TRACE("Enter NtUserGetGuiResources\n");
547
552 (PVOID*)&Process,
553 NULL);
554
555 if(!NT_SUCCESS(Status))
556 {
558 goto Exit; // Return 0
559 }
560
561 W32Process = (PPROCESSINFO)Process->Win32Process;
562 if(!W32Process)
563 {
566 goto Exit; // Return 0
567 }
568
569 switch(uiFlags)
570 {
571 case GR_GDIOBJECTS:
572 {
573 Ret = (DWORD)W32Process->GDIHandleCount;
574 break;
575 }
576 case GR_USEROBJECTS:
577 {
578 Ret = (DWORD)W32Process->UserHandleCount;
579 break;
580 }
581 default:
582 {
584 break;
585 }
586 }
587
589
590Exit:
591 TRACE("Leave NtUserGetGuiResources, ret=%lu\n", Ret);
592 UserLeave();
593 return Ret;
594}
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define ExGetPreviousMode
Definition: ex.h:140
unsigned long DWORD
Definition: ntddk_ex.h:95
#define PROCESS_QUERY_INFORMATION
Definition: pstypes.h:167
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:71
#define DWORD
Definition: nt_native.h:44
POBJECT_TYPE PsProcessType
Definition: process.c:20
struct _PROCESSINFO * PPROCESSINFO
Definition: ntwin32.h:5
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494
static void Exit(void)
Definition: sock.c:1330
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:31
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:22

Referenced by GetGuiResources().

◆ NtUserGetGUIThreadInfo()

BOOL APIENTRY NtUserGetGUIThreadInfo ( DWORD  idThread,
LPGUITHREADINFO  lpgui 
)

Definition at line 405 of file misc.c.

408{
410 PTHRDCARETINFO CaretInfo;
411 GUITHREADINFO SafeGui;
413 PUSER_MESSAGE_QUEUE MsgQueue;
414 PTHREADINFO W32Thread, pti;
415 BOOL Ret = FALSE;
416
417 TRACE("Enter NtUserGetGUIThreadInfo\n");
419
420 Status = MmCopyFromCaller(&SafeGui, lpgui, sizeof(DWORD));
421 if(!NT_SUCCESS(Status))
422 {
424 goto Exit; // Return FALSE
425 }
426
427 if(SafeGui.cbSize != sizeof(GUITHREADINFO))
428 {
430 goto Exit; // Return FALSE
431 }
432
433 if (idThread)
434 {
436
437 // Validate Tread ID
438 W32Thread = IntTID2PTI(UlongToHandle(idThread));
439
440 if ( !W32Thread )
441 {
443 goto Exit; // Return FALSE
444 }
445
446 Desktop = W32Thread->rpdesk;
447
448 // Check Desktop and it must be the same as current.
449 if ( !Desktop || Desktop != pti->rpdesk )
450 {
452 goto Exit; // Return FALSE
453 }
454
455 if ( W32Thread->MessageQueue )
456 MsgQueue = W32Thread->MessageQueue;
457 else
458 {
459 MsgQueue = Desktop->ActiveMessageQueue;
460 }
461 }
462 else
463 { /* Get the foreground thread */
464 /* FIXME: Handle NULL queue properly? */
465 MsgQueue = IntGetFocusMessageQueue();
466 if(!MsgQueue)
467 {
469 goto Exit; // Return FALSE
470 }
471 }
472
473 CaretInfo = &MsgQueue->CaretInfo;
474
475 SafeGui.flags = (CaretInfo->Visible ? GUI_CARETBLINKING : 0);
476/*
477 if (W32Thread->pMenuState->pGlobalPopupMenu)
478 {
479 SafeGui.flags |= GUI_INMENUMODE;
480
481 if (W32Thread->pMenuState->pGlobalPopupMenu->spwndNotify)
482 SafeGui.hwndMenuOwner = UserHMGetHandle(W32Thread->pMenuState->pGlobalPopupMenu->spwndNotify);
483
484 if (W32Thread->pMenuState->pGlobalPopupMenu->fHasMenuBar)
485 {
486 if (W32Thread->pMenuState->pGlobalPopupMenu->fIsSysMenu)
487 {
488 SafeGui.flags |= GUI_SYSTEMMENUMODE;
489 }
490 }
491 else
492 {
493 SafeGui.flags |= GUI_POPUPMENUMODE;
494 }
495 }
496 */
497 SafeGui.hwndMenuOwner = MsgQueue->MenuOwner;
498
499 if (MsgQueue->MenuOwner)
500 SafeGui.flags |= GUI_INMENUMODE | MsgQueue->MenuState;
501
502 if (MsgQueue->MoveSize)
503 SafeGui.flags |= GUI_INMOVESIZE;
504
505 /* FIXME: Add flag GUI_16BITTASK */
506
507 SafeGui.hwndActive = MsgQueue->spwndActive ? UserHMGetHandle(MsgQueue->spwndActive) : 0;
508 SafeGui.hwndFocus = MsgQueue->spwndFocus ? UserHMGetHandle(MsgQueue->spwndFocus) : 0;
509 SafeGui.hwndCapture = MsgQueue->spwndCapture ? UserHMGetHandle(MsgQueue->spwndCapture) : 0;
510 SafeGui.hwndMoveSize = MsgQueue->MoveSize;
511 SafeGui.hwndCaret = CaretInfo->hWnd;
512
513 SafeGui.rcCaret.left = CaretInfo->Pos.x;
514 SafeGui.rcCaret.top = CaretInfo->Pos.y;
515 SafeGui.rcCaret.right = SafeGui.rcCaret.left + CaretInfo->Size.cx;
516 SafeGui.rcCaret.bottom = SafeGui.rcCaret.top + CaretInfo->Size.cy;
517
518 Status = MmCopyToCaller(lpgui, &SafeGui, sizeof(GUITHREADINFO));
519 if(!NT_SUCCESS(Status))
520 {
522 goto Exit; // Return FALSE
523 }
524
525 Ret = TRUE;
526
527Exit:
528 TRACE("Leave NtUserGetGUIThreadInfo, ret=%i\n", Ret);
529 UserLeave();
530 return Ret;
531}
#define UlongToHandle(ul)
Definition: basetsd.h:97
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
unsigned int BOOL
Definition: ntddk_ex.h:94
#define MmCopyToCaller(x, y, z)
Definition: mmcopy.h:19
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
struct _DESKTOP * rpdesk
Definition: win32.h:92
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:89
THRDCARETINFO CaretInfo
Definition: msgqueue.h:92
HWND hwndCaret
Definition: winable.h:77
HWND hwndFocus
Definition: winable.h:73
HWND hwndMenuOwner
Definition: winable.h:75
HWND hwndMoveSize
Definition: winable.h:76
DWORD cbSize
Definition: winable.h:70
HWND hwndCapture
Definition: winable.h:74
HWND hwndActive
Definition: winable.h:72
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1324
PTHREADINFO FASTCALL IntTID2PTI(HANDLE id)
Definition: misc.c:42
#define GUI_INMENUMODE
Definition: winable.h:29
#define GUI_CARETBLINKING
Definition: winable.h:27
#define GUI_INMOVESIZE
Definition: winable.h:28

Referenced by GetGUIThreadInfo().

◆ NtUserGetThreadState()

DWORD_PTR APIENTRY NtUserGetThreadState ( DWORD  Routine)

Definition at line 240 of file misc.c.

242{
243 DWORD_PTR ret = 0;
244 PTHREADINFO pti;
245
246 TRACE("Enter NtUserGetThreadState\n");
247 if (Routine != THREADSTATE_GETTHREADINFO)
248 {
250 }
251 else
252 {
254 }
255
257
258 switch (Routine)
259 {
261 ret = TRUE;
262 break;
265 break;
267 /* FIXME: Should use UserEnterShared */
269 break;
270 case THREADSTATE_PROGMANWINDOW: /* FIXME: Delete this HACK */
271 ret = (DWORD_PTR)GetW32ThreadInfo()->pDeskInfo->hProgmanWindow;
272 break;
273 case THREADSTATE_TASKMANWINDOW: /* FIXME: Delete this HACK */
274 ret = (DWORD_PTR)GetW32ThreadInfo()->pDeskInfo->hTaskManWindow;
275 break;
278 break;
280 {
283 TRACE("THREADSTATE_INSENDMESSAGE\n");
284
285 ret = ISMEX_NOSEND;
286 if (Message)
287 {
288 if (Message->ptiSender)
289 ret = ISMEX_SEND;
290 else
291 {
292 if (Message->CompletionCallback)
293 ret = ISMEX_CALLBACK;
294 else
295 ret = ISMEX_NOTIFY;
296 }
297 /* If ReplyMessage */
298 if (Message->QS_Flags & QS_SMRESULT) ret |= ISMEX_REPLIED;
299 }
300
301 break;
302 }
305 break;
306
308 pti->pcti->timeLastRead = EngGetTickCount32();
309 break;
310
313 break;
314
317 break;
319 ret = (DWORD_PTR) (GetW32ThreadInfo()->MessageQueue->CursorObject ?
320 UserHMGetHandle(GetW32ThreadInfo()->MessageQueue->CursorObject) : 0);
321 break;
324 break;
326 if (pti->spwndDefaultIme)
328 break;
330 if (pti->spDefaultImc)
332 break;
334 ret = pti->pcti->fsChangeBits;
335 break;
337 ret = pti->ppi->dwImeCompatFlags;
338 break;
340 ret = (ULONG_PTR)pti->hklPrev;
341 break;
344 break;
346 FIXME("stub\n");
347 break;
349 ret = (IntTID2PTI(UlongToHandle(pti->rpdesk->dwConsoleThreadId)) == pti);
350 break;
351 }
352
353 TRACE("Leave NtUserGetThreadState, ret=%lu\n", ret);
354 UserLeave();
355
356 return ret;
357}
#define FIXME(fmt,...)
Definition: precomp.h:53
static const WCHAR Message[]
Definition: register.c:74
#define ULONG_PTR
Definition: config.h:101
#define EngGetTickCount32()
Definition: eng.h:43
HWND FASTCALL IntGetThreadFocusWindow(VOID)
Definition: focus.c:41
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:13
HWND APIENTRY IntGetCapture(VOID)
Definition: focus.c:1443
HWND FASTCALL UserGetActiveWindow(VOID)
Definition: focus.c:1432
@ THREADSTATE_GETCURSOR
Definition: ntuser.h:2478
@ THREADSTATE_DEFAULTIMEWINDOW
Definition: ntuser.h:2475
@ THREADSTATE_DEFAULTINPUTCONTEXT
Definition: ntuser.h:2476
@ THREADSTATE_CHECKCONIME
Definition: ntuser.h:2489
@ THREADSTATE_INSENDMESSAGE
Definition: ntuser.h:2482
@ THREADSTATE_GETTHREADINFO
Definition: ntuser.h:2490
@ THREADSTATE_CAPTUREWINDOW
Definition: ntuser.h:2474
@ THREADSTATE_TASKMANWINDOW
Definition: ntuser.h:2492
@ THREADSTATE_UNKNOWN_0x10
Definition: ntuser.h:2488
@ THREADSTATE_FOREGROUNDTHREAD
Definition: ntuser.h:2484
@ THREADSTATE_OLDKEYBOARDLAYOUT
Definition: ntuser.h:2486
@ THREADSTATE_GETINPUTSTATE
Definition: ntuser.h:2477
@ THREADSTATE_PROGMANWINDOW
Definition: ntuser.h:2491
@ THREADSTATE_ACTIVEWINDOW
Definition: ntuser.h:2473
@ THREADSTATE_GETMESSAGETIME
Definition: ntuser.h:2483
@ THREADSTATE_FOCUSWINDOW
Definition: ntuser.h:2472
@ THREADSTATE_GETMESSAGEEXTRAINFO
Definition: ntuser.h:2481
@ THREADSTATE_ISWINLOGON
Definition: ntuser.h:2487
@ THREADSTATE_UPTIMELASTREAD
Definition: ntuser.h:2480
@ THREADSTATE_CHANGEBITS
Definition: ntuser.h:2479
@ THREADSTATE_IMECOMPATFLAGS
Definition: ntuser.h:2485
LPARAM FASTCALL MsqGetMessageExtraInfo(VOID)
Definition: msgqueue.c:2461
HANDLE NTAPI PsGetCurrentProcessId(VOID)
Definition: process.c:1123
struct _THREADINFO * PTHREADINFO
Definition: ntwin32.h:6
HANDLE gpidLogon
Definition: simplecall.c:15
DWORD dwImeCompatFlags
Definition: win32.h:276
struct _DESKTOPINFO * pDeskInfo
Definition: win32.h:93
struct tagIMC * spDefaultImc
Definition: win32.h:132
HKL hklPrev
Definition: win32.h:133
struct _CLIENTTHREADINFO * pcti
Definition: win32.h:91
struct _WND * spwndDefaultIme
Definition: win32.h:131
#define DWORD_PTR
Definition: treelist.c:76
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define QS_SMRESULT
Definition: undocuser.h:95
int ret
DWORD APIENTRY IntGetQueueStatus(DWORD Changes)
Definition: message.c:2139
PTHREADINFO GetW32ThreadInfo(VOID)
Definition: misc.c:807
#define QS_KEY
Definition: winuser.h:877
#define QS_SENDMESSAGE
Definition: winuser.h:883
#define QS_TIMER
Definition: winuser.h:881
#define QS_MOUSEBUTTON
Definition: winuser.h:879
#define QS_INPUT
Definition: winuser.h:902
#define QS_POSTMESSAGE
Definition: winuser.h:880
#define QS_PAINT
Definition: winuser.h:882

Referenced by CheckThreadState(), DIALOG_CreateIndirect(), DoTest_BUTTON(), DoTest_EDIT(), GetActiveWindow(), GetCapture(), GetCursor(), GetFocus(), GetInputState(), GetMessageTime(), GetProgmanWindow(), GetTaskmanWindow(), GetW32ThreadInfo(), ImeWnd_OnImeSetContext(), Imm32CurrentPti(), Imm32ImeNonImeToggle(), Imm32InquireIme(), ImmCreateContext(), ImmDllInitialize(), ImmGetDefaultIMEWnd(), ImmGetSaveContext(), ImmLockClientImc(), ImmWINNLSEnableIME(), InSendMessage(), InSendMessageEx(), IsGUIThread(), NtUserxGetMessageExtraInfo(), and PeekMessageWorker().

◆ NtUserSetThreadState()

DWORD APIENTRY NtUserSetThreadState ( DWORD  Set,
DWORD  Flags 
)

Definition at line 361 of file misc.c.

364{
365 PTHREADINFO pti;
366 DWORD Ret = 0;
367 // Test the only flags user can change.
372 if (pti->MessageQueue)
373 {
374 Ret = pti->MessageQueue->QF_flags; // Get the queue flags.
375 if (Set)
376 pti->MessageQueue->QF_flags |= (Set&Flags); // Set the queue flags.
377 else
378 {
379 if (Flags) pti->MessageQueue->QF_flags &= ~Flags; // Clr the queue flags.
380 }
381 }
382 UserLeave();
383 return Ret;
384}
#define QF_DIALOGACTIVE
Definition: msgqueue.h:106
#define QF_TABSWITCHING
Definition: msgqueue.h:101
#define QF_FMENUSTATUSBREAK
Definition: msgqueue.h:96
#define QF_FMENUSTATUS
Definition: msgqueue.h:97
#define QF_FF10STATUS
Definition: msgqueue.h:98
static BOOL Set
Definition: pageheap.c:10
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170

Referenced by DEFDLG_Proc().

◆ UserDbgAssertThreadInfo()

void UserDbgAssertThreadInfo ( BOOL  showCaller)

Definition at line 734 of file misc.c.

735{
736 PTEB Teb;
737 PPROCESSINFO ppi;
738 PCLIENTINFO pci;
739 PTHREADINFO pti;
740
743 Teb = NtCurrentTeb();
744 pci = GetWin32ClientInfo();
745
746 ASSERT(Teb);
747 ASSERT(pti);
748 ASSERT(pti->ppi == ppi);
749 ASSERT(pti->pClientInfo == pci);
750 ASSERT(Teb->Win32ThreadInfo == pti);
751 ASSERT(pci->ppi == ppi);
752 ASSERT(pci->fsHooks == pti->fsHooks);
754 if (pti->pcti && pci->pDeskInfo)
755 ASSERT(pci->pClientThreadInfo == (PVOID)((ULONG_PTR)pti->pcti - pci->ulClientDelta));
756 if (pti->KeyboardLayout)
757 ASSERT(pci->hKL == pti->KeyboardLayout->hkl);
758 if(pti->rpdesk != NULL)
759 ASSERT(pti->pDeskInfo == pti->rpdesk->pDeskInfo);
760
761 /*too bad we still get this assertion*/
762
763 // Why? Not all flags are passed to the user and doing so could crash the system........
764
765 /* ASSERT(pci->dwTIFlags == pti->TIF_flags); */
766/* if(pci->dwTIFlags != pti->TIF_flags)
767 {
768 ERR("pci->dwTIFlags(0x%x) doesn't match pti->TIF_flags(0x%x)\n", pci->dwTIFlags, pti->TIF_flags);
769 if(showCaller)
770 {
771 DbgPrint("Caller:\n");
772 KeRosDumpStackFrames(NULL, 10);
773 }
774 pci->dwTIFlags = pti->TIF_flags;
775 }
776*/
777}
#define GetWin32ClientInfo()
Definition: ntuser.h:352
#define NtCurrentTeb
HKL hKL
Definition: ntuser.h:339
ULONG_PTR ulClientDelta
Definition: ntuser.h:326
ULONG fsHooks
Definition: ntuser.h:328
PCLIENTTHREADINFO pClientThreadInfo
Definition: ntuser.h:332
PDESKTOPINFO pDeskInfo
Definition: ntuser.h:325
struct _PROCESSINFO * ppi
Definition: ntuser.h:346
Definition: compat.h:836
PVOID Win32ThreadInfo
Definition: compat.h:846
ULONG fsHooks
Definition: win32.h:117
struct _CLIENTINFO * pClientInfo
Definition: win32.h:94
struct tagKL * KeyboardLayout
Definition: win32.h:90
uint32_t ULONG_PTR
Definition: typedefs.h:65
static __inline ULONG_PTR DesktopHeapGetUserDelta(VOID)
Definition: desktop.h:272

Referenced by GetW32ThreadInfo(), UserDbgPostServiceHook(), and UserDbgPreServiceHook().

◆ UserDbgPostServiceHook()

ULONG_PTR NTAPI UserDbgPostServiceHook ( ULONG  ulSyscallId,
ULONG_PTR  ulResult 
)

Definition at line 788 of file misc.c.

789{
790 /* Make sure that the first syscall is NtUserInitialize */
791 /* too bad this fails */
792 // ASSERT(gpepCSRSS);
793
795
796 return ulResult;
797}

◆ UserDbgPreServiceHook()

void NTAPI UserDbgPreServiceHook ( ULONG  ulSyscallId,
PULONG_PTR  pulArguments 
)

Definition at line 781 of file misc.c.

782{
784}

◆ UserGetLanguageID()

USHORT FASTCALL UserGetLanguageID ( VOID  )

Definition at line 105 of file misc.c.

106{
108 OBJECT_ATTRIBUTES ObAttr;
109// http://support.microsoft.com/kb/324097
113 UNICODE_STRING Language;
114
115 RtlInitUnicodeString( &Language,
116 L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Nls\\Language");
117
119 &Language,
121 NULL,
122 NULL);
123
124 if ( NT_SUCCESS(ZwOpenKey(&KeyHandle, KEY_READ, &ObAttr)))
125 {
127 if ( pKeyInfo )
128 {
129 RtlInitUnicodeString(&Language, L"Default");
130
131 if ( NT_SUCCESS(ZwQueryValueKey( KeyHandle,
132 &Language,
134 pKeyInfo,
135 Size,
136 &Size)) )
137 {
138 RtlInitUnicodeString(&Language, (PWSTR)pKeyInfo->Data);
139 if (!NT_SUCCESS(RtlUnicodeStringToInteger(&Language, 16, &Ret)))
140 {
142 }
143 }
144 ExFreePoolWithTag(pKeyInfo, TAG_STRING);
145 }
147 }
148 TRACE("Language ID = %x\n",Ret);
149 return (USHORT) Ret;
150}
#define MAX_PATH
Definition: compat.h:34
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
@ KeyValuePartialInformation
Definition: nt_native.h:1182
#define KEY_READ
Definition: nt_native.h:1023
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)
struct _KEY_VALUE_PARTIAL_INFORMATION KEY_VALUE_PARTIAL_INFORMATION
unsigned short USHORT
Definition: pedump.c:61
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_ENGLISH
Definition: nls.h:52
#define SUBLANG_DEFAULT
Definition: nls.h:168
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533

Referenced by InitializeGreCSRSS().

◆ UserGetLanguageToggle()

DWORD FASTCALL UserGetLanguageToggle ( _In_ PCWSTR  pszType,
_In_ DWORD  dwDefaultValue 
)
See also
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc976564%28v=technet.10%29

Definition at line 84 of file misc.c.

87{
89 DWORD dwValue = dwDefaultValue;
90 WCHAR szBuff[4];
91
92 Status = RegReadUserSetting(L"Keyboard Layout\\Toggle", pszType, REG_SZ, szBuff, sizeof(szBuff));
93 if (NT_SUCCESS(Status))
94 {
95 szBuff[RTL_NUMBER_OF(szBuff) - 1] = UNICODE_NULL;
96 dwValue = _wtoi(szBuff);
97 }
98
99 TRACE("%ls: %lu\n", pszType, dwValue);
100 return dwValue;
101}
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
#define REG_SZ
Definition: layer.c:22
#define UNICODE_NULL

Referenced by SpiGetSet(), and SpiUpdatePerUserSystemParameters().