ReactOS  0.4.12-dev-914-g71f84a3
userfuncs.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define ASSERT_REFS_CO(_obj_)
 
#define DUMP_REFS(obj)   TRACE_CH(UserObj,"obj 0x%x, refs %i\n",obj, ((PHEAD)obj)->cLockObj)
 

Functions

FORCEINLINE PMENU UserGetMenuObject (HMENU hMenu)
 
PWND FASTCALL IntGetWindowObject (HWND hWnd)
 
BOOL FASTCALL IntDdeSendMessageHook (PWND, UINT, WPARAM, LPARAM)
 
BOOL APIENTRY IntDdePostMessageHook (IN PWND, IN UINT, IN WPARAM, IN OUT LPARAM *, IN OUT LONG_PTR *)
 
BOOL APIENTRY IntDdeGetMessageHook (PMSG, LONG_PTR)
 
NTSTATUS NTAPI InitThreadCallback (PETHREAD Thread)
 
HWINSTA FASTCALL UserGetProcessWindowStation (VOID)
 
HWND FASTCALL UserGetActiveWindow (VOID)
 
HWND FASTCALL UserGetForegroundWindow (VOID)
 
HWND FASTCALL co_UserSetFocus (PWND Window)
 
INT FASTCALL UserReleaseDC (PWND Window, HDC hDc, BOOL EndPaint)
 
HDC FASTCALL UserGetDCEx (PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
 
HDC FASTCALL UserGetWindowDC (PWND Wnd)
 
NTSTATUS FASTCALL InitSessionImpl (VOID)
 
BOOL NTAPI InitMetrics (VOID)
 
LONG NTAPI UserGetSystemMetrics (ULONG Index)
 
DWORD FASTCALL UserGetKeyState (DWORD key)
 
DWORD FASTCALL UserGetKeyboardType (DWORD TypeFlag)
 
HKL FASTCALL UserGetKeyboardLayout (DWORD dwThreadId)
 
int __cdecl _scwprintf (const wchar_t *format,...)
 
BOOL FASTCALL UserSystemParametersInfo (UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
 
VOID FASTCALL IntSetWindowState (PWND, UINT)
 
VOID FASTCALL IntClearWindowState (PWND, UINT)
 
PTHREADINFO FASTCALL IntTID2PTI (HANDLE)
 
HBRUSH FASTCALL GetControlBrush (PWND, HDC, UINT)
 
HBRUSH FASTCALL GetControlColor (PWND, PWND, HDC, UINT)
 
NTSTATUS GetProcessLuid (IN PETHREAD Thread OPTIONAL, IN PEPROCESS Process OPTIONAL, OUT PLUID Luid)
 
BOOL FASTCALL UserPostMessage (HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
 
PWND FASTCALL UserGetWindowObject (HWND hWnd)
 
VOID FASTCALL co_DestroyThreadWindows (struct _ETHREAD *Thread)
 
HWND FASTCALL UserGetShellWindow (VOID)
 
BOOLEAN co_UserDestroyWindow (PVOID Object)
 
PWND FASTCALL UserGetAncestor (PWND Wnd, UINT Type)
 
BOOL APIENTRY DefSetText (PWND Wnd, PCWSTR WindowText)
 
DWORD FASTCALL IntGetWindowContextHelpId (PWND pWnd)
 
HMENU FASTCALL UserCreateMenu (PDESKTOP Desktop, BOOL PopupMenu)
 
BOOL FASTCALL UserSetMenuDefaultItem (PMENU Menu, UINT uItem, UINT fByPos)
 
BOOL FASTCALL UserDestroyMenu (HMENU hMenu)
 
VOID FASTCALL DefWndDoSizeMove (PWND pwnd, WORD wParam)
 
LRESULT NC_DoNCPaint (PWND, HDC, INT)
 
void FASTCALL NC_GetSysPopupPos (PWND, RECT *)
 
LRESULT NC_HandleNCActivate (PWND Wnd, WPARAM wParam, LPARAM lParam)
 
LRESULT NC_HandleNCCalcSize (PWND wnd, WPARAM wparam, RECTL *winRect, BOOL Suspended)
 
VOID NC_DrawFrame (HDC hDC, RECT *CurrentRect, BOOL Active, DWORD Style, DWORD ExStyle)
 
VOID UserDrawCaptionBar (PWND pWnd, HDC hDC, INT Flags)
 
void FASTCALL NC_GetInsideRect (PWND Wnd, RECT *rect)
 
LRESULT NC_HandleNCLButtonDown (PWND Wnd, WPARAM wParam, LPARAM lParam)
 
LRESULT NC_HandleNCLButtonDblClk (PWND Wnd, WPARAM wParam, LPARAM lParam)
 
LRESULT NC_HandleNCRButtonDown (PWND wnd, WPARAM wParam, LPARAM lParam)
 
HBRUSH FASTCALL DefWndControlColor (HDC hDC, UINT ctlType)
 
BOOL UserDrawSysMenuButton (PWND pWnd, HDC hDC, LPRECT Rect, BOOL Down)
 
BOOL UserPaintCaption (PWND pWnd, INT Flags)
 
BOOL FASTCALL SetLayeredStatus (PWND pWnd, BYTE set)
 
BOOL FASTCALL GetLayeredStatus (PWND pWnd)
 

Variables

PRTL_ATOM_TABLE gAtomTable
 

Macro Definition Documentation

◆ ASSERT_REFS_CO

#define ASSERT_REFS_CO (   _obj_)
Value:
{ \
LONG ref = ((PHEAD)_obj_)->cLockObj;\
if (!(ref >= 1)){ \
ERR_CH(UserObj, "ASSERT: obj 0x%p, refs %ld\n", _obj_, ref); \
ASSERT(FALSE); \
} \
}
Definition: send.c:47
struct _HEAD * PHEAD

Definition at line 13 of file userfuncs.h.

◆ DUMP_REFS

#define DUMP_REFS (   obj)    TRACE_CH(UserObj,"obj 0x%x, refs %i\n",obj, ((PHEAD)obj)->cLockObj)

Definition at line 44 of file userfuncs.h.

Function Documentation

◆ _scwprintf()

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

Definition at line 13 of file _scwprintf.c.

16 {
17  int len;
18  va_list args;
19 
22  va_end(args);
23 
24  return len;
25 }
Definition: match.c:390
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
#define va_end(ap)
Definition: acmsvcex.h:90
char * va_list
Definition: acmsvcex.h:78
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 va_start(ap, A)
Definition: acmsvcex.h:91
#define args
Definition: format.c:66

Referenced by UserpFormatMessages().

◆ co_DestroyThreadWindows()

VOID FASTCALL co_DestroyThreadWindows ( struct _ETHREAD Thread)

◆ co_UserDestroyWindow()

BOOLEAN co_UserDestroyWindow ( PVOID  Object)

Definition at line 2629 of file window.c.

2630 {
2631  HWND hWnd;
2632  PWND pwndTemp;
2633  PTHREADINFO ti;
2634  MSG msg;
2635  PWND Window = Object;
2636 
2637  ASSERT_REFS_CO(Window); // FIXME: Temp HACK?
2638 
2639  hWnd = Window->head.h;
2641 
2642  TRACE("co_UserDestroyWindow(Window = 0x%p, hWnd = 0x%p)\n", Window, hWnd);
2643 
2644  /* Check for owner thread */
2645  if ( Window->head.pti != PsGetCurrentThreadWin32Thread())
2646  {
2647  /* Check if we are destroying the desktop window */
2648  if (! ((Window->head.rpdesk->dwDTFlags & DF_DESTROYED) && Window == Window->head.rpdesk->pDeskInfo->spwnd))
2649  {
2651  return FALSE;
2652  }
2653  }
2654 
2655  /* If window was created successfully and it is hooked */
2656  if ((Window->state2 & WNDS2_WMCREATEMSGPROCESSED))
2657  {
2659  {
2660  ERR("Destroy Window WH_CBT Call Hook return!\n");
2661  return FALSE;
2662  }
2663  }
2664 
2665  if (Window->pcls->atomClassName != gpsi->atomSysClass[ICLS_IME])
2666  {
2667  if ((Window->style & (WS_POPUP|WS_CHILD)) != WS_CHILD)
2668  {
2669  if (Window->spwndOwner)
2670  {
2671  //ERR("DestroyWindow Owner out.\n");
2672  UserAttachThreadInput(Window->head.pti, Window->spwndOwner->head.pti, FALSE);
2673  }
2674  }
2675  }
2676 
2677  /* Inform the parent */
2678  if (Window->style & WS_CHILD)
2679  {
2681  }
2682 
2683  if (!Window->spwndOwner && !IntGetParent(Window))
2684  {
2686  }
2687 
2688  /* Hide the window */
2689  if (Window->style & WS_VISIBLE)
2690  {
2691  if (Window->style & WS_CHILD)
2692  {
2693  /* Only child windows receive WM_SHOWWINDOW in DestroyWindow() */
2695  }
2696  else
2697  {
2699  }
2700  }
2701 
2702  /* Adjust last active */
2703  if ((pwndTemp = Window->spwndOwner))
2704  {
2705  while (pwndTemp->spwndOwner)
2706  pwndTemp = pwndTemp->spwndOwner;
2707 
2708  if (pwndTemp->spwndLastActive == Window)
2709  pwndTemp->spwndLastActive = Window->spwndOwner;
2710  }
2711 
2712  if (Window->spwndParent && IntIsWindow(UserHMGetHandle(Window)))
2713  {
2714  if ((Window->style & (WS_POPUP | WS_CHILD)) == WS_CHILD)
2715  {
2717  {
2718  //ERR("DestroyWindow Parent out.\n");
2719  UserAttachThreadInput(Window->head.pti, Window->spwndParent->head.pti, FALSE);
2720  }
2721  }
2722  }
2723 
2724  if (Window->head.pti->MessageQueue->spwndActive == Window)
2725  Window->head.pti->MessageQueue->spwndActive = NULL;
2726  if (Window->head.pti->MessageQueue->spwndFocus == Window)
2727  Window->head.pti->MessageQueue->spwndFocus = NULL;
2728  if (Window->head.pti->MessageQueue->spwndActivePrev == Window)
2729  Window->head.pti->MessageQueue->spwndActivePrev = NULL;
2730  if (Window->head.pti->MessageQueue->spwndCapture == Window)
2731  Window->head.pti->MessageQueue->spwndCapture = NULL;
2732 
2733  /*
2734  * Check if this window is the Shell's Desktop Window. If so set hShellWindow to NULL
2735  */
2736 
2737  if ((ti != NULL) && (ti->pDeskInfo != NULL))
2738  {
2739  if (ti->pDeskInfo->hShellWindow == hWnd)
2740  {
2741  ERR("Destroying the ShellWindow!\n");
2742  ti->pDeskInfo->hShellWindow = NULL;
2743  }
2744  }
2745 
2747 
2749  {
2750  return TRUE;
2751  }
2752 
2753  /* Recursively destroy owned windows */
2754  if (!(Window->style & WS_CHILD))
2755  {
2756  HWND* List;
2757  HWND* phWnd;
2758  PWND pWnd;
2759 
2761  if (List)
2762  {
2763  for (phWnd = List; *phWnd; ++phWnd)
2764  {
2765  pWnd = ValidateHwndNoErr(*phWnd);
2766  if (pWnd == NULL)
2767  continue;
2768  ASSERT(pWnd->spwndOwner == Window);
2769  ASSERT(pWnd != Window);
2770 
2771  pWnd->spwndOwner = NULL;
2773  {
2775  UserRefObjectCo(pWnd, &Ref); // Temp HACK?
2776  co_UserDestroyWindow(pWnd);
2777  UserDerefObjectCo(pWnd); // Temp HACK?
2778  }
2779  else
2780  {
2781  ERR("IntWndBelongsToThread(0x%p) is FALSE, ignoring.\n", pWnd);
2782  }
2783  }
2784 
2786  }
2787  }
2788 
2789  /* Generate mouse move message for the next window */
2790  msg.message = WM_MOUSEMOVE;
2791  msg.wParam = UserGetMouseButtonsState();
2792  msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
2793  msg.pt = gpsi->ptCursor;
2795 
2796  IntNotifyWinEvent(EVENT_OBJECT_DESTROY, Window, OBJID_WINDOW, CHILDID_SELF, 0);
2797 
2798  /* Send destroy messages */
2800 
2802  {
2803  return TRUE;
2804  }
2805 
2806  /* Destroy the window storage */
2808 
2809  return TRUE;
2810 }
#define TRUE
Definition: types.h:120
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:582
LRESULT co_UserFreeWindow(PWND Window, PPROCESSINFO ProcessData, PTHREADINFO ThreadData, BOOLEAN SendMessages)
Definition: window.c:546
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
NTSTATUS FASTCALL UserAttachThreadInput(PTHREADINFO ptiFrom, PTHREADINFO ptiTo, BOOL fAttach)
Definition: input.c:483
#define IntWndBelongsToThread(WndObj, W32Thread)
Definition: window.h:31
#define SW_HIDE
Definition: winuser.h:762
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
VOID FASTCALL IntNotifyWinEvent(DWORD Event, PWND pWnd, LONG idObject, LONG idChild, DWORD flags)
Definition: event.c:179
#define MAKELPARAM(l, h)
Definition: winuser.h:3915
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1651
#define OBJID_WINDOW
Definition: winable.h:15
HWND hWnd
Definition: settings.c:17
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:25
HWND *FASTCALL IntWinListOwnedPopups(PWND Window)
Definition: window.c:287
UINT_PTR WPARAM
Definition: windef.h:207
#define WS_CHILD
Definition: pedump.c:617
#define SWP_NOZORDER
Definition: winuser.h:1232
PSERVERINFO gpsi
Definition: main.c:27
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
#define SWP_HIDEWINDOW
Definition: winuser.h:1226
Definition: window.c:29
#define ERROR_ACCESS_DENIED
Definition: compat.h:87
#define WOC_DELETE
Definition: winddi.h:1269
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:38
#define HCBT_DESTROYWND
Definition: winuser.h:59
#define CHILDID_SELF
Definition: winable.h:14
struct _WND * spwndOwner
Definition: ntuser.h:679
Definition: object.h:3
smooth NULL
Definition: ftsmooth.c:416
#define WH_CBT
Definition: winuser.h:35
#define WM_DESTROY
Definition: winuser.h:1591
BOOLEAN FASTCALL co_WinPosShowWindow(PWND Wnd, INT Cmd)
Definition: winpos.c:2393
BOOLEAN co_UserDestroyWindow(PVOID Object)
Definition: window.c:2629
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define TRACE(s)
Definition: solgame.cpp:4
static void IntSendDestroyMsg(HWND hWnd)
Definition: window.c:433
LIST_ENTRY List
Definition: psmgr.c:57
#define SWP_NOACTIVATE
Definition: winuser.h:1227
#define WNDS2_WMCREATEMSGPROCESSED
Definition: ntuser.h:638
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:157
static IUnknown Object
Definition: main.c:512
BOOL FASTCALL IntIsTopLevelWindow(PWND pWnd)
Definition: window.c:331
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1089
#define ICLS_IME
Definition: ntuser.h:888
#define HSHELL_WINDOWDESTROYED
Definition: winuser.h:1241
#define SWP_NOSIZE
Definition: winuser.h:1230
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
struct _WND * spwndLastActive
Definition: ntuser.h:703
#define DF_DESTROYED
Definition: desktop.h:50
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:185
#define WS_POPUP
Definition: pedump.c:616
#define WM_MOUSEMOVE
Definition: winuser.h:1751
PVOID NTAPI PsGetCurrentProcessWin32Process(VOID)
Definition: process.c:1183
VOID FASTCALL IntEngWindowChanged(_In_ struct _WND *Window, _In_ FLONG flChanged)
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
Definition: desktop.c:1656
#define msg(x)
Definition: auth_time.c:54
#define SWP_NOMOVE
Definition: winuser.h:1229
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define USERTAG_WINDOWLIST
Definition: tags.h:297
struct _DESKTOPINFO * pDeskInfo
Definition: win32.h:92
#define WS_VISIBLE
Definition: pedump.c:620
static void IntSendParentNotify(PWND pWindow, UINT msg)
Definition: window.c:1503
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
ATOM atomSysClass[ICLS_NOTUSED+1]
Definition: ntuser.h:1013

Referenced by co_UserCreateWindowEx(), handle_internal_message(), IntDefWindowProc(), IntDesktopObjectDelete(), IntTrackPopupMenuEx(), MENU_HideSubPopups(), MENU_TrackMenu(), and NtUserDestroyWindow().

◆ co_UserSetFocus()

HWND FASTCALL co_UserSetFocus ( PWND  Window)

Definition at line 1196 of file focus.c.

1197 {
1198  HWND hWndPrev = 0;
1199  PWND pwndTop;
1200  PTHREADINFO pti;
1201  PUSER_MESSAGE_QUEUE ThreadQueue;
1202 
1203  if (Window)
1205 
1207  ThreadQueue = pti->MessageQueue;
1208  ASSERT(ThreadQueue != 0);
1209 
1210  TRACE("Enter SetFocus hWnd 0x%p pti 0x%p\n",Window ? UserHMGetHandle(Window) : 0, pti );
1211 
1212  hWndPrev = ThreadQueue->spwndFocus ? UserHMGetHandle(ThreadQueue->spwndFocus) : 0;
1213 
1214  if (Window != 0)
1215  {
1216  if (hWndPrev == UserHMGetHandle(Window))
1217  {
1218  return hWndPrev ? (IntIsWindow(hWndPrev) ? hWndPrev : 0) : 0; /* Nothing to do */
1219  }
1220 
1221  if (Window->head.pti->MessageQueue != ThreadQueue)
1222  {
1223  ERR("SetFocus Must have the same Q!\n");
1224  return 0;
1225  }
1226 
1227  /* Check if we can set the focus to this window */
1229  for (pwndTop = Window; pwndTop; pwndTop = pwndTop->spwndParent)
1230  {
1231  if (pwndTop->style & (WS_MINIMIZED|WS_DISABLED)) return 0;
1232  if ((pwndTop->style & (WS_POPUP|WS_CHILD)) != WS_CHILD) break;
1233  if (pwndTop->spwndParent == NULL) break;
1234  }
1236  if (co_HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM)Window->head.h, (LPARAM)hWndPrev))
1237  {
1238  ERR("SetFocus 1 WH_CBT Call Hook return!\n");
1239  return 0;
1240  }
1241 
1242  /* Activate pwndTop if needed. */
1243  if (pwndTop != ThreadQueue->spwndActive)
1244  {
1245  PUSER_MESSAGE_QUEUE ForegroundQueue = IntGetFocusMessageQueue(); // Keep it based on desktop.
1246  if (ThreadQueue != ForegroundQueue && IsAllowedFGActive(pti, pwndTop)) // Rule 2 & 3.
1247  {
1248  //ERR("SetFocus: Set Foreground!\n");
1249  if (!(pwndTop->style & WS_VISIBLE))
1250  {
1251  pti->ppi->W32PF_flags |= W32PF_ALLOWFOREGROUNDACTIVATE;
1252  }
1254  {
1255  ERR("SetFocus: Set Foreground and Focus Failed!\n");
1256  return 0;
1257  }
1258  }
1259 
1260  /* Set Active when it is needed. */
1261  if (pwndTop != ThreadQueue->spwndActive)
1262  {
1263  //ERR("SetFocus: Set Active! %p\n",pwndTop?UserHMGetHandle(pwndTop):0);
1264  if (!co_IntSetActiveWindow(pwndTop, FALSE, FALSE, FALSE))
1265  {
1266  ERR("SetFocus: Set Active Failed!\n");
1267  return 0;
1268  }
1269  }
1270 
1271  /* Abort if window destroyed */
1272  if (Window->state2 & WNDS2_INDESTROY) return 0;
1273  /* Do not change focus if the window is no longer active */
1274  if (pwndTop != ThreadQueue->spwndActive)
1275  {
1276  ERR("SetFocus: Top window did not go active!\n");
1277  return 0;
1278  }
1279  }
1280 
1281  // Check again! SetActiveWindow could have set the focus via WM_ACTIVATE.
1282  hWndPrev = ThreadQueue->spwndFocus ? UserHMGetHandle(ThreadQueue->spwndFocus) : 0;
1283 
1285 
1286  TRACE("Focus: %p -> %p\n", hWndPrev, Window->head.h);
1287  }
1288  else /* NULL hwnd passed in */
1289  {
1290  if (co_HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM)0, (LPARAM)hWndPrev))
1291  {
1292  ERR("SetFocus: 2 WH_CBT Call Hook return!\n");
1293  return 0;
1294  }
1295  //ERR("SetFocus: Set Focus NULL\n");
1296  /* set the current thread focus window null */
1297  IntSendFocusMessages( pti, NULL);
1298  }
1299  return hWndPrev ? (IntIsWindow(hWndPrev) ? hWndPrev : 0) : 0;
1300 }
#define WS_DISABLED
Definition: pedump.c:621
#define TRUE
Definition: types.h:120
BOOL FASTCALL co_IntSetActiveWindow(_In_ PWND Wnd, _In_ BOOL bMouse, _In_ BOOL bFocus, _In_ BOOL Async)
Definition: focus.c:912
VOID FASTCALL IntSendFocusMessages(PTHREADINFO pti, PWND pWnd)
Definition: focus.c:524
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
UINT_PTR WPARAM
Definition: windef.h:207
#define WS_CHILD
Definition: pedump.c:617
#define HCBT_SETFOCUS
Definition: winuser.h:64
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1271
PPROCESSINFO ppi
Definition: win32.h:87
Definition: window.c:29
#define W32PF_ALLOWFOREGROUNDACTIVATE
Definition: win32.h:12
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
#define WH_CBT
Definition: winuser.h:35
#define WS_MINIMIZED
Definition: undocuser.h:18
static BOOL FASTCALL co_IntSetForegroundAndFocusWindow(_In_opt_ PWND Wnd, _In_ BOOL MouseActivate, _In_ BOOL bFlash)
Definition: focus.c:812
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define TRACE(s)
Definition: solgame.cpp:4
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:157
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1089
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
#define WS_POPUP
Definition: pedump.c:616
struct _WND * spwndParent
Definition: ntuser.h:677
BOOL FASTCALL IsAllowedFGActive(PTHREADINFO pti, PWND Wnd)
Definition: focus.c:618
#define WS_VISIBLE
Definition: pedump.c:620
#define WNDS2_INDESTROY
Definition: ntuser.h:616
DWORD style
Definition: ntuser.h:670

Referenced by co_WinPosShowWindow(), IntDefWindowProc(), IntEnableWindow(), IntSendDestroyMsg(), and NtUserSetFocus().

◆ DefSetText()

BOOL APIENTRY DefSetText ( PWND  Wnd,
PCWSTR  WindowText 
)

Definition at line 4149 of file window.c.

4150 {
4152  BOOL Ret = FALSE;
4153 
4154  RtlInitUnicodeString(&UnicodeString, WindowText);
4155 
4156  if (UnicodeString.Length != 0)
4157  {
4158  if (Wnd->strName.MaximumLength > 0 &&
4159  UnicodeString.Length <= Wnd->strName.MaximumLength - sizeof(UNICODE_NULL))
4160  {
4161  ASSERT(Wnd->strName.Buffer != NULL);
4162 
4163  Wnd->strName.Length = UnicodeString.Length;
4164  Wnd->strName.Buffer[UnicodeString.Length / sizeof(WCHAR)] = L'\0';
4166  UnicodeString.Buffer,
4167  UnicodeString.Length);
4168  }
4169  else
4170  {
4171  PWCHAR buf;
4172  Wnd->strName.MaximumLength = Wnd->strName.Length = 0;
4173  buf = Wnd->strName.Buffer;
4174  Wnd->strName.Buffer = NULL;
4175  if (buf != NULL)
4176  {
4177  DesktopHeapFree(Wnd->head.rpdesk, buf);
4178  }
4179 
4181  UnicodeString.Length + sizeof(UNICODE_NULL));
4182  if (Wnd->strName.Buffer != NULL)
4183  {
4184  Wnd->strName.Buffer[UnicodeString.Length / sizeof(WCHAR)] = L'\0';
4186  UnicodeString.Buffer,
4187  UnicodeString.Length);
4188  Wnd->strName.MaximumLength = UnicodeString.Length + sizeof(UNICODE_NULL);
4189  Wnd->strName.Length = UnicodeString.Length;
4190  }
4191  else
4192  {
4194  goto Exit;
4195  }
4196  }
4197  }
4198  else
4199  {
4200  Wnd->strName.Length = 0;
4201  if (Wnd->strName.Buffer != NULL)
4202  Wnd->strName.Buffer[0] = L'\0';
4203  }
4204 
4205  // FIXME: HAX! Windows does not do this in here!
4206  // In User32, these are called after: NotifyWinEvent EVENT_OBJECT_NAMECHANGE than
4207  // RepaintButton, StaticRepaint, NtUserCallHwndLock HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK, etc.
4208  /* Send shell notifications */
4209  if (!Wnd->spwndOwner && !IntGetParent(Wnd))
4210  {
4211  co_IntShellHookNotify(HSHELL_REDRAW, (WPARAM) UserHMGetHandle(Wnd), FALSE); // FIXME Flashing?
4212  }
4213 
4214  Ret = TRUE;
4215 Exit:
4217  return Ret;
4218 }
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
*BytesInUnicodeString PWCH UnicodeString
Definition: rtlfuncs.h:1980
struct _DESKTOP * rpdesk
Definition: ntuser.h:189
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
UINT_PTR WPARAM
Definition: windef.h:207
uint16_t * PWCHAR
Definition: typedefs.h:54
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
Definition: desktop.h:230
#define UNICODE_NULL
unsigned int BOOL
Definition: ntddk_ex.h:94
struct _WND * spwndOwner
Definition: ntuser.h:679
THRDESKHEAD head
Definition: ntuser.h:659
smooth NULL
Definition: ftsmooth.c:416
LARGE_UNICODE_STRING strName
Definition: ntuser.h:700
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
__wchar_t WCHAR
Definition: xmlstorage.h:180
static void Exit(void)
Definition: sock.c:1331
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
static const WCHAR L[]
Definition: oid.c:1250
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:185
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
Definition: desktop.c:1656
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
Definition: desktop.h:239
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27

◆ DefWndControlColor()

HBRUSH FASTCALL DefWndControlColor ( HDC  hDC,
UINT  ctlType 
)

Definition at line 33 of file defwnd.c.

34 {
35  if (ctlType == CTLCOLOR_SCROLLBAR)
36  {
40  IntGdiSetBkColor(hDC, bk);
41 
42  /* if COLOR_WINDOW happens to be the same as COLOR_3DHILIGHT
43  * we better use 0x55aa bitmap brush to make scrollbar's background
44  * look different from the window background.
45  */
46  if ( bk == IntGetSysColor(COLOR_WINDOW))
47  return gpsi->hbrGray;
48 
50  return hb;
51  }
52 
54 
55  if ((ctlType == CTLCOLOR_EDIT) || (ctlType == CTLCOLOR_LISTBOX))
56  {
58  }
59  else
60  {
63  }
64 
66 }
#define COLOR_3DHILIGHT
Definition: winuser.h:927
HGDIOBJ FASTCALL IntGetSysColorBrush(INT Object)
Definition: stockobj.c:317
COLORREF FASTCALL IntGdiSetBkColor(_In_ HDC hDC, _In_ COLORREF Color)
#define CTLCOLOR_SCROLLBAR
Definition: winuser.h:946
#define COLOR_WINDOW
Definition: winuser.h:908
PSERVERINFO gpsi
Definition: main.c:27
#define COLOR_3DFACE
Definition: winuser.h:919
#define COLOR_SCROLLBAR
Definition: winuser.h:902
COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color)
Definition: dcutil.c:172
__kernel_entry W32KAPI BOOL APIENTRY NtGdiUnrealizeObject(_In_ HANDLE h)
DWORD COLORREF
Definition: windef.h:285
#define COLOR_WINDOWTEXT
Definition: winuser.h:911
#define CTLCOLOR_EDIT
Definition: winuser.h:942
DWORD FASTCALL IntGetSysColor(INT nIndex)
Definition: stockobj.c:323
#define CTLCOLOR_LISTBOX
Definition: winuser.h:943
static HDC hDC
Definition: 3dtext.c:33

◆ DefWndDoSizeMove()

VOID FASTCALL DefWndDoSizeMove ( PWND  pwnd,
WORD  wParam 
)

Definition at line 239 of file nonclient.c.

240 {
241  MSG msg;
242  RECT sizingRect, mouseRect, origRect, unmodRect;
243  HDC hdc;
244  LONG hittest = (LONG)(wParam & 0x0f);
245  PCURICON_OBJECT DragCursor = NULL, OldCursor = NULL;
246  POINT minTrack, maxTrack;
247  POINT capturePoint, pt;
249  BOOL thickframe;
250  BOOL iconic;
251  BOOL moved = FALSE;
252  BOOL DragFullWindows = FALSE;
253  PWND pWndParent = NULL;
254  WPARAM syscommand = (wParam & 0xfff0);
256  //PMONITOR mon = 0; Don't port sync from wine!!! This breaks explorer task bar sizing!!
257  // The task bar can grow in size and can not reduce due to the change
258  // in the work area.
259 
260  Style = pwnd->style;
261  ExStyle = pwnd->ExStyle;
262  iconic = (Style & WS_MINIMIZE) != 0;
263 
264  if ((Style & WS_MAXIMIZE) || !IntIsWindowVisible(pwnd)) return;
265 
266  thickframe = UserHasThickFrameStyle(Style, ExStyle) && !iconic;
267 
268  //
269  // Show window contents while dragging the window, get flag from registry data.
270  //
271  UserSystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, &DragFullWindows, 0);
272 
273  pt.x = pti->ptLast.x;
274  pt.y = pti->ptLast.y;
275  capturePoint = pt;
276  UserClipCursor( NULL );
277 
278  TRACE("pwnd %p command %04lx, hittest %d, pos %d,%d\n",
279  pwnd, syscommand, hittest, pt.x, pt.y);
280 
281  if (syscommand == SC_MOVE)
282  {
283  if (!hittest) hittest = DefWndStartSizeMove(pwnd, wParam, &capturePoint);
284  if (!hittest) return;
285  }
286  else /* SC_SIZE */
287  {
288  if (!thickframe) return;
289  if (hittest && (syscommand != SC_MOUSEMENU))
290  {
291  hittest += (HTLEFT - WMSZ_LEFT);
292  }
293  else
294  {
296  hittest = DefWndStartSizeMove(pwnd, wParam, &capturePoint);
297  if (!hittest)
298  {
300  return;
301  }
302  }
303  }
304 
305  /* Get min/max info */
306 
307  co_WinPosGetMinMaxInfo(pwnd, NULL, NULL, &minTrack, &maxTrack);
308  sizingRect = pwnd->rcWindow;
309  origRect = sizingRect;
310  if (Style & WS_CHILD)
311  {
312  pWndParent = IntGetParent(pwnd);
313  IntGetClientRect( pWndParent, &mouseRect );
314  IntMapWindowPoints( pWndParent, 0, (LPPOINT)&mouseRect, 2 );
315  IntMapWindowPoints( 0, pWndParent, (LPPOINT)&sizingRect, 2 );
316  unmodRect = sizingRect;
317  }
318  else
319  {
320  if (!(ExStyle & WS_EX_TOPMOST))
321  {
322  UserSystemParametersInfo(SPI_GETWORKAREA, 0, &mouseRect, 0);
323  }
324  else
325  {
327  }
328  unmodRect = sizingRect;
329  }
330 
331  if (ON_LEFT_BORDER(hittest))
332  {
333  mouseRect.left = max( mouseRect.left, sizingRect.right-maxTrack.x+capturePoint.x-sizingRect.left );
334  mouseRect.right = min( mouseRect.right, sizingRect.right-minTrack.x+capturePoint.x-sizingRect.left );
335  }
336  else if (ON_RIGHT_BORDER(hittest))
337  {
338  mouseRect.left = max( mouseRect.left, sizingRect.left+minTrack.x+capturePoint.x-sizingRect.right );
339  mouseRect.right = min( mouseRect.right, sizingRect.left+maxTrack.x+capturePoint.x-sizingRect.right );
340  }
341  if (ON_TOP_BORDER(hittest))
342  {
343  mouseRect.top = max( mouseRect.top, sizingRect.bottom-maxTrack.y+capturePoint.y-sizingRect.top );
344  mouseRect.bottom = min( mouseRect.bottom,sizingRect.bottom-minTrack.y+capturePoint.y-sizingRect.top);
345  }
346  else if (ON_BOTTOM_BORDER(hittest))
347  {
348  mouseRect.top = max( mouseRect.top, sizingRect.top+minTrack.y+capturePoint.y-sizingRect.bottom );
349  mouseRect.bottom = min( mouseRect.bottom, sizingRect.top+maxTrack.y+capturePoint.y-sizingRect.bottom );
350  }
351 
352  hdc = UserGetDCEx( pWndParent, 0, DCX_CACHE );
353  if (iconic)
354  {
355  DragCursor = pwnd->pcls->spicn;
356  if (DragCursor)
357  {
358  UserReferenceObject(DragCursor);
359  }
360  else
361  {
362  HCURSOR CursorHandle = (HCURSOR)co_IntSendMessage( UserHMGetHandle(pwnd), WM_QUERYDRAGICON, 0, 0 );
363  if (CursorHandle)
364  {
365  DragCursor = UserGetCurIconObject(CursorHandle);
366  }
367  else
368  {
369  iconic = FALSE;
370  }
371  }
372  }
373 
374  /* repaint the window before moving it around */
376 
377  IntNotifyWinEvent( EVENT_SYSTEM_MOVESIZESTART, pwnd, OBJID_WINDOW, CHILDID_SELF, 0);
378 
380 
382 
384 
385  pwnd->head.pti->TIF_flags |= TIF_MOVESIZETRACKING;
386 
387  for(;;)
388  {
389  int dx = 0, dy = 0;
390 
391  if (!co_IntGetPeekMessage(&msg, 0, 0, 0, PM_REMOVE, TRUE)) break;
392  if (IntCallMsgFilter( &msg, MSGF_SIZE )) continue;
393 
394  /* Exit on button-up */
395  if (msg.message == WM_LBUTTONUP)
396  {
397  // check for snapping if was moved by caption
398  if (hittest == HTCAPTION && thickframe && (ExStyle & WS_EX_MDICHILD) == 0)
399  {
400  RECT snapRect;
401  BOOL doSideSnap = FALSE;
402  UserSystemParametersInfo(SPI_GETWORKAREA, 0, &snapRect, 0);
403 
404  // snap to left
405  if (pt.x <= snapRect.left)
406  {
407  snapRect.right = (snapRect.right - snapRect.left) / 2 + snapRect.left;
408  doSideSnap = TRUE;
409  }
410  // snap to right
411  if (pt.x >= snapRect.right-1)
412  {
413  snapRect.left = (snapRect.right - snapRect.left) / 2 + snapRect.left;
414  doSideSnap = TRUE;
415  }
416 
417  if (doSideSnap)
418  {
420  0,
421  snapRect.left,
422  snapRect.top,
423  snapRect.right - snapRect.left,
424  snapRect.bottom - snapRect.top,
425  0);
426  pwnd->InternalPos.NormalRect = origRect;
427  }
428  else
429  {
430  // maximize if on dragged to top
431  if (pt.y <= snapRect.top)
432  {
434  pwnd->InternalPos.NormalRect = origRect;
435  }
436  }
437  }
438  break;
439  }
440 
441  /* Exit on Return or Esc */
442  if (msg.message == WM_KEYDOWN &&
443  (msg.wParam == VK_RETURN || msg.wParam == VK_ESCAPE))
444  {
445  break;
446  }
447 
448  if ((msg.message != WM_KEYDOWN) && (msg.message != WM_MOUSEMOVE))
449  {
450  IntTranslateKbdMessage( &msg , 0 );
452  continue; /* We are not interested in other messages */
453  }
454 
455  pt = msg.pt;
456 
457  if (msg.message == WM_KEYDOWN) switch(msg.wParam)
458  {
459  case VK_UP: pt.y -= 8; break;
460  case VK_DOWN: pt.y += 8; break;
461  case VK_LEFT: pt.x -= 8; break;
462  case VK_RIGHT: pt.x += 8; break;
463  }
464 
465  pt.x = max( pt.x, mouseRect.left );
466  pt.x = min( pt.x, mouseRect.right - 1 );
467  pt.y = max( pt.y, mouseRect.top );
468  pt.y = min( pt.y, mouseRect.bottom - 1 );
469 
470  dx = pt.x - capturePoint.x;
471  dy = pt.y - capturePoint.y;
472 
473  if (dx || dy)
474  {
475  if ( !moved )
476  {
477  moved = TRUE;
478  if ( iconic ) /* ok, no system popup tracking */
479  {
480  OldCursor = UserSetCursor(DragCursor, FALSE);
481  UserShowCursor( TRUE );
482  }
483  else if(!DragFullWindows)
484  UserDrawMovingFrame( hdc, &sizingRect, thickframe );
485  }
486 
487  if (msg.message == WM_KEYDOWN) UserSetCursorPos(pt.x, pt.y, 0, 0, FALSE);
488  else
489  {
490  RECT newRect = unmodRect;
491 
492  if (!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe );
493  if (hittest == HTCAPTION) RECTL_vOffsetRect( &newRect, dx, dy );
494  if (ON_LEFT_BORDER(hittest)) newRect.left += dx;
495  else if (ON_RIGHT_BORDER(hittest)) newRect.right += dx;
496  if (ON_TOP_BORDER(hittest)) newRect.top += dy;
497  else if (ON_BOTTOM_BORDER(hittest)) newRect.bottom += dy;
498  capturePoint = pt;
499 
500  //
501  // Save the new position to the unmodified rectangle. This allows explorer task bar
502  // sizing. Explorer will forces back the position unless a certain amount of sizing
503  // has occurred.
504  //
505  unmodRect = newRect;
506 
507  /* determine the hit location */
508  if (syscommand == SC_SIZE)
509  {
510  WPARAM wpSizingHit = 0;
511 
512  if (hittest >= HTLEFT && hittest <= HTBOTTOMRIGHT)
513  wpSizingHit = WMSZ_LEFT + (hittest - HTLEFT);
514  co_IntSendMessage( UserHMGetHandle(pwnd), WM_SIZING, wpSizingHit, (LPARAM)&newRect );
515  }
516  else
517  co_IntSendMessage( UserHMGetHandle(pwnd), WM_MOVING, 0, (LPARAM)&newRect );
518 
519  if (!iconic)
520  {
521  if (!DragFullWindows)
522  UserDrawMovingFrame( hdc, &newRect, thickframe );
523  else
524  { // Moving the whole window now!
525  HRGN hrgnNew;
526  HRGN hrgnOrig = GreCreateRectRgnIndirect(&pwnd->rcWindow);
527 
528  if (pwnd->hrgnClip != NULL)
529  NtGdiCombineRgn(hrgnOrig, hrgnOrig, pwnd->hrgnClip, RGN_AND);
530 
532  //IntMapWindowPoints( 0, pWndParent, (POINT *)&rect, 2 );
533  co_WinPosSetWindowPos( pwnd,
534  0,
535  newRect.left,
536  newRect.top,
537  newRect.right - newRect.left,
538  newRect.bottom - newRect.top,
539  ( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 );
540 
541  hrgnNew = GreCreateRectRgnIndirect(&pwnd->rcWindow);
542  if (pwnd->hrgnClip != NULL)
543  NtGdiCombineRgn(hrgnNew, hrgnNew, pwnd->hrgnClip, RGN_AND);
544 
545  if (hrgnNew)
546  {
547  if (hrgnOrig)
548  NtGdiCombineRgn(hrgnOrig, hrgnOrig, hrgnNew, RGN_DIFF);
549  }
550  else
551  {
552  if (hrgnOrig)
553  {
554  GreDeleteObject(hrgnOrig);
555  hrgnOrig = 0;
556  }
557  }
558 
559  // Update all the windows after the move or size, including this window.
560  UpdateThreadWindows(UserGetDesktopWindow()->spwndChild, pti, hrgnOrig);
561 
562  if (hrgnOrig) GreDeleteObject(hrgnOrig);
563  if (hrgnNew) GreDeleteObject(hrgnNew);
564  }
565  }
566  sizingRect = newRect;
567  }
568  }
569  }
570 
571  pwnd->head.pti->TIF_flags &= ~TIF_MOVESIZETRACKING;
572 
574 
575  if ( iconic )
576  {
577  if ( moved ) /* restore cursors, show icon title later on */
578  {
580  OldCursor = UserSetCursor(OldCursor, FALSE);
581  }
582 
583  /* It could be that the cursor was already changed while we were proceeding,
584  * so we must unreference whatever cursor was current at the time we restored the old one.
585  * Maybe it is DragCursor, but maybe it is another one and DragCursor got already freed.
586  */
587  if (OldCursor) UserDereferenceObject(OldCursor);
588  }
589  else if ( moved && !DragFullWindows )
590  UserDrawMovingFrame( hdc, &sizingRect, thickframe );
591 
593 
595  //if (pWndParent) IntMapWindowPoints( 0, pWndParent, (POINT *)&sizingRect, 2 );
596 
598  {
599  ERR("DoSizeMove : WH_CBT Call Hook return!\n");
600  moved = FALSE;
601  }
602 
603  IntNotifyWinEvent( EVENT_SYSTEM_MOVESIZEEND, pwnd, OBJID_WINDOW, CHILDID_SELF, 0);
604 
606 
611  /* window moved or resized */
612  if (moved)
613  {
614  /* if the moving/resizing isn't canceled call SetWindowPos
615  * with the new position or the new size of the window
616  */
617  if (!((msg.message == WM_KEYDOWN) && (msg.wParam == VK_ESCAPE)) )
618  {
619  /* NOTE: SWP_NOACTIVATE prevents document window activation in Word 6 */
620  if (!DragFullWindows || iconic )
621  {
622  co_WinPosSetWindowPos( pwnd,
623  0,
624  sizingRect.left,
625  sizingRect.top,
626  sizingRect.right - sizingRect.left,
627  sizingRect.bottom - sizingRect.top,
628  ( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 );
629  }
630  }
631  else
632  { /* restore previous size/position */
633  if ( DragFullWindows )
634  {
635  co_WinPosSetWindowPos( pwnd,
636  0,
637  origRect.left,
638  origRect.top,
639  origRect.right - origRect.left,
640  origRect.bottom - origRect.top,
641  ( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 );
642  }
643  }
644  }
645 
646  if ( IntIsWindow(UserHMGetHandle(pwnd)) )
647  {
648  if ( iconic )
649  {
650  /* Single click brings up the system menu when iconized */
651  if ( !moved )
652  {
653  if( Style & WS_SYSMENU )
655  }
656  }
657  }
658 }
struct _WND::@4105 InternalPos
#define HTLEFT
Definition: winuser.h:2441
#define MSQ_STATE_MOVESIZE
Definition: ntuser.h:3548
#define max(a, b)
Definition: svc.c:63
DWORD ExStyle
Definition: ntuser.h:668
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1153
#define TRUE
Definition: types.h:120
#define TIF_MOVESIZETRACKING
Definition: ntuser.h:255
long y
Definition: polytest.cpp:48
PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon)
Definition: cursoricon.c:200
LRESULT FASTCALL IntDispatchMessage(PMSG pMsg)
Definition: message.c:682
long x
Definition: polytest.cpp:48
BOOL FASTCALL IntReleaseCapture(VOID)
Definition: focus.c:1412
#define pt(x, y)
Definition: drawing.c:79
BOOL FASTCALL IntTranslateKbdMessage(LPMSG lpMsg, UINT flags)
Definition: keyboard.c:1138
GLint dy
Definition: linetemp.h:97
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
VOID FASTCALL IntNotifyWinEvent(DWORD Event, PWND pWnd, LONG idObject, LONG idChild, DWORD flags)
Definition: event.c:179
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1651
static HDC
Definition: imagelist.c:92
#define OBJID_WINDOW
Definition: winable.h:15
LONG top
Definition: windef.h:292
#define VK_LEFT
Definition: winuser.h:2178
#define WM_EXITSIZEMOVE
Definition: winuser.h:1800
int UserShowCursor(BOOL bShow)
Definition: msgqueue.c:168
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
#define SC_MOUSEMENU
Definition: winuser.h:2549
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:610
BOOL FASTCALL IntCallMsgFilter(LPMSG lpmsg, INT code)
Definition: message.c:1984
UINT_PTR WPARAM
Definition: windef.h:207
#define VK_DOWN
Definition: winuser.h:2181
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:291
VOID FASTCALL IntGetClientRect(PWND WindowObject, RECTL *Rect)
Definition: winpos.c:91
HICON HCURSOR
Definition: windef.h:284
#define VK_ESCAPE
Definition: winuser.h:2168
LONG right
Definition: windef.h:293
BOOL UserSetCursorPos(INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: cursoricon.c:238
#define VK_RETURN
Definition: winuser.h:2155
struct _CURICON_OBJECT * spicn
Definition: ntuser.h:553
WPARAM wParam
Definition: combotst.c:138
#define RGN_AND
Definition: wingdi.h:355
#define WM_QUERYDRAGICON
Definition: winuser.h:1636
#define SM_CXSCREEN
Definition: winuser.h:949
#define ON_RIGHT_BORDER(hit)
Definition: nonclient.c:27
#define WS_EX_MDICHILD
Definition: winuser.h:394
#define HTSYSMENU
Definition: winuser.h:2431
#define VK_UP
Definition: winuser.h:2179
#define WS_MINIMIZE
Definition: pedump.c:622
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define MSGF_SIZE
Definition: winuser.h:1163
#define CHILDID_SELF
Definition: winable.h:14
#define SC_MAXIMIZE
Definition: winuser.h:2542
#define WM_SIZING
Definition: winuser.h:1783
THRDESKHEAD head
Definition: ntuser.h:659
#define MAKELONG(a, b)
Definition: typedefs.h:248
VOID FASTCALL UserDrawMovingFrame(HDC hdc, RECTL *rect, BOOL thickframe)
Definition: nonclient.c:56
smooth NULL
Definition: ftsmooth.c:416
HRGN hrgnClip
Definition: ntuser.h:697
#define WM_KEYDOWN
Definition: winuser.h:1691
LONG_PTR LPARAM
Definition: windef.h:208
#define WH_CBT
Definition: winuser.h:35
BOOL APIENTRY UserClipCursor(RECTL *prcl)
Definition: cursoricon.c:700
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
UINT FASTCALL co_WinPosGetMinMaxInfo(PWND Window, POINT *MaxSize, POINT *MaxPos, POINT *MinTrack, POINT *MaxTrack)
Definition: winpos.c:936
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define SM_CYSCREEN
Definition: winuser.h:950
HWND FASTCALL MsqSetStateWindow(PTHREADINFO pti, ULONG Type, HWND hWnd)
Definition: msgqueue.c:2541
#define TRACE(s)
Definition: solgame.cpp:4
HWND FASTCALL co_UserSetCapture(HWND hWnd)
Definition: focus.c:1340
#define ON_BOTTOM_BORDER(hit)
Definition: nonclient.c:31
LONG FASTCALL DefWndStartSizeMove(PWND Wnd, WPARAM wParam, POINT *capturePoint)
Definition: nonclient.c:140
const DWORD Style
Definition: appswitch.c:71
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:157
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1089
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1349
BOOL FASTCALL IntIsWindowVisible(PWND Wnd)
Definition: window.c:170
#define WM_MOVING
Definition: winuser.h:1785
static const WCHAR L[]
Definition: oid.c:1250
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1291
HDC hdc
Definition: main.c:9
#define WS_EX_TOPMOST
Definition: pedump.c:647
#define WM_SETVISIBLE
Definition: undocuser.h:31
RECT rcWindow
Definition: ntuser.h:680
#define HTBOTTOMRIGHT
Definition: winuser.h:2449
HWND APIENTRY IntGetCapture(VOID)
Definition: focus.c:1322
__kernel_entry W32KAPI INT APIENTRY NtGdiCombineRgn(_In_ HRGN hrgnDst, _In_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ INT iMode)
POINT ptLast
Definition: win32.h:127
#define VK_RIGHT
Definition: winuser.h:2180
#define SWP_NOSIZE
Definition: winuser.h:1230
#define ERR(fmt,...)
Definition: debug.h:109
#define HTCAPTION
Definition: winuser.h:2430
Definition: ntuser.h:657
VOID FASTCALL UpdateThreadWindows(PWND pWnd, PTHREADINFO pti, HRGN hRgn)
Definition: painting.c:1081
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
Definition: rect.h:5
#define DCX_CACHE
Definition: winuser.h:2075
BOOL APIENTRY co_IntGetPeekMessage(PMSG pMsg, HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax, UINT RemoveMsg, BOOL bGMSG)
Definition: message.c:1020
#define RGN_DIFF
Definition: wingdi.h:357
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:876
#define RDW_ALLCHILDREN
Definition: winuser.h:1207
#define SC_SIZE
Definition: winuser.h:2538
#define WM_LBUTTONUP
Definition: winuser.h:1753
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:185
INT FASTCALL IntMapWindowPoints(PWND FromWnd, PWND ToWnd, LPPOINT lpPoints, UINT cPoints)
Definition: winpos.c:143
#define ON_TOP_BORDER(hit)
Definition: nonclient.c:29
#define min(a, b)
Definition: monoChain.cc:55
#define WM_MOUSEMOVE
Definition: winuser.h:1751
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:917
GLint dx
Definition: linetemp.h:97
#define msg(x)
Definition: auth_time.c:54
#define RDW_UPDATENOW
Definition: winuser.h:1206
#define SC_MOVE
Definition: winuser.h:2539
#define HCBT_MOVESIZE
Definition: winuser.h:55
unsigned int ULONG
Definition: retypes.h:1
#define UserHasThickFrameStyle(Style, ExStyle)
Definition: nonclient.c:18
LONG bottom
Definition: windef.h:294
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2059
#define PM_REMOVE
Definition: winuser.h:1182
PCURICON_OBJECT FASTCALL UserSetCursor(PCURICON_OBJECT NewCursor, BOOL ForceChange)
Definition: msgqueue.c:93
#define WS_SYSMENU
Definition: pedump.c:629
#define WM_SYSCOMMAND
Definition: winuser.h:1717
#define WM_ENTERSIZEMOVE
Definition: winuser.h:1799
#define GreCreateRectRgnIndirect(prc)
Definition: painting.h:18
#define WMSZ_LEFT
Definition: winuser.h:2418
#define ON_LEFT_BORDER(hit)
Definition: nonclient.c:25
const DWORD ExStyle
Definition: appswitch.c:72
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:697
PCLS pcls
Definition: ntuser.h:684
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:670

Referenced by DefWndHandleSysCommand().

◆ GetControlBrush()

HBRUSH FASTCALL GetControlBrush ( PWND  ,
HDC  ,
UINT   
)

Definition at line 171 of file misc.c.

175 {
176  PWND pwndParent = IntGetParent(pwnd);
177  return GetControlColor( pwndParent, pwnd, hdc, ctlType);
178 }
HBRUSH FASTCALL GetControlColor(PWND pwndParent, PWND pwnd, HDC hdc, UINT CtlMsg)
Definition: misc.c:145
HDC hdc
Definition: main.c:9
Definition: ntuser.h:657
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:185

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

◆ GetControlColor()

HBRUSH FASTCALL GetControlColor ( PWND  ,
PWND  ,
HDC  ,
UINT   
)

Definition at line 145 of file misc.c.

150 {
151  HBRUSH hBrush;
152 
153  if (!pwndParent) pwndParent = pwnd;
154 
155  if ( pwndParent->head.pti->ppi != PsGetCurrentProcessWin32Process())
156  {
157  return (HBRUSH)IntDefWindowProc( pwndParent, CtlMsg, (WPARAM)hdc, (LPARAM)UserHMGetHandle(pwnd), FALSE);
158  }
159 
160  hBrush = (HBRUSH)co_IntSendMessage( UserHMGetHandle(pwndParent), CtlMsg, (WPARAM)hdc, (LPARAM)UserHMGetHandle(pwnd));
161 
162  if (!hBrush || !GreIsHandleValid(hBrush))
163  {
164  hBrush = (HBRUSH)IntDefWindowProc( pwndParent, CtlMsg, (WPARAM)hdc, (LPARAM)UserHMGetHandle(pwnd), FALSE);
165  }
166  return hBrush;
167 }
LRESULT FASTCALL IntDefWindowProc(PWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi)
Definition: defwnd.c:532
BOOL NTAPI GreIsHandleValid(HGDIOBJ hobj)
Definition: gdiobj.c:1141
UINT_PTR WPARAM
Definition: windef.h:207
LONG_PTR LPARAM
Definition: windef.h:208
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1291
HDC hdc
Definition: main.c:9
PVOID NTAPI PsGetCurrentProcessWin32Process(VOID)
Definition: process.c:1183

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().

◆ GetLayeredStatus()

BOOL FASTCALL GetLayeredStatus ( PWND  pWnd)

Definition at line 23 of file layered.c.

24 {
25  PLRD_PROP pLrdProp = UserGetProp(pWnd, AtomLayer, TRUE);
26  if (pLrdProp)
27  {
28  return pLrdProp->is_Layered;
29  }
30  return FALSE;
31 }
#define TRUE
Definition: types.h:120
HANDLE FASTCALL UserGetProp(_In_ PWND Window, _In_ ATOM Atom, _In_ BOOLEAN SystemProp)
Definition: prop.c:46
BYTE is_Layered
Definition: layered.c:17
ATOM AtomLayer
Definition: ntuser.c:21

Referenced by NtUserUpdateLayeredWindow().

◆ GetProcessLuid()

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

Definition at line 791 of file misc.c.

795 {
800 
801  if (Thread && Process)
803 
804  /* If nothing has been specified, use the current thread */
805  if (!Thread && !Process)
807 
808  if (Thread)
809  {
810  /* Use a thread token */
811  ASSERT(!Process);
813  &CopyOnOpen,
814  &EffectiveOnly,
816 
817  /* If we don't have a thread token, use a process token */
818  if (!Token)
820  }
821  if (!Token && Process)
822  {
823  /* Use a process token */
825 
826  /* If we don't have a token, fail */
827  if (!Token)
828  return STATUS_NO_TOKEN;
829  }
830  ASSERT(Token);
831 
832  /* Query the LUID */
834 
835  /* Get rid of the token and return */
837  return Status;
838 }
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
_IRQL_requires_same_ _In_ PLSA_STRING _In_ SECURITY_LOGON_TYPE _In_ ULONG _In_ ULONG _In_opt_ PTOKEN_GROUPS _In_ PTOKEN_SOURCE _Out_ PVOID _Out_ PULONG _Inout_ PLUID _Out_ PHANDLE Token
_Out_ PBOOLEAN CopyOnOpen
Definition: psfuncs.h:154
VOID NTAPI ObDereferenceObject(IN PVOID Object)
Definition: obref.c:375
NTSTATUS NTAPI SeQueryAuthenticationIdToken(IN PACCESS_TOKEN Token, OUT PLUID LogonId)
Definition: token.c:1752
enum _SECURITY_IMPERSONATION_LEVEL SECURITY_IMPERSONATION_LEVEL
PEPROCESS PsGetThreadProcess(_In_ PETHREAD Thread)
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
_Out_ PBOOLEAN _Out_ PBOOLEAN _Out_ PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel
Definition: psfuncs.h:154
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
#define STATUS_NO_TOKEN
Definition: ntstatus.h:346
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
PACCESS_TOKEN NTAPI PsReferencePrimaryToken(PEPROCESS Process)
Definition: security.c:432
Status
Definition: gdiplustypes.h:24
PACCESS_TOKEN NTAPI PsReferenceImpersonationToken(IN PETHREAD Thread, OUT PBOOLEAN CopyOnOpen, OUT PBOOLEAN EffectiveOnly, OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel)
Definition: security.c:774
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_ BOOLEAN EffectiveOnly
Definition: sefuncs.h:417

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

◆ InitMetrics()

BOOL NTAPI InitMetrics ( VOID  )

Definition at line 19 of file metric.c.

20 {
21  INT *piSysMet = gpsi->aiSysMet;
22  ULONG Width, Height;
23 
24  /* Note: used for the SM_CLEANBOOT metric */
25  DWORD dwValue = 0;
26  HKEY hKey = 0;
27 
28  /* Clean boot */
29  piSysMet[SM_CLEANBOOT] = 0; // Fallback value of 0 (normal mode)
30  if(NT_SUCCESS(RegOpenKey(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Option", &hKey)))
31  {
32  if(RegReadDWORD(hKey, L"OptionValue", &dwValue)) piSysMet[SM_CLEANBOOT] = (INT)dwValue;
33  ZwClose(hKey);
34  }
35 
36  /* FIXME: HACK, due to missing PDEV on first init */
37  if (!gppdevPrimary)
38  {
39  Width = 640;
40  Height = 480;
41  }
42  else
43  {
46  }
47 
48  /* Screen sizes */
49  piSysMet[SM_CXSCREEN] = Width;
50  piSysMet[SM_CYSCREEN] = Height;
51  piSysMet[SM_XVIRTUALSCREEN] = 0;
52  piSysMet[SM_YVIRTUALSCREEN] = 0;
53  piSysMet[SM_CXVIRTUALSCREEN] = Width;
54  piSysMet[SM_CYVIRTUALSCREEN] = Height;
55 
56  /* NC area sizes */
57  piSysMet[SM_CYCAPTION] = gspv.ncm.iCaptionHeight + 1; // 19
58  piSysMet[SM_CYSMCAPTION] = gspv.ncm.iSmCaptionHeight + 1; // 15;
59  piSysMet[SM_CXSIZE] = gspv.ncm.iCaptionHeight; // 18;
60  piSysMet[SM_CYSIZE] = gspv.ncm.iCaptionHeight; // 18;
61  piSysMet[SM_CXSMSIZE] = gspv.ncm.iSmCaptionWidth; // 12; XP: piSysMet(SM_CYSMCAPTION) - 1
62  piSysMet[SM_CYSMSIZE] = gspv.ncm.iSmCaptionHeight; // 14;
63  piSysMet[SM_CXBORDER] = 1; // Seems to be hardcoded
64  piSysMet[SM_CYBORDER] = 1; // Seems to be hardcoded
65  piSysMet[SM_CXFOCUSBORDER] = 1;
66  piSysMet[SM_CYFOCUSBORDER] = 1;
67  piSysMet[SM_CXDLGFRAME] = 3;
68  piSysMet[SM_CYDLGFRAME] = 3;
69  piSysMet[SM_CXEDGE] = 2;
70  piSysMet[SM_CYEDGE] = 2;
71  piSysMet[SM_CXFRAME] = piSysMet[SM_CXDLGFRAME] + gspv.ncm.iBorderWidth; // 4
72  piSysMet[SM_CYFRAME] = piSysMet[SM_CYDLGFRAME] + gspv.ncm.iBorderWidth; // 4
73 #if (_WIN32_WINNT >= 0x0600)
74  piSysMet[SM_CXPADDEDBORDER] = 0;
75 #endif
76 
77  /* Window sizes */
78  TRACE("ncm.iCaptionWidth=%d,GetSystemMetrics(SM_CYSIZE)=%d,GetSystemMetrics(SM_CXFRAME)=%d,avcwCaption=%d \n",
79  gspv.ncm.iCaptionWidth, piSysMet[SM_CYSIZE],piSysMet[SM_CXFRAME], gspv.tmCaptionFont.tmAveCharWidth);
80 
81  piSysMet[SM_CXMIN] = 3 * max(gspv.ncm.iCaptionWidth, 8) // 112
82  + piSysMet[SM_CYSIZE] + 4
84  + 2 * piSysMet[SM_CXFRAME];
85  piSysMet[SM_CYMIN] = piSysMet[SM_CYCAPTION] + 2 * piSysMet[SM_CYFRAME]; // 27
86  piSysMet[SM_CXMAXIMIZED] = piSysMet[SM_CXSCREEN] + 2 * piSysMet[SM_CXFRAME];
87  piSysMet[SM_CYMAXIMIZED] = piSysMet[SM_CYSCREEN] - 20;
88  piSysMet[SM_CXFULLSCREEN] = piSysMet[SM_CXSCREEN];
89  piSysMet[SM_CYFULLSCREEN] = piSysMet[SM_CYMAXIMIZED] - piSysMet[SM_CYMIN];
90  piSysMet[SM_CYKANJIWINDOW] = 0;
91  piSysMet[SM_CXMINIMIZED] = gspv.mm.iWidth + 6;
92  piSysMet[SM_CYMINIMIZED] = piSysMet[SM_CYCAPTION] + 5;
93  piSysMet[SM_CXMINSPACING] = piSysMet[SM_CXMINIMIZED] + gspv.mm.iHorzGap;
94  piSysMet[SM_CYMINSPACING] = piSysMet[SM_CYMINIMIZED] + gspv.mm.iVertGap;
95  piSysMet[SM_CXMAXTRACK] = piSysMet[SM_CXVIRTUALSCREEN] + 4
96  + 2 * piSysMet[SM_CXFRAME];
97  piSysMet[SM_CYMAXTRACK] = piSysMet[SM_CYVIRTUALSCREEN] + 4
98  + 2 * piSysMet[SM_CYFRAME];
99 
100  /* Icon */
101  piSysMet[SM_CXVSCROLL] = gspv.ncm.iScrollWidth; // 16;
102  piSysMet[SM_CYVTHUMB] = gspv.ncm.iScrollHeight; // 16;
103  piSysMet[SM_CYHSCROLL] = gspv.ncm.iScrollWidth; // 16;
104  piSysMet[SM_CXHTHUMB] = gspv.ncm.iScrollHeight; // 16;
105  piSysMet[SM_CYVSCROLL] = gspv.ncm.iScrollHeight; // 16
106  piSysMet[SM_CXHSCROLL] = gspv.ncm.iScrollHeight; // 16;
107  piSysMet[SM_CXICON] = 32;
108  piSysMet[SM_CYICON] = 32;
109  piSysMet[SM_CXSMICON] = 16;
110  piSysMet[SM_CYSMICON] = 16;
111  piSysMet[SM_CXICONSPACING] = gspv.im.iHorzSpacing; // 64;
112  piSysMet[SM_CYICONSPACING] = gspv.im.iVertSpacing; // 64;
113  piSysMet[SM_CXCURSOR] = 32;
114  piSysMet[SM_CYCURSOR] = 32;
115  piSysMet[SM_CXMINTRACK] = piSysMet[SM_CXMIN]; // 117
116  piSysMet[SM_CYMINTRACK] = piSysMet[SM_CYMIN]; // 27
117  piSysMet[SM_CXDRAG] = 4;
118  piSysMet[SM_CYDRAG] = 4;
119  piSysMet[SM_ARRANGE] = gspv.mm.iArrange; // 8;
120 
121  /* Menu */
122  piSysMet[SM_CYMENU] = gspv.ncm.iMenuHeight + 1; // 19;
124  piSysMet[SM_CXMENUCHECK] = ((1 + gspv.tmMenuFont.tmHeight +
125  gspv.tmMenuFont.tmExternalLeading) & ~1) - 1; // 13;
126  piSysMet[SM_CYMENUCHECK] = piSysMet[SM_CXMENUCHECK];
127  piSysMet[SM_CXMENUSIZE] = gspv.ncm.iMenuWidth; // 18;
128  piSysMet[SM_CYMENUSIZE] = gspv.ncm.iMenuHeight; // 18;
129 
130  /* Mouse */
131  piSysMet[SM_MOUSEPRESENT] = 1;
132  piSysMet[SM_MOUSEWHEELPRESENT] = 1;
133  piSysMet[SM_CMOUSEBUTTONS] = 2;
134  piSysMet[SM_SWAPBUTTON] = gspv.bMouseBtnSwap ? 1 : 0;
135  piSysMet[SM_CXDOUBLECLK] = gspv.iDblClickWidth;
136  piSysMet[SM_CYDOUBLECLK] = gspv.iDblClickHeight;
137 #if (_WIN32_WINNT >= 0x0600)
138  piSysMet[SM_MOUSEHORIZONTALWHEELPRESENT] = 0;
139 #endif
140 
141  /* Version info */
142  piSysMet[SM_TABLETPC] = 0;
143  piSysMet[SM_MEDIACENTER] = 0;
144  piSysMet[SM_STARTER] = 0;
145  piSysMet[SM_SERVERR2] = 0;
146  piSysMet[SM_PENWINDOWS] = 0;
147 
148  /* Other */
149  piSysMet[SM_DEBUG] = 0;
150  piSysMet[SM_NETWORK] = 3;
151  piSysMet[SM_SLOWMACHINE] = 0;
152  piSysMet[SM_SECURE] = 0;
153  piSysMet[SM_DBCSENABLED] = 0;
154  piSysMet[SM_SHOWSOUNDS] = gspv.bShowSounds;
155  piSysMet[SM_MIDEASTENABLED] = 0;
156  piSysMet[SM_CMONITORS] = 1;
157  piSysMet[SM_SAMEDISPLAYFORMAT] = 1;
158  piSysMet[SM_IMMENABLED] = 0;
159 
160  /* Reserved */
161  piSysMet[SM_RESERVED1] = 0;
162  piSysMet[SM_RESERVED2] = 0;
163  piSysMet[SM_RESERVED3] = 0;
164  piSysMet[SM_RESERVED4] = 0;
165  piSysMet[64] = 0;
166  piSysMet[65] = 0;
167  piSysMet[66] = 0;
168 #if (_WIN32_WINNT >= 0x0600)
169  piSysMet[90] = 0;
170 #endif
171 
173  Setup = TRUE;
174 
175  return TRUE;
176 }
#define SM_CXICONSPACING
Definition: winuser.h:991
#define max(a, b)
Definition: svc.c:63
#define SM_CYDOUBLECLK
Definition: winuser.h:990
#define SM_CYHSCROLL
Definition: winuser.h:952
#define TRUE
Definition: types.h:120
#define SM_SHOWSOUNDS
Definition: winuser.h:1020
#define SM_CYSIZE
Definition: winuser.h:982
#define SM_XVIRTUALSCREEN
Definition: winuser.h:1026
#define SM_CYMENUSIZE
Definition: winuser.h:1008
LONG tmExternalLeading
Definition: wingdi.h:2365
#define SM_CMONITORS
Definition: winuser.h:1030
#define SM_CYMINTRACK
Definition: winuser.h:988
#define SM_MOUSEPRESENT
Definition: winuser.h:970
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1028
#define SM_CXMINIMIZED
Definition: winuser.h:1010
BOOL bMouseBtnSwap
Definition: sysparams.h:82
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
GDIINFO gdiinfo
Definition: pdevobj.h:124
PPDEVOBJ gppdevPrimary
Definition: pdevobj.c:13
#define SM_MIDEASTENABLED
Definition: winuser.h:1024
LONG tmAveCharWidth
Definition: wingdi.h:2366
#define SM_SLOWMACHINE
Definition: winuser.h:1023
#define INT
Definition: polytest.cpp:20
#define SM_CYVSCROLL
Definition: winuser.h:971
NONCLIENTMETRICSW ncm
Definition: sysparams.h:51
#define SM_CXMENUCHECK
Definition: winuser.h:1021
#define SM_CYCURSOR
Definition: winuser.h:965
#define SM_CMOUSEBUTTONS
Definition: winuser.h:996
#define SM_CXEDGE
Definition: winuser.h:998
#define SM_CYSMICON
Definition: winuser.h:1003
#define SM_NETWORK
Definition: winuser.h:1016
#define SM_CYMAXTRACK
Definition: winuser.h:1013
#define SM_CYFRAME
Definition: winuser.h:986
#define SM_CXFRAME
Definition: winuser.h:984
PSERVERINFO gpsi
Definition: main.c:27
int32_t INT
Definition: typedefs.h:56
#define SM_CXMINSPACING
Definition: winuser.h:1000
#define SM_CXSCREEN
Definition: winuser.h:949
#define SM_CYMENUCHECK
Definition: winuser.h:1022
DWORD dwSRVIFlags
Definition: ntuser.h:1004
#define SM_CYMAXIMIZED
Definition: winuser.h:1015
#define SM_CYDLGFRAME
Definition: winuser.h:958
#define SM_CXICON
Definition: winuser.h:962
#define SM_RESERVED2
Definition: winuser.h:976
ULONG ulHorzRes
Definition: winddi.h:882
#define SM_CXHTHUMB
Definition: winuser.h:961
#define SM_CYEDGE
Definition: winuser.h:999
#define SM_CXDRAG
Definition: winuser.h:1018
#define SM_SECURE
Definition: winuser.h:997
#define SM_CYVTHUMB
Definition: winuser.h:960
#define SM_PENWINDOWS
Definition: winuser.h:994
#define SM_CYMIN
Definition: winuser.h:980
TEXTMETRICW tmCaptionFont
Definition: sysparams.h:139
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1029
#define SM_RESERVED4
Definition: winuser.h:978
#define SM_CLEANBOOT
Definition: winuser.h:1017
#define SM_CYSMSIZE
Definition: winuser.h:1006
#define SM_CYSCREEN
Definition: winuser.h:950
#define TRACE(s)
Definition: solgame.cpp:4
#define SM_CYCAPTION
Definition: winuser.h:953
#define SM_CXHSCROLL
Definition: winuser.h:972
#define SM_CXCURSOR
Definition: winuser.h:964
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define SM_CXMAXIMIZED
Definition: winuser.h:1014
#define SM_CXDLGFRAME
Definition: winuser.h:956
#define SRVINFO_METRICS
Definition: ntuser.h:912
#define SM_CXMINTRACK
Definition: winuser.h:987
BOOL NTAPI RegReadDWORD(HKEY hkey, PWSTR pwszValue, PDWORD pdwData)
Definition: registry.c:150
#define SM_CXSMSIZE
Definition: winuser.h:1005
SPIVALUES gspv
Definition: sysparams.c:17
BOOL bShowSounds
Definition: sysparams.h:71
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SM_CXSMICON
Definition: winuser.h:1002
#define SM_CYBORDER
Definition: winuser.h:955
#define SM_CYICON
Definition: winuser.h:963
#define SM_CYMINIMIZED
Definition: winuser.h:1011
static const WCHAR L[]
Definition: oid.c:1250
#define SM_CYICONSPACING
Definition: winuser.h:992
BOOL bMenuDropAlign
Definition: sysparams.h:130
#define SM_CXBORDER
Definition: winuser.h:954
#define SM_MENUDROPALIGNMENT
Definition: winuser.h:993
#define SM_YVIRTUALSCREEN
Definition: winuser.h:1027
#define SM_CYMINSPACING
Definition: winuser.h:1001
#define SM_RESERVED3
Definition: winuser.h:977
#define SM_ARRANGE
Definition: winuser.h:1009
#define SM_DEBUG
Definition: winuser.h:973
INT iDblClickHeight
Definition: sysparams.h:89
ICONMETRICSW im
Definition: sysparams.h:53
#define SM_SAMEDISPLAYFORMAT
Definition: winuser.h:1031
#define SM_CXVSCROLL
Definition: winuser.h:951
TEXTMETRICW tmMenuFont
Definition: sysparams.h:138
#define SM_SWAPBUTTON
Definition: winuser.h:974
#define SM_CXMAXTRACK
Definition: winuser.h:1012
#define SM_CYFULLSCREEN
Definition: winuser.h:968
#define SM_CXSIZE
Definition: winuser.h:981
unsigned int ULONG
Definition: retypes.h:1
INT iDblClickWidth
Definition: sysparams.h:88
#define SM_CYKANJIWINDOW
Definition: winuser.h:969
#define SM_CXFULLSCREEN
Definition: winuser.h:967
#define SM_CYMENU
Definition: winuser.h:966
#define SM_CYDRAG
Definition: winuser.h:1019
static BOOL Setup
Definition: metric.c:13
LONG tmHeight
Definition: wingdi.h:2361
ULONG ulVertRes
Definition: winddi.h:883
#define SM_DBCSENABLED
Definition: winuser.h:995
#define RegOpenKey
Definition: winreg.h:519
#define SM_MOUSEWHEELPRESENT
Definition: winuser.h:1025
#define SM_RESERVED1
Definition: winuser.h:975
#define SM_CYSMCAPTION
Definition: winuser.h:1004
#define SM_CXDOUBLECLK
Definition: winuser.h:989
MINIMIZEDMETRICS mm
Definition: sysparams.h:52
#define SM_CXMIN
Definition: winuser.h:979
#define SM_CXMENUSIZE
Definition: winuser.h:1007

Referenced by co_IntInitializeDesktopGraphics(), SpiUpdatePerUserSystemParameters(), UserChangeDisplaySettings(), and UserSystemParametersInfo().

◆ InitSessionImpl()

NTSTATUS FASTCALL InitSessionImpl ( VOID  )

Definition at line 18 of file session.c.

19 {
20  return RtlCreateAtomTable(37, &gAtomTable);
21 }
PRTL_ATOM_TABLE gAtomTable
Definition: session.c:13
NTSYSAPI NTSTATUS NTAPI RtlCreateAtomTable(_In_ ULONG TableSize, _Inout_ PRTL_ATOM_TABLE *AtomTable)

Referenced by InitUserImpl().

◆ InitThreadCallback()

NTSTATUS NTAPI InitThreadCallback ( PETHREAD  Thread)

Definition at line 438 of file main.c.

439 {
441  PCLIENTINFO pci;
442  PTHREADINFO ptiCurrent;
443  int i;
445  PTEB pTeb;
446  LARGE_INTEGER LargeTickCount;
447  PRTL_USER_PROCESS_PARAMETERS ProcessParams;
448 
449  Process = Thread->ThreadsProcess;
450 
451  pTeb = NtCurrentTeb();
452  ASSERT(pTeb);
453 
454  ProcessParams = pTeb->ProcessEnvironmentBlock->ProcessParameters;
455 
456  /* Allocate a new Win32 thread info */
457  Status = AllocW32Thread(Thread, &ptiCurrent);
458  if (!NT_SUCCESS(Status))
459  {
460  ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
462  return Status;
463  }
464 
465  /* Initialize the THREADINFO */
466  ptiCurrent->pEThread = Thread;
467  ptiCurrent->ppi = PsGetProcessWin32Process(Process);
468  IntReferenceProcessInfo(ptiCurrent->ppi);
469  pTeb->Win32ThreadInfo = ptiCurrent;
470  ptiCurrent->pClientInfo = (PCLIENTINFO)pTeb->Win32ClientInfo;
471 
472  /* Mark the process as having threads */
473  ptiCurrent->ppi->W32PF_flags |= W32PF_THREADCONNECTED;
474 
475  InitializeListHead(&ptiCurrent->WindowListHead);
479  InitializeListHead(&ptiCurrent->PtiLink);
480  for (i = 0; i < NB_HOOKS; i++)
481  {
482  InitializeListHead(&ptiCurrent->aphkStart[i]);
483  }
484  ptiCurrent->ptiSibling = ptiCurrent->ppi->ptiList;
485  ptiCurrent->ppi->ptiList = ptiCurrent;
486  ptiCurrent->ppi->cThreads++;
487 
488  ptiCurrent->hEventQueueClient = NULL;
489  Status = ZwCreateEvent(&ptiCurrent->hEventQueueClient, EVENT_ALL_ACCESS,
491  if (!NT_SUCCESS(Status))
492  {
493  ERR_CH(UserThread, "Event creation failed, Status 0x%08x.\n", Status);
494  goto error;
495  }
498  (PVOID*)&ptiCurrent->pEventQueueServer, NULL);
499  if (!NT_SUCCESS(Status))
500  {
501  ERR_CH(UserThread, "Failed referencing the event object, Status 0x%08x.\n", Status);
503  ptiCurrent->hEventQueueClient = NULL;
504  goto error;
505  }
506 
507  KeQueryTickCount(&LargeTickCount);
508  ptiCurrent->timeLast = LargeTickCount.u.LowPart;
509 
510  ptiCurrent->MessageQueue = MsqCreateMessageQueue(ptiCurrent);
511  if (ptiCurrent->MessageQueue == NULL)
512  {
513  ERR_CH(UserThread, "Failed to allocate message loop\n");
515  goto error;
516  }
517 
518  ptiCurrent->KeyboardLayout = W32kGetDefaultKeyLayout();
519  if (ptiCurrent->KeyboardLayout)
520  UserReferenceObject(ptiCurrent->KeyboardLayout);
521 
522  ptiCurrent->TIF_flags &= ~TIF_INCLEANUP;
523 
524  // FIXME: Flag SYSTEM threads with... TIF_SYSTEMTHREAD !!
525 
526  /* CSRSS threads have some special features */
527  if (Process == gpepCSRSS || !gpepCSRSS)
529 
530  ptiCurrent->pcti = &ptiCurrent->cti;
531 
532  /* Initialize the CLIENTINFO */
533  pci = (PCLIENTINFO)pTeb->Win32ClientInfo;
534  RtlZeroMemory(pci, sizeof(*pci));
535  pci->ppi = ptiCurrent->ppi;
536  pci->fsHooks = ptiCurrent->fsHooks;
537  pci->dwTIFlags = ptiCurrent->TIF_flags;
538  if (ptiCurrent->KeyboardLayout)
539  {
540  pci->hKL = ptiCurrent->KeyboardLayout->hkl;
541  pci->CodePage = ptiCurrent->KeyboardLayout->CodePage;
542  }
543 
544  /* Need to pass the user Startup Information to the current process. */
545  if ( ProcessParams )
546  {
547  if ( ptiCurrent->ppi->usi.cb == 0 ) // Not initialized yet.
548  {
549  if ( ProcessParams->WindowFlags != 0 ) // Need window flags set.
550  {
551  ptiCurrent->ppi->usi.cb = sizeof(USERSTARTUPINFO);
552  ptiCurrent->ppi->usi.dwX = ProcessParams->StartingX;
553  ptiCurrent->ppi->usi.dwY = ProcessParams->StartingY;
554  ptiCurrent->ppi->usi.dwXSize = ProcessParams->CountX;
555  ptiCurrent->ppi->usi.dwYSize = ProcessParams->CountY;
556  ptiCurrent->ppi->usi.dwFlags = ProcessParams->WindowFlags;
557  ptiCurrent->ppi->usi.wShowWindow = (WORD)ProcessParams->ShowWindowFlags;
558  }
559  }
560  }
561 
562  /*
563  * Assign a default window station and desktop to the process.
564  * Do not try to open a desktop or window station before the very first
565  * (interactive) window station has been created by Winlogon.
566  */
567  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)) &&
568  ptiCurrent->ppi->hdeskStartup == NULL &&
570  {
571  HWINSTA hWinSta = NULL;
572  HDESK hDesk = NULL;
573  UNICODE_STRING DesktopPath;
574  PDESKTOP pdesk;
575 
576  /*
577  * Inherit the thread desktop and process window station (if not yet inherited)
578  * from the process startup info structure. See documentation of CreateProcess().
579  */
581  if (ProcessParams && ProcessParams->DesktopInfo.Length > 0)
582  {
583  Status = IntSafeCopyUnicodeStringTerminateNULL(&DesktopPath, &ProcessParams->DesktopInfo);
584  }
585  if (!NT_SUCCESS(Status))
586  {
587  RtlInitUnicodeString(&DesktopPath, NULL);
588  }
589 
591  &DesktopPath,
592  !!(ProcessParams->WindowFlags & STARTF_INHERITDESKTOP),
593  &hWinSta,
594  &hDesk);
595 
596  if (DesktopPath.Buffer)
597  ExFreePoolWithTag(DesktopPath.Buffer, TAG_STRING);
598 
599  if (!NT_SUCCESS(Status))
600  {
601  ERR_CH(UserThread, "Failed to assign default desktop and winsta to process\n");
602  goto error;
603  }
604 
605  if (!UserSetProcessWindowStation(hWinSta))
606  {
608  ERR_CH(UserThread, "Failed to set initial process winsta\n");
609  goto error;
610  }
611 
612  /* Validate the new desktop */
613  Status = IntValidateDesktopHandle(hDesk, UserMode, 0, &pdesk);
614  if (!NT_SUCCESS(Status))
615  {
616  ERR_CH(UserThread, "Failed to validate initial desktop handle\n");
617  goto error;
618  }
619 
620  /* Store the parsed desktop as the initial desktop */
621  ASSERT(ptiCurrent->ppi->hdeskStartup == NULL);
622  ASSERT(Process->UniqueProcessId != gpidLogon);
623  ptiCurrent->ppi->hdeskStartup = hDesk;
624  ptiCurrent->ppi->rpdeskStartup = pdesk;
625  }
626 
627  if (ptiCurrent->ppi->hdeskStartup != NULL)
628  {
629  if (!IntSetThreadDesktop(ptiCurrent->ppi->hdeskStartup, FALSE))
630  {
631  ERR_CH(UserThread, "Failed to set thread desktop\n");
633  goto error;
634  }
635  }
636 
637  /* Mark the thread as fully initialized */
638  ptiCurrent->TIF_flags |= TIF_GUITHREADINITIALIZED;
639 
640  if (!(ptiCurrent->ppi->W32PF_flags & (W32PF_ALLOWFOREGROUNDACTIVATE | W32PF_APPSTARTING)) &&
641  (gptiForeground && gptiForeground->ppi == ptiCurrent->ppi ))
642  {
643  ptiCurrent->TIF_flags |= TIF_ALLOWFOREGROUNDACTIVATE;
644  }
645  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
646 
647  /* Last things to do only if we are not a SYSTEM or CSRSS thread */
648  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)))
649  {
650  /* Callback to User32 Client Thread Setup */
651  TRACE_CH(UserThread, "Call co_IntClientThreadSetup...\n");
653  if (!NT_SUCCESS(Status))
654  {
655  ERR_CH(UserThread, "ClientThreadSetup failed with Status 0x%08lx\n", Status);
656  goto error;
657  }
658  TRACE_CH(UserThread, "co_IntClientThreadSetup succeeded!\n");
659  }
660  else
661  {
662  TRACE_CH(UserThread, "co_IntClientThreadSetup cannot be called...\n");
663  }
664 
665  TRACE_CH(UserThread, "UserCreateW32Thread pti 0x%p\n", ptiCurrent);
666  return STATUS_SUCCESS;
667 
668 error:
669  ERR_CH(UserThread, "InitThreadCallback failed! Freeing pti 0x%p for TID:0x%lx\n",
670  ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
672  return Status;
673 }
ULONG fsHooks
Definition: ntuser.h:296
USERSTARTUPINFO usi
Definition: win32.h:269
ULONG Win32ClientInfo[31]
Definition: compat.h:496
PPEB ProcessEnvironmentBlock
Definition: ntddk_ex.h:337
#define error(str)
Definition: mkdosfs.c:1605
PVOID Win32ThreadInfo
Definition: compat.h:495
LIST_ENTRY WindowListHead
Definition: win32.h:149
PTHREADINFO ptiSibling
Definition: win32.h:115
#define TAG_STRING
Definition: oslist.c:24
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:246
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
FLONG TIF_flags
Definition: win32.h:94
PWINSTATION_OBJECT InputWindowStation
Definition: winsta.c:21
PEPROCESS gpepCSRSS
Definition: csr.c:15
LONG NTSTATUS
Definition: precomp.h:26
#define HandleToUlong(h)
Definition: basetsd.h:79
LIST_ENTRY PtiLink
Definition: win32.h:125
UNICODE_STRING DesktopInfo
Definition: rtltypes.h:1526
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:242
POBJECT_TYPE ExEventObjectType
Definition: event.c:22
PPROCESSINFO ppi
Definition: win32.h:87
PTHREADINFO gptiForeground
Definition: focus.c:14
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define W32PF_ALLOWFOREGROUNDACTIVATE
Definition: win32.h:12
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:496
HDESK hdeskStartup
Definition: win32.h:254
NTSTATUS FASTCALL IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, PUNICODE_STRING Source)
Definition: misc.c:659
#define TIF_CSRSSTHREAD
Definition: ntuser.h:243
LIST_ENTRY SentMessagesListHead
Definition: win32.h:99
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
NTSTATUS AllocW32Thread(IN PETHREAD Thread, OUT PTHREADINFO *W32Thread)
Definition: main.c:365
#define STARTF_INHERITDESKTOP
Definition: undocuser.h:162
smooth NULL
Definition: ftsmooth.c:416
#define IntReferenceProcessInfo(ppi)
Definition: win32.h:177
LIST_ENTRY W32CallbackListHead
Definition: win32.h:150
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:264
struct _CLIENTTHREADINFO * pcti
Definition: win32.h:90
VOID NTAPI KeQueryTickCount(IN PLARGE_INTEGER TickCount)
Definition: clock.c:165
#define TIF_ALLOWFOREGROUNDACTIVATE
Definition: ntuser.h:245
INT cThreads
Definition: win32.h:253
ULONG fsHooks
Definition: win32.h:116
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO pti)
Definition: msgqueue.c:2430
CLIENT_ID Cid
Definition: pstypes.h:1059
struct _DESKTOP * rpdeskStartup
Definition: win32.h:249
PKEVENT pEventQueueServer
Definition: win32.h:124
unsigned short WORD
Definition: ntddk_ex.h:93
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
struct _CLIENTINFO * pClientInfo
Definition: win32.h:93
HKL hKL
Definition: ntuser.h:307
HANDLE UniqueThread
Definition: compat.h:475
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3376
LONG timeLast
Definition: win32.h:101
struct _CLIENTINFO * PCLIENTINFO
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1346
#define NB_HOOKS
Definition: ntuser.h:130
LIST_ENTRY aphkStart[NB_HOOKS]
FIXME!
Definition: win32.h:137
PRTL_USER_PROCESS_PARAMETERS ProcessParameters
Definition: btrfs_drv.h:1838
CLIENTTHREADINFO cti
Definition: win32.h:138
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:680
struct tagKL * KeyboardLayout
Definition: win32.h:89
Status
Definition: gdiplustypes.h:24
HANDLE hEventQueueClient
Definition: win32.h:122
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
Definition: compat.h:484
USHORT CodePage
Definition: ntuser.h:308
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:107
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
LIST_ENTRY PostedMessagesListHead
Definition: win32.h:131
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
Definition: desktop.c:3181
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
struct tagUSERSTARTUPINFO USERSTARTUPINFO
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
PKL W32kGetDefaultKeyLayout(VOID)
Definition: kbdlayout.c:343
NTSTATUS FASTCALL IntResolveDesktop(IN PEPROCESS Process, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta, OUT HDESK *phDesktop)
Definition: desktop.c:535
NTSTATUS FASTCALL IntValidateDesktopHandle(HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
Definition: desktop.c:1200
NTSTATUS APIENTRY co_IntClientThreadSetup(VOID)
Definition: callback.c:948
#define W32PF_APPSTARTING
Definition: win32.h:10
#define ERR_CH(ch, fmt,...)
Definition: debug.h:104
WORD wShowWindow
Definition: win32.h:214
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
struct _LARGE_INTEGER::@2192 u
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
PTHREADINFO ptiList
Definition: win32.h:247
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
struct _PROCESSINFO * ppi
Definition: ntuser.h:314
return STATUS_SUCCESS
Definition: btrfs.c:2725
DWORD dwTIFlags
Definition: ntuser.h:292
#define TIF_INCLEANUP
Definition: ntuser.h:240
#define W32PF_THREADCONNECTED
Definition: win32.h:18
HANDLE gpidLogon
Definition: simplecall.c:15
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:697

Referenced by Win32kThreadCallback().

◆ IntClearWindowState()

VOID FASTCALL IntClearWindowState ( PWND  ,
UINT   
)

Definition at line 592 of file misc.c.

593 {
594  UINT bit;
595  if (gptiCurrent->ppi != pWnd->head.pti->ppi) return;
596  bit = 1 << LOWORD(Flag);
597  TRACE("CWS %x\n",bit);
598  switch(HIWORD(Flag))
599  {
600  case 0:
601  pWnd->state &= ~bit;
602  break;
603  case 1:
604  pWnd->state2 &= ~bit;
605  break;
606  case 2:
607  pWnd->ExStyle2 &= ~bit;
608  break;
609  }
610 }
PPROCESSINFO ppi
Definition: win32.h:87
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
#define TRACE(s)
Definition: solgame.cpp:4
Definition: xml2sdb.h:79
unsigned int UINT
Definition: ndis.h:50
#define HIWORD(l)
Definition: typedefs.h:246
#define LOWORD(l)
Definition: pedump.c:82

Referenced by NtUserCallHwndParam().

◆ IntDdeGetMessageHook()

BOOL APIENTRY IntDdeGetMessageHook ( PMSG  ,
LONG_PTR   
)

Definition at line 326 of file dde.c.

327 {
328  PWND pWnd, pWndClient;
329  PDDE_DATA pddeData;
330  PDDE_PROP pddeProp;
331  BOOL Ret;
332 
333  pWnd = UserGetWindowObject(pMsg->hwnd);
334  if (pWnd == NULL)
335  {
336  ERR("DDE Get Window is dead. %p\n", pMsg->hwnd);
337  return TRUE;
338  }
339 
340  if (pMsg->message == WM_DDE_TERMINATE)
341  {
342  pddeProp = (PDDE_PROP)UserGetProp(pWnd, AtomDDETrack, TRUE);
343  if (pddeProp)
344  {
345  pWndClient = UserGetWindowObject((HWND)pMsg->wParam);
346  if (pWndClient == NULL)
347  {
348  ERR("DDE Get Client WM_DDE_TERMINATE\n");
349  }
350 
352  ExFreePoolWithTag(pddeProp, USERTAG_DDE1);
353  }
354  return TRUE;
355  }
356 
357  TRACE("DDE Get Msg 0x%x\n",pMsg->message);
358 
359  pddeData = (PDDE_DATA)ExtraInfo;
360 
361  if ( pddeData )
362  {
363  TRACE("DDE Get size %d lParam c=%08lx lp c=%08lx\n",pddeData->cbSize, pMsg->lParam, pddeData->lParam);
364 
365  // Callback.
366  Ret = IntDDEGetCallback( pWnd, pMsg, pddeData->pvBuffer, pddeData->cbSize);
367  if (!Ret)
368  {
369  ERR("DDE Get CB failed\n");
370  }
371 
372  if (pddeData->pvBuffer) ExFreePoolWithTag(pddeData->pvBuffer, USERTAG_DDE);
373 
374  ExFreePoolWithTag(pddeData, USERTAG_DDE5);
375 
376  return Ret;
377  }
378  TRACE("DDE Get No DDE Data found!\n");
379  return TRUE;
380 }
struct _DDE_DATA * PDDE_DATA
#define TRUE
Definition: types.h:120
PVOID pvBuffer
Definition: dde.c:32
#define USERTAG_DDE
Definition: tags.h:222
#define USERTAG_DDE1
Definition: tags.h:210
#define USERTAG_DDE5
Definition: tags.h:213
LPARAM lParam
Definition: dde.c:30
unsigned int BOOL
Definition: ntddk_ex.h:94
#define WM_DDE_TERMINATE
Definition: dde.h:38
smooth NULL
Definition: ftsmooth.c:416
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:103
#define TRACE(s)
Definition: solgame.cpp:4
struct _DDE_PROP * PDDE_PROP
HANDLE FASTCALL UserGetProp(_In_ PWND Window, _In_ ATOM Atom, _In_ BOOLEAN SystemProp)
Definition: prop.c:46
Definition: dde.c:35
ATOM AtomDDETrack
Definition: ntuser.c:23
BOOL APIENTRY IntDDEGetCallback(IN PWND pWnd, IN OUT PMSG pMsg, IN PVOID Buffer, IN int size)
Definition: dde.c:111
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
Definition: dde.c:28
int cbSize
Definition: dde.c:31
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
HANDLE FASTCALL UserRemoveProp(_In_ PWND Window, _In_ ATOM Atom, _In_ BOOLEAN SystemProp)

Referenced by co_IntGetPeekMessage().

◆ IntDdePostMessageHook()

BOOL APIENTRY IntDdePostMessageHook ( IN  PWND,
IN  UINT,
IN  WPARAM,
IN OUT LPARAM ,
IN OUT LONG_PTR  
)

Definition at line 172 of file dde.c.

178 {
179  PWND pWndClient;
180  PDDE_DATA pddeData;
181  int size;
182  HGDIOBJ Object = NULL;
183  PVOID userBuf = NULL;
184  PVOID Buffer = NULL;
185  LPARAM lp = *lParam;
186 
187  if (pWnd->head.pti->ppi != gptiCurrent->ppi)
188  {
189  TRACE("Posting long DDE 0x%x\n",Msg);
190  // Initiate is sent only across borders.
191  if (Msg == WM_DDE_INITIATE)
192  {
193  return FALSE;
194  }
195 
196  pWndClient = UserGetWindowObject((HWND)wParam);
197  if (pWndClient == NULL)
198  {
199  // This is terminating so post it.
200  if ( Msg == WM_DDE_TERMINATE)
201  {
202  TRACE("DDE Posted WM_DDE_TERMINATE\n");
203  return TRUE;
204  }
205  TRACE("Invalid DDE Client Window handle\n");
206  return FALSE;
207  }
208 
209  if ( Msg == WM_DDE_REQUEST || Msg == WM_DDE_UNADVISE )
210  {
211  // Do not bother to callback after validation.
212  return TRUE;
213  }
214 
215  if ( Msg == WM_DDE_TERMINATE )
216  {
218 
219  // Do not bother to callback.
220  return TRUE;
221  }
222 
223  if ( Msg == WM_DDE_EXECUTE && *lParam == 0)
224  {
225  // Do not bother to do a callback.
226  TRACE("DDE Post EXECUTE lParam 0\n");
227  return FALSE;
228  }
229 
230  // Callback.
231  if ((size = IntDDEPostCallback(pWnd, Msg, wParam, &lp, &userBuf)) == 0)
232  {
233  ERR("DDE Post Callback return 0 0x%x\n", Msg);
234  return FALSE;
235  }
236 
237  // No error HACK.
238  if (size == -1)
239  {
240  size = 0;
241  }
242  else
243  {
244  // Set buffer with users data size.
246  if (Buffer == NULL)
247  {
248  ERR("Failed to allocate %i bytes.\n", size);
249  return FALSE;
250  }
251  // No SEH? Yes, the user memory is freed after the Acknowledgment or at Termination.
252  RtlCopyMemory(Buffer, userBuf, size);
253  }
254 
255  TRACE("DDE Post size %d 0x%x\n",size, Msg);
256 
257  switch(Msg)
258  {
259  case WM_DDE_POKE:
260  {
261  DDEPOKE *pddePoke = Buffer;
262  NT_ASSERT(pddePoke != NULL);
263  switch(pddePoke->cfFormat)
264  {
265  case CF_BITMAP:
266  case CF_DIB:
267  case CF_PALETTE:
268  RtlCopyMemory(&Object, pddePoke->Value, sizeof(HGDIOBJ));
269  break;
270  default:
271  break;
272  }
273  break;
274  }
275  case WM_DDE_DATA:
276  {
277  DDEDATA *pddeData2 = Buffer;
278  NT_ASSERT(pddeData2 != NULL);
279  switch(pddeData2->cfFormat)
280  {
281  case CF_BITMAP:
282  case CF_DIB:
283  case CF_PALETTE:
284  RtlCopyMemory(&Object, pddeData2->Value, sizeof(HGDIOBJ));
285  break;
286  default:
287  break;
288  }
289  break;
290  }
291  default:
292  break;
293  }
294 
295  if (Object)
296  {
297  // Give gdi object to the other process.
298  GreSetObjectOwner(Object, pWnd->head.pti->ppi->W32Pid);
299  }
300 
302  if (pddeData == NULL)
303  {
304  ERR("Failed to allocate DDE_DATA\n");
306  return FALSE;
307  }
308 
309  pddeData->cbSize = size;
310  pddeData->pvBuffer = Buffer;
311  pddeData->lParam = lp;
312 
313  TRACE("DDE Post lParam c=%08lx\n",lp);
314  *lParam = lp;
315 
316  // Attach this data packet to the user message.
317  *ExtraInfo = (LONG_PTR)pddeData;
318  }
319  return TRUE;
320 }
#define LONG_PTR
Definition: treelist.c:79
BOOL NTAPI GreSetObjectOwner(HGDIOBJ hobj, ULONG ulOwner)
Definition: gdiobj.c:1250
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
#define WM_DDE_UNADVISE
Definition: dde.h:40
PVOID pvBuffer
Definition: dde.c:32
#define USERTAG_DDE
Definition: tags.h:222
Definition: dde.h:71
struct @1567 Msg[]
int APIENTRY IntDDEPostCallback(IN PWND pWnd, IN UINT Msg, IN WPARAM wParam, IN OUT LPARAM *lParam, IN OUT PVOID *Buffer)
Definition: dde.c:48
short cfFormat
Definition: dde.h:59
#define WM_DDE_REQUEST
Definition: dde.h:43
WPARAM wParam
Definition: combotst.c:138
short cfFormat
Definition: dde.h:74
#define USERTAG_DDE5
Definition: tags.h:213
PPROCESSINFO ppi
Definition: win32.h:87
LPARAM lParam
Definition: dde.c:30
#define WM_DDE_TERMINATE
Definition: dde.h:38
#define WM_DDE_DATA
Definition: dde.h:42
#define CF_BITMAP
Definition: constants.h:397
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
Definition: bufpool.h:45
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:103
BYTE Value[1]
Definition: dde.h:75
Definition: dde.h:56
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
static IUnknown Object
Definition: main.c:512
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define WM_DDE_POKE
Definition: dde.h:44
#define CF_PALETTE
Definition: constants.h:404
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
Definition: dde.c:28
#define WM_DDE_INITIATE
Definition: dde.h:37
int cbSize
Definition: dde.c:31
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
#define WM_DDE_EXECUTE
Definition: dde.h:45
LPARAM lParam
Definition: combotst.c:139
#define NT_ASSERT
Definition: rtlfuncs.h:3312
BYTE Value[1]
Definition: dde.h:60
#define CF_DIB
Definition: constants.h:403

Referenced by UserPostMessage().

◆ IntDdeSendMessageHook()

BOOL FASTCALL IntDdeSendMessageHook ( PWND  ,
UINT  ,
WPARAM  ,
LPARAM   
)

Definition at line 386 of file dde.c.

387 {
388  PWND pWndServer;
389  PDDE_PROP pddeProp;
390 
391  if (pWnd->head.pti->ppi != gptiCurrent->ppi)
392  {
393  TRACE("Sending long DDE 0x%x\n",Msg);
394 
395  // Allow only Acknowledge and Initiate to be sent across borders.
396  if (Msg != WM_DDE_ACK )
397  {
398  if (Msg == WM_DDE_INITIATE) return TRUE;
399  return FALSE;
400  }
401 
402  TRACE("Sending long WM_DDE_ACK\n");
403 
404  pWndServer = UserGetWindowObject((HWND)wParam);
405  if (pWndServer == NULL)
406  {
407  ERR("Invalid DDE Server Window handle\n");
408  return FALSE;
409  }
410 
411  // Setup property so this conversation can be tracked.
413  if (pddeProp == NULL)
414  {
415  ERR("failed to allocate DDE_PROP\n");
416  return FALSE;
417  }
418 
419  pddeProp->spwnd = pWndServer;
420  pddeProp->spwndPartner = pWnd;
421 
422  UserSetProp(pWndServer, AtomDDETrack, (HANDLE)pddeProp, TRUE);
423  }
424  return TRUE;
425 }
#define TRUE
Definition: types.h:120
struct @1567 Msg[]
#define USERTAG_DDE1
Definition: tags.h:210
WPARAM wParam
Definition: combotst.c:138
PPROCESSINFO ppi
Definition: win32.h:87
smooth NULL
Definition: ftsmooth.c:416
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:103
#define TRACE(s)
Definition: solgame.cpp:4
Definition: dde.c:35
ATOM AtomDDETrack
Definition: ntuser.c:23
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
#define WM_DDE_INITIATE
Definition: dde.h:37
#define WM_DDE_ACK
Definition: dde.h:41
PWND spwndPartner
Definition: dde.c:38
PWND spwnd
Definition: dde.c:37

Referenced by co_IntSendMessageTimeoutSingle().

◆ IntGetWindowContextHelpId()

DWORD FASTCALL IntGetWindowContextHelpId ( PWND  pWnd)

Definition at line 410 of file window.c.

411 {
412  DWORD HelpId;
413 
414  do
415  {
417  if (!HelpId) break;
418  pWnd = IntGetParent(pWnd);
419  }
420  while (pWnd && pWnd->fnid != FNID_DESKTOP);
421  return HelpId;
422 }
#define TRUE
Definition: types.h:120
ATOM atomContextHelpIdProp
Definition: ntuser.h:1020
#define DWORD
Definition: nt_native.h:44
PSERVERINFO gpsi
Definition: main.c:27
DWORD fnid
Definition: ntuser.h:673
#define FNID_DESKTOP
Definition: ntuser.h:824
HANDLE FASTCALL UserGetProp(_In_ PWND Window, _In_ ATOM Atom, _In_ BOOLEAN SystemProp)
Definition: prop.c:46
unsigned long DWORD
Definition: ntddk_ex.h:95
uint32_t DWORD_PTR
Definition: typedefs.h:63
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:185

Referenced by IntDefWindowProc().

◆ IntGetWindowObject()

PWND FASTCALL IntGetWindowObject ( HWND  hWnd)

Definition at line 51 of file window.c.

52 {
53  PWND Window;
54 
55  if (!hWnd) return NULL;
56 
58  if (Window)
59  Window->head.cLockObj++;
60 
61  return Window;
62 }
HWND hWnd
Definition: settings.c:17
Definition: window.c:29
smooth NULL
Definition: ftsmooth.c:416
int Window
Definition: x11stubs.h:26
Definition: ntuser.h:657
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:103

Referenced by co_UserFreeWindow(), IntHideDesktop(), and IntSetOwner().

◆ IntSetWindowState()

VOID FASTCALL IntSetWindowState ( PWND  ,
UINT   
)

Definition at line 571 of file misc.c.

572 {
573  UINT bit;
574  if (gptiCurrent->ppi != pWnd->head.pti->ppi) return;
575  bit = 1 << LOWORD(Flag);
576  TRACE("SWS %x\n",bit);
577  switch(HIWORD(Flag))
578  {
579  case 0:
580  pWnd->state |= bit;
581  break;
582  case 1:
583  pWnd->state2 |= bit;
584  break;
585  case 2:
586  pWnd->ExStyle2 |= bit;
587  break;
588  }
589 }
PPROCESSINFO ppi
Definition: win32.h:87
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
#define TRACE(s)
Definition: solgame.cpp:4
Definition: xml2sdb.h:79
unsigned int UINT
Definition: ndis.h:50
#define HIWORD(l)
Definition: typedefs.h:246
#define LOWORD(l)
Definition: pedump.c:82

Referenced by NtUserCallHwndParam().

◆ IntTID2PTI()

PTHREADINFO FASTCALL IntTID2PTI ( HANDLE  )

Definition at line 41 of file misc.c.

42 {
45  PTHREADINFO pti;
47  if (!NT_SUCCESS(Status))
48  {
49  return NULL;
50  }
52  {
54  return NULL;
55  }
57  if (!pti)
58  {
60  return NULL;
61  }
62  // Validate and verify!
63  _SEH2_TRY
64  {
65  if (pti->TIF_flags & TIF_INCLEANUP) pti = NULL;
66  if (pti && !(pti->TIF_flags & TIF_GUITHREADINITIALIZED)) pti = NULL;
67  if (PsGetThreadId(Thread) != id) pti = NULL;
68  }
70  {
71  pti = NULL;
72  }
73  _SEH2_END
75  return pti;
76 }
PVOID NTAPI PsGetThreadWin32Thread(IN PETHREAD Thread)
Definition: thread.c:795
NTSTATUS NTAPI PsLookupThreadByThreadId(IN HANDLE ThreadId, OUT PETHREAD *Thread)
Definition: thread.c:643
FLONG TIF_flags
Definition: win32.h:94
LONG NTSTATUS
Definition: precomp.h:26
VOID NTAPI ObDereferenceObject(IN PVOID Object)
Definition: obref.c:375
_SEH2_TRY
Definition: create.c:4250
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
smooth NULL
Definition: ftsmooth.c:416
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:264
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
HANDLE NTAPI PsGetThreadId(IN PETHREAD Thread)
Definition: thread.c:705
Status
Definition: gdiplustypes.h:24
_SEH2_END
Definition: create.c:4424
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:6
BOOLEAN NTAPI PsIsThreadTerminating(IN PETHREAD Thread)
Definition: thread.c:868
#define TIF_INCLEANUP
Definition: ntuser.h:240

Referenced by NtUserAttachThreadInput(), and NtUserSetWindowsHookEx().

◆ NC_DoNCPaint()

LRESULT NC_DoNCPaint ( PWND  ,
HDC  ,
INT   
)

Definition at line 1021 of file nonclient.c.

1022 {
1023  DWORD Style, ExStyle;
1024  PWND Parent;
1025  RECT WindowRect, CurrentRect, TempRect;
1026  BOOL Active = FALSE;
1027 
1028  if (!IntIsWindowVisible(pWnd) ||
1029  (pWnd->state & WNDS_NONCPAINT && !(pWnd->state & WNDS_FORCEMENUDRAW)) ||
1030  IntEqualRect(&pWnd->rcWindow, &pWnd->rcClient) )
1031  return 0;
1032 
1033  Style = pWnd->style;
1034 
1035  TRACE("DefWndNCPaint: pWnd %p, hDc %p, Active %s.\n", pWnd, hDC, Flags & DC_ACTIVE ? "TRUE" : "FALSE");
1036 
1037  Parent = IntGetParent(pWnd);
1038  ExStyle = pWnd->ExStyle;
1039 
1040  if (Flags == -1) // NC paint mode.
1041  {
1042  if (ExStyle & WS_EX_MDICHILD)
1043  {
1045 
1046  if (Active)
1048  }
1049  else
1050  {
1051  Active = (gpqForeground == pWnd->head.pti->MessageQueue);
1052  }
1053  Flags = DC_NC; // Redraw everything!
1054  }
1055  else
1056  Flags |= DC_NC;
1057 
1058 
1059  IntGetWindowRect(pWnd, &WindowRect);
1060 
1061  CurrentRect.top = CurrentRect.left = 0;
1062  CurrentRect.right = WindowRect.right - WindowRect.left;
1063  CurrentRect.bottom = WindowRect.bottom - WindowRect.top;
1064 
1065  /* Draw outer edge */
1066  if (UserHasWindowEdge(pWnd->style, pWnd->ExStyle))
1067  {
1068  DrawEdge(hDC, &CurrentRect, EDGE_RAISED, BF_RECT | BF_ADJUST);
1069  }
1070  else if (pWnd->ExStyle & WS_EX_STATICEDGE)
1071  {
1072 #if 0
1073  DrawEdge(hDC, &CurrentRect, BDR_SUNKENINNER, BF_RECT | BF_ADJUST | BF_FLAT);
1074 #else
1076  NtGdiPatBlt(hDC, CurrentRect.left, CurrentRect.top, CurrentRect.right - CurrentRect.left, 1, PATCOPY);
1077  NtGdiPatBlt(hDC, CurrentRect.left, CurrentRect.top, 1, CurrentRect.bottom - CurrentRect.top, PATCOPY);
1078 
1080  NtGdiPatBlt(hDC, CurrentRect.left, CurrentRect.bottom - 1, CurrentRect.right - CurrentRect.left, 1, PATCOPY);
1081  NtGdiPatBlt(hDC, CurrentRect.right - 1, CurrentRect.top, 1, CurrentRect.bottom - CurrentRect.top, PATCOPY);
1082 
1083  RECTL_vInflateRect(&CurrentRect, -1, -1);
1084 #endif
1085  }
1086 
1087  if (Flags & DC_FRAME) NC_DrawFrame(hDC, &CurrentRect, Active ? Active : (Flags & DC_ACTIVE), Style, ExStyle);
1088 
1089  /* Draw caption */
1090  if ((Style & WS_CAPTION) == WS_CAPTION)
1091  {
1092  HPEN PreviousPen;
1093  BOOL Gradient = FALSE;
1094 
1095  if (Flags & DC_REDRAWHUNGWND)
1096  {
1097  Flags &= ~DC_REDRAWHUNGWND;
1098  Flags |= DC_NOSENDMSG;
1099  }
1100 
1101  if (UserSystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, &Gradient, 0) && Gradient)
1102  {
1103  Flags |= DC_GRADIENT;
1104  }
1105 
1106  if (Active)
1107  {
1108  if (pWnd->state & WNDS_ACTIVEFRAME)
1109  Flags |= DC_ACTIVE;
1110  else
1111  {
1112  ERR("Wnd is active and not set active!\n");
1113  }
1114  }
1115 
1116  TempRect = CurrentRect;
1117 
1118  if (ExStyle & WS_EX_TOOLWINDOW)
1119  {
1120  Flags |= DC_SMALLCAP;
1121  TempRect.bottom = TempRect.top + UserGetSystemMetrics(SM_CYSMCAPTION) - 1;
1122  CurrentRect.top += UserGetSystemMetrics(SM_CYSMCAPTION);
1123  }
1124  else
1125  {
1126  TempRect.bottom = TempRect.top + UserGetSystemMetrics(SM_CYCAPTION) - 1;
1127  CurrentRect.top += UserGetSystemMetrics(SM_CYCAPTION);
1128  }
1129 
1130  UserDrawCaption(pWnd, hDC, &TempRect, NULL, NULL, NULL, Flags);
1131 
1132  /* Draw buttons */
1133  if (Style & WS_SYSMENU)
1134  {
1137  {
1140  }
1141  }
1142  if (!(Style & WS_MINIMIZE))
1143  {
1144  /* Line under caption */
1145  PreviousPen = NtGdiSelectPen(hDC, NtGdiGetStockObject(DC_PEN));
1146 
1150 
1151  GreMoveTo(hDC, TempRect.left, TempRect.bottom, NULL);
1152 
1153  NtGdiLineTo(hDC, TempRect.right, TempRect.bottom);
1154 
1155  NtGdiSelectPen(hDC, PreviousPen);
1156  }
1157  }
1158 
1159  if (!(Style & WS_MINIMIZE))
1160  {
1161  /* Draw menu bar */
1162  if (pWnd->state & WNDS_HASMENU && pWnd->IDMenu) // Should be pWnd->spmenu
1163  {
1164  if (!(Flags & DC_NOSENDMSG))
1165  {
1166  PMENU menu;
1167  // Fix crash in test_menu_locked_by_window, should use pWnd->spmenu....
1168  if ((menu = UserGetMenuObject(UlongToHandle(pWnd->IDMenu)))) // FIXME! Use pWnd->spmenu,
1169  {
1170  TempRect = CurrentRect;
1171  TempRect.bottom = TempRect.top + menu->cyMenu; // Should be pWnd->spmenu->cyMenu;
1172  CurrentRect.top += MENU_DrawMenuBar(hDC, &TempRect, pWnd, FALSE);
1173  }
1174  }
1175  }
1176 
1177  if (ExStyle & WS_EX_CLIENTEDGE)
1178  {
1179  DrawEdge(hDC, &CurrentRect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
1180  }
1181 
1182  /* Draw the scrollbars */
1183  if ((Style & WS_VSCROLL) && (Style & WS_HSCROLL) &&
1185  {
1186  RECT ParentClientRect;
1187 
1188  TempRect = CurrentRect;
1189 
1191  TempRect.right = TempRect.left + UserGetSystemMetrics(SM_CXVSCROLL);
1192  else
1193  TempRect.left = TempRect.right - UserGetSystemMetrics(SM_CXVSCROLL);
1194 
1195  TempRect.top = TempRect.bottom - UserGetSystemMetrics(SM_CYHSCROLL);
1196 
1198 
1199  if (Parent)
1200  {
1201  IntGetClientRect(Parent, &ParentClientRect);
1202 
1203  if (HASSIZEGRIP(Style, ExStyle, Parent->style, WindowRect, ParentClientRect))
1204  {
1206  }
1207  }
1208 
1209  IntDrawScrollBar(pWnd, hDC, SB_VERT);
1210  IntDrawScrollBar(pWnd, hDC, SB_HORZ);
1211  }
1212  else
1213  {
1215  {
1216  IntDrawScrollBar(pWnd, hDC, SB_VERT);
1217  }
1218  else if (Style & WS_HSCROLL && IntIsScrollBarVisible(pWnd, OBJID_HSCROLL))
1219  {
1220  IntDrawScrollBar(pWnd, hDC, SB_HORZ);
1221  }
1222  }
1223  }
1224  return 0; // For WM_NCPAINT message, return 0.
1225 }
#define BF_FLAT
Definition: winuser.h:471
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:12
#define SM_CYHSCROLL
Definition: winuser.h:952
void IntDrawScrollBar(PWND, HDC, INT)
Definition: scrollbar.c:1073
#define COLOR_WINDOWFRAME
Definition: winuser.h:909
__kernel_entry W32KAPI BOOL APIENTRY NtGdiPatBlt(_In_ HDC hdcDest, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_ DWORD dwRop)
Definition: bitblt.c:924
HGDIOBJ FASTCALL IntGetSysColorBrush(INT Object)
Definition: stockobj.c:317
#define SB_VERT
Definition: winuser.h:553
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
BOOL IntIsScrollBarVisible(PWND pWnd, INT hBar)
Definition: nonclient.c:714
#define SB_HORZ
Definition: winuser.h:552
__kernel_entry W32KAPI HANDLE APIENTRY NtGdiGetStockObject(_In_ INT iObject)
LONG top
Definition: windef.h:292
HANDLE HWND
Definition: compat.h:13
#define COLOR_BTNHIGHLIGHT
Definition: winuser.h:925
BOOL UserHasWindowEdge(DWORD Style, DWORD ExStyle)
Definition: nonclient.c:36
BOOL WINAPI DrawFrameControl(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:716
LONG left
Definition: windef.h:291
VOID FASTCALL IntGetClientRect(PWND WindowObject, RECTL *Rect)
Definition: winpos.c:91
UINT MENU_DrawMenuBar(HDC hDC, LPRECT lprect, PWND pWnd, BOOL suppress_draw)
Definition: menu.c:2760
LONG right
Definition: windef.h:293
VOID UserDrawCaptionButton(PWND pWnd, LPRECT Rect, DWORD Style, DWORD ExStyle, HDC hDC, BOOL bDown, ULONG Type)
Definition: nonclient.c:732
#define WS_EX_LEFTSCROLLBAR
Definition: winuser.h:392
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
#define BF_ADJUST
Definition: winuser.h:470
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiSelectBrush(_In_ HDC hdc, _In_ HBRUSH hbrush)
FORCEINLINE PMENU UserGetMenuObject(HMENU hMenu)
Definition: userfuncs.h:3
#define BF_RECT
Definition: winuser.h:462
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
__kernel_entry W32KAPI BOOL APIENTRY NtGdiLineTo(_In_ HDC hdc, _In_ INT x, _In_ INT y)
__kernel_entry W32KAPI HPEN APIENTRY NtGdiSelectPen(_In_ HDC hdc, _In_ HPEN hpen)
#define WS_EX_MDICHILD
Definition: winuser.h:394
#define COLOR_3DFACE
Definition: winuser.h:919
#define BDR_SUNKENINNER
Definition: winuser.h:445
#define DC_NC
Definition: winuser.h:440
#define WS_MINIMIZE
Definition: pedump.c:622
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL WINAPI DrawEdge(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT)
#define DC_REDRAWHUNGWND
Definition: undocuser.h:150
ULONG cyMenu
Definition: ntuser.h:391
smooth NULL
Definition: ftsmooth.c:416
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
Definition: sacdrv.h:287
#define WS_MAXIMIZEBOX
Definition: pedump.c:632
#define DC_ACTIVE
Definition: winuser.h:427
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define WS_CAPTION
Definition: pedump.c:624
#define TRACE(s)
Definition: solgame.cpp:4
#define SM_CYCAPTION
Definition: winuser.h:953
const DWORD Style
Definition: appswitch.c:71
#define OBJID_HSCROLL
Definition: winable.h:21
#define UlongToHandle(ul)
Definition: basetsd.h:97
#define DFCS_SCROLLSIZEGRIP
Definition: winuser.h:494
#define DC_FRAME
Definition: undocuser.h:147
#define DFCS_CAPTIONCLOSE
Definition: winuser.h:480
VOID NC_DrawFrame(HDC hDC, RECT *CurrentRect, BOOL Active, DWORD Style, DWORD ExStyle)
Definition: nonclient.c:833
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD FASTCALL IntGetSysColor(INT nIndex)
Definition: stockobj.c:323
#define OBJID_VSCROLL
Definition: winable.h:20
#define WS_HSCROLL
Definition: pedump.c:628
#define WM_MDIGETACTIVE
Definition: winuser.h:1797
BOOL FASTCALL IntIsWindowVisible(PWND Wnd)
Definition: window.c:170
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1291
#define COLOR_BTNFACE
Definition: winuser.h:918
COLORREF FASTCALL IntSetDCPenColor(HDC, COLORREF)
Definition: dcutil.c:259
#define WNDS_ACTIVEFRAME
Definition: ntuser.h:579
BOOL FASTCALL GreMoveTo(HDC hdc, INT x, INT y, LPPOINT pptOut)
Definition: line.c:110
#define PATCOPY
Definition: wingdi.h:334
#define EDGE_RAISED
Definition: winuser.h:450
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
static HDC hDC
Definition: 3dtext.c:33
#define DC_NOSENDMSG
Definition: undocuser.h:146
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define DC_SMALLCAP
Definition: winuser.h:428
#define WS_MINIMIZEBOX
Definition: pedump.c:631
FORCEINLINE BOOL IntEqualRect(RECTL *lprc1, RECTL *lprc2)
Definition: winpos.h:48
#define COLOR_BTNSHADOW
Definition: winuser.h:920
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:185
#define WS_VSCROLL
Definition: pedump.c:627
#define DFCS_CAPTIONMAX
Definition: winuser.h:482
#define WNDS_NONCPAINT
Definition: ntuser.h:581
#define SM_CXVSCROLL
Definition: winuser.h:951
#define DFC_SCROLL
Definition: winuser.h:475
#define HASSIZEGRIP(Style, ExStyle, ParentStyle, WindowRect, ParentClientRect)
Definition: nonclient.c:34
LONG bottom
Definition: windef.h:294
#define WNDS_FORCEMENUDRAW
Definition: ntuser.h:588
#define EDGE_SUNKEN
Definition: winuser.h:451
BOOL FASTCALL IntIsChildWindow(PWND Parent, PWND BaseWindow)
Definition: window.c:882
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2059
#define WNDS_HASMENU
Definition: ntuser.h:573
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
#define WS_SYSMENU
Definition: pedump.c:629
#define SM_CYSMCAPTION
Definition: winuser.h:1004
#define WS_EX_STATICEDGE
Definition: winuser.h:403
#define DFCS_CAPTIONMIN
Definition: winuser.h:481
const DWORD ExStyle
Definition: appswitch.c:72
BOOL UserDrawCaption(PWND pWnd, HDC hDc, RECTL *lpRc, HFONT hFont, HICON hIcon, const PUNICODE_STRING Str, UINT uFlags)
Definition: painting.c:2182
BOOL FASTCALL IntGetWindowRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:120

Referenced by co_WinPosSetWindowPos(), IntDefWindowProc(), NC_HandleNCActivate(), NtUserDrawCaptionTemp(), and PaintSuspendedWindow().

◆ NC_DrawFrame()

VOID NC_DrawFrame ( HDC  hDC,
RECT CurrentRect,
BOOL  Active,
DWORD  Style,
DWORD  ExStyle 
)

Definition at line 833 of file nonclient.c.

834 {
835  /* Firstly the "thick" frame */
836  if ((Style & WS_THICKFRAME) && !(Style & WS_MINIMIZE))
837  {
838  LONG Width =
841 
842  LONG Height =
845 
847 
848  /* Draw frame */
849  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, CurrentRect->right - CurrentRect->left, Height, PATCOPY);
850  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
851  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->bottom - 1, CurrentRect->right - CurrentRect->left, -Height, PATCOPY);
852  NtGdiPatBlt(hDC, CurrentRect->right - 1, CurrentRect->top, -Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
853 
854  RECTL_vInflateRect(CurrentRect, -Width, -Height);
855  }
856 
857  /* Now the other bit of the frame */
859  {
862 
868 
869  /* Draw frame */
870  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, CurrentRect->right - CurrentRect->left, Height, PATCOPY);
871  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
872  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->bottom - 1, CurrentRect->right - CurrentRect->left, -Height, PATCOPY);
873  NtGdiPatBlt(hDC, CurrentRect->right - 1, CurrentRect->top, -Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
874 
875  RECTL_vInflateRect(CurrentRect, -Width, -Height);
876  }
877 }
#define WS_THICKFRAME
Definition: pedump.c:630
#define COLOR_WINDOWFRAME
Definition: winuser.h:909
__kernel_entry W32KAPI BOOL APIENTRY NtGdiPatBlt(_In_ HDC hdcDest, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_ DWORD dwRop)
Definition: bitblt.c:924
HGDIOBJ FASTCALL IntGetSysColorBrush(INT Object)
Definition: stockobj.c:317
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
LONG top
Definition: windef.h:292
#define COLOR_INACTIVEBORDER
Definition: winuser.h:914
#define WS_DLGFRAME
Definition: pedump.c:626
LONG left
Definition: windef.h:291
#define SM_CYFRAME
Definition: winuser.h:986
#define SM_CXFRAME
Definition: winuser.h:984
LONG right
Definition: windef.h:293
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiSelectBrush(_In_ HDC hdc, _In_ HBRUSH hbrush)
#define COLOR_3DFACE
Definition: winuser.h:919
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
#define SM_CYDLGFRAME
Definition: winuser.h:958
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
Definition: sacdrv.h:287
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
const DWORD Style
Definition: appswitch.c:71
#define SM_CXDLGFRAME
Definition: winuser.h:956
#define COLOR_ACTIVEBORDER
Definition: winuser.h:913
#define SM_CYBORDER
Definition: winuser.h:955
#define SM_CXBORDER
Definition: winuser.h:954
#define PATCOPY
Definition: wingdi.h:334
static HDC hDC
Definition: 3dtext.c:33
#define WS_BORDER
Definition: pedump.c:625
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
LONG bottom
Definition: windef.h:294
#define WS_EX_STATICEDGE
Definition: winuser.h:403
const DWORD ExStyle
Definition: appswitch.c:72

Referenced by NC_DoNCPaint(), and UserDrawCaptionBar().

◆ NC_GetInsideRect()

void FASTCALL NC_GetInsideRect ( PWND  Wnd,
RECT rect 
)

Definition at line 71 of file nonclient.c.

72 {
73  ULONG Style;
74  ULONG ExStyle;
75 
76  Style = Wnd->style;
77  ExStyle = Wnd->ExStyle;
78 
79  rect->top = rect->left = 0;
80  rect->right = Wnd->rcWindow.right - Wnd->rcWindow.left;
81  rect->bottom = Wnd->rcWindow.bottom - Wnd->rcWindow.top;
82 
83  if (Style & WS_ICONIC) return;
84 
85  /* Remove frame from rectangle */
87  {
89  }
91  {
93  /* FIXME: this isn't in NC_AdjustRect? why not? */
95  RECTL_vInflateRect( rect, -1, 0 );
96  }
98  {
100  }
101 
102  /* We have additional border information if the window
103  * is a child (but not an MDI child) */
104  if ((Style & WS_CHILD) && !(ExStyle & WS_EX_MDICHILD))
105  {
110  }
111 }
DWORD ExStyle
Definition: ntuser.h:668
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
LONG top
Definition: windef.h:292
#define SM_CXEDGE
Definition: winuser.h:998
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:291
#define SM_CYFRAME
Definition: winuser.h:986
#define SM_CXFRAME
Definition: winuser.h:984
LONG right
Definition: windef.h:293
& rect
Definition: startmenu.cpp:1413
#define WS_EX_MDICHILD
Definition: winuser.h:394
#define SM_CYDLGFRAME
Definition: winuser.h:958
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
#define SM_CYEDGE
Definition: winuser.h:999
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
const DWORD Style
Definition: appswitch.c:71
#define WS_ICONIC
Definition: pedump.c:641
#define UserHasDlgFrameStyle(Style, ExStyle)
Definition: nonclient.c:14
#define SM_CXDLGFRAME
Definition: winuser.h:956
#define SM_CYBORDER
Definition: winuser.h:955
#define UserHasThinFrameStyle(Style, ExStyle)
Definition: nonclient.c:22
#define SM_CXBORDER
Definition: winuser.h:954
RECT rcWindow
Definition: ntuser.h:680
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
unsigned int ULONG
Definition: retypes.h:1
#define UserHasThickFrameStyle(Style, ExStyle)
Definition: nonclient.c:18
LONG bottom
Definition: windef.h:294
#define WS_EX_STATICEDGE
Definition: winuser.h:403
const DWORD ExStyle
Definition: appswitch.c:72
DWORD style
Definition: ntuser.h:670

Referenced by MENU_DrawMenuItem(), NC_GetSysPopupPos(), and NC_HandleNCLButtonDown().

◆ NC_GetSysPopupPos()

void FASTCALL NC_GetSysPopupPos ( PWND  ,
RECT  
)

Definition at line 117 of file nonclient.c.

118 {
119  RECT WindowRect;
120 
121  if ((Wnd->style & WS_MINIMIZE) != 0)
122  {
123  IntGetWindowRect(Wnd, Rect);
124  }
125  else
126  {
127  NC_GetInsideRect(Wnd, Rect);
128  IntGetWindowRect(Wnd, &WindowRect);
129  RECTL_vOffsetRect(Rect, WindowRect.left, WindowRect.top);
130  if (Wnd->style & WS_CHILD)
131  {
133  }
134  Rect->right = Rect->left + UserGetSystemMetrics(SM_CYCAPTION) - 1;
135  Rect->bottom = Rect->top + UserGetSystemMetrics(SM_CYCAPTION) - 1;
136  }
137 }
BOOL FASTCALL IntClientToScreen(PWND Wnd, LPPOINT lpPoint)
Definition: winpos.c:198
LONG top
Definition: windef.h:292
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:291
#define WS_MINIMIZE
Definition: pedump.c:622
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define SM_CYCAPTION
Definition: winuser.h:953
void FASTCALL NC_GetInsideRect(PWND Wnd, RECT *rect)
Definition: nonclient.c:71
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:185
BOOL FASTCALL IntGetWindowRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:120

Referenced by MENU_ShowSubPopup().

◆ NC_HandleNCActivate()

LRESULT NC_HandleNCActivate ( PWND  Wnd,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1361 of file nonclient.c.

1362 {
1363  INT Flags;
1364  /* Lotus Notes draws menu descriptions in the caption of its main
1365  * window. When it wants to restore original "system" view, it just
1366  * sends WM_NCACTIVATE message to itself. Any optimizations here in
1367  * attempt to minimize redrawings lead to a not restored caption.
1368  */
1369  if (wParam & DC_ACTIVE)
1370  {
1373  }
1374  else
1375  {
1376  Wnd->state &= ~WNDS_ACTIVEFRAME;
1377  wParam = DC_CAPTION;
1378  }
1379 
1380  if ((Wnd->state & WNDS_NONCPAINT) || !(Wnd->style & WS_VISIBLE))
1381  return TRUE;
1382 
1383  /* This isn't documented but is reproducible in at least XP SP2 and
1384  * Outlook 2007 depends on it
1385  */
1386  // MSDN:
1387  // If this parameter is set to -1, DefWindowProc does not repaint the
1388  // nonclient area to reflect the state change.
1389  if ( lParam != -1 &&
1390  ( Flags = NC_DoNCActive(Wnd)) != 0 )
1391  {
1392  HDC hDC;
1393  HRGN hRgnTemp = NULL, hRgn = (HRGN)lParam;
1394 
1395  if (GreIsHandleValid(hRgn))
1396  {
1397  hRgnTemp = NtGdiCreateRectRgn(0, 0, 0, 0);
1398  if (NtGdiCombineRgn(hRgnTemp, hRgn, 0, RGN_COPY) == ERROR)
1399  {
1400  GreDeleteObject(hRgnTemp);
1401  hRgnTemp = NULL;
1402  }
1403  }
1404 
1405  if ((hDC = UserGetDCEx(Wnd, hRgnTemp, DCX_WINDOW|DCX_USESTYLE)))
1406  {
1407  NC_DoNCPaint(Wnd, hDC, wParam | Flags); // Redraw MENUs.
1408  UserReleaseDC(Wnd, hDC, FALSE);
1409  }
1410  else
1411  GreDeleteObject(hRgnTemp);
1412  }
1413 
1414  return TRUE;
1415 }
__kernel_entry W32KAPI HRGN APIENTRY NtGdiCreateRectRgn(_In_ INT xLeft, _In_ INT yTop, _In_ INT xRight, _In_ INT yBottom)
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1153
#define TRUE
Definition: types.h:120
BOOL NTAPI GreIsHandleValid(HGDIOBJ hobj)
Definition: gdiobj.c:1141
#define ERROR(name)
Definition: error_private.h:53
static HDC
Definition: imagelist.c:92
static HRGN hRgn
Definition: mapping.c:33
#define DCX_USESTYLE
Definition: GetDCEx.c:10
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
int32_t INT
Definition: typedefs.h:56
WPARAM wParam
Definition: combotst.c:138
#define DCX_WINDOW
Definition: winuser.h:2074
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
LRESULT NC_DoNCPaint(PWND pWnd, HDC hDC, INT Flags)
Definition: nonclient.c:1021
smooth NULL
Definition: ftsmooth.c:416
#define DC_ACTIVE
Definition: winuser.h:427
#define WNDS_ACTIVEFRAME
Definition: ntuser.h:579
__kernel_entry W32KAPI INT APIENTRY NtGdiCombineRgn(_In_ HRGN hrgnDst, _In_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ INT iMode)
#define RGN_COPY
Definition: wingdi.h:356
static HDC hDC
Definition: 3dtext.c:33
DWORD state
Definition: ntuser.h:665
static INT NC_DoNCActive(PWND Wnd)
Definition: nonclient.c:1343
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:917
#define WNDS_NONCPAINT
Definition: ntuser.h:581
#define WS_VISIBLE
Definition: pedump.c:620
#define DC_CAPTION
Definition: winuser.h:439
LPARAM lParam
Definition: combotst.c:139
#define WNDS_HASCAPTION
Definition: ntuser.h:576
DWORD style
Definition: ntuser.h:670

Referenced by IntDefWindowProc().

◆ NC_HandleNCCalcSize()

LRESULT NC_HandleNCCalcSize ( PWND  wnd,
WPARAM  wparam,
RECTL winRect,
BOOL  Suspended 
)

Definition at line 1227 of file nonclient.c.

1228 {
1229  LRESULT Result = 0;
1230  SIZE WindowBorders;
1231  RECT OrigRect;
1232  LONG Style = Wnd->style;
1233  LONG exStyle = Wnd->ExStyle;
1234 
1235  if (Rect == NULL)
1236  {
1237  return Result;
1238  }
1239  OrigRect = *Rect;
1240 
1241  Wnd->state &= ~WNDS_HASCAPTION;
1242 
1243  if (wparam)
1244  {
1245  if (Wnd->pcls->style & CS_VREDRAW)
1246  {
1247  Result |= WVR_VREDRAW;
1248  }
1249  if (Wnd->pcls->style & CS_HREDRAW)
1250  {
1251  Result |= WVR_HREDRAW;
1252  }
1254  }
1255 
1256  if (!(Wnd->style & WS_MINIMIZE))
1257  {
1258  if (UserHasWindowEdge(Wnd->style, Wnd->ExStyle))
1259  {
1260  UserGetWindowBorders(Wnd->style, Wnd->ExStyle, &WindowBorders, FALSE);
1261  RECTL_vInflateRect(Rect, -WindowBorders.cx, -WindowBorders.cy);
1262  }
1263  else if ((Wnd->ExStyle & WS_EX_STATICEDGE) || (Wnd->style & WS_BORDER))
1264  {
1265  RECTL_vInflateRect(Rect, -1, -1);
1266  }
1267 
1268  if ((Wnd->style & WS_CAPTION) == WS_CAPTION)
1269  {
1270  Wnd->state |= WNDS_HASCAPTION;
1271 
1272  if (Wnd->ExStyle & WS_EX_TOOLWINDOW)
1274  else
1276  }
1277 
1278  if (HAS_MENU(Wnd, Style))
1279  {
1280  HDC hDC = UserGetDCEx(Wnd, 0, DCX_USESTYLE | DCX_WINDOW);
1281 
1282  Wnd->state |= WNDS_HASMENU;
1283 
1284  if (hDC)
1285  {
1286  RECT CliRect = *Rect;
1287  CliRect.bottom -= OrigRect.top;
1288  CliRect.right -= OrigRect.left;
1289  CliRect.left -= OrigRect.left;
1290  CliRect.top -= OrigRect.top;
1291  if (!Suspended) Rect->top += MENU_DrawMenuBar(hDC, &CliRect, Wnd, TRUE);
1292  UserReleaseDC(Wnd, hDC, FALSE);
1293  }
1294  }
1295 
1296  if (Wnd->ExStyle & WS_EX_CLIENTEDGE)
1297  {
1299  }
1300 
1301  if (Style & WS_VSCROLL)
1302  {
1303  if (Rect->right - Rect->left >= UserGetSystemMetrics(SM_CXVSCROLL))
1304  {
1305  Wnd->state |= WNDS_HASVERTICALSCROOLLBAR;
1306 
1307  /* rectangle is in screen coords when wparam is false */
1308  if (!wparam && (exStyle & WS_EX_LAYOUTRTL)) exStyle ^= WS_EX_LEFTSCROLLBAR;
1309 
1310  if((exStyle & WS_EX_LEFTSCROLLBAR) != 0)
1312  else
1314  }
1315  }
1316 
1317  if (Style & WS_HSCROLL)
1318  {
1319  if( Rect->bottom - Rect->top > UserGetSystemMetrics(SM_CYHSCROLL))
1320  {
1321  Wnd->state |= WNDS_HASHORIZONTALSCROLLBAR;
1322 
1324  }
1325  }
1326 
1327  if (Rect->top > Rect->bottom)
1328  Rect->bottom = Rect->top;
1329 
1330  if (Rect->left > Rect->right)
1331  Rect->right = Rect->left;
1332  }
1333  else
1334  {
1335  Rect->right = Rect->left;
1336  Rect->bottom = Rect->top;
1337  }
1338 
1339  return Result;
1340 }
#define SM_CYHSCROLL
Definition: winuser.h:952
#define TRUE
Definition: types.h:120
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
#define WNDS_HASHORIZONTALSCROLLBAR
Definition: ntuser.h:575
static HDC
Definition: imagelist.c:92
LONG top
Definition: windef.h:292
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
#define DCX_USESTYLE
Definition: GetDCEx.c:10
#define CS_HREDRAW
Definition: winuser.h:648
BOOL UserHasWindowEdge(DWORD Style, DWORD ExStyle)
Definition: nonclient.c:36
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
LONG left
Definition: windef.h:291
UINT MENU_DrawMenuBar(HDC hDC, LPRECT lprect, PWND pWnd, BOOL suppress_draw)
Definition: menu.c:2760
LONG right
Definition: windef.h:293
#define WS_EX_LEFTSCROLLBAR
Definition: winuser.h:392
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
#define DCX_WINDOW
Definition: winuser.h:2074
#define WNDS_HASVERTICALSCROOLLBAR
Definition: ntuser.h:574
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
smooth NULL
Definition: ftsmooth.c:416
_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:426
LONG cx
Definition: windef.h:319
VOID UserGetWindowBorders(DWORD Style, DWORD ExStyle, SIZE *Size, BOOL WithClient)
Definition: nonclient.c:53
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define WS_CAPTION
Definition: pedump.c:624
#define CS_VREDRAW
Definition: winuser.h:653
#define SM_CYCAPTION
Definition: winuser.h:953
const DWORD Style
Definition: appswitch.c:71
#define WVR_VALIDRECTS
Definition: winuser.h:2476
#define WS_HSCROLL
Definition: pedump.c:628
#define SM_CYBORDER
Definition: winuser.h:955
#define SM_CXBORDER
Definition: winuser.h:954
static HDC hDC
Definition: 3dtext.c:33
#define WS_BORDER
Definition: pedump.c:625
#define HAS_MENU(hwnd, style)
Definition: uxthemep.h:222
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define WVR_HREDRAW
Definition: winuser.h:2473
#define WS_VSCROLL
Definition: pedump.c:627
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:917
#define WVR_VREDRAW
Definition: winuser.h:2474
#define SM_CXVSCROLL
Definition: winuser.h:951
LONG bottom
Definition: windef.h:294
#define WNDS_HASMENU
Definition: ntuser.h:573
LONG_PTR LRESULT
Definition: windef.h:209
#define SM_CYSMCAPTION
Definition: winuser.h:1004
LONG cy
Definition: windef.h:320
#define WS_EX_STATICEDGE
Definition: winuser.h:403
#define WNDS_HASCAPTION
Definition: ntuser.h:576
struct Rect Rect
static UINT WPARAM wparam
Definition: combo.c:716

Referenced by IntDefWindowProc().

◆ NC_HandleNCLButtonDblClk()

LRESULT NC_HandleNCLButtonDblClk ( PWND  Wnd,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1589 of file nonclient.c.

1590 {
1591  ULONG Style;
1592 
1593  Style = pWnd->style;
1594  switch(wParam)
1595  {
1596  case HTCAPTION:
1597  {
1598  /* Maximize/Restore the window */
1599  if((Style & WS_CAPTION) == WS_CAPTION && (Style & WS_MAXIMIZEBOX))
1600  {
1602  }
1603  break;
1604  }
1605  case HTSYSMENU:
1606  {
1607  PMENU SysMenu = IntGetSystemMenu(pWnd, FALSE);
1609 
1610  /* If the close item of the sysmenu is disabled or not present do nothing */
1611  if ((state & (MF_DISABLED | MF_GRAYED)) || (state == 0xFFFFFFFF))
1612  break;
1613 
1615  break;
1616  }
1617  case HTTOP:
1618  case HTBOTTOM:
1619  {
1620  RECT sizingRect = pWnd->rcWindow, mouseRect;
1621 
1622  if (pWnd->ExStyle & WS_EX_MDICHILD)
1623  break;
1624 
1625  UserSystemParametersInfo(SPI_GETWORKAREA, 0, &mouseRect, 0);
1626 
1627  co_WinPosSetWindowPos(pWnd,
1628  0,
1629  sizingRect.left,
1630  mouseRect.top,
1631  sizingRect.right - sizingRect.left,
1632  mouseRect.bottom - mouseRect.top,
1633  0);
1634  break;
1635  }
1636  default:
1637  return NC_HandleNCLButtonDown(pWnd, wParam, lParam);
1638  }
1639  return(0);
1640 }
#define HTTOP
Definition: winuser.h:2444
#define MF_DISABLED
Definition: winuser.h:130
#define MF_BYCOMMAND
Definition: winuser.h:202
#define SC_RESTORE
Definition: winuser.h:2552
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1651
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
WPARAM wParam
Definition: combotst.c:138
#define WS_EX_MDICHILD
Definition: winuser.h:394
#define HTSYSMENU
Definition: winuser.h:2431
#define WS_MINIMIZE
Definition: pedump.c:622
#define SC_MAXIMIZE
Definition: winuser.h:2542
smooth NULL
Definition: ftsmooth.c:416
#define WS_MAXIMIZEBOX
Definition: pedump.c:632
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define WS_CAPTION
Definition: pedump.c:624
const DWORD Style
Definition: appswitch.c:71
PMENU FASTCALL IntGetSystemMenu(PWND Window, BOOL bRevert)
Definition: menu.c:5238
#define HTBOTTOM
Definition: winuser.h:2447
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1291
static int state
Definition: maze.c:121
#define HTCAPTION
Definition: winuser.h:2430
unsigned int UINT
Definition: ndis.h:50
#define SC_CLOSE
Definition: winuser.h:2546
unsigned int ULONG
Definition: retypes.h:1
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2059
#define MF_GRAYED
Definition: winuser.h:129
LRESULT NC_HandleNCLButtonDown(PWND pWnd, WPARAM wParam, LPARAM lParam)
Definition: nonclient.c:1498
#define WM_SYSCOMMAND
Definition: winuser.h:1717
LPARAM lParam
Definition: combotst.c:139
UINT FASTCALL IntGetMenuState(HMENU hMenu, UINT uId, UINT uFlags)
Definition: menu.c:4830
#define WS_MAXIMIZE
Definition: pedump.c:623

Referenced by IntDefWindowProc().

◆ NC_HandleNCLButtonDown()

LRESULT NC_HandleNCLButtonDown ( PWND  Wnd,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1498 of file nonclient.c.

1499 {
1500  switch (wParam)
1501  {
1502  case HTCAPTION:
1503  {
1504  PWND TopWnd = pWnd, parent;
1505  while(1)
1506  {
1507  if ((TopWnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD)
1508  break;
1509  parent = UserGetAncestor( TopWnd, GA_PARENT );
1510  if (!parent || UserIsDesktopWindow(parent)) break;
1511  TopWnd = parent;
1512  }
1513 
1514  if ( co_IntSetForegroundWindowMouse(TopWnd) ||
1515  //NtUserCallHwndLock(hTopWnd, HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE) ||
1516  UserGetActiveWindow() == UserHMGetHandle(TopWnd))
1517  {
1519  }
1520  break;
1521  }
1522  case HTSYSMENU:
1523  {
1524  LONG style = pWnd->style;
1525  if (style & WS_SYSMENU)
1526  {
1527  if(!(style & WS_MINIMIZE) )
1528  {
1529  RECT rect;
1530  HDC hDC = UserGetWindowDC(pWnd);
1531  NC_GetInsideRect(pWnd, &rect);
1532  UserDrawSysMenuButton(pWnd, hDC, &rect, TRUE);
1533  UserReleaseDC( pWnd, hDC, FALSE );
1534  }
1536  }
1537  break;
1538  }
1539  case HTMENU:
1540  {
1542  break;
1543  }
1544  case HTHSCROLL:
1545  {
1547  break;
1548  }
1549  case HTVSCROLL:
1550  {
1552  break;
1553  }
1554  case HTMINBUTTON:
1555  case HTMAXBUTTON:
1556  case HTCLOSE:
1557  {
1558  NC_DoButton(pWnd, wParam, lParam);
1559  break;
1560  }
1561  case HTLEFT:
1562  case HTRIGHT:
1563  case HTTOP:
1564  case HTBOTTOM:
1565  case HTTOPLEFT:
1566  case HTTOPRIGHT:
1567  case HTBOTTOMLEFT:
1568  case HTBOTTOMRIGHT:
1569  {
1570  /* Old comment:
1571  * "make sure hittest fits into 0xf and doesn't overlap with HTSYSMENU"
1572  * This was previously done by setting wParam=SC_SIZE + wParam - 2
1573  */
1574  /* But that is not what WinNT does. Instead it sends this. This
1575  * is easy to differentiate from HTSYSMENU, because HTSYSMENU adds
1576  * SC_MOUSEMENU into wParam.
1577  */
1579  break;
1580  }
1581  case HTBORDER:
1582  break;
1583  }
1584  return(0);
1585 }
#define HTMAXBUTTON
Definition: winuser.h:2438
#define HTTOP
Definition: winuser.h:2444
#define HTLEFT
Definition: winuser.h:2441
#define HTHSCROLL
Definition: winuser.h:2435
#define TRUE
Definition: types.h:120
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
HWND FASTCALL UserGetActiveWindow(VOID)
Definition: focus.c:1311
static HDC
Definition: imagelist.c:92
HDC FASTCALL UserGetWindowDC(PWND Wnd)
Definition: windc.c:946
#define HTBOTTOMLEFT
Definition: winuser.h:2448
#define SC_MOUSEMENU
Definition: winuser.h:2549
#define HTRIGHT
Definition: winuser.h:2443
#define WS_CHILD
Definition: pedump.c:617
#define HTMINBUTTON
Definition: winuser.h:2437
& rect
Definition: startmenu.cpp:1413
WPARAM wParam
Definition: combotst.c:138
#define HTTOPLEFT
Definition: winuser.h:2445
#define HTSYSMENU
Definition: winuser.h:2431
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
#define GA_PARENT
Definition: winuser.h:2742
BOOL UserDrawSysMenuButton(PWND pWnd, HDC hDC, LPRECT Rect, BOOL Down)
Definition: nonclient.c:691
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define HTTOPRIGHT
Definition: winuser.h:2446
r parent
Definition: btrfs.c:2659
#define HTBOTTOM
Definition: winuser.h:2447
#define HTCLOSE
Definition: winuser.h:2453
void FASTCALL NC_GetInsideRect(PWND Wnd, RECT *rect)
Definition: nonclient.c:71
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1291
#define HTBOTTOMRIGHT
Definition: winuser.h:2449
PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type)
Definition: window.c:3129
#define HTCAPTION
Definition: winuser.h:2430
Definition: ntuser.h:657
static HDC hDC
Definition: 3dtext.c:33
#define HTMENU
Definition: winuser.h:2434
#define SC_SIZE
Definition: winuser.h:2538
#define HTBORDER
Definition: winuser.h:2451
#define WS_POPUP
Definition: pedump.c:616
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:917
#define HTVSCROLL
Definition: winuser.h:2436
#define SC_MOVE
Definition: winuser.h:2539
BOOL FASTCALL co_IntSetForegroundWindowMouse(PWND Window)
Definition: focus.c:1443
Arabic default style
Definition: afstyles.h:93
#define WS_SYSMENU
Definition: pedump.c:629
VOID NC_DoButton(PWND pWnd, WPARAM wParam, LPARAM lParam)
Definition: nonclient.c:1418
#define WM_SYSCOMMAND
Definition: winuser.h:1717
#define SC_VSCROLL
Definition: winuser.h:2547
LPARAM lParam
Definition: combotst.c:139
#define WMSZ_LEFT
Definition: winuser.h:2418
DWORD style
Definition: ntuser.h:670
#define SC_HSCROLL
Definition: winuser.h:2548

Referenced by IntDefWindowProc(), and NC_HandleNCLButtonDblClk().

◆ NC_HandleNCRButtonDown()

LRESULT NC_HandleNCRButtonDown ( PWND  wnd,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1647 of file nonclient.c.

1648 {
1649  MSG msg;
1650  INT hittest = wParam;
1651 
1652  switch (hittest)
1653  {
1654  case HTCAPTION:
1655  case HTSYSMENU:
1656  if (!IntGetSystemMenu( pwnd, FALSE )) break;
1657 
1659  for (;;)
1660  {
1662  if (IntCallMsgFilter( &msg, MSGF_MAX )) continue;
1663  if (msg.message == WM_RBUTTONUP)
1664  {
1665  hittest = GetNCHitEx( pwnd, msg.pt );
1666  break;
1667  }
1668  if (UserHMGetHandle(pwnd) != IntGetCapture()) return 0;
1669  }
1671  if (hittest == HTCAPTION || hittest == HTSYSMENU || hittest == HTHSCROLL || hittest == HTVSCROLL)
1672  {
1673  TRACE("Msg pt %x and Msg.lParam %x and lParam %x\n",MAKELONG(msg.pt.x,msg.pt.y),msg.lParam,lParam);
1675  }