ReactOS  0.4.15-dev-5608-gafb953a
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)
 
BOOL FASTCALL UserIsDBCSEnabled (VOID)
 
BOOL FASTCALL UserIsIMMEnabled (VOID)
 
BOOL FASTCALL UserIsCiceroEnabled (VOID)
 
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)
 
PIMC FASTCALL UserCreateInputContext (ULONG_PTR dwClientImcData)
 
VOID UserFreeInputContext (PVOID Object)
 
BOOLEAN UserDestroyInputContext (PVOID Object)
 
PVOID AllocInputContextObject (PDESKTOP pDesk, PTHREADINFO pti, SIZE_T Size, PVOID *HandleOwner)
 

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:48
#define FALSE
Definition: types.h:117
struct _HEAD * PHEAD

Definition at line 14 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 45 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 }
#define args
Definition: format.c:66
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
va_start(ap, x)
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)

Referenced by UserpFormatMessages().

◆ AllocInputContextObject()

PVOID AllocInputContextObject ( PDESKTOP  pDesk,
PTHREADINFO  pti,
SIZE_T  Size,
PVOID HandleOwner 
)

Definition at line 1435 of file ime.c.

1439 {
1440  PTHRDESKHEAD ObjHead;
1441 
1442  ASSERT(Size > sizeof(*ObjHead));
1443  ASSERT(pti != NULL);
1444 
1445  if (!pDesk)
1446  pDesk = pti->rpdesk;
1447 
1448  ObjHead = DesktopHeapAlloc(pDesk, Size);
1449  if (!ObjHead)
1450  return NULL;
1451 
1452  RtlZeroMemory(ObjHead, Size);
1453 
1454  ObjHead->pSelf = ObjHead;
1455  ObjHead->rpdesk = pDesk;
1456  ObjHead->pti = pti;
1458  *HandleOwner = pti;
1459  pti->ppi->UserHandleCount++;
1460 
1461  return ObjHead;
1462 }
PVOID pSelf
Definition: ntuser.h:195
struct _DESKTOP * rpdesk
Definition: ntuser.h:194
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
struct _DESKTOP * rpdesk
Definition: win32.h:92
PPROCESSINFO ppi
Definition: win32.h:88
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
Definition: desktop.h:204
#define IntReferenceThreadInfo(pti)
Definition: win32.h:166
#define ASSERT(a)
Definition: mode.c:44
#define NULL
Definition: types.h:112
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262

◆ co_DestroyThreadWindows()

VOID FASTCALL co_DestroyThreadWindows ( struct _ETHREAD Thread)

◆ co_UserDestroyWindow()

BOOLEAN co_UserDestroyWindow ( PVOID  Object)

Definition at line 2848 of file window.c.

2849 {
2850  HWND hWnd;
2851  PWND pwndTemp;
2852  PTHREADINFO ti;
2853  MSG msg;
2854  PWND Window = Object;
2855 
2856  ASSERT_REFS_CO(Window); // FIXME: Temp HACK?
2857 
2858  hWnd = Window->head.h;
2860 
2861  TRACE("co_UserDestroyWindow(Window = 0x%p, hWnd = 0x%p)\n", Window, hWnd);
2862 
2863  /* Check for owner thread */
2864  if (Window->head.pti != ti)
2865  {
2866  /* Check if we are destroying the desktop window */
2867  if (! ((Window->head.rpdesk->dwDTFlags & DF_DESTROYED) && Window == Window->head.rpdesk->pDeskInfo->spwnd))
2868  {
2870  return FALSE;
2871  }
2872  }
2873 
2874  /* If window was created successfully and it is hooked */
2875  if ((Window->state2 & WNDS2_WMCREATEMSGPROCESSED))
2876  {
2878  {
2879  ERR("Destroy Window WH_CBT Call Hook return!\n");
2880  return FALSE;
2881  }
2882  }
2883 
2884  if (Window->pcls->atomClassName != gpsi->atomSysClass[ICLS_IME])
2885  {
2886  if ((Window->style & (WS_POPUP|WS_CHILD)) != WS_CHILD)
2887  {
2888  if (Window->spwndOwner)
2889  {
2890  //ERR("DestroyWindow Owner out.\n");
2891  UserAttachThreadInput(Window->head.pti, Window->spwndOwner->head.pti, FALSE);
2892  }
2893  }
2894  }
2895 
2896  /* Inform the parent */
2897  if (Window->style & WS_CHILD)
2898  {
2900  }
2901 
2902  if (!Window->spwndOwner && !IntGetParent(Window))
2903  {
2905  }
2906 
2907  /* Hide the window */
2908  if (Window->style & WS_VISIBLE)
2909  {
2910  if (Window->style & WS_CHILD)
2911  {
2912  /* Only child windows receive WM_SHOWWINDOW in DestroyWindow() */
2914  }
2915  else
2916  {
2918  }
2919  }
2920 
2921  /* Adjust last active */
2922  if ((pwndTemp = Window->spwndOwner))
2923  {
2924  while (pwndTemp->spwndOwner)
2925  pwndTemp = pwndTemp->spwndOwner;
2926 
2927  if (pwndTemp->spwndLastActive == Window)
2928  pwndTemp->spwndLastActive = Window->spwndOwner;
2929  }
2930 
2931  if (Window->spwndParent && IntIsWindow(UserHMGetHandle(Window)))
2932  {
2933  if ((Window->style & (WS_POPUP | WS_CHILD)) == WS_CHILD)
2934  {
2936  {
2937  //ERR("DestroyWindow Parent out.\n");
2938  UserAttachThreadInput(Window->head.pti, Window->spwndParent->head.pti, FALSE);
2939  }
2940  }
2941  }
2942 
2943  if (Window->head.pti->MessageQueue->spwndActive == Window)
2944  Window->head.pti->MessageQueue->spwndActive = NULL;
2945  if (Window->head.pti->MessageQueue->spwndFocus == Window)
2946  Window->head.pti->MessageQueue->spwndFocus = NULL;
2947  if (Window->head.pti->MessageQueue->spwndActivePrev == Window)
2948  Window->head.pti->MessageQueue->spwndActivePrev = NULL;
2949  if (Window->head.pti->MessageQueue->spwndCapture == Window)
2950  Window->head.pti->MessageQueue->spwndCapture = NULL;
2951 
2952  /*
2953  * Check if this window is the Shell's Desktop Window. If so set hShellWindow to NULL
2954  */
2955 
2956  if (ti->pDeskInfo != NULL)
2957  {
2958  if (ti->pDeskInfo->hShellWindow == hWnd)
2959  {
2960  ERR("Destroying the ShellWindow!\n");
2961  ti->pDeskInfo->hShellWindow = NULL;
2962  }
2963  }
2964 
2966 
2968  {
2969  return TRUE;
2970  }
2971 
2972  /* Recursively destroy owned windows */
2973  if (!(Window->style & WS_CHILD))
2974  {
2976  }
2977 
2978  /* Generate mouse move message for the next window */
2979  msg.message = WM_MOUSEMOVE;
2980  msg.wParam = UserGetMouseButtonsState();
2981  msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
2982  msg.pt = gpsi->ptCursor;
2984 
2985  IntNotifyWinEvent(EVENT_OBJECT_DESTROY, Window, OBJID_WINDOW, CHILDID_SELF, 0);
2986 
2987  /* Send destroy messages */
2989 
2990  /* Destroy the default IME window if necessary */
2991  if (IS_IMM_MODE() && !(ti->TIF_flags & TIF_INCLEANUP) &&
2992  ti->spwndDefaultIme && (ti->spwndDefaultIme != Window) &&
2993  !(Window->state & WNDS_DESTROYED) && !IS_WND_IMELIKE(Window))
2994  {
2995  if (IS_WND_CHILD(Window))
2996  {
2999  }
3000  else
3001  {
3004  }
3005  }
3006 
3008  {
3009  return TRUE;
3010  }
3011 
3012  /* Destroy the window storage */
3014 
3015  return TRUE;
3016 }
#define IS_WND_CHILD(pWnd)
Definition: window.h:107
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
LRESULT co_UserFreeWindow(PWND Window, PPROCESSINFO ProcessData, PTHREADINFO ThreadData, BOOLEAN SendMessages)
Definition: window.c:577
NTSTATUS FASTCALL UserAttachThreadInput(PTHREADINFO ptiFrom, PTHREADINFO ptiTo, BOOL fAttach)
Definition: input.c:480
#define TRUE
Definition: types.h:120
#define SW_HIDE
Definition: winuser.h:762
#define IS_IMM_MODE()
Definition: ntuser.h:1232
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
FLONG TIF_flags
Definition: win32.h:95
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:3998
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:1748
PSERVERINFO gpsi
Definition: imm.c:18
#define OBJID_WINDOW
Definition: winable.h:15
HWND hWnd
Definition: settings.c:17
UINT_PTR WPARAM
Definition: windef.h:207
#define WS_CHILD
Definition: pedump.c:617
#define SWP_NOZORDER
Definition: winuser.h:1237
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
#define SWP_HIDEWINDOW
Definition: winuser.h:1231
Definition: window.c:28
#define FALSE
Definition: types.h:117
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
#define WOC_DELETE
Definition: winddi.h:1269
#define HCBT_DESTROYWND
Definition: winuser.h:59
#define CHILDID_SELF
Definition: winable.h:14
struct _WND * spwndOwner
Definition: ntuser.h:710
struct _WND * spwndDefaultIme
Definition: win32.h:131
#define WH_CBT
Definition: winuser.h:35
BOOL FASTCALL IntImeCanDestroyDefIME(PWND pImeWnd, PWND pwndTarget)
Definition: ime.c:2072
#define WM_DESTROY
Definition: winuser.h:1599
BOOL FASTCALL IntImeCanDestroyDefIMEforChild(PWND pImeWnd, PWND pwndTarget)
Definition: ime.c:2027
BOOLEAN FASTCALL co_WinPosShowWindow(PWND Wnd, INT Cmd)
Definition: winpos.c:2521
BOOLEAN co_UserDestroyWindow(PVOID Object)
Definition: window.c:2848
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define TRACE(s)
Definition: solgame.cpp:4
static void IntSendDestroyMsg(HWND hWnd)
Definition: window.c:464
#define SWP_NOACTIVATE
Definition: winuser.h:1232
#define WNDS2_WMCREATEMSGPROCESSED
Definition: ntuser.h:665
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:188
BOOL FASTCALL IntIsTopLevelWindow(PWND pWnd)
Definition: window.c:362
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1103
#define ICLS_IME
Definition: ntuser.h:922
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
#define HSHELL_WINDOWDESTROYED
Definition: winuser.h:1246
#define SWP_NOSIZE
Definition: winuser.h:1235
#define ERR(fmt,...)
Definition: debug.h:110
Definition: ntuser.h:688
VOID FASTCALL IntDestroyOwnedWindows(PWND Window)
Definition: window.c:2805
struct _WND * spwndLastActive
Definition: ntuser.h:734
#define DF_DESTROYED
Definition: desktop.h:50
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:216
#define WS_POPUP
Definition: pedump.c:616
#define WM_MOUSEMOVE
Definition: winuser.h:1765
#define NULL
Definition: types.h:112
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:1692
#define msg(x)
Definition: auth_time.c:54
#define IS_WND_IMELIKE(pWnd)
Definition: window.h:113
#define SWP_NOMOVE
Definition: winuser.h:1234
struct _DESKTOPINFO * pDeskInfo
Definition: win32.h:93
#define WS_VISIBLE
Definition: pedump.c:620
#define WNDS_DESTROYED
Definition: ntuser.h:631
static void IntSendParentNotify(PWND pWindow, UINT msg)
Definition: window.c:1681
#define TIF_INCLEANUP
Definition: ntuser.h:262
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:28
ATOM atomSysClass[ICLS_NOTUSED+1]
Definition: ntuser.h:1055

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

◆ co_UserSetFocus()

HWND FASTCALL co_UserSetFocus ( PWND  Window)

Definition at line 1314 of file focus.c.

1315 {
1316  HWND hWndPrev = 0;
1317  PWND pwndTop;
1318  PTHREADINFO pti;
1319  PUSER_MESSAGE_QUEUE ThreadQueue;
1320 
1321  if (Window)
1323 
1325  ThreadQueue = pti->MessageQueue;
1326  ASSERT(ThreadQueue != 0);
1327 
1328  TRACE("Enter SetFocus hWnd 0x%p pti 0x%p\n",Window ? UserHMGetHandle(Window) : 0, pti );
1329 
1330  hWndPrev = ThreadQueue->spwndFocus ? UserHMGetHandle(ThreadQueue->spwndFocus) : 0;
1331 
1332  if (Window != 0)
1333  {
1334  if (hWndPrev == UserHMGetHandle(Window))
1335  {
1336  return hWndPrev ? (IntIsWindow(hWndPrev) ? hWndPrev : 0) : 0; /* Nothing to do */
1337  }
1338 
1339  if (Window->head.pti->MessageQueue != ThreadQueue)
1340  {
1341  ERR("SetFocus Must have the same Q!\n");
1342  return 0;
1343  }
1344 
1345  /* Check if we can set the focus to this window */
1347  for (pwndTop = Window; pwndTop; pwndTop = pwndTop->spwndParent)
1348  {
1349  if (pwndTop->style & (WS_MINIMIZED|WS_DISABLED)) return 0;
1350  if ((pwndTop->style & (WS_POPUP|WS_CHILD)) != WS_CHILD) break;
1351  if (pwndTop->spwndParent == NULL) break;
1352  }
1354  if (co_HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM)Window->head.h, (LPARAM)hWndPrev))
1355  {
1356  ERR("SetFocus 1 WH_CBT Call Hook return!\n");
1357  return 0;
1358  }
1359 
1360  /* Activate pwndTop if needed. */
1361  if (pwndTop != ThreadQueue->spwndActive)
1362  {
1363  PUSER_MESSAGE_QUEUE ForegroundQueue = IntGetFocusMessageQueue(); // Keep it based on desktop.
1364  if (ThreadQueue != ForegroundQueue && IsAllowedFGActive(pti, pwndTop)) // Rule 2 & 3.
1365  {
1366  //ERR("SetFocus: Set Foreground!\n");
1367  if (!(pwndTop->style & WS_VISIBLE))
1368  {
1369  pti->ppi->W32PF_flags |= W32PF_ALLOWFOREGROUNDACTIVATE;
1370  }
1372  {
1373  ERR("SetFocus: Set Foreground and Focus Failed!\n");
1374  return 0;
1375  }
1376  }
1377 
1378  /* Set Active when it is needed. */
1379  if (pwndTop != ThreadQueue->spwndActive)
1380  {
1381  //ERR("SetFocus: Set Active! %p\n",pwndTop?UserHMGetHandle(pwndTop):0);
1382  if (!co_IntSetActiveWindow(pwndTop, FALSE, FALSE, FALSE))
1383  {
1384  ERR("SetFocus: Set Active Failed!\n");
1385  return 0;
1386  }
1387  }
1388 
1389  /* Abort if window destroyed */
1390  if (Window->state2 & WNDS2_INDESTROY) return 0;
1391  /* Do not change focus if the window is no longer active */
1392  if (pwndTop != ThreadQueue->spwndActive)
1393  {
1394  ERR("SetFocus: Top window did not go active!\n");
1395  return 0;
1396  }
1397  }
1398 
1399  // Check again! SetActiveWindow could have set the focus via WM_ACTIVATE.
1400  hWndPrev = ThreadQueue->spwndFocus ? UserHMGetHandle(ThreadQueue->spwndFocus) : 0;
1401 
1403 
1404  TRACE("Focus: %p -> %p\n", hWndPrev, Window->head.h);
1405  }
1406  else /* NULL hwnd passed in */
1407  {
1408  if (co_HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM)0, (LPARAM)hWndPrev))
1409  {
1410  ERR("SetFocus: 2 WH_CBT Call Hook return!\n");
1411  return 0;
1412  }
1413  //ERR("SetFocus: Set Focus NULL\n");
1414  /* set the current thread focus window null */
1415  IntSendFocusMessages( pti, NULL);
1416  }
1417  return hWndPrev ? (IntIsWindow(hWndPrev) ? hWndPrev : 0) : 0;
1418 }
#define WS_DISABLED
Definition: pedump.c:621
BOOL FASTCALL co_IntSetActiveWindow(_In_ PWND Wnd, _In_ BOOL bMouse, _In_ BOOL bFocus, _In_ BOOL Async)
Definition: focus.c:1024
VOID FASTCALL IntSendFocusMessages(PTHREADINFO pti, PWND pWnd)
Definition: focus.c:615
#define TRUE
Definition: types.h:120
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
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:1307
PPROCESSINFO ppi
Definition: win32.h:88
Definition: window.c:28
#define W32PF_ALLOWFOREGROUNDACTIVATE
Definition: win32.h:12
#define FALSE
Definition: types.h:117
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:924
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define TRACE(s)
Definition: solgame.cpp:4
#define ASSERT(a)
Definition: mode.c:44
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:188
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1103
#define ERR(fmt,...)
Definition: debug.h:110
Definition: ntuser.h:688
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:89
#define WS_POPUP
Definition: pedump.c:616
#define NULL
Definition: types.h:112
struct _WND * spwndParent
Definition: ntuser.h:708
BOOL FASTCALL IsAllowedFGActive(PTHREADINFO pti, PWND Wnd)
Definition: focus.c:730
#define WS_VISIBLE
Definition: pedump.c:620
#define WNDS2_INDESTROY
Definition: ntuser.h:643
DWORD style
Definition: ntuser.h:701

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

◆ DefSetText()

BOOL APIENTRY DefSetText ( PWND  Wnd,
PCWSTR  WindowText 
)

Definition at line 4382 of file window.c.

4383 {
4385  BOOL Ret = FALSE;
4386 
4387  RtlInitUnicodeString(&UnicodeString, WindowText);
4388 
4389  if (UnicodeString.Length != 0)
4390  {
4391  if (Wnd->strName.MaximumLength > 0 &&
4392  UnicodeString.Length <= Wnd->strName.MaximumLength - sizeof(UNICODE_NULL))
4393  {
4394  ASSERT(Wnd->strName.Buffer != NULL);
4395 
4396  Wnd->strName.Length = UnicodeString.Length;
4397  Wnd->strName.Buffer[UnicodeString.Length / sizeof(WCHAR)] = L'\0';
4399  UnicodeString.Buffer,
4400  UnicodeString.Length);
4401  }
4402  else
4403  {
4404  PWCHAR buf;
4405  Wnd->strName.MaximumLength = Wnd->strName.Length = 0;
4406  buf = Wnd->strName.Buffer;
4407  Wnd->strName.Buffer = NULL;
4408  if (buf != NULL)
4409  {
4410  DesktopHeapFree(Wnd->head.rpdesk, buf);
4411  }
4412 
4414  UnicodeString.Length + sizeof(UNICODE_NULL));
4415  if (Wnd->strName.Buffer != NULL)
4416  {
4417  Wnd->strName.Buffer[UnicodeString.Length / sizeof(WCHAR)] = L'\0';
4419  UnicodeString.Buffer,
4420  UnicodeString.Length);
4421  Wnd->strName.MaximumLength = UnicodeString.Length + sizeof(UNICODE_NULL);
4422  Wnd->strName.Length = UnicodeString.Length;
4423  }
4424  else
4425  {
4427  goto Exit;
4428  }
4429  }
4430  }
4431  else
4432  {
4433  Wnd->strName.Length = 0;
4434  if (Wnd->strName.Buffer != NULL)
4435  Wnd->strName.Buffer[0] = L'\0';
4436  }
4437 
4438  // FIXME: HAX! Windows does not do this in here!
4439  // In User32, these are called after: NotifyWinEvent EVENT_OBJECT_NAMECHANGE than
4440  // RepaintButton, StaticRepaint, NtUserCallHwndLock HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK, etc.
4441  /* Send shell notifications */
4442  if (!Wnd->spwndOwner && !IntGetParent(Wnd))
4443  {
4444  co_IntShellHookNotify(HSHELL_REDRAW, (WPARAM) UserHMGetHandle(Wnd), FALSE); // FIXME Flashing?
4445  }
4446 
4447  Ret = TRUE;
4448 Exit:
4450  return Ret;
4451 }
struct _DESKTOP * rpdesk
Definition: ntuser.h:194
#define TRUE
Definition: types.h:120
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
UINT_PTR WPARAM
Definition: windef.h:207
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_opt_ PCUNICODE_STRING UnicodeString
Definition: wdfstring.h:64
uint16_t * PWCHAR
Definition: typedefs.h:56
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define L(x)
Definition: ntvdm.h:50
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
Definition: desktop.h:204
#define FALSE
Definition: types.h:117
#define UNICODE_NULL
unsigned int BOOL
Definition: ntddk_ex.h:94
struct _WND * spwndOwner
Definition: ntuser.h:710
THRDESKHEAD head
Definition: ntuser.h:690
LARGE_UNICODE_STRING strName
Definition: ntuser.h:731
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define ASSERT(a)
Definition: mode.c:44
__wchar_t WCHAR
Definition: xmlstorage.h:180
static void Exit(void)
Definition: sock.c:1331
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:216
#define NULL
Definition: types.h:112
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
Definition: desktop.c:1692
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
Definition: desktop.h:215
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:28

◆ 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:931
HGDIOBJ FASTCALL IntGetSysColorBrush(INT Object)
Definition: stockobj.c:317
PSERVERINFO gpsi
Definition: imm.c:18
COLORREF FASTCALL IntGdiSetBkColor(_In_ HDC hDC, _In_ COLORREF Color)
#define CTLCOLOR_SCROLLBAR
Definition: winuser.h:950
#define COLOR_WINDOW
Definition: winuser.h:912
#define COLOR_3DFACE
Definition: winuser.h:923
#define COLOR_SCROLLBAR
Definition: winuser.h:906
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:300
#define COLOR_WINDOWTEXT
Definition: winuser.h:915
#define CTLCOLOR_EDIT
Definition: winuser.h:946
DWORD FASTCALL IntGetSysColor(INT nIndex)
Definition: stockobj.c:323
#define CTLCOLOR_LISTBOX
Definition: winuser.h:947
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  DWORD ExStyleTB, StyleTB;
260  BOOL IsTaskBar;
261 
262  Style = pwnd->style;
263  ExStyle = pwnd->ExStyle;
264  iconic = (Style & WS_MINIMIZE) != 0;
265 
266  if (((Style & WS_MAXIMIZE) && syscommand != SC_MOVE) || !IntIsWindowVisible(pwnd)) return;
267 
268  thickframe = UserHasThickFrameStyle(Style, ExStyle) && !iconic;
269 
270  //
271  // Show window contents while dragging the window, get flag from registry data.
272  //
273  UserSystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, &DragFullWindows, 0);
274 
275  pt.x = pti->ptLast.x;
276  pt.y = pti->ptLast.y;
277  capturePoint = pt;
278  UserClipCursor( NULL );
279 
280  TRACE("pwnd %p command %04lx, hittest %d, pos %d,%d\n",
281  pwnd, syscommand, hittest, pt.x, pt.y);
282 
283  if (syscommand == SC_MOVE)
284  {
285  if (!hittest) hittest = DefWndStartSizeMove(pwnd, wParam, &capturePoint);
286  if (!hittest) return;
287  }
288  else /* SC_SIZE */
289  {
290  if (!thickframe) return;
291  if (hittest && (syscommand != SC_MOUSEMENU))
292  {
293  hittest += (HTLEFT - WMSZ_LEFT);
294  }
295  else
296  {
298  hittest = DefWndStartSizeMove(pwnd, wParam, &capturePoint);
299  if (!hittest)
300  {
302  return;
303  }
304  }
305  }
306 
307  /* Get min/max info */
308 
309  co_WinPosGetMinMaxInfo(pwnd, NULL, NULL, &minTrack, &maxTrack);
310  sizingRect = pwnd->rcWindow;
311  origRect = sizingRect;
312  if (Style & WS_CHILD)
313  {
314  pWndParent = IntGetParent(pwnd);
315  IntGetClientRect( pWndParent, &mouseRect );
316  IntMapWindowPoints( pWndParent, 0, (LPPOINT)&mouseRect, 2 );
317  IntMapWindowPoints( 0, pWndParent, (LPPOINT)&sizingRect, 2 );
318  unmodRect = sizingRect;
319  }
320  else
321  {
322  if (!(ExStyle & WS_EX_TOPMOST))
323  {
324  UserSystemParametersInfo(SPI_GETWORKAREA, 0, &mouseRect, 0);
325  }
326  else
327  {
329  }
330  unmodRect = sizingRect;
331  }
332 
333  if (ON_LEFT_BORDER(hittest))
334  {
335  mouseRect.left = max( mouseRect.left, sizingRect.right-maxTrack.x+capturePoint.x-sizingRect.left );
336  mouseRect.right = min( mouseRect.right, sizingRect.right-minTrack.x+capturePoint.x-sizingRect.left );
337  }
338  else if (ON_RIGHT_BORDER(hittest))
339  {
340  mouseRect.left = max( mouseRect.left, sizingRect.left+minTrack.x+capturePoint.x-sizingRect.right );
341  mouseRect.right = min( mouseRect.right, sizingRect.left+maxTrack.x+capturePoint.x-sizingRect.right );
342  }
343  if (ON_TOP_BORDER(hittest))
344  {
345  mouseRect.top = max( mouseRect.top, sizingRect.bottom-maxTrack.y+capturePoint.y-sizingRect.top );
346  mouseRect.bottom = min( mouseRect.bottom,sizingRect.bottom-minTrack.y+capturePoint.y-sizingRect.top);
347  }
348  else if (ON_BOTTOM_BORDER(hittest))
349  {
350  mouseRect.top = max( mouseRect.top, sizingRect.top+minTrack.y+capturePoint.y-sizingRect.bottom );
351  mouseRect.bottom = min( mouseRect.bottom, sizingRect.top+maxTrack.y+capturePoint.y-sizingRect.bottom );
352  }
353 
354  hdc = UserGetDCEx( pWndParent, 0, DCX_CACHE );
355  if (iconic)
356  {
357  DragCursor = pwnd->pcls->spicn;
358  if (DragCursor)
359  {
360  UserReferenceObject(DragCursor);
361  }
362  else
363  {
364  HCURSOR CursorHandle = (HCURSOR)co_IntSendMessage( UserHMGetHandle(pwnd), WM_QUERYDRAGICON, 0, 0 );
365  if (CursorHandle)
366  {
367  DragCursor = UserGetCurIconObject(CursorHandle);
368  }
369  else
370  {
371  iconic = FALSE;
372  }
373  }
374  }
375 
376  /* repaint the window before moving it around */
378 
379  IntNotifyWinEvent( EVENT_SYSTEM_MOVESIZESTART, pwnd, OBJID_WINDOW, CHILDID_SELF, 0);
380 
382 
384 
386 
387  pwnd->head.pti->TIF_flags |= TIF_MOVESIZETRACKING;
388 
389  for(;;)
390  {
391  int dx = 0, dy = 0;
392 
393  if (!co_IntGetPeekMessage(&msg, 0, 0, 0, PM_REMOVE, TRUE)) break;
394  if (IntCallMsgFilter( &msg, MSGF_SIZE )) continue;
395 
396  /* Exit on button-up */
397  if (msg.message == WM_LBUTTONUP)
398  {
399  /* Test for typical TaskBar ExStyle Values */
400  ExStyleTB = (ExStyle & WS_EX_TOOLWINDOW);
401  TRACE("ExStyle is '%x'.\n", ExStyleTB);
402 
403  /* Test for typical TaskBar Style Values */
404  StyleTB = (Style & (WS_POPUP | WS_VISIBLE |
406  TRACE("Style is '%x'.\n", StyleTB);
407 
408  /* Test for masked typical TaskBar Style and ExStyles to detect TaskBar */
409  IsTaskBar = (StyleTB == (WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN))
410  && (ExStyleTB == WS_EX_TOOLWINDOW);
411  TRACE("This %s the TaskBar.\n", IsTaskBar ? "is" : "is not");
412 
413  // check for snapping if was moved by caption
414  if (hittest == HTCAPTION && thickframe && (ExStyle & WS_EX_MDICHILD) == 0)
415  {
416  RECT snapRect;
417  BOOL doSideSnap = FALSE;
418  UserSystemParametersInfo(SPI_GETWORKAREA, 0, &snapRect, 0);
419 
420  /* if this is the taskbar, then we want to just exit */
421  if (IsTaskBar)
422  {
423  break;
424  }
425  // snap to left
426  if (pt.x <= snapRect.left)
427  {
428  snapRect.right = (snapRect.right - snapRect.left) / 2 + snapRect.left;
429  doSideSnap = TRUE;
430  }
431  // snap to right
432  if (pt.x >= snapRect.right-1)
433  {
434  snapRect.left = (snapRect.right - snapRect.left) / 2 + snapRect.left;
435  doSideSnap = TRUE;
436  }
437 
438  if (doSideSnap)
439  {
441  NULL,
442  snapRect.left,
443  snapRect.top,
444  snapRect.right - snapRect.left,
445  snapRect.bottom - snapRect.top,
447  pwnd->InternalPos.NormalRect = origRect;
448  }
449  else
450  {
451  // maximize if on dragged to top
452  if (pt.y <= snapRect.top)
453  {
455  pwnd->InternalPos.NormalRect = origRect;
456  }
457  }
458  }
459  break;
460  }
461 
462  /* Exit on Return or Esc */
463  if (msg.message == WM_KEYDOWN &&
464  (msg.wParam == VK_RETURN || msg.wParam == VK_ESCAPE))
465  {
466  break;
467  }
468 
469  if ((msg.message != WM_KEYDOWN) && (msg.message != WM_MOUSEMOVE))
470  {
471  IntTranslateKbdMessage( &msg , 0 );
473  continue; /* We are not interested in other messages */
474  }
475 
476  pt = msg.pt;
477 
478  if (msg.message == WM_KEYDOWN) switch(msg.wParam)
479  {
480  case VK_UP: pt.y -= 8; break;
481  case VK_DOWN: pt.y += 8; break;
482  case VK_LEFT: pt.x -= 8; break;
483  case VK_RIGHT: pt.x += 8; break;
484  }
485 
486  pt.x = max( pt.x, mouseRect.left );
487  pt.x = min( pt.x, mouseRect.right - 1 );
488  pt.y = max( pt.y, mouseRect.top );
489  pt.y = min( pt.y, mouseRect.bottom - 1 );
490 
491  dx = pt.x - capturePoint.x;
492  dy = pt.y - capturePoint.y;
493 
494  if (dx || dy)
495  {
496  if ( !moved )
497  {
498  moved = TRUE;
499  if ( iconic ) /* ok, no system popup tracking */
500  {
501  OldCursor = UserSetCursor(DragCursor, FALSE);
502  UserShowCursor( TRUE );
503  }
504  else if(!DragFullWindows)
505  UserDrawMovingFrame( hdc, &sizingRect, thickframe );
506  }
507 
508  if (msg.message == WM_KEYDOWN) UserSetCursorPos(pt.x, pt.y, 0, 0, FALSE);
509  else
510  {
511  RECT newRect = unmodRect;
512 
513  if (!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe );
514  if (hittest == HTCAPTION)
515  {
516  /* Restore window size if it is snapped */
517  if (!RECTL_bIsEmptyRect(&pwnd->InternalPos.NormalRect) &&
518  !IntEqualRect(&pwnd->InternalPos.NormalRect, &pwnd->rcWindow))
519  {
520  UserSetCursorPos(max(0, pwnd->InternalPos.NormalRect.left) + pt.x, pwnd->InternalPos.NormalRect.top + pt.y, 0, 0, FALSE);
521 
522  /* Save normal size - it required when window unsnapped from one side and snapped to another holding mouse down */
523  origRect = pwnd->InternalPos.NormalRect;
524 
525  /* Restore from maximized state */
526  if (Style & WS_MAXIMIZE)
527  {
529  }
530  /* Restore snapped to left/right place */
531  else
532  {
534  NULL,
535  pwnd->InternalPos.NormalRect.left,
536  pwnd->InternalPos.NormalRect.top,
537  pwnd->InternalPos.NormalRect.right - pwnd->InternalPos.NormalRect.left,
538  pwnd->InternalPos.NormalRect.bottom - pwnd->InternalPos.NormalRect.top,
539  0);
540  }
541  RECTL_vSetEmptyRect(&pwnd->InternalPos.NormalRect);
542  continue;
543  }
544 
545  /* regular window moving */
546  RECTL_vOffsetRect(&newRect, dx, dy);
547  }
548  if (ON_LEFT_BORDER(hittest)) newRect.left += dx;
549  else if (ON_RIGHT_BORDER(hittest)) newRect.right += dx;
550  if (ON_TOP_BORDER(hittest)) newRect.top += dy;
551  else if (ON_BOTTOM_BORDER(hittest)) newRect.bottom += dy;
552  capturePoint = pt;
553 
554  //
555  // Save the new position to the unmodified rectangle. This allows explorer task bar
556  // sizing. Explorer will forces back the position unless a certain amount of sizing
557  // has occurred.
558  //
559  unmodRect = newRect;
560 
561  /* determine the hit location */
562  if (syscommand == SC_SIZE)
563  {
564  WPARAM wpSizingHit = 0;
565 
566  if (hittest >= HTLEFT && hittest <= HTBOTTOMRIGHT)
567  wpSizingHit = WMSZ_LEFT + (hittest - HTLEFT);
568  co_IntSendMessage( UserHMGetHandle(pwnd), WM_SIZING, wpSizingHit, (LPARAM)&newRect );
569  }
570  else
571  co_IntSendMessage( UserHMGetHandle(pwnd), WM_MOVING, 0, (LPARAM)&newRect );
572 
573  if (!iconic)
574  {
575  if (!DragFullWindows)
576  UserDrawMovingFrame( hdc, &newRect, thickframe );
577  else
578  { // Moving the whole window now!
579  HRGN hrgnNew;
580  HRGN hrgnOrig = GreCreateRectRgnIndirect(&pwnd->rcWindow);
581 
582  if (pwnd->hrgnClip != NULL)
583  NtGdiCombineRgn(hrgnOrig, hrgnOrig, pwnd->hrgnClip, RGN_AND);
584 
586  //IntMapWindowPoints( 0, pWndParent, (POINT *)&rect, 2 );
588  NULL,
589  newRect.left,
590  newRect.top,
591  newRect.right - newRect.left,
592  newRect.bottom - newRect.top,
593  SWP_NOACTIVATE | ((hittest == HTCAPTION) ? SWP_NOSIZE : 0));
594 
595  hrgnNew = GreCreateRectRgnIndirect(&pwnd->rcWindow);
596  if (pwnd->hrgnClip != NULL)
597  NtGdiCombineRgn(hrgnNew, hrgnNew, pwnd->hrgnClip, RGN_AND);
598 
599  if (hrgnNew)
600  {
601  if (hrgnOrig)
602  NtGdiCombineRgn(hrgnOrig, hrgnOrig, hrgnNew, RGN_DIFF);
603  }
604  else
605  {
606  if (hrgnOrig)
607  {
608  GreDeleteObject(hrgnOrig);
609  hrgnOrig = 0;
610  }
611  }
612 
613  // Update all the windows after the move or size, including this window.
614  UpdateThreadWindows(UserGetDesktopWindow()->spwndChild, pti, hrgnOrig);
615 
616  if (hrgnOrig) GreDeleteObject(hrgnOrig);
617  if (hrgnNew) GreDeleteObject(hrgnNew);
618  }
619  }
620  sizingRect = newRect;
621  }
622  }
623  }
624 
625  pwnd->head.pti->TIF_flags &= ~TIF_MOVESIZETRACKING;
626 
628 
629  if ( iconic )
630  {
631  if ( moved ) /* restore cursors, show icon title later on */
632  {
634  OldCursor = UserSetCursor(OldCursor, FALSE);
635  }
636 
637  /* It could be that the cursor was already changed while we were proceeding,
638  * so we must unreference whatever cursor was current at the time we restored the old one.
639  * Maybe it is DragCursor, but maybe it is another one and DragCursor got already freed.
640  */
641  if (OldCursor) UserDereferenceObject(OldCursor);
642  }
643  else if ( moved && !DragFullWindows )
644  UserDrawMovingFrame( hdc, &sizingRect, thickframe );
645 
647 
649  //if (pWndParent) IntMapWindowPoints( 0, pWndParent, (POINT *)&sizingRect, 2 );
650 
652  {
653  ERR("DoSizeMove : WH_CBT Call Hook return!\n");
654  moved = FALSE;
655  }
656 
657  IntNotifyWinEvent( EVENT_SYSTEM_MOVESIZEEND, pwnd, OBJID_WINDOW, CHILDID_SELF, 0);
658 
660 
665  /* window moved or resized */
666  if (moved)
667  {
668  /* if the moving/resizing isn't canceled call SetWindowPos
669  * with the new position or the new size of the window
670  */
671  if (!((msg.message == WM_KEYDOWN) && (msg.wParam == VK_ESCAPE)) )
672  {
673  /* NOTE: SWP_NOACTIVATE prevents document window activation in Word 6 */
674  if (!DragFullWindows || iconic )
675  {
676  co_WinPosSetWindowPos( pwnd,
677  0,
678  sizingRect.left,
679  sizingRect.top,
680  sizingRect.right - sizingRect.left,
681  sizingRect.bottom - sizingRect.top,
682  ( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 );
683  }
684  }
685  else
686  { /* restore previous size/position */
687  if ( DragFullWindows )
688  {
689  co_WinPosSetWindowPos( pwnd,
690  0,
691  origRect.left,
692  origRect.top,
693  origRect.right - origRect.left,
694  origRect.bottom - origRect.top,
695  ( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 );
696  }
697  }
698  }
699 
700  if ( IntIsWindow(UserHMGetHandle(pwnd)) )
701  {
702  if ( iconic )
703  {
704  /* Single click brings up the system menu when iconized */
705  if ( !moved )
706  {
707  if( Style & WS_SYSMENU )
709  }
710  }
711  }
712 }
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define HTLEFT
Definition: winuser.h:2477
#define MSQ_STATE_MOVESIZE
Definition: ntuser.h:3703
#define max(a, b)
Definition: svc.c:63
DWORD ExStyle
Definition: ntuser.h:699
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1158
#define TIF_MOVESIZETRACKING
Definition: ntuser.h:277
#define SC_RESTORE
Definition: winuser.h:2588
long y
Definition: polytest.cpp:48
FORCEINLINE VOID RECTL_vSetEmptyRect(_Out_ RECTL *prcl)
Definition: rect.h:20
PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon)
Definition: cursoricon.c:200
LRESULT FASTCALL IntDispatchMessage(PMSG pMsg)
Definition: message.c:841
long x
Definition: polytest.cpp:48
BOOL FASTCALL IntReleaseCapture(VOID)
Definition: focus.c:1530
#define TRUE
Definition: types.h:120
#define pt(x, y)
Definition: drawing.c:79
BOOL FASTCALL IntTranslateKbdMessage(LPMSG lpMsg, UINT flags)
Definition: keyboard.c:1152
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:1748
static HDC
Definition: imagelist.c:92
#define OBJID_WINDOW
Definition: winable.h:15
LONG top
Definition: windef.h:307
#define VK_LEFT
Definition: winuser.h:2214
#define WM_EXITSIZEMOVE
Definition: winuser.h:1814
int UserShowCursor(BOOL bShow)
Definition: msgqueue.c:168
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
#define SC_MOUSEMENU
Definition: winuser.h:2585
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:644
BOOL FASTCALL IntCallMsgFilter(LPMSG lpmsg, INT code)
Definition: message.c:2137
UINT_PTR WPARAM
Definition: windef.h:207
#define VK_DOWN
Definition: winuser.h:2217
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:306
VOID FASTCALL IntGetClientRect(PWND WindowObject, RECTL *Rect)
Definition: winpos.c:91
HICON HCURSOR
Definition: windef.h:299
#define VK_ESCAPE
Definition: winuser.h:2204
#define WS_CLIPCHILDREN
Definition: pedump.c:619
LONG right
Definition: windef.h:308
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
BOOL UserSetCursorPos(INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: cursoricon.c:238
#define VK_RETURN
Definition: winuser.h:2191
struct _CURICON_OBJECT * spicn
Definition: ntuser.h:580
WPARAM wParam
Definition: combotst.c:138
#define RGN_AND
Definition: wingdi.h:356
#define WM_QUERYDRAGICON
Definition: winuser.h:1644
#define SM_CXSCREEN
Definition: winuser.h:953
#define ON_RIGHT_BORDER(hit)
Definition: nonclient.c:27
#define WS_EX_MDICHILD
Definition: winuser.h:394
#define L(x)
Definition: ntvdm.h:50
#define HTSYSMENU
Definition: winuser.h:2467
#define VK_UP
Definition: winuser.h:2215
#define FALSE
Definition: types.h:117
#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:1167
#define CHILDID_SELF
Definition: winable.h:14
#define SC_MAXIMIZE
Definition: winuser.h:2578
#define GreCreateRectRgnIndirect(prc)
Definition: region.h:96
#define WM_SIZING
Definition: winuser.h:1797
THRDESKHEAD head
Definition: ntuser.h:690
#define MAKELONG(a, b)
Definition: typedefs.h:249
VOID FASTCALL UserDrawMovingFrame(HDC hdc, RECTL *rect, BOOL thickframe)
Definition: nonclient.c:56
HRGN hrgnClip
Definition: ntuser.h:728
#define WM_KEYDOWN
Definition: winuser.h:1705
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:208
UINT FASTCALL co_WinPosGetMinMaxInfo(PWND Window, POINT *MaxSize, POINT *MaxPos, POINT *MinTrack, POINT *MaxTrack)
Definition: winpos.c:933
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define SM_CYSCREEN
Definition: winuser.h:954
HWND FASTCALL MsqSetStateWindow(PTHREADINFO pti, ULONG Type, HWND hWnd)
Definition: msgqueue.c:2551
#define TRACE(s)
Definition: solgame.cpp:4
HWND FASTCALL co_UserSetCapture(HWND hWnd)
Definition: focus.c:1458
#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
#define SWP_NOACTIVATE
Definition: winuser.h:1232
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:188
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1103
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1386
BOOL FASTCALL IntIsWindowVisible(PWND Wnd)
Definition: window.c:201
#define WM_MOVING
Definition: winuser.h:1799
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
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:711
#define HTBOTTOMRIGHT
Definition: winuser.h:2485
HWND APIENTRY IntGetCapture(VOID)
Definition: focus.c:1440
__kernel_entry W32KAPI INT APIENTRY NtGdiCombineRgn(_In_ HRGN hrgnDst, _In_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ INT iMode)
POINT ptLast
Definition: win32.h:129
#define VK_RIGHT
Definition: winuser.h:2216
#define SWP_NOSIZE
Definition: winuser.h:1235
#define ERR(fmt,...)
Definition: debug.h:110
#define HTCAPTION
Definition: winuser.h:2466
Definition: ntuser.h:688
VOID FASTCALL UpdateThreadWindows(PWND pWnd, PTHREADINFO pti, HRGN hRgn)
Definition: painting.c:1093
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:2104
BOOL APIENTRY co_IntGetPeekMessage(PMSG pMsg, HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax, UINT RemoveMsg, BOOL bGMSG)
Definition: message.c:1177
#define RGN_DIFF
Definition: wingdi.h:358
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:888
#define RDW_ALLCHILDREN
Definition: winuser.h:1211
FORCEINLINE BOOL IntEqualRect(RECTL *lprc1, RECTL *lprc2)
Definition: winpos.h:48
#define SC_SIZE
Definition: winuser.h:2574
#define WM_LBUTTONUP
Definition: winuser.h:1767
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:216
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 WS_POPUP
Definition: pedump.c:616
#define WM_MOUSEMOVE
Definition: winuser.h:1765
#define NULL
Definition: types.h:112
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:918
GLint dx
Definition: linetemp.h:97
#define msg(x)
Definition: auth_time.c:54
#define RDW_UPDATENOW
Definition: winuser.h:1210
#define SC_MOVE
Definition: winuser.h:2575
#define HCBT_MOVESIZE
Definition: winuser.h:55
FORCEINLINE BOOL RECTL_bIsEmptyRect(_In_ const RECTL *prcl)
Definition: rect.h:44
unsigned int ULONG
Definition: retypes.h:1
#define UserHasThickFrameStyle(Style, ExStyle)
Definition: nonclient.c:18
LONG bottom
Definition: windef.h:309
struct _WND::@4898 InternalPos
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2090
#define PM_REMOVE
Definition: winuser.h:1186
PCURICON_OBJECT FASTCALL UserSetCursor(PCURICON_OBJECT NewCursor, BOOL ForceChange)
Definition: msgqueue.c:93
#define WS_VISIBLE
Definition: pedump.c:620
#define WS_SYSMENU
Definition: pedump.c:629
#define WM_SYSCOMMAND
Definition: winuser.h:1731
#define WM_ENTERSIZEMOVE
Definition: winuser.h:1813
#define WMSZ_LEFT
Definition: winuser.h:2454
#define ON_LEFT_BORDER(hit)
Definition: nonclient.c:25
const DWORD ExStyle
Definition: appswitch.c:72
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:731
PCLS pcls
Definition: ntuser.h:715
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:701

Referenced by DefWndHandleSysCommand().

◆ GetControlBrush()

HBRUSH FASTCALL GetControlBrush ( PWND  ,
HDC  ,
UINT   
)

Definition at line 172 of file misc.c.

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

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

◆ GetControlColor()

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

Definition at line 146 of file misc.c.

151 {
152  HBRUSH hBrush;
153 
154  if (!pwndParent) pwndParent = pwnd;
155 
156  if ( pwndParent->head.pti->ppi != PsGetCurrentProcessWin32Process())
157  {
158  return (HBRUSH)IntDefWindowProc( pwndParent, CtlMsg, (WPARAM)hdc, (LPARAM)UserHMGetHandle(pwnd), FALSE);
159  }
160 
161  hBrush = (HBRUSH)co_IntSendMessage( UserHMGetHandle(pwndParent), CtlMsg, (WPARAM)hdc, (LPARAM)UserHMGetHandle(pwnd));
162 
163  if (!hBrush || !GreIsHandleValid(hBrush))
164  {
165  hBrush = (HBRUSH)IntDefWindowProc( pwndParent, CtlMsg, (WPARAM)hdc, (LPARAM)UserHMGetHandle(pwnd), FALSE);
166  }
167  return hBrush;
168 }
LRESULT FASTCALL IntDefWindowProc(PWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi)
Definition: defwnd.c:537
BOOL NTAPI GreIsHandleValid(HGDIOBJ hobj)
Definition: gdiobj.c:1146
UINT_PTR WPARAM
Definition: windef.h:207
#define FALSE
Definition: types.h:117
LONG_PTR LPARAM
Definition: windef.h:208
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
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
#define FALSE
Definition: types.h:117
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 809 of file misc.c.

813 {
818 
819  if (Thread && Process)
821 
822  /* If nothing has been specified, use the current thread */
823  if (!Thread && !Process)
825 
826  if (Thread)
827  {
828  /* Use a thread token */
829  ASSERT(!Process);
831  &CopyOnOpen,
832  &EffectiveOnly,
834 
835  /* If we don't have a thread token, use a process token */
836  if (!Token)
838  }
839  if (!Token && Process)
840  {
841  /* Use a process token */
843 
844  /* If we don't have a token, fail */
845  if (!Token)
846  return STATUS_NO_TOKEN;
847  }
848  ASSERT(Token);
849 
850  /* Query the LUID */
852 
853  /* Get rid of the token and return */
855  return Status;
856 }
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
_Out_ PBOOLEAN CopyOnOpen
Definition: psfuncs.h:154
PEPROCESS __stdcall PsGetThreadProcess(_In_ PETHREAD Thread)
enum _SECURITY_IMPERSONATION_LEVEL SECURITY_IMPERSONATION_LEVEL
unsigned char BOOLEAN
Status
Definition: gdiplustypes.h:24
#define ASSERT(a)
Definition: mode.c:44
_Out_ PBOOLEAN _Out_ PBOOLEAN _Out_ PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel
Definition: psfuncs.h:154
#define ObDereferenceObject
Definition: obfuncs.h:203
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2652
#define STATUS_NO_TOKEN
Definition: ntstatus.h:360
PACCESS_TOKEN NTAPI PsReferencePrimaryToken(PEPROCESS Process)
Definition: security.c:440
PACCESS_TOKEN NTAPI PsReferenceImpersonationToken(IN PETHREAD Thread, OUT PBOOLEAN CopyOnOpen, OUT PBOOLEAN EffectiveOnly, OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel)
Definition: security.c:849
NTSTATUS NTAPI SeQueryAuthenticationIdToken(_In_ PACCESS_TOKEN Token, _Out_ PLUID LogonId)
Queries the authentication ID of an access token.
Definition: token.c:1823
#define NULL
Definition: types.h:112
_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:401

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

◆ InitMetrics()

BOOL NTAPI InitMetrics ( VOID  )

Definition at line 39 of file metric.c.

40 {
41  INT *piSysMet = gpsi->aiSysMet;
43 
44  /* Note: used for the SM_CLEANBOOT metric */
45  DWORD dwValue = 0;
46  HKEY hKey = 0;
47 
48  /* Clean boot */
49  piSysMet[SM_CLEANBOOT] = 0; // Fallback value of 0 (normal mode)
50  if(NT_SUCCESS(RegOpenKey(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Option", &hKey)))
51  {
52  if(RegReadDWORD(hKey, L"OptionValue", &dwValue)) piSysMet[SM_CLEANBOOT] = (INT)dwValue;
53  ZwClose(hKey);
54  }
55 
56  /* FIXME: HACK, due to missing MDEV on first init */
57  if (!gpmdev)
58  {
59  Width = 640;
60  Height = 480;
61  }
62  else
63  {
66  }
67 
68  /* Screen sizes */
69  piSysMet[SM_CXSCREEN] = Width;
70  piSysMet[SM_CYSCREEN] = Height;
71  piSysMet[SM_XVIRTUALSCREEN] = 0;
72  piSysMet[SM_YVIRTUALSCREEN] = 0;
73  piSysMet[SM_CXVIRTUALSCREEN] = Width;
74  piSysMet[SM_CYVIRTUALSCREEN] = Height;
75 
76  /* NC area sizes */
77  piSysMet[SM_CYCAPTION] = gspv.ncm.iCaptionHeight + 1; // 19
78  piSysMet[SM_CYSMCAPTION] = gspv.ncm.iSmCaptionHeight + 1; // 15;
79  piSysMet[SM_CXSIZE] = gspv.ncm.iCaptionHeight; // 18;
80  piSysMet[SM_CYSIZE] = gspv.ncm.iCaptionHeight; // 18;
81  piSysMet[SM_CXSMSIZE] = gspv.ncm.iSmCaptionWidth; // 12; XP: piSysMet(SM_CYSMCAPTION) - 1
82  piSysMet[SM_CYSMSIZE] = gspv.ncm.iSmCaptionHeight; // 14;
83  piSysMet[SM_CXBORDER] = 1; // Seems to be hardcoded
84  piSysMet[SM_CYBORDER] = 1; // Seems to be hardcoded
85  piSysMet[SM_CXFOCUSBORDER] = 1;
86  piSysMet[SM_CYFOCUSBORDER] = 1;
87  piSysMet[SM_CXDLGFRAME] = 3;
88  piSysMet[SM_CYDLGFRAME] = 3;
89  piSysMet[SM_CXEDGE] = 2;
90  piSysMet[SM_CYEDGE] = 2;
91  piSysMet[SM_CXFRAME] = piSysMet[SM_CXDLGFRAME] + gspv.ncm.iBorderWidth; // 4
92  piSysMet[SM_CYFRAME] = piSysMet[SM_CYDLGFRAME] + gspv.ncm.iBorderWidth; // 4
93 #if (_WIN32_WINNT >= 0x0600)
94  piSysMet[SM_CXPADDEDBORDER] = 0;
95 #endif
96 
97  /* Window sizes */
98  TRACE("ncm.iCaptionWidth=%d,GetSystemMetrics(SM_CYSIZE)=%d,GetSystemMetrics(SM_CXFRAME)=%d,avcwCaption=%d \n",
99  gspv.ncm.iCaptionWidth, piSysMet[SM_CYSIZE],piSysMet[SM_CXFRAME], gspv.tmCaptionFont.tmAveCharWidth);
100 
101  piSysMet[SM_CXMIN] = 3 * max(gspv.ncm.iCaptionWidth, 8) // 112
102  + piSysMet[SM_CYSIZE] + 4
104  + 2 * piSysMet[SM_CXFRAME];
105  piSysMet[SM_CYMIN] = piSysMet[SM_CYCAPTION] + 2 * piSysMet[SM_CYFRAME]; // 27
106  piSysMet[SM_CXMAXIMIZED] = piSysMet[SM_CXSCREEN] + 2 * piSysMet[SM_CXFRAME];
107  piSysMet[SM_CYMAXIMIZED] = piSysMet[SM_CYSCREEN] - 20;
108  piSysMet[SM_CXFULLSCREEN] = piSysMet[SM_CXSCREEN];
109  piSysMet[SM_CYFULLSCREEN] = piSysMet[SM_CYMAXIMIZED] - piSysMet[SM_CYMIN];
110  piSysMet[SM_CYKANJIWINDOW] = 0;
111  piSysMet[SM_CXMINIMIZED] = gspv.mm.iWidth + 6;
112  piSysMet[SM_CYMINIMIZED] = piSysMet[SM_CYCAPTION] + 5;
113  piSysMet[SM_CXMINSPACING] = piSysMet[SM_CXMINIMIZED] + gspv.mm.iHorzGap;
114  piSysMet[SM_CYMINSPACING] = piSysMet[SM_CYMINIMIZED] + gspv.mm.iVertGap;
115  piSysMet[SM_CXMAXTRACK] = piSysMet[SM_CXVIRTUALSCREEN] + 4
116  + 2 * piSysMet[SM_CXFRAME];
117  piSysMet[SM_CYMAXTRACK] = piSysMet[SM_CYVIRTUALSCREEN] + 4
118  + 2 * piSysMet[SM_CYFRAME];
119 
120  /* Icon */
121  piSysMet[SM_CXVSCROLL] = gspv.ncm.iScrollWidth; // 16;
122  piSysMet[SM_CYVTHUMB] = gspv.ncm.iScrollHeight; // 16;
123  piSysMet[SM_CYHSCROLL] = gspv.ncm.iScrollWidth; // 16;
124  piSysMet[SM_CXHTHUMB] = gspv.ncm.iScrollHeight; // 16;
125  piSysMet[SM_CYVSCROLL] = gspv.ncm.iScrollHeight; // 16
126  piSysMet[SM_CXHSCROLL] = gspv.ncm.iScrollHeight; // 16;
127  piSysMet[SM_CXICON] = 32;
128  piSysMet[SM_CYICON] = 32;
129  piSysMet[SM_CXSMICON] = 16;
130  piSysMet[SM_CYSMICON] = 16;
131  piSysMet[SM_CXICONSPACING] = gspv.im.iHorzSpacing; // 64;
132  piSysMet[SM_CYICONSPACING] = gspv.im.iVertSpacing; // 64;
133  piSysMet[SM_CXCURSOR] = 32;
134  piSysMet[SM_CYCURSOR] = 32;
135  piSysMet[SM_CXMINTRACK] = piSysMet[SM_CXMIN]; // 117
136  piSysMet[SM_CYMINTRACK] = piSysMet[SM_CYMIN]; // 27
137  piSysMet[SM_CXDRAG] = 4;
138  piSysMet[SM_CYDRAG] = 4;
139  piSysMet[SM_ARRANGE] = gspv.mm.iArrange; // 8;
140 
141  /* Menu */
142  piSysMet[SM_CYMENU] = gspv.ncm.iMenuHeight + 1; // 19;
144  piSysMet[SM_CXMENUCHECK] = ((1 + gspv.tmMenuFont.tmHeight +
145  gspv.tmMenuFont.tmExternalLeading) & ~1) - 1; // 13;
146  piSysMet[SM_CYMENUCHECK] = piSysMet[SM_CXMENUCHECK];
147  piSysMet[SM_CXMENUSIZE] = gspv.ncm.iMenuWidth; // 18;
148  piSysMet[SM_CYMENUSIZE] = gspv.ncm.iMenuHeight; // 18;
149 
150  /* Mouse */
151  piSysMet[SM_MOUSEPRESENT] = 1;
152  piSysMet[SM_MOUSEWHEELPRESENT] = 1;
153  piSysMet[SM_CMOUSEBUTTONS] = 2;
154  piSysMet[SM_SWAPBUTTON] = gspv.bMouseBtnSwap ? 1 : 0;
155  piSysMet[SM_CXDOUBLECLK] = gspv.iDblClickWidth;
156  piSysMet[SM_CYDOUBLECLK] = gspv.iDblClickHeight;
157 #if (_WIN32_WINNT >= 0x0600)
158  piSysMet[SM_MOUSEHORIZONTALWHEELPRESENT] = 0;
159 #endif
160 
161  /* Version info */
162  piSysMet[SM_TABLETPC] = 0;
163  piSysMet[SM_MEDIACENTER] = 0;
164  piSysMet[SM_STARTER] = 0;
165  piSysMet[SM_SERVERR2] = 0;
166  piSysMet[SM_PENWINDOWS] = 0;
167 
168  /* Other */
169  piSysMet[SM_DEBUG] = 0;
170  piSysMet[SM_NETWORK] = 3;
171  piSysMet[SM_SLOWMACHINE] = 0;
172  piSysMet[SM_SECURE] = 0;
174  piSysMet[SM_SHOWSOUNDS] = gspv.bShowSounds;
175  piSysMet[SM_MIDEASTENABLED] = 0;
176  piSysMet[SM_CMONITORS] = 1;
177  piSysMet[SM_SAMEDISPLAYFORMAT] = 1;
178  piSysMet[SM_IMMENABLED] = NLS_MB_CODE_PAGE_TAG;
179 
180  /* Reserved */
181  piSysMet[SM_RESERVED1] = 0;
182  piSysMet[SM_RESERVED2] = 0;
183  piSysMet[SM_RESERVED3] = 0;
184  piSysMet[SM_RESERVED4] = 0;
185  piSysMet[64] = 0;
186  piSysMet[65] = 0;
187  piSysMet[66] = 0;
188 #if (_WIN32_WINNT >= 0x0600)
189  piSysMet[90] = 0;
190 #endif
191 
192  if (UserIsDBCSEnabled())
193  gpsi->dwSRVIFlags |= SRVINFO_DBCSENABLED; /* DBCS Support */
194 
195  if (UserIsIMMEnabled())
196  gpsi->dwSRVIFlags |= SRVINFO_IMM32; /* IME Support */
197 
199  gpsi->dwSRVIFlags |= SRVINFO_CICERO_ENABLED; /* Cicero support */
200 
201  Setup = TRUE;
202 
203  return TRUE;
204 }
BOOL FASTCALL UserIsDBCSEnabled(VOID)
Definition: metric.c:17
#define SM_CXICONSPACING
Definition: winuser.h:995
#define max(a, b)
Definition: svc.c:63
#define SM_CYDOUBLECLK
Definition: winuser.h:994
#define SM_CYHSCROLL
Definition: winuser.h:956
#define SM_SHOWSOUNDS
Definition: winuser.h:1024
#define SM_CYSIZE
Definition: winuser.h:986
#define SM_XVIRTUALSCREEN
Definition: winuser.h:1030
#define SM_CYMENUSIZE
Definition: winuser.h:1012
LONG tmExternalLeading
Definition: wingdi.h:2387
#define SM_CMONITORS
Definition: winuser.h:1034
#define SM_CYMINTRACK
Definition: winuser.h:992
BOOLEAN NLS_MB_CODE_PAGE_TAG
#define SM_MOUSEPRESENT
Definition: winuser.h:974
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1032
#define TRUE
Definition: types.h:120
#define SM_CXMINIMIZED
Definition: winuser.h:1014
BOOL bMouseBtnSwap
Definition: sysparams.h:82
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
Definition: font.h:124
GDIINFO gdiinfo
Definition: pdevobj.h:123
#define SM_MIDEASTENABLED
Definition: winuser.h:1028
LONG tmAveCharWidth
Definition: wingdi.h:2388
#define SM_SLOWMACHINE
Definition: winuser.h:1027
#define INT
Definition: polytest.cpp:20
#define SM_CYVSCROLL
Definition: winuser.h:975
PSERVERINFO gpsi
Definition: imm.c:18
NONCLIENTMETRICSW ncm
Definition: sysparams.h:51
#define SM_CXMENUCHECK
Definition: winuser.h:1025
#define SM_CYCURSOR
Definition: winuser.h:969
BOOL FASTCALL UserIsCiceroEnabled(VOID)
Definition: metric.c:32
#define SM_CMOUSEBUTTONS
Definition: winuser.h:1000
#define SM_CXEDGE
Definition: winuser.h:1002
#define SM_CYSMICON
Definition: winuser.h:1007
#define SM_NETWORK
Definition: winuser.h:1020
_In_ HFONT _Out_ PUINT Height
Definition: font.h:124
#define SM_CYMAXTRACK
Definition: winuser.h:1017
#define SM_CYFRAME
Definition: winuser.h:990
#define SM_CXFRAME
Definition: winuser.h:988
if(dx==0 &&dy==0)
Definition: linetemp.h:174
int32_t INT
Definition: typedefs.h:58
#define SM_CXMINSPACING
Definition: winuser.h:1004
#define SM_CXSCREEN
Definition: winuser.h:953
#define L(x)
Definition: ntvdm.h:50
#define SM_CYMENUCHECK
Definition: winuser.h:1026
DWORD dwSRVIFlags
Definition: ntuser.h:1046
#define SM_CYMAXIMIZED
Definition: winuser.h:1019
#define SM_CYDLGFRAME
Definition: winuser.h:962
#define SM_CXICON
Definition: winuser.h:966
#define SM_RESERVED2
Definition: winuser.h:980
ULONG ulHorzRes
Definition: winddi.h:882
#define SM_CXHTHUMB
Definition: winuser.h:965
#define SM_CYEDGE
Definition: winuser.h:1003
#define SM_CXDRAG
Definition: winuser.h:1022
#define SM_SECURE
Definition: winuser.h:1001
#define SM_CYVTHUMB
Definition: winuser.h:964
#define SM_PENWINDOWS
Definition: winuser.h:998
#define SM_CYMIN
Definition: winuser.h:984
TEXTMETRICW tmCaptionFont
Definition: sysparams.h:139
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1033
#define SM_RESERVED4
Definition: winuser.h:982
#define SM_CLEANBOOT
Definition: winuser.h:1021
#define SM_CYSMSIZE
Definition: winuser.h:1010
#define SM_CYSCREEN
Definition: winuser.h:954
#define TRACE(s)
Definition: solgame.cpp:4
#define SM_CYCAPTION
Definition: winuser.h:957
#define SM_CXHSCROLL
Definition: winuser.h:976
#define SM_CXCURSOR
Definition: winuser.h:968
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define SM_CXMAXIMIZED
Definition: winuser.h:1018
#define SM_CXDLGFRAME
Definition: winuser.h:960
#define SM_CXMINTRACK
Definition: winuser.h:991
BOOL NTAPI RegReadDWORD(HKEY hkey, PWSTR pwszValue, PDWORD pdwData)
Definition: registry.c:150
#define SM_CXSMSIZE
Definition: winuser.h:1009
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:1006
#define SM_CYBORDER
Definition: winuser.h:959
#define SM_CYICON
Definition: winuser.h:967
#define SM_CYMINIMIZED
Definition: winuser.h:1015
#define SM_CYICONSPACING
Definition: winuser.h:996
BOOL bMenuDropAlign
Definition: sysparams.h:130
#define SM_CXBORDER
Definition: winuser.h:958
#define SM_MENUDROPALIGNMENT
Definition: winuser.h:997
BOOL FASTCALL UserIsIMMEnabled(VOID)
Definition: metric.c:22
#define SM_YVIRTUALSCREEN
Definition: winuser.h:1031
#define SM_CYMINSPACING
Definition: winuser.h:1005
#define SM_RESERVED3
Definition: winuser.h:981
#define SM_ARRANGE
Definition: winuser.h:1013
#define SM_DEBUG
Definition: winuser.h:977
INT iDblClickHeight
Definition: sysparams.h:89
ICONMETRICSW im
Definition: sysparams.h:53
FxAutoRegKey hKey
PPDEVOBJ ppdevGlobal
Definition: mdevobj.h:16
#define SM_SAMEDISPLAYFORMAT
Definition: winuser.h:1035
PMDEVOBJ gpmdev
Definition: mdevobj.c:14
#define SM_CXVSCROLL
Definition: winuser.h:955
TEXTMETRICW tmMenuFont
Definition: sysparams.h:138
#define SRVINFO_DBCSENABLED
Definition: ntuser.h:943
#define SM_SWAPBUTTON
Definition: winuser.h:978
#define SM_CXMAXTRACK
Definition: winuser.h:1016
#define SM_CYFULLSCREEN
Definition: winuser.h:972
#define SM_CXSIZE
Definition: winuser.h:985
#define SRVINFO_IMM32
Definition: ntuser.h:944
unsigned int ULONG
Definition: retypes.h:1
INT iDblClickWidth
Definition: sysparams.h:88
#define SM_CYKANJIWINDOW
Definition: winuser.h:973
#define SM_CXFULLSCREEN
Definition: winuser.h:971
#define SM_CYMENU
Definition: winuser.h:970
#define SM_CYDRAG
Definition: winuser.h:1023
static BOOL Setup
Definition: metric.c:13
LONG tmHeight
Definition: wingdi.h:2383
ULONG ulVertRes
Definition: winddi.h:883
#define SM_DBCSENABLED
Definition: winuser.h:999
#define RegOpenKey
Definition: winreg.h:519
#define SM_MOUSEWHEELPRESENT
Definition: winuser.h:1029
#define SM_RESERVED1
Definition: winuser.h:979
#define SM_CYSMCAPTION
Definition: winuser.h:1008
#define SM_CXDOUBLECLK
Definition: winuser.h:993
#define SRVINFO_CICERO_ENABLED
Definition: ntuser.h:946
MINIMIZEDMETRICS mm
Definition: sysparams.h:52
#define SM_CXMIN
Definition: winuser.h:983
#define SM_CXMENUSIZE
Definition: winuser.h:1011

Referenced by co_IntInitializeDesktopGraphics(), SpiUpdatePerUserSystemParameters(), UserChangeDisplaySettings(), UserRefreshDisplay(), 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 457 of file main.c.

458 {
460  PCLIENTINFO pci;
461  PTHREADINFO ptiCurrent;
462  int i;
464  PTEB pTeb;
465  PRTL_USER_PROCESS_PARAMETERS ProcessParams;
466  PKL pDefKL;
467 
468  Process = Thread->ThreadsProcess;
469 
470  pTeb = NtCurrentTeb();
471  ASSERT(pTeb);
472 
473  ProcessParams = pTeb->ProcessEnvironmentBlock->ProcessParameters;
474 
475  /* Allocate a new Win32 thread info */
476  Status = AllocW32Thread(Thread, &ptiCurrent);
477  if (!NT_SUCCESS(Status))
478  {
479  ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
481  return Status;
482  }
483 
484  /* Initialize the THREADINFO */
485  ptiCurrent->pEThread = Thread;
486  ptiCurrent->ppi = PsGetProcessWin32Process(Process);
487  IntReferenceProcessInfo(ptiCurrent->ppi);
488  pTeb->Win32ThreadInfo = ptiCurrent;
489  ptiCurrent->pClientInfo = (PCLIENTINFO)pTeb->Win32ClientInfo;
490  ptiCurrent->pcti = &ptiCurrent->cti;
491 
492  /* Mark the process as having threads */
493  ptiCurrent->ppi->W32PF_flags |= W32PF_THREADCONNECTED;
494 
495  InitializeListHead(&ptiCurrent->WindowListHead);
499  InitializeListHead(&ptiCurrent->PtiLink);
500  for (i = 0; i < NB_HOOKS; i++)
501  {
502  InitializeListHead(&ptiCurrent->aphkStart[i]);
503  }
504  ptiCurrent->ptiSibling = ptiCurrent->ppi->ptiList;
505  ptiCurrent->ppi->ptiList = ptiCurrent;
506  ptiCurrent->ppi->cThreads++;
507 
508  ptiCurrent->hEventQueueClient = NULL;
509  Status = ZwCreateEvent(&ptiCurrent->hEventQueueClient, EVENT_ALL_ACCESS,
511  if (!NT_SUCCESS(Status))
512  {
513  ERR_CH(UserThread, "Event creation failed, Status 0x%08x.\n", Status);
514  goto error;
515  }
518  (PVOID*)&ptiCurrent->pEventQueueServer, NULL);
519  if (!NT_SUCCESS(Status))
520  {
521  ERR_CH(UserThread, "Failed referencing the event object, Status 0x%08x.\n", Status);
523  ptiCurrent->hEventQueueClient = NULL;
524  goto error;
525  }
526 
527  ptiCurrent->pcti->timeLastRead = EngGetTickCount32();
528 
529  ptiCurrent->MessageQueue = MsqCreateMessageQueue(ptiCurrent);
530  if (ptiCurrent->MessageQueue == NULL)
531  {
532  ERR_CH(UserThread, "Failed to allocate message loop\n");
534  goto error;
535  }
536 
537  pDefKL = W32kGetDefaultKeyLayout();
538  UserAssignmentLock((PVOID*)&(ptiCurrent->KeyboardLayout), pDefKL);
539 
540  ptiCurrent->TIF_flags &= ~TIF_INCLEANUP;
541 
542  // FIXME: Flag SYSTEM threads with... TIF_SYSTEMTHREAD !!
543 
544  /* CSRSS threads have some special features */
545  if (Process == gpepCSRSS || !gpepCSRSS)
547 
548  /* Initialize the CLIENTINFO */
549  pci = (PCLIENTINFO)pTeb->Win32ClientInfo;
550  RtlZeroMemory(pci, sizeof(*pci));
551  pci->ppi = ptiCurrent->ppi;
552  pci->fsHooks = ptiCurrent->fsHooks;
553  pci->dwTIFlags = ptiCurrent->TIF_flags;
554  if (pDefKL)
555  {
556  pci->hKL = pDefKL->hkl;
557  pci->CodePage = pDefKL->CodePage;
558  }
559 
560  /* Need to pass the user Startup Information to the current process. */
561  if ( ProcessParams )
562  {
563  if ( ptiCurrent->ppi->usi.cb == 0 ) // Not initialized yet.
564  {
565  if ( ProcessParams->WindowFlags != 0 ) // Need window flags set.
566  {
567  ptiCurrent->ppi->usi.cb = sizeof(USERSTARTUPINFO);
568  ptiCurrent->ppi->usi.dwX = ProcessParams->StartingX;
569  ptiCurrent->ppi->usi.dwY = ProcessParams->StartingY;
570  ptiCurrent->ppi->usi.dwXSize = ProcessParams->CountX;
571  ptiCurrent->ppi->usi.dwYSize = ProcessParams->CountY;
572  ptiCurrent->ppi->usi.dwFlags = ProcessParams->WindowFlags;
573  ptiCurrent->ppi->usi.wShowWindow = (WORD)ProcessParams->ShowWindowFlags;
574  }
575  }
576  }
577 
578  /*
579  * Assign a default window station and desktop to the process.
580  * Do not try to open a desktop or window station before the very first
581  * (interactive) window station has been created by Winlogon.
582  */
583  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)) &&
584  ptiCurrent->ppi->hdeskStartup == NULL &&
586  {
587  HWINSTA hWinSta = NULL;
588  HDESK hDesk = NULL;
589  UNICODE_STRING DesktopPath;
590  PDESKTOP pdesk;
591 
592  /*
593  * Inherit the thread desktop and process window station (if not yet inherited)
594  * from the process startup info structure. See documentation of CreateProcess().
595  */
597  if (ProcessParams && ProcessParams->DesktopInfo.Length > 0)
598  {
599  Status = IntSafeCopyUnicodeStringTerminateNULL(&DesktopPath, &ProcessParams->DesktopInfo);
600  }
601  if (!NT_SUCCESS(Status))
602  {
603  RtlInitUnicodeString(&DesktopPath, NULL);
604  }
605 
607  &DesktopPath,
608  !!(ProcessParams->WindowFlags & STARTF_INHERITDESKTOP),
609  &hWinSta,
610  &hDesk);
611 
612  if (DesktopPath.Buffer)
613  ExFreePoolWithTag(DesktopPath.Buffer, TAG_STRING);
614 
615  if (!NT_SUCCESS(Status))
616  {
617  ERR_CH(UserThread, "Failed to assign default desktop and winsta to process\n");
618  goto error;
619  }
620 
621  if (!UserSetProcessWindowStation(hWinSta))
622  {
624  ERR_CH(UserThread, "Failed to set initial process winsta\n");
625  goto error;
626  }
627 
628  /* Validate the new desktop */
629  Status = IntValidateDesktopHandle(hDesk, UserMode, 0, &pdesk);
630  if (!NT_SUCCESS(Status))
631  {
632  ERR_CH(UserThread, "Failed to validate initial desktop handle\n");
633  goto error;
634  }
635 
636  /* Store the parsed desktop as the initial desktop */
637  ASSERT(ptiCurrent->ppi->hdeskStartup == NULL);
638  ASSERT(Process->UniqueProcessId != gpidLogon);
639  ptiCurrent->ppi->hdeskStartup = hDesk;
640  ptiCurrent->ppi->rpdeskStartup = pdesk;
641  }
642 
643  if (ptiCurrent->ppi->hdeskStartup != NULL)
644  {
645  if (!IntSetThreadDesktop(ptiCurrent->ppi->hdeskStartup, FALSE))
646  {
647  ERR_CH(UserThread, "Failed to set thread desktop\n");
649  goto error;
650  }
651  }
652 
653  /* Mark the thread as fully initialized */
654  ptiCurrent->TIF_flags |= TIF_GUITHREADINITIALIZED;
655 
656  if (!(ptiCurrent->ppi->W32PF_flags & (W32PF_ALLOWFOREGROUNDACTIVATE | W32PF_APPSTARTING)) &&
657  (gptiForeground && gptiForeground->ppi == ptiCurrent->ppi ))
658  {
659  ptiCurrent->TIF_flags |= TIF_ALLOWFOREGROUNDACTIVATE;
660  }
661  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
662 
663  /* Create the default input context */
664  if (IS_IMM_MODE())
665  {
667  }
668 
669  /* Last things to do only if we are not a SYSTEM or CSRSS thread */
670  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)))
671  {
672  /* Callback to User32 Client Thread Setup */
673  TRACE_CH(UserThread, "Call co_IntClientThreadSetup...\n");
675  if (!NT_SUCCESS(Status))
676  {
677  ERR_CH(UserThread, "ClientThreadSetup failed with Status 0x%08lx\n", Status);
678  goto error;
679  }
680  TRACE_CH(UserThread, "co_IntClientThreadSetup succeeded!\n");
681  }
682  else
683  {
684  TRACE_CH(UserThread, "co_IntClientThreadSetup cannot be called...\n");
685  }
686 
687  TRACE_CH(UserThread, "UserCreateW32Thread pti 0x%p\n", ptiCurrent);
688  return STATUS_SUCCESS;
689 
690 error:
691  ERR_CH(UserThread, "InitThreadCallback failed! Freeing pti 0x%p for TID:0x%lx\n",
692  ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
694  return Status;
695 }
ULONG fsHooks
Definition: ntuser.h:323
USERSTARTUPINFO usi
Definition: win32.h:278
ULONG Win32ClientInfo[31]
Definition: compat.h:847
PPEB ProcessEnvironmentBlock
Definition: ntddk_ex.h:337
#define error(str)
Definition: mkdosfs.c:1605
PVOID FASTCALL UserAssignmentLock(PVOID *ppvObj, PVOID pvNew)
Definition: object.c:840
PVOID Win32ThreadInfo
Definition: compat.h:846
LIST_ENTRY WindowListHead
Definition: win32.h:155
PTHREADINFO ptiSibling
Definition: win32.h:116
#define IS_IMM_MODE()
Definition: ntuser.h:1232
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:268
#define EngGetTickCount32()
Definition: eng.h:43
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
FLONG TIF_flags
Definition: win32.h:95
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:126
PRTL_USER_PROCESS_PARAMETERS ProcessParameters
Definition: btrfs_drv.h:1913
UNICODE_STRING DesktopInfo
Definition: rtltypes.h:1555
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:264
POBJECT_TYPE ExEventObjectType
Definition: event.c:18
PPROCESSINFO ppi
Definition: win32.h:88
PTHREADINFO gptiForeground
Definition: focus.c:15
#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:494
HDESK hdeskStartup
Definition: win32.h:263
NTSTATUS FASTCALL IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, PUNICODE_STRING Source)
Definition: misc.c:679
#define FALSE
Definition: types.h:117
#define TIF_CSRSSTHREAD
Definition: ntuser.h:265
#define TAG_STRING
Definition: oslist.h:22
LIST_ENTRY SentMessagesListHead
Definition: win32.h:100
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
NTSTATUS AllocW32Thread(IN PETHREAD Thread, OUT PTHREADINFO *W32Thread)
Definition: main.c:373
#define STARTF_INHERITDESKTOP
Definition: undocuser.h:164
#define IntReferenceProcessInfo(ppi)
Definition: win32.h:181
Definition: input.h:26
LIST_ENTRY W32CallbackListHead
Definition: win32.h:156
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:286
struct _CLIENTTHREADINFO * pcti
Definition: win32.h:91
#define TIF_ALLOWFOREGROUNDACTIVATE
Definition: ntuser.h:267
INT cThreads
Definition: win32.h:262
Status
Definition: gdiplustypes.h:24
ULONG fsHooks
Definition: win32.h:117
#define ASSERT(a)
Definition: mode.c:44
USHORT CodePage
Definition: input.h:36
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO pti)
Definition: msgqueue.c:2440
CLIENT_ID Cid
Definition: pstypes.h:1128
struct _DESKTOP * rpdeskStartup
Definition: win32.h:258
PKEVENT pEventQueueServer
Definition: win32.h:125
HKL hkl
Definition: input.h:32
unsigned short WORD
Definition: ntddk_ex.h:93
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2652
struct _CLIENTINFO * pClientInfo
Definition: win32.h:94
HKL hKL
Definition: ntuser.h:334
HANDLE UniqueThread
Definition: compat.h:826
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3379
struct _CLIENTINFO * PCLIENTINFO
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1382
#define NB_HOOKS
Definition: ntuser.h:127
LIST_ENTRY aphkStart[NB_HOOKS]
FIXME!
Definition: win32.h:143
#define VOID
Definition: acefi.h:82
CLIENTTHREADINFO cti
Definition: win32.h:144
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:703
struct tagKL * KeyboardLayout
Definition: win32.h:90
HANDLE hEventQueueClient
Definition: win32.h:123
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:89
Definition: compat.h:835
USHORT CodePage
Definition: ntuser.h:335
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
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
LIST_ENTRY PostedMessagesListHead
Definition: win32.h:137
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
Definition: desktop.c:3260
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
struct tagUSERSTARTUPINFO USERSTARTUPINFO
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
PKL W32kGetDefaultKeyLayout(VOID)
Definition: kbdlayout.c:514
NTSTATUS FASTCALL IntResolveDesktop(IN PEPROCESS Process, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta, OUT HDESK *phDesktop)
Definition: desktop.c:551
NTSTATUS FASTCALL IntValidateDesktopHandle(HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
Definition: desktop.c:1237
#define NULL
Definition: types.h:112
NTSTATUS APIENTRY co_IntClientThreadSetup(VOID)
Definition: callback.c:959
#define W32PF_APPSTARTING
Definition: win32.h:10
#define ERR_CH(ch, fmt,...)
Definition: debug.h:105
WORD wShowWindow
Definition: win32.h:219
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
PTHREADINFO ptiList
Definition: win32.h:256
#define STATUS_SUCCESS
Definition: shellext.h:65
struct _PROCESSINFO * ppi
Definition: ntuser.h:341
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
DWORD dwTIFlags
Definition: ntuser.h:319
PIMC FASTCALL UserCreateInputContext(ULONG_PTR dwClientImcData)
Definition: ime.c:1565
#define TIF_INCLEANUP
Definition: ntuser.h:262
#define W32PF_THREADCONNECTED
Definition: win32.h:18
HANDLE gpidLogon
Definition: simplecall.c:15

Referenced by Win32kThreadCallback().

◆ IntClearWindowState()

VOID FASTCALL IntClearWindowState ( PWND  ,
UINT   
)

Definition at line 612 of file misc.c.

613 {
614  UINT bit;
615  if (gptiCurrent->ppi != pWnd->head.pti->ppi) return;
616  bit = 1 << LOWORD(Flag);
617  TRACE("CWS %x\n",bit);
618  switch(HIWORD(Flag))
619  {
620  case 0:
621  pWnd->state &= ~bit;
622  break;
623  case 1:
624  pWnd->state2 &= ~bit;
625  break;
626  case 2:
627  pWnd->ExStyle2 &= ~bit;
628  break;
629  }
630 }
PPROCESSINFO ppi
Definition: win32.h:88
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:247
#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
PVOID pvBuffer
Definition: dde.c:32
#define TRUE
Definition: types.h:120
#define USERTAG_DDE
Definition: tags.h:223
#define USERTAG_DDE1
Definition: tags.h:211
#define USERTAG_DDE5
Definition: tags.h:214
LPARAM lParam
Definition: dde.c:30
unsigned int BOOL
Definition: ntddk_ex.h:94
#define WM_DDE_TERMINATE
Definition: dde.h:38
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:134
#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:110
Definition: ntuser.h:688
Definition: dde.c:28
#define NULL
Definition: types.h:112
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:1255
#define WM_DDE_UNADVISE
Definition: dde.h:40
PVOID pvBuffer
Definition: dde.c:32
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
#define TRUE
Definition: types.h:120
#define USERTAG_DDE
Definition: tags.h:223
Definition: dde.h:71
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:214
PPROCESSINFO ppi
Definition: win32.h:88
LPARAM lParam
Definition: dde.c:30
#define FALSE
Definition: types.h:117
#define WM_DDE_TERMINATE
Definition: dde.h:38
#define WM_DDE_DATA
Definition: dde.h:42
#define CF_BITMAP
Definition: constants.h:397
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:134
BYTE Value[1]
Definition: dde.h:75
Definition: dde.h:56
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
#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
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
#define ERR(fmt,...)
Definition: debug.h:110
Definition: ntuser.h:688
Definition: dde.c:28
#define NULL
Definition: types.h:112
#define WM_DDE_INITIATE
Definition: dde.h:37
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
int cbSize
Definition: dde.c:31
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define WM_DDE_EXECUTE
Definition: dde.h:45
struct @1595 Msg[]
LPARAM lParam
Definition: combotst.c:139
#define NT_ASSERT
Definition: rtlfuncs.h:3310
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
#define USERTAG_DDE1
Definition: tags.h:211
WPARAM wParam
Definition: combotst.c:138
PPROCESSINFO ppi
Definition: win32.h:88
#define FALSE
Definition: types.h:117
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:134
#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:110
Definition: ntuser.h:688
#define NULL
Definition: types.h:112
#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
struct @1595 Msg[]

Referenced by co_IntSendMessageTimeoutSingle().

◆ IntGetWindowContextHelpId()

DWORD FASTCALL IntGetWindowContextHelpId ( PWND  pWnd)

Definition at line 441 of file window.c.

442 {
443  DWORD HelpId;
444 
445  do
446  {
448  if (!HelpId) break;
449  pWnd = IntGetParent(pWnd);
450  }
451  while (pWnd && pWnd->fnid != FNID_DESKTOP);
452  return HelpId;
453 }
#define TRUE
Definition: types.h:120
PSERVERINFO gpsi
Definition: imm.c:18
ATOM atomContextHelpIdProp
Definition: ntuser.h:1062
#define DWORD
Definition: nt_native.h:44
DWORD fnid
Definition: ntuser.h:704
#define FNID_DESKTOP
Definition: ntuser.h:857
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:65
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:216

Referenced by IntDefWindowProc().

◆ IntGetWindowObject()

PWND FASTCALL IntGetWindowObject ( HWND  hWnd)

Definition at line 73 of file window.c.

74 {
75  PWND Window;
76 
77  if (!hWnd) return NULL;
78 
80  if (Window)
81  Window->head.cLockObj++;
82 
83  return Window;
84 }
HWND hWnd
Definition: settings.c:17
Definition: window.c:28
int Window
Definition: x11stubs.h:26
Definition: ntuser.h:688
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:134
#define NULL
Definition: types.h:112

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

◆ IntSetWindowState()

VOID FASTCALL IntSetWindowState ( PWND  ,
UINT   
)

Definition at line 591 of file misc.c.

592 {
593  UINT bit;
594  if (gptiCurrent->ppi != pWnd->head.pti->ppi) return;
595  bit = 1 << LOWORD(Flag);
596  TRACE("SWS %x\n",bit);
597  switch(HIWORD(Flag))
598  {
599  case 0:
600  pWnd->state |= bit;
601  break;
602  case 1:
603  pWnd->state2 |= bit;
604  break;
605  case 2:
606  pWnd->ExStyle2 |= bit;
607  break;
608  }
609 }
PPROCESSINFO ppi
Definition: win32.h:88
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:247
#define LOWORD(l)
Definition: pedump.c:82

Referenced by NtUserCallHwndParam().

◆ IntTID2PTI()

PTHREADINFO FASTCALL IntTID2PTI ( HANDLE  )

Definition at line 42 of file misc.c.

43 {
46  PTHREADINFO pti;
48  if (!NT_SUCCESS(Status))
49  {
50  return NULL;
51  }
53  {
55  return NULL;
56  }
58  if (!pti)
59  {
61  return NULL;
62  }
63  // Validate and verify!
64  _SEH2_TRY
65  {
66  if (pti->TIF_flags & TIF_INCLEANUP) pti = NULL;
67  if (pti && !(pti->TIF_flags & TIF_GUITHREADINITIALIZED)) pti = NULL;
68  if (PsGetThreadId(Thread) != id) pti = NULL;
69  }
71  {
72  pti = NULL;
73  }
74  _SEH2_END
76  return pti;
77 }
_SEH2_TRY
Definition: create.c:4226
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:95
LONG NTSTATUS
Definition: precomp.h:26
_SEH2_END
Definition: create.c:4400
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:286
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
#define ObDereferenceObject
Definition: obfuncs.h:203
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2652
HANDLE NTAPI PsGetThreadId(IN PETHREAD Thread)
Definition: thread.c:705
#define NULL
Definition: types.h:112
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:40
BOOLEAN NTAPI PsIsThreadTerminating(IN PETHREAD Thread)
Definition: thread.c:868
#define TIF_INCLEANUP
Definition: ntuser.h:262

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

◆ NC_DoNCPaint()

LRESULT NC_DoNCPaint ( PWND  ,
HDC  ,
INT   
)

Definition at line 1075 of file nonclient.c.

1076 {
1077  DWORD Style, ExStyle;
1078  PWND Parent;
1079  RECT WindowRect, CurrentRect, TempRect;
1080  BOOL Active = FALSE;
1081 
1082  if (!IntIsWindowVisible(pWnd) ||
1083  (pWnd->state & WNDS_NONCPAINT && !(pWnd->state & WNDS_FORCEMENUDRAW)) ||
1084  IntEqualRect(&pWnd->rcWindow, &pWnd->rcClient) )
1085  return 0;
1086 
1087  Style = pWnd->style;
1088 
1089  TRACE("DefWndNCPaint: pWnd %p, hDc %p, Active %s.\n", pWnd, hDC, Flags & DC_ACTIVE ? "TRUE" : "FALSE");
1090 
1091  Parent = IntGetParent(pWnd);
1092  ExStyle = pWnd->ExStyle;
1093 
1094  if (Flags == -1) // NC paint mode.
1095  {
1096  if (ExStyle & WS_EX_MDICHILD)
1097  {
1099 
1100  if (Active)
1102  }
1103  else
1104  {
1105  Active = (gpqForeground == pWnd->head.pti->MessageQueue);
1106  }
1107  Flags = DC_NC; // Redraw everything!
1108  }
1109  else
1110  Flags |= DC_NC;
1111 
1112 
1113  IntGetWindowRect(pWnd, &WindowRect);
1114 
1115  CurrentRect.top = CurrentRect.left = 0;
1116  CurrentRect.right = WindowRect.right - WindowRect.left;
1117  CurrentRect.bottom = WindowRect.bottom - WindowRect.top;
1118 
1119  /* Draw outer edge */
1120  if (UserHasWindowEdge(pWnd->style, pWnd->ExStyle))
1121  {
1122  DrawEdge(hDC, &CurrentRect, EDGE_RAISED, BF_RECT | BF_ADJUST);
1123  }
1124  else if (pWnd->ExStyle & WS_EX_STATICEDGE)
1125  {
1126 #if 0
1127  DrawEdge(hDC, &CurrentRect, BDR_SUNKENINNER, BF_RECT | BF_ADJUST | BF_FLAT);
1128 #else
1130  NtGdiPatBlt(hDC, CurrentRect.left, CurrentRect.top, CurrentRect.right - CurrentRect.left, 1, PATCOPY);
1131  NtGdiPatBlt(hDC, CurrentRect.left, CurrentRect.top, 1, CurrentRect.bottom - CurrentRect.top, PATCOPY);
1132 
1134  NtGdiPatBlt(hDC, CurrentRect.left, CurrentRect.bottom - 1, CurrentRect.right - CurrentRect.left, 1, PATCOPY);
1135  NtGdiPatBlt(hDC, CurrentRect.right - 1, CurrentRect.top, 1, CurrentRect.bottom - CurrentRect.top, PATCOPY);
1136 
1137  RECTL_vInflateRect(&CurrentRect, -1, -1);
1138 #endif
1139  }
1140 
1141  if (Flags & DC_FRAME) NC_DrawFrame(hDC, &CurrentRect, Active ? Active : (Flags & DC_ACTIVE), Style, ExStyle);
1142 
1143  /* Draw caption */
1144  if ((Style & WS_CAPTION) == WS_CAPTION)
1145  {
1146  HPEN PreviousPen;
1147  BOOL Gradient = FALSE;
1148 
1149  if (Flags & DC_REDRAWHUNGWND)
1150  {
1151  Flags &= ~DC_REDRAWHUNGWND;
1152  Flags |= DC_NOSENDMSG;
1153  }
1154 
1155  if (UserSystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, &Gradient, 0) && Gradient)
1156  {
1157  Flags |= DC_GRADIENT;
1158  }
1159 
1160  if (Active)
1161  {
1162  if (pWnd->state & WNDS_ACTIVEFRAME)
1163  Flags |= DC_ACTIVE;
1164  else
1165  {
1166  ERR("Wnd is active and not set active!\n");
1167  }
1168  }
1169 
1170  TempRect = CurrentRect;
1171 
1172  if (ExStyle & WS_EX_TOOLWINDOW)
1173  {
1174  Flags |= DC_SMALLCAP;
1175  TempRect.bottom = TempRect.top + UserGetSystemMetrics(SM_CYSMCAPTION) - 1;
1176  CurrentRect.top += UserGetSystemMetrics(SM_CYSMCAPTION);
1177  }
1178  else
1179  {
1180  TempRect.bottom = TempRect.top + UserGetSystemMetrics(SM_CYCAPTION) - 1;
1181  CurrentRect.top += UserGetSystemMetrics(SM_CYCAPTION);
1182  }
1183 
1184  UserDrawCaption(pWnd, hDC, &TempRect, NULL, NULL, NULL, Flags);
1185 
1186  /* Draw buttons */
1187  if (Style & WS_SYSMENU)
1188  {
1191  {
1194  }
1195  }
1196  if (!(Style & WS_MINIMIZE))
1197  {
1198  /* Line under caption */
1199  PreviousPen = NtGdiSelectPen(hDC, NtGdiGetStockObject(DC_PEN));
1200 
1204 
1205  GreMoveTo(hDC, TempRect.left, TempRect.bottom, NULL);
1206 
1207  NtGdiLineTo(hDC, TempRect.right, TempRect.bottom);
1208 
1209  NtGdiSelectPen(hDC, PreviousPen);
1210  }
1211  }
1212 
1213  if (!(Style & WS_MINIMIZE))
1214  {
1215  /* Draw menu bar */
1216  if (pWnd->state & WNDS_HASMENU && pWnd->IDMenu) // Should be pWnd->spmenu
1217  {
1218  if (!(Flags & DC_NOSENDMSG))
1219  {
1220  PMENU menu;
1221  // Fix crash in test_menu_locked_by_window, should use pWnd->spmenu....
1222  if ((menu = UserGetMenuObject(UlongToHandle(pWnd->IDMenu)))) // FIXME! Use pWnd->spmenu,
1223  {
1224  TempRect = CurrentRect;
1225  TempRect.bottom = TempRect.top + menu->cyMenu; // Should be pWnd->spmenu->cyMenu;
1226  CurrentRect.top += MENU_DrawMenuBar(hDC, &TempRect, pWnd, FALSE);
1227  }
1228  }
1229  }
1230 
1231  if (ExStyle & WS_EX_CLIENTEDGE)
1232  {
1233  DrawEdge(hDC, &CurrentRect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
1234  }
1235 
1236  /* Draw the scrollbars */
1237  if ((Style & WS_VSCROLL) && (Style & WS_HSCROLL) &&
1239  {
1240  RECT ParentClientRect;
1241 
1242  TempRect = CurrentRect;
1243 
1245  TempRect.right = TempRect.left + UserGetSystemMetrics(SM_CXVSCROLL);
1246  else
1247  TempRect.left = TempRect.right - UserGetSystemMetrics(SM_CXVSCROLL);
1248 
1249  TempRect.top = TempRect.bottom - UserGetSystemMetrics(SM_CYHSCROLL);
1250 
1252 
1253  if (Parent)
1254  {
1255  IntGetClientRect(Parent, &ParentClientRect);
1256 
1257  if (HASSIZEGRIP(Style, ExStyle, Parent->style, WindowRect, ParentClientRect))
1258  {
1260  }
1261  }
1262 
1263  IntDrawScrollBar(pWnd, hDC, SB_VERT);
1264  IntDrawScrollBar(pWnd, hDC, SB_HORZ);
1265  }
1266  else
1267  {
1269  {
1270  IntDrawScrollBar(pWnd, hDC, SB_VERT);
1271  }
1272  else if (Style & WS_HSCROLL && IntIsScrollBarVisible(pWnd, OBJID_HSCROLL))
1273  {
1274  IntDrawScrollBar(pWnd, hDC, SB_HORZ);
1275  }
1276  }
1277  }
1278  return 0; // For WM_NCPAINT message, return 0.
1279 }
#define BF_FLAT
Definition: winuser.h:471
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:13
#define SM_CYHSCROLL
Definition: winuser.h:956
void IntDrawScrollBar(PWND, HDC, INT)
Definition: scrollbar.c:1180
#define COLOR_WINDOWFRAME
Definition: winuser.h:913
__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:984
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:768
#define SB_HORZ
Definition: winuser.h:552
__kernel_entry W32KAPI HANDLE APIENTRY NtGdiGetStockObject(_In_ INT iObject)
LONG top
Definition: windef.h:307
HANDLE HWND
Definition: compat.h:19
#define COLOR_BTNHIGHLIGHT
Definition: winuser.h:929
BOOL UserHasWindowEdge(DWORD Style, DWORD ExStyle)
Definition: nonclient.c:36
BOOL WINAPI DrawFrameControl(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT)
LONG left
Definition: windef.h:306
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:2744
LONG right
Definition: windef.h:308
VOID UserDrawCaptionButton(PWND pWnd, LPRECT Rect, DWORD Style, DWORD ExStyle, HDC hDC, BOOL bDown, ULONG Type)
Definition: nonclient.c:786
#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:4
#define BF_RECT
Definition: winuser.h:462
__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:923
#define BDR_SUNKENINNER
Definition: winuser.h:445
#define DC_NC
Definition: winuser.h:440
#define FALSE
Definition: types.h:117
#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:152
ULONG cyMenu
Definition: ntuser.h:418
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
#define WS_MAXIMIZEBOX
Definition: pedump.c:632
#define DC_ACTIVE
Definition: winuser.h:427
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:208
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define WS_CAPTION
Definition: pedump.c:624
#define TRACE(s)
Definition: solgame.cpp:4
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define SM_CYCAPTION
Definition: winuser.h:957
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:149
#define DFCS_CAPTIONCLOSE
Definition: winuser.h:480
VOID NC_DrawFrame(HDC hDC, RECT *CurrentRect, BOOL Active, DWORD Style, DWORD ExStyle)
Definition: nonclient.c:887
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:1811
BOOL FASTCALL IntIsWindowVisible(PWND Wnd)
Definition: window.c:201
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
#define COLOR_BTNFACE
Definition: winuser.h:922
COLORREF FASTCALL IntSetDCPenColor(HDC, COLORREF)
Definition: dcutil.c:259
#define WNDS_ACTIVEFRAME
Definition: ntuser.h:606
BOOL FASTCALL GreMoveTo(HDC hdc, INT x, INT y, LPPOINT pptOut)
Definition: line.c:108
#define PATCOPY
Definition: wingdi.h:335
#define EDGE_RAISED
Definition: winuser.h:450
#define ERR(fmt,...)
Definition: debug.h:110
Definition: ntuser.h:688
static HDC hDC
Definition: 3dtext.c:33
#define DC_NOSENDMSG
Definition: undocuser.h:148
#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:924
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:216
#define NULL
Definition: types.h:112
#define WS_VSCROLL
Definition: pedump.c:627
#define DFCS_CAPTIONMAX
Definition: winuser.h:482
#define WNDS_NONCPAINT
Definition: ntuser.h:608
#define SM_CXVSCROLL
Definition: winuser.h:955
#define DFC_SCROLL
Definition: winuser.h:475
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx 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:732
#define HASSIZEGRIP(Style, ExStyle, ParentStyle, WindowRect, ParentClientRect)
Definition: nonclient.c:34
LONG bottom
Definition: windef.h:309
#define WNDS_FORCEMENUDRAW
Definition: ntuser.h:615
_In_ ULONG _In_ BOOLEAN Active
Definition: potypes.h:560
#define EDGE_SUNKEN
Definition: winuser.h:451
BOOL FASTCALL IntIsChildWindow(PWND Parent, PWND BaseWindow)
Definition: window.c:925
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2090
#define WNDS_HASMENU
Definition: ntuser.h:600
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
#define WS_SYSMENU
Definition: pedump.c:629
#define SM_CYSMCAPTION
Definition: winuser.h:1008
#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:2197
BOOL FASTCALL IntGetWindowRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:120

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

◆ NC_DrawFrame()

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

Definition at line 887 of file nonclient.c.

888 {
889  /* Firstly the "thick" frame */
890  if ((Style & WS_THICKFRAME) && !(Style & WS_MINIMIZE))
891  {
892  LONG Width =
895 
896  LONG Height =
899 
901 
902  /* Draw frame */
903  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, CurrentRect->right - CurrentRect->left, Height, PATCOPY);
904  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
905  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->bottom - 1, CurrentRect->right - CurrentRect->left, -Height, PATCOPY);
906  NtGdiPatBlt(hDC, CurrentRect->right - 1, CurrentRect->top, -Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
907 
908  RECTL_vInflateRect(CurrentRect, -Width, -Height);
909  }
910 
911  /* Now the other bit of the frame */
913  {
916 
922 
923  /* Draw frame */
924  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, CurrentRect->right - CurrentRect->left, Height, PATCOPY);
925  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
926  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->bottom - 1, CurrentRect->right - CurrentRect->left, -Height, PATCOPY);
927  NtGdiPatBlt(hDC, CurrentRect->right - 1, CurrentRect->top, -Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
928 
929  RECTL_vInflateRect(CurrentRect, -Width, -Height);
930  }
931 }
#define WS_THICKFRAME
Definition: pedump.c:630
#define COLOR_WINDOWFRAME
Definition: winuser.h:913
__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:984
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
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
Definition: font.h:124
LONG top
Definition: windef.h:307
#define COLOR_INACTIVEBORDER
Definition: winuser.h:918
#define WS_DLGFRAME
Definition: pedump.c:626
_In_ HFONT _Out_ PUINT Height
Definition: font.h:124
LONG left
Definition: windef.h:306
#define SM_CYFRAME
Definition: winuser.h:990
#define SM_CXFRAME
Definition: winuser.h:988
LONG right
Definition: windef.h:308
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiSelectBrush(_In_ HDC hdc, _In_ HBRUSH hbrush)
#define COLOR_3DFACE
Definition: winuser.h:923
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
#define SM_CYDLGFRAME
Definition: winuser.h:962
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:208
const DWORD Style
Definition: appswitch.c:71
#define SM_CXDLGFRAME
Definition: winuser.h:960
#define COLOR_ACTIVEBORDER
Definition: winuser.h:917
#define SM_CYBORDER
Definition: winuser.h:959
#define SM_CXBORDER
Definition: winuser.h:958
#define PATCOPY
Definition: wingdi.h:335
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:309
_In_ ULONG _In_ BOOLEAN Active
Definition: potypes.h:560
#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:699
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
LONG top
Definition: windef.h:307
#define SM_CXEDGE
Definition: winuser.h:1002
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:306
#define SM_CYFRAME
Definition: winuser.h:990
#define SM_CXFRAME
Definition: winuser.h:988
LONG right
Definition: windef.h:308
& rect
Definition: startmenu.cpp:1413
#define WS_EX_MDICHILD
Definition: winuser.h:394
#define SM_CYDLGFRAME
Definition: winuser.h:962
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
#define SM_CYEDGE
Definition: winuser.h:1003
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:208
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:960
#define SM_CYBORDER
Definition: winuser.h:959
#define UserHasThinFrameStyle(Style, ExStyle)
Definition: nonclient.c:22
#define SM_CXBORDER
Definition: winuser.h:958
RECT rcWindow
Definition: ntuser.h:711
#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:309
#define WS_EX_STATICEDGE
Definition: winuser.h:403
const DWORD ExStyle
Definition: appswitch.c:72
DWORD style
Definition: ntuser.h:701

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:307
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:306
#define WS_MINIMIZE
Definition: pedump.c:622
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:208
#define SM_CYCAPTION
Definition: winuser.h:957
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:216
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 1416 of file nonclient.c.

1417 {
1418  INT Flags;
1419  /* Lotus Notes draws menu descriptions in the caption of its main
1420  * window. When it wants to restore original "system" view, it just
1421  * sends WM_NCACTIVATE message to itself. Any optimizations here in
1422  * attempt to minimize redrawings lead to a not restored caption.
1423  */
1424  if (wParam & DC_ACTIVE)
1425  {
1428  }
1429  else
1430  {
1431  Wnd->state &= ~WNDS_ACTIVEFRAME;
1432  wParam = DC_CAPTION;
1433  }
1434 
1435  if ((Wnd->state & WNDS_NONCPAINT) || !(Wnd->style & WS_VISIBLE))
1436  return TRUE;
1437 
1438  /* This isn't documented but is reproducible in at least XP SP2 and
1439  * Outlook 2007 depends on it
1440  */
1441  // MSDN:
1442  // If this parameter is set to -1, DefWindowProc does not repaint the
1443  // nonclient area to reflect the state change.
1444  if ( lParam != -1 &&
1445  ( Flags = NC_DoNCActive(Wnd)) != 0 )
1446  {
1447  HDC hDC;
1448  HRGN hRgnTemp = NULL, hRgn = (HRGN)lParam;
1449 
1450  if (GreIsHandleValid(hRgn))
1451  {
1452  hRgnTemp = NtGdiCreateRectRgn(0, 0, 0, 0);
1453  if (NtGdiCombineRgn(hRgnTemp, hRgn, 0, RGN_COPY) == ERROR)
1454  {
1455  GreDeleteObject(hRgnTemp);
1456  hRgnTemp = NULL;
1457  }
1458  }
1459 
1460  if ((hDC = UserGetDCEx(Wnd, hRgnTemp, DCX_WINDOW|DCX_USESTYLE)))
1461  {
1462  NC_DoNCPaint(Wnd, hDC, wParam | Flags); // Redraw MENUs.
1463  UserReleaseDC(Wnd, hDC, FALSE);
1464  }
1465  else
1466  GreDeleteObject(hRgnTemp);
1467  }
1468 
1469  return TRUE;
1470 }
__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:1158
BOOL NTAPI GreIsHandleValid(HGDIOBJ hobj)
Definition: gdiobj.c:1146
#define TRUE
Definition: types.h:120
#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:58
WPARAM wParam
Definition: combotst.c:138
#define DCX_WINDOW
Definition: winuser.h:2103
#define FALSE
Definition: types.h:117
LRESULT NC_DoNCPaint(PWND pWnd, HDC hDC, INT Flags)
Definition: nonclient.c:1075
#define DC_ACTIVE
Definition: winuser.h:427
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define WNDS_ACTIVEFRAME
Definition: ntuser.h:606
__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:357
static HDC hDC
Definition: 3dtext.c:33
DWORD state
Definition: ntuser.h:696
#define NULL
Definition: types.h:112
static INT NC_DoNCActive(PWND Wnd)
Definition: nonclient.c:1398
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:918
#define WNDS_NONCPAINT
Definition: ntuser.h:608
#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:603
DWORD style
Definition: ntuser.h:701

Referenced by IntDefWindowProc().

◆ NC_HandleNCCalcSize()

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

Definition at line 1282 of file nonclient.c.

1283 {
1284  LRESULT Result = 0;
1285  SIZE WindowBorders;
1286  RECT OrigRect;
1287  LONG Style = Wnd->style;
1288  LONG exStyle = Wnd->ExStyle;
1289 
1290  if (Rect == NULL)
1291  {
1292  return Result;
1293  }
1294  OrigRect = *Rect;
1295 
1296  Wnd->state &= ~WNDS_HASCAPTION;
1297 
1298  if (wparam)
1299  {
1300  if (Wnd->pcls->style & CS_VREDRAW)
1301  {
1302  Result |= WVR_VREDRAW;
1303  }
1304  if (Wnd->pcls->style & CS_HREDRAW)
1305  {
1306  Result |= WVR_HREDRAW;
1307  }
1309  }
1310 
1311  if (!(Wnd->style & WS_MINIMIZE))
1312  {
1313  if (UserHasWindowEdge(Wnd->style, Wnd->ExStyle))
1314  {
1315  UserGetWindowBorders(Wnd->style, Wnd->ExStyle, &WindowBorders, FALSE);
1316  RECTL_vInflateRect(Rect, -WindowBorders.cx, -WindowBorders.cy);
1317  }
1318  else if ((Wnd->ExStyle & WS_EX_STATICEDGE) || (Wnd->style & WS_BORDER))
1319  {
1320  RECTL_vInflateRect(Rect, -1, -1);
1321  }
1322 
1323  if ((Wnd->style & WS_CAPTION) == WS_CAPTION)
1324  {
1325  Wnd->state |= WNDS_HASCAPTION;
1326 
1327  if (Wnd->ExStyle & WS_EX_TOOLWINDOW)
1329  else
1331  }
1332 
1333  if (HAS_MENU(Wnd, Style))
1334  {
1335  HDC hDC = UserGetDCEx(Wnd, 0, DCX_USESTYLE | DCX_WINDOW);
1336 
1337  Wnd->state |= WNDS_HASMENU;
1338 
1339  if (hDC)
1340  {
1341  RECT CliRect = *Rect;
1342  CliRect.bottom -= OrigRect.top;
1343  CliRect.right -= OrigRect.left;
1344  CliRect.left -= OrigRect.left;
1345  CliRect.top -= OrigRect.top;
1346  if (!Suspended) Rect->top += MENU_DrawMenuBar(hDC, &CliRect, Wnd, TRUE);
1347  UserReleaseDC(Wnd, hDC, FALSE);
1348  }
1349  }
1350 
1351  if (Wnd->ExStyle & WS_EX_CLIENTEDGE)
1352  {
1354  }
1355 
1356  if (Style & WS_VSCROLL)
1357  {
1358  if (Rect->right - Rect->left >= UserGetSystemMetrics(SM_CXVSCROLL))
1359  {
1360  Wnd->state |= WNDS_HASVERTICALSCROOLLBAR;
1361 
1362  /* rectangle is in screen coords when wparam is false */
1363  if (!wparam && (exStyle & WS_EX_LAYOUTRTL)) exStyle ^= WS_EX_LEFTSCROLLBAR;
1364 
1365  if((exStyle & WS_EX_LEFTSCROLLBAR) != 0)
1367  else
1369  }
1370  }
1371 
1372  if (Style & WS_HSCROLL)
1373  {
1374  if( Rect->bottom - Rect->top > UserGetSystemMetrics(SM_CYHSCROLL))
1375  {
1376  Wnd->state |= WNDS_HASHORIZONTALSCROLLBAR;
1377 
1379  }
1380  }
1381 
1382  if (Rect->top > Rect->bottom)
1383  Rect->bottom = Rect->top;
1384 
1385  if (Rect->left > Rect->right)
1386  Rect->right = Rect->left;
1387  }
1388  else
1389  {
1390  Rect->right = Rect->left;
1391  Rect->bottom = Rect->top;
1392  }
1393 
1394  return Result;
1395 }
#define SM_CYHSCROLL
Definition: winuser.h:956
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
#define TRUE
Definition: types.h:120
#define WNDS_HASHORIZONTALSCROLLBAR
Definition: ntuser.h:602
static HDC
Definition: imagelist.c:92
LONG top
Definition: windef.h:307
#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:306
UINT MENU_DrawMenuBar(HDC hDC, LPRECT lprect, PWND pWnd, BOOL suppress_draw)
Definition: menu.c:2744
LONG right
Definition: windef.h:308
#define WS_EX_LEFTSCROLLBAR
Definition: winuser.h:392
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
#define DCX_WINDOW
Definition: winuser.h:2103
#define WNDS_HASVERTICALSCROOLLBAR
Definition: ntuser.h:601
#define FALSE
Definition: types.h:117
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
_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:334
VOID UserGetWindowBorders(DWORD Style, DWORD ExStyle, SIZE *Size, BOOL WithClient)
Definition: nonclient.c:53
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:208
#define WS_CAPTION
Definition: pedump.c:624
#define CS_VREDRAW
Definition: winuser.h:653
#define SM_CYCAPTION
Definition: winuser.h:957
const DWORD Style
Definition: appswitch.c:71
#define WVR_VALIDRECTS
Definition: winuser.h:2512
#define WS_HSCROLL
Definition: pedump.c:628
#define SM_CYBORDER
Definition: winuser.h:959
#define SM_CXBORDER
Definition: winuser.h:958
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:2509
#define NULL
Definition: types.h:112
#define WS_VSCROLL
Definition: pedump.c:627
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:918
#define WVR_VREDRAW
Definition: winuser.h:2510
#define SM_CXVSCROLL
Definition: winuser.h:955
LONG bottom
Definition: windef.h:309
#define WNDS_HASMENU
Definition: ntuser.h:600
LONG_PTR LRESULT
Definition: windef.h:209
#define SM_CYSMCAPTION
Definition: winuser.h:1008
LONG cy
Definition: windef.h:335
#define WS_EX_STATICEDGE
Definition: winuser.h:403
#define WNDS_HASCAPTION
Definition: ntuser.h:603
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 1645 of file nonclient.c.

1646 {
1647  ULONG Style;
1648 
1649  Style = pWnd->style;
1650  switch(wParam)
1651  {
1652  case HTCAPTION:
1653  {
1654  /* Maximize/Restore the window */
1655  if((Style & WS_CAPTION) == WS_CAPTION && (Style & WS_MAXIMIZEBOX))
1656  {
1658  }
1659  break;
1660  }
1661  case HTSYSMENU:
1662  {
1663  PMENU SysMenu = IntGetSystemMenu(pWnd, FALSE);
1665 
1666  /* If the close item of the sysmenu is disabled or not present do nothing */
1667  if ((state & (MF_DISABLED | MF_GRAYED)) || (state == 0xFFFFFFFF))
1668  break;
1669 
1671  break;
1672  }
1673  case HTTOP:
1674  case HTBOTTOM:
1675  {
1676  RECT sizingRect = pWnd->rcWindow, mouseRect;
1677 
1678  if (pWnd->ExStyle & WS_EX_MDICHILD)
1679  break;
1680 
1681  UserSystemParametersInfo(SPI_GETWORKAREA, 0, &mouseRect, 0);
1682 
1683  co_WinPosSetWindowPos(pWnd,
1684  NULL,
1685  sizingRect.left,
1686  mouseRect.top,
1687  sizingRect.right - sizingRect.left,
1688  mouseRect.bottom - mouseRect.top,
1689  0);
1690  break;
1691  }
1692  default:
1693  return NC_HandleNCLButtonDown(pWnd, wParam, lParam);
1694  }
1695  return(0);
1696 }
#define HTTOP
Definition: winuser.h:2480
#define MF_DISABLED
Definition: winuser.h:130
#define MF_BYCOMMAND
Definition: winuser.h:202
#define SC_RESTORE
Definition: winuser.h:2588
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1748
LONG left
Definition: windef.h:306
LONG right
Definition: windef.h:308
WPARAM wParam
Definition: combotst.c:138
#define WS_EX_MDICHILD
Definition: winuser.h:394
#define HTSYSMENU
Definition: winuser.h:2467
#define FALSE
Definition: types.h:117
#define WS_MINIMIZE
Definition: pedump.c:622
#define SC_MAXIMIZE
Definition: winuser.h:2578
#define WS_MAXIMIZEBOX
Definition: pedump.c:632
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define WS_CAPTION
Definition: pedump.c:624
const DWORD Style
Definition: appswitch.c:71
PMENU FASTCALL IntGetSystemMenu(PWND Window, BOOL bRevert)
Definition: menu.c:5383
#define HTBOTTOM
Definition: winuser.h:2483
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
static int state
Definition: maze.c:121
#define HTCAPTION
Definition: winuser.h:2466
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
#define SC_CLOSE
Definition: winuser.h:2582
unsigned int ULONG
Definition: retypes.h:1
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2090
#define MF_GRAYED
Definition: winuser.h:129
LRESULT NC_HandleNCLButtonDown(PWND pWnd, WPARAM wParam, LPARAM lParam)
Definition: nonclient.c:1553
#define WM_SYSCOMMAND
Definition: winuser.h:1731
LPARAM lParam
Definition: combotst.c:139
UINT FASTCALL IntGetMenuState(HMENU hMenu, UINT uId, UINT uFlags)
Definition: menu.c:4975
#define WS_MAXIMIZE
Definition: pedump.c:623

Referenced by IntDefWindowProc().

◆ NC_HandleNCLButtonDown()

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

Definition at line 1553 of file nonclient.c.

1554 {
1555  switch (wParam)
1556  {
1557  case HTCAPTION:
1558  {
1559  PWND TopWnd = pWnd, parent;
1560  while(1)
1561  {
1562  if ((TopWnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD)
1563  break;
1564  parent = UserGetAncestor( TopWnd, GA_PARENT );
1565  if (!parent || UserIsDesktopWindow(parent)) break;
1566  TopWnd = parent;