ReactOS  0.4.15-dev-5126-g3bb451b
userfuncs.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

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

Functions

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

1435 {
1436  PTHRDESKHEAD ObjHead;
1437 
1438  ASSERT(Size > sizeof(*ObjHead));
1439  ASSERT(pti != NULL);
1440 
1441  if (!pDesk)
1442  pDesk = pti->rpdesk;
1443 
1444  ObjHead = DesktopHeapAlloc(pDesk, Size);
1445  if (!ObjHead)
1446  return NULL;
1447 
1448  RtlZeroMemory(ObjHead, Size);
1449 
1450  ObjHead->pSelf = ObjHead;
1451  ObjHead->rpdesk = pDesk;
1452  ObjHead->pti = pti;
1454  *HandleOwner = pti;
1455  pti->ppi->UserHandleCount++;
1456 
1457  return ObjHead;
1458 }
PVOID pSelf
Definition: ntuser.h:187
struct _DESKTOP * rpdesk
Definition: ntuser.h:186
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
struct _DESKTOP * rpdesk
Definition: win32.h:88
PPROCESSINFO ppi
Definition: win32.h:84
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
Definition: desktop.h:204
#define IntReferenceThreadInfo(pti)
Definition: win32.h:162
#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 2841 of file window.c.

2842 {
2843  HWND hWnd;
2844  PWND pwndTemp;
2845  PTHREADINFO ti;
2846  MSG msg;
2847  PWND Window = Object;
2848 
2849  ASSERT_REFS_CO(Window); // FIXME: Temp HACK?
2850 
2851  hWnd = Window->head.h;
2853 
2854  TRACE("co_UserDestroyWindow(Window = 0x%p, hWnd = 0x%p)\n", Window, hWnd);
2855 
2856  /* Check for owner thread */
2857  if (Window->head.pti != ti)
2858  {
2859  /* Check if we are destroying the desktop window */
2860  if (! ((Window->head.rpdesk->dwDTFlags & DF_DESTROYED) && Window == Window->head.rpdesk->pDeskInfo->spwnd))
2861  {
2863  return FALSE;
2864  }
2865  }
2866 
2867  /* If window was created successfully and it is hooked */
2868  if ((Window->state2 & WNDS2_WMCREATEMSGPROCESSED))
2869  {
2871  {
2872  ERR("Destroy Window WH_CBT Call Hook return!\n");
2873  return FALSE;
2874  }
2875  }
2876 
2877  if (Window->pcls->atomClassName != gpsi->atomSysClass[ICLS_IME])
2878  {
2879  if ((Window->style & (WS_POPUP|WS_CHILD)) != WS_CHILD)
2880  {
2881  if (Window->spwndOwner)
2882  {
2883  //ERR("DestroyWindow Owner out.\n");
2884  UserAttachThreadInput(Window->head.pti, Window->spwndOwner->head.pti, FALSE);
2885  }
2886  }
2887  }
2888 
2889  /* Inform the parent */
2890  if (Window->style & WS_CHILD)
2891  {
2893  }
2894 
2895  if (!Window->spwndOwner && !IntGetParent(Window))
2896  {
2898  }
2899 
2900  /* Hide the window */
2901  if (Window->style & WS_VISIBLE)
2902  {
2903  if (Window->style & WS_CHILD)
2904  {
2905  /* Only child windows receive WM_SHOWWINDOW in DestroyWindow() */
2907  }
2908  else
2909  {
2911  }
2912  }
2913 
2914  /* Adjust last active */
2915  if ((pwndTemp = Window->spwndOwner))
2916  {
2917  while (pwndTemp->spwndOwner)
2918  pwndTemp = pwndTemp->spwndOwner;
2919 
2920  if (pwndTemp->spwndLastActive == Window)
2921  pwndTemp->spwndLastActive = Window->spwndOwner;
2922  }
2923 
2924  if (Window->spwndParent && IntIsWindow(UserHMGetHandle(Window)))
2925  {
2926  if ((Window->style & (WS_POPUP | WS_CHILD)) == WS_CHILD)
2927  {
2929  {
2930  //ERR("DestroyWindow Parent out.\n");
2931  UserAttachThreadInput(Window->head.pti, Window->spwndParent->head.pti, FALSE);
2932  }
2933  }
2934  }
2935 
2936  if (Window->head.pti->MessageQueue->spwndActive == Window)
2937  Window->head.pti->MessageQueue->spwndActive = NULL;
2938  if (Window->head.pti->MessageQueue->spwndFocus == Window)
2939  Window->head.pti->MessageQueue->spwndFocus = NULL;
2940  if (Window->head.pti->MessageQueue->spwndActivePrev == Window)
2941  Window->head.pti->MessageQueue->spwndActivePrev = NULL;
2942  if (Window->head.pti->MessageQueue->spwndCapture == Window)
2943  Window->head.pti->MessageQueue->spwndCapture = NULL;
2944 
2945  /*
2946  * Check if this window is the Shell's Desktop Window. If so set hShellWindow to NULL
2947  */
2948 
2949  if ((ti != NULL) && (ti->pDeskInfo != NULL))
2950  {
2951  if (ti->pDeskInfo->hShellWindow == hWnd)
2952  {
2953  ERR("Destroying the ShellWindow!\n");
2954  ti->pDeskInfo->hShellWindow = NULL;
2955  }
2956  }
2957 
2959 
2961  {
2962  return TRUE;
2963  }
2964 
2965  /* Recursively destroy owned windows */
2966  if (!(Window->style & WS_CHILD))
2967  {
2969  }
2970 
2971  /* Generate mouse move message for the next window */
2972  msg.message = WM_MOUSEMOVE;
2973  msg.wParam = UserGetMouseButtonsState();
2974  msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
2975  msg.pt = gpsi->ptCursor;
2977 
2978  IntNotifyWinEvent(EVENT_OBJECT_DESTROY, Window, OBJID_WINDOW, CHILDID_SELF, 0);
2979 
2980  /* Send destroy messages */
2982 
2983  // Destroy the default IME window if necessary
2984  if (IS_IMM_MODE() && !(ti->TIF_flags & TIF_INCLEANUP) &&
2985  ti->spwndDefaultIme && !IS_WND_IMELIKE(Window) && !(Window->state & WNDS_DESTROYED))
2986  {
2987  if (IS_WND_CHILD(Window))
2988  {
2991  }
2992  else
2993  {
2996  }
2997  }
2998 
3000  {
3001  return TRUE;
3002  }
3003 
3004  /* Destroy the window storage */
3006 
3007  return TRUE;
3008 }
#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:569
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:1204
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
FLONG TIF_flags
Definition: win32.h:91
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:1721
PSERVERINFO gpsi
Definition: imm.c:17
#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:694
struct _WND * spwndDefaultIme
Definition: win32.h:127
#define WH_CBT
Definition: winuser.h:35
BOOL FASTCALL IntImeCanDestroyDefIME(PWND pImeWnd, PWND pwndTarget)
Definition: ime.c:2068
#define WM_DESTROY
Definition: winuser.h:1599
BOOL FASTCALL IntImeCanDestroyDefIMEforChild(PWND pImeWnd, PWND pwndTarget)
Definition: ime.c:2023
BOOLEAN FASTCALL co_WinPosShowWindow(PWND Wnd, INT Cmd)
Definition: winpos.c:2491
BOOLEAN co_UserDestroyWindow(PVOID Object)
Definition: window.c:2841
#define UserHMGetHandle(obj)
Definition: ntuser.h:222
#define TRACE(s)
Definition: solgame.cpp:4
static void IntSendDestroyMsg(HWND hWnd)
Definition: window.c:456
#define SWP_NOACTIVATE
Definition: winuser.h:1232
#define WNDS2_WMCREATEMSGPROCESSED
Definition: ntuser.h:653
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:180
BOOL FASTCALL IntIsTopLevelWindow(PWND pWnd)
Definition: window.c:354
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1103
#define ICLS_IME
Definition: ntuser.h:906
_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:672
VOID FASTCALL IntDestroyOwnedWindows(PWND Window)
Definition: window.c:2798
struct _WND * spwndLastActive
Definition: ntuser.h:718
#define DF_DESTROYED
Definition: desktop.h:50
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:208
#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:89
#define WS_VISIBLE
Definition: pedump.c:620
#define WNDS_DESTROYED
Definition: ntuser.h:619
static void IntSendParentNotify(PWND pWindow, UINT msg)
Definition: window.c:1678
#define TIF_INCLEANUP
Definition: ntuser.h:254
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:28
ATOM atomSysClass[ICLS_NOTUSED+1]
Definition: ntuser.h:1031

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 1309 of file focus.c.

1310 {
1311  HWND hWndPrev = 0;
1312  PWND pwndTop;
1313  PTHREADINFO pti;
1314  PUSER_MESSAGE_QUEUE ThreadQueue;
1315 
1316  if (Window)
1318 
1320  ThreadQueue = pti->MessageQueue;
1321  ASSERT(ThreadQueue != 0);
1322 
1323  TRACE("Enter SetFocus hWnd 0x%p pti 0x%p\n",Window ? UserHMGetHandle(Window) : 0, pti );
1324 
1325  hWndPrev = ThreadQueue->spwndFocus ? UserHMGetHandle(ThreadQueue->spwndFocus) : 0;
1326 
1327  if (Window != 0)
1328  {
1329  if (hWndPrev == UserHMGetHandle(Window))
1330  {
1331  return hWndPrev ? (IntIsWindow(hWndPrev) ? hWndPrev : 0) : 0; /* Nothing to do */
1332  }
1333 
1334  if (Window->head.pti->MessageQueue != ThreadQueue)
1335  {
1336  ERR("SetFocus Must have the same Q!\n");
1337  return 0;
1338  }
1339 
1340  /* Check if we can set the focus to this window */
1342  for (pwndTop = Window; pwndTop; pwndTop = pwndTop->spwndParent)
1343  {
1344  if (pwndTop->style & (WS_MINIMIZED|WS_DISABLED)) return 0;
1345  if ((pwndTop->style & (WS_POPUP|WS_CHILD)) != WS_CHILD) break;
1346  if (pwndTop->spwndParent == NULL) break;
1347  }
1349  if (co_HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM)Window->head.h, (LPARAM)hWndPrev))
1350  {
1351  ERR("SetFocus 1 WH_CBT Call Hook return!\n");
1352  return 0;
1353  }
1354 
1355  /* Activate pwndTop if needed. */
1356  if (pwndTop != ThreadQueue->spwndActive)
1357  {
1358  PUSER_MESSAGE_QUEUE ForegroundQueue = IntGetFocusMessageQueue(); // Keep it based on desktop.
1359  if (ThreadQueue != ForegroundQueue && IsAllowedFGActive(pti, pwndTop)) // Rule 2 & 3.
1360  {
1361  //ERR("SetFocus: Set Foreground!\n");
1362  if (!(pwndTop->style & WS_VISIBLE))
1363  {
1364  pti->ppi->W32PF_flags |= W32PF_ALLOWFOREGROUNDACTIVATE;
1365  }
1367  {
1368  ERR("SetFocus: Set Foreground and Focus Failed!\n");
1369  return 0;
1370  }
1371  }
1372 
1373  /* Set Active when it is needed. */
1374  if (pwndTop != ThreadQueue->spwndActive)
1375  {
1376  //ERR("SetFocus: Set Active! %p\n",pwndTop?UserHMGetHandle(pwndTop):0);
1377  if (!co_IntSetActiveWindow(pwndTop, FALSE, FALSE, FALSE))
1378  {
1379  ERR("SetFocus: Set Active Failed!\n");
1380  return 0;
1381  }
1382  }
1383 
1384  /* Abort if window destroyed */
1385  if (Window->state2 & WNDS2_INDESTROY) return 0;
1386  /* Do not change focus if the window is no longer active */
1387  if (pwndTop != ThreadQueue->spwndActive)
1388  {
1389  ERR("SetFocus: Top window did not go active!\n");
1390  return 0;
1391  }
1392  }
1393 
1394  // Check again! SetActiveWindow could have set the focus via WM_ACTIVATE.
1395  hWndPrev = ThreadQueue->spwndFocus ? UserHMGetHandle(ThreadQueue->spwndFocus) : 0;
1396 
1398 
1399  TRACE("Focus: %p -> %p\n", hWndPrev, Window->head.h);
1400  }
1401  else /* NULL hwnd passed in */
1402  {
1403  if (co_HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM)0, (LPARAM)hWndPrev))
1404  {
1405  ERR("SetFocus: 2 WH_CBT Call Hook return!\n");
1406  return 0;
1407  }
1408  //ERR("SetFocus: Set Focus NULL\n");
1409  /* set the current thread focus window null */
1410  IntSendFocusMessages( pti, NULL);
1411  }
1412  return hWndPrev ? (IntIsWindow(hWndPrev) ? hWndPrev : 0) : 0;
1413 }
#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:84
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:222
#define TRACE(s)
Definition: solgame.cpp:4
#define ASSERT(a)
Definition: mode.c:44
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:180
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:672
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:85
#define WS_POPUP
Definition: pedump.c:616
#define NULL
Definition: types.h:112
struct _WND * spwndParent
Definition: ntuser.h:692
BOOL FASTCALL IsAllowedFGActive(PTHREADINFO pti, PWND Wnd)
Definition: focus.c:730
#define WS_VISIBLE
Definition: pedump.c:620
#define WNDS2_INDESTROY
Definition: ntuser.h:631
DWORD style
Definition: ntuser.h:685

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

◆ DefSetText()

BOOL APIENTRY DefSetText ( PWND  Wnd,
PCWSTR  WindowText 
)

Definition at line 4374 of file window.c.

4375 {
4377  BOOL Ret = FALSE;
4378 
4379  RtlInitUnicodeString(&UnicodeString, WindowText);
4380 
4381  if (UnicodeString.Length != 0)
4382  {
4383  if (Wnd->strName.MaximumLength > 0 &&
4384  UnicodeString.Length <= Wnd->strName.MaximumLength - sizeof(UNICODE_NULL))
4385  {
4386  ASSERT(Wnd->strName.Buffer != NULL);
4387 
4388  Wnd->strName.Length = UnicodeString.Length;
4389  Wnd->strName.Buffer[UnicodeString.Length / sizeof(WCHAR)] = L'\0';
4391  UnicodeString.Buffer,
4392  UnicodeString.Length);
4393  }
4394  else
4395  {
4396  PWCHAR buf;
4397  Wnd->strName.MaximumLength = Wnd->strName.Length = 0;
4398  buf = Wnd->strName.Buffer;
4399  Wnd->strName.Buffer = NULL;
4400  if (buf != NULL)
4401  {
4402  DesktopHeapFree(Wnd->head.rpdesk, buf);
4403  }
4404 
4406  UnicodeString.Length + sizeof(UNICODE_NULL));
4407  if (Wnd->strName.Buffer != NULL)
4408  {
4409  Wnd->strName.Buffer[UnicodeString.Length / sizeof(WCHAR)] = L'\0';
4411  UnicodeString.Buffer,
4412  UnicodeString.Length);
4413  Wnd->strName.MaximumLength = UnicodeString.Length + sizeof(UNICODE_NULL);
4414  Wnd->strName.Length = UnicodeString.Length;
4415  }
4416  else
4417  {
4419  goto Exit;
4420  }
4421  }
4422  }
4423  else
4424  {
4425  Wnd->strName.Length = 0;
4426  if (Wnd->strName.Buffer != NULL)
4427  Wnd->strName.Buffer[0] = L'\0';
4428  }
4429 
4430  // FIXME: HAX! Windows does not do this in here!
4431  // In User32, these are called after: NotifyWinEvent EVENT_OBJECT_NAMECHANGE than
4432  // RepaintButton, StaticRepaint, NtUserCallHwndLock HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK, etc.
4433  /* Send shell notifications */
4434  if (!Wnd->spwndOwner && !IntGetParent(Wnd))
4435  {
4436  co_IntShellHookNotify(HSHELL_REDRAW, (WPARAM) UserHMGetHandle(Wnd), FALSE); // FIXME Flashing?
4437  }
4438 
4439  Ret = TRUE;
4440 Exit:
4442  return Ret;
4443 }
struct _DESKTOP * rpdesk
Definition: ntuser.h:186
#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:694
THRDESKHEAD head
Definition: ntuser.h:674
LARGE_UNICODE_STRING strName
Definition: ntuser.h:715
#define UserHMGetHandle(obj)
Definition: ntuser.h:222
#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:208
#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:17
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) || !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  0,
442  snapRect.left,
443  snapRect.top,
444  snapRect.right - snapRect.left,
445  snapRect.bottom - snapRect.top,
446  0);
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) RECTL_vOffsetRect( &newRect, dx, dy );
515  if (ON_LEFT_BORDER(hittest)) newRect.left += dx;
516  else if (ON_RIGHT_BORDER(hittest)) newRect.right += dx;
517  if (ON_TOP_BORDER(hittest)) newRect.top += dy;
518  else if (ON_BOTTOM_BORDER(hittest)) newRect.bottom += dy;
519  capturePoint = pt;
520 
521  //
522  // Save the new position to the unmodified rectangle. This allows explorer task bar
523  // sizing. Explorer will forces back the position unless a certain amount of sizing
524  // has occurred.
525  //
526  unmodRect = newRect;
527 
528  /* determine the hit location */
529  if (syscommand == SC_SIZE)
530  {
531  WPARAM wpSizingHit = 0;
532 
533  if (hittest >= HTLEFT && hittest <= HTBOTTOMRIGHT)
534  wpSizingHit = WMSZ_LEFT + (hittest - HTLEFT);
535  co_IntSendMessage( UserHMGetHandle(pwnd), WM_SIZING, wpSizingHit, (LPARAM)&newRect );
536  }
537  else
538  co_IntSendMessage( UserHMGetHandle(pwnd), WM_MOVING, 0, (LPARAM)&newRect );
539 
540  if (!iconic)
541  {
542  if (!DragFullWindows)
543  UserDrawMovingFrame( hdc, &newRect, thickframe );
544  else
545  { // Moving the whole window now!
546  HRGN hrgnNew;
547  HRGN hrgnOrig = GreCreateRectRgnIndirect(&pwnd->rcWindow);
548 
549  if (pwnd->hrgnClip != NULL)
550  NtGdiCombineRgn(hrgnOrig, hrgnOrig, pwnd->hrgnClip, RGN_AND);
551 
553  //IntMapWindowPoints( 0, pWndParent, (POINT *)&rect, 2 );
554  co_WinPosSetWindowPos( pwnd,
555  0,
556  newRect.left,
557  newRect.top,
558  newRect.right - newRect.left,
559  newRect.bottom - newRect.top,
560  ( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 );
561 
562  hrgnNew = GreCreateRectRgnIndirect(&pwnd->rcWindow);
563  if (pwnd->hrgnClip != NULL)
564  NtGdiCombineRgn(hrgnNew, hrgnNew, pwnd->hrgnClip, RGN_AND);
565 
566  if (hrgnNew)
567  {
568  if (hrgnOrig)
569  NtGdiCombineRgn(hrgnOrig, hrgnOrig, hrgnNew, RGN_DIFF);
570  }
571  else
572  {
573  if (hrgnOrig)
574  {
575  GreDeleteObject(hrgnOrig);
576  hrgnOrig = 0;
577  }
578  }
579 
580  // Update all the windows after the move or size, including this window.
581  UpdateThreadWindows(UserGetDesktopWindow()->spwndChild, pti, hrgnOrig);
582 
583  if (hrgnOrig) GreDeleteObject(hrgnOrig);
584  if (hrgnNew) GreDeleteObject(hrgnNew);
585  }
586  }
587  sizingRect = newRect;
588  }
589  }
590  }
591 
592  pwnd->head.pti->TIF_flags &= ~TIF_MOVESIZETRACKING;
593 
595 
596  if ( iconic )
597  {
598  if ( moved ) /* restore cursors, show icon title later on */
599  {
601  OldCursor = UserSetCursor(OldCursor, FALSE);
602  }
603 
604  /* It could be that the cursor was already changed while we were proceeding,
605  * so we must unreference whatever cursor was current at the time we restored the old one.
606  * Maybe it is DragCursor, but maybe it is another one and DragCursor got already freed.
607  */
608  if (OldCursor) UserDereferenceObject(OldCursor);
609  }
610  else if ( moved && !DragFullWindows )
611  UserDrawMovingFrame( hdc, &sizingRect, thickframe );
612 
614 
616  //if (pWndParent) IntMapWindowPoints( 0, pWndParent, (POINT *)&sizingRect, 2 );
617 
619  {
620  ERR("DoSizeMove : WH_CBT Call Hook return!\n");
621  moved = FALSE;
622  }
623 
624  IntNotifyWinEvent( EVENT_SYSTEM_MOVESIZEEND, pwnd, OBJID_WINDOW, CHILDID_SELF, 0);
625 
627 
632  /* window moved or resized */
633  if (moved)
634  {
635  /* if the moving/resizing isn't canceled call SetWindowPos
636  * with the new position or the new size of the window
637  */
638  if (!((msg.message == WM_KEYDOWN) && (msg.wParam == VK_ESCAPE)) )
639  {
640  /* NOTE: SWP_NOACTIVATE prevents document window activation in Word 6 */
641  if (!DragFullWindows || iconic )
642  {
643  co_WinPosSetWindowPos( pwnd,
644  0,
645  sizingRect.left,
646  sizingRect.top,
647  sizingRect.right - sizingRect.left,
648  sizingRect.bottom - sizingRect.top,
649  ( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 );
650  }
651  }
652  else
653  { /* restore previous size/position */
654  if ( DragFullWindows )
655  {
656  co_WinPosSetWindowPos( pwnd,
657  0,
658  origRect.left,
659  origRect.top,
660  origRect.right - origRect.left,
661  origRect.bottom - origRect.top,
662  ( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 );
663  }
664  }
665  }
666 
667  if ( IntIsWindow(UserHMGetHandle(pwnd)) )
668  {
669  if ( iconic )
670  {
671  /* Single click brings up the system menu when iconized */
672  if ( !moved )
673  {
674  if( Style & WS_SYSMENU )
676  }
677  }
678  }
679 }
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define HTLEFT
Definition: winuser.h:2477
#define MSQ_STATE_MOVESIZE
Definition: ntuser.h:3675
#define max(a, b)
Definition: svc.c:63
DWORD ExStyle
Definition: ntuser.h:683
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1158
#define TIF_MOVESIZETRACKING
Definition: ntuser.h:269
long y
Definition: polytest.cpp:48
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:1525
#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:1721
static HDC
Definition: imagelist.c:92
#define OBJID_WINDOW
Definition: winable.h:15
LONG top
Definition: windef.h:307
struct _WND::@4900 InternalPos
#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:568
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:674
#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:712
#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:194
UINT FASTCALL co_WinPosGetMinMaxInfo(PWND Window, POINT *MaxSize, POINT *MaxPos, POINT *MinTrack, POINT *MaxTrack)
Definition: winpos.c:932
#define UserHMGetHandle(obj)
Definition: ntuser.h:222
#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:1453
#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
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:180
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:193
#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:695
#define HTBOTTOMRIGHT
Definition: winuser.h:2485
HWND APIENTRY IntGetCapture(VOID)
Definition: focus.c:1435
__kernel_entry W32KAPI INT APIENTRY NtGdiCombineRgn(_In_ HRGN hrgnDst, _In_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ INT iMode)
POINT ptLast
Definition: win32.h:125
#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:672
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
#define SC_SIZE
Definition: winuser.h:2574
#define WM_LBUTTONUP
Definition: winuser.h:1767
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:208
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
unsigned int ULONG
Definition: retypes.h:1
#define UserHasThickFrameStyle(Style, ExStyle)
Definition: nonclient.c:18
LONG bottom
Definition: windef.h:309
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:699
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:685

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:672
PWND FASTCALL IntGetParent(PWND Wnd)
Definition: window.c:208

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:531
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:222
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
_IRQL_requires_same_ _In_ PLSA_STRING _In_ SECURITY_LOGON_TYPE _In_ ULONG _In_ ULONG _In_opt_ PTOKEN_GROUPS _In_ PTOKEN_SOURCE _Out_ PVOID _Out_ PULONG _Inout_ PLUID _Out_ PHANDLE Token
_Out_ PBOOLEAN CopyOnOpen
Definition: psfuncs.h:154
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 33 of file metric.c.

34 {
35  INT *piSysMet = gpsi->aiSysMet;
37 
38  /* Note: used for the SM_CLEANBOOT metric */
39  DWORD dwValue = 0;
40  HKEY hKey = 0;
41 
42  /* Clean boot */
43  piSysMet[SM_CLEANBOOT] = 0; // Fallback value of 0 (normal mode)
44  if(NT_SUCCESS(RegOpenKey(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Option", &hKey)))
45  {
46  if(RegReadDWORD(hKey, L"OptionValue", &dwValue)) piSysMet[SM_CLEANBOOT] = (INT)dwValue;
47  ZwClose(hKey);
48  }
49 
50  /* FIXME: HACK, due to missing MDEV on first init */
51  if (!gpmdev)
52  {
53  Width = 640;
54  Height = 480;
55  }
56  else
57  {
60  }
61 
62  /* Screen sizes */
63  piSysMet[SM_CXSCREEN] = Width;
64  piSysMet[SM_CYSCREEN] = Height;
65  piSysMet[SM_XVIRTUALSCREEN] = 0;
66  piSysMet[SM_YVIRTUALSCREEN] = 0;
67  piSysMet[SM_CXVIRTUALSCREEN] = Width;
68  piSysMet[SM_CYVIRTUALSCREEN] = Height;
69 
70  /* NC area sizes */
71  piSysMet[SM_CYCAPTION] = gspv.ncm.iCaptionHeight + 1; // 19
72  piSysMet[SM_CYSMCAPTION] = gspv.ncm.iSmCaptionHeight + 1; // 15;
73  piSysMet[SM_CXSIZE] = gspv.ncm.iCaptionHeight; // 18;
74  piSysMet[SM_CYSIZE] = gspv.ncm.iCaptionHeight; // 18;
75  piSysMet[SM_CXSMSIZE] = gspv.ncm.iSmCaptionWidth; // 12; XP: piSysMet(SM_CYSMCAPTION) - 1
76  piSysMet[SM_CYSMSIZE] = gspv.ncm.iSmCaptionHeight; // 14;
77  piSysMet[SM_CXBORDER] = 1; // Seems to be hardcoded
78  piSysMet[SM_CYBORDER] = 1; // Seems to be hardcoded
79  piSysMet[SM_CXFOCUSBORDER] = 1;
80  piSysMet[SM_CYFOCUSBORDER] = 1;
81  piSysMet[SM_CXDLGFRAME] = 3;
82  piSysMet[SM_CYDLGFRAME] = 3;
83  piSysMet[SM_CXEDGE] = 2;
84  piSysMet[SM_CYEDGE] = 2;
85  piSysMet[SM_CXFRAME] = piSysMet[SM_CXDLGFRAME] + gspv.ncm.iBorderWidth; // 4
86  piSysMet[SM_CYFRAME] = piSysMet[SM_CYDLGFRAME] + gspv.ncm.iBorderWidth; // 4
87 #if (_WIN32_WINNT >= 0x0600)
88  piSysMet[SM_CXPADDEDBORDER] = 0;
89 #endif
90 
91  /* Window sizes */
92  TRACE("ncm.iCaptionWidth=%d,GetSystemMetrics(SM_CYSIZE)=%d,GetSystemMetrics(SM_CXFRAME)=%d,avcwCaption=%d \n",
93  gspv.ncm.iCaptionWidth, piSysMet[SM_CYSIZE],piSysMet[SM_CXFRAME], gspv.tmCaptionFont.tmAveCharWidth);
94 
95  piSysMet[SM_CXMIN] = 3 * max(gspv.ncm.iCaptionWidth, 8) // 112
96  + piSysMet[SM_CYSIZE] + 4
98  + 2 * piSysMet[SM_CXFRAME];
99  piSysMet[SM_CYMIN] = piSysMet[SM_CYCAPTION] + 2 * piSysMet[SM_CYFRAME]; // 27
100  piSysMet[SM_CXMAXIMIZED] = piSysMet[SM_CXSCREEN] + 2 * piSysMet[SM_CXFRAME];
101  piSysMet[SM_CYMAXIMIZED] = piSysMet[SM_CYSCREEN] - 20;
102  piSysMet[SM_CXFULLSCREEN] = piSysMet[SM_CXSCREEN];
103  piSysMet[SM_CYFULLSCREEN] = piSysMet[SM_CYMAXIMIZED] - piSysMet[SM_CYMIN];
104  piSysMet[SM_CYKANJIWINDOW] = 0;
105  piSysMet[SM_CXMINIMIZED] = gspv.mm.iWidth + 6;
106  piSysMet[SM_CYMINIMIZED] = piSysMet[SM_CYCAPTION] + 5;
107  piSysMet[SM_CXMINSPACING] = piSysMet[SM_CXMINIMIZED] + gspv.mm.iHorzGap;
108  piSysMet[SM_CYMINSPACING] = piSysMet[SM_CYMINIMIZED] + gspv.mm.iVertGap;
109  piSysMet[SM_CXMAXTRACK] = piSysMet[SM_CXVIRTUALSCREEN] + 4
110  + 2 * piSysMet[SM_CXFRAME];
111  piSysMet[SM_CYMAXTRACK] = piSysMet[SM_CYVIRTUALSCREEN] + 4
112  + 2 * piSysMet[SM_CYFRAME];
113 
114  /* Icon */
115  piSysMet[SM_CXVSCROLL] = gspv.ncm.iScrollWidth; // 16;
116  piSysMet[SM_CYVTHUMB] = gspv.ncm.iScrollHeight; // 16;
117  piSysMet[SM_CYHSCROLL] = gspv.ncm.iScrollWidth; // 16;
118  piSysMet[SM_CXHTHUMB] = gspv.ncm.iScrollHeight; // 16;
119  piSysMet[SM_CYVSCROLL] = gspv.ncm.iScrollHeight; // 16
120  piSysMet[SM_CXHSCROLL] = gspv.ncm.iScrollHeight; // 16;
121  piSysMet[SM_CXICON] = 32;
122  piSysMet[SM_CYICON] = 32;
123  piSysMet[SM_CXSMICON] = 16;
124  piSysMet[SM_CYSMICON] = 16;
125  piSysMet[SM_CXICONSPACING] = gspv.im.iHorzSpacing; // 64;
126  piSysMet[SM_CYICONSPACING] = gspv.im.iVertSpacing; // 64;
127  piSysMet[SM_CXCURSOR] = 32;
128  piSysMet[SM_CYCURSOR] = 32;
129  piSysMet[SM_CXMINTRACK] = piSysMet[SM_CXMIN]; // 117
130  piSysMet[SM_CYMINTRACK] = piSysMet[SM_CYMIN]; // 27
131  piSysMet[SM_CXDRAG] = 4;
132  piSysMet[SM_CYDRAG] = 4;
133  piSysMet[SM_ARRANGE] = gspv.mm.iArrange; // 8;
134 
135  /* Menu */
136  piSysMet[SM_CYMENU] = gspv.ncm.iMenuHeight + 1; // 19;
138  piSysMet[SM_CXMENUCHECK] = ((1 + gspv.tmMenuFont.tmHeight +
139  gspv.tmMenuFont.tmExternalLeading) & ~1) - 1; // 13;
140  piSysMet[SM_CYMENUCHECK] = piSysMet[SM_CXMENUCHECK];
141  piSysMet[SM_CXMENUSIZE] = gspv.ncm.iMenuWidth; // 18;
142  piSysMet[SM_CYMENUSIZE] = gspv.ncm.iMenuHeight; // 18;
143 
144  /* Mouse */
145  piSysMet[SM_MOUSEPRESENT] = 1;
146  piSysMet[SM_MOUSEWHEELPRESENT] = 1;
147  piSysMet[SM_CMOUSEBUTTONS] = 2;
148  piSysMet[SM_SWAPBUTTON] = gspv.bMouseBtnSwap ? 1 : 0;
149  piSysMet[SM_CXDOUBLECLK] = gspv.iDblClickWidth;
150  piSysMet[SM_CYDOUBLECLK] = gspv.iDblClickHeight;
151 #if (_WIN32_WINNT >= 0x0600)
152  piSysMet[SM_MOUSEHORIZONTALWHEELPRESENT] = 0;
153 #endif
154 
155  /* Version info */
156  piSysMet[SM_TABLETPC] = 0;
157  piSysMet[SM_MEDIACENTER] = 0;
158  piSysMet[SM_STARTER] = 0;
159  piSysMet[SM_SERVERR2] = 0;
160  piSysMet[SM_PENWINDOWS] = 0;
161 
162  /* Other */
163  piSysMet[SM_DEBUG] = 0;
164  piSysMet[SM_NETWORK] = 3;
165  piSysMet[SM_SLOWMACHINE] = 0;
166  piSysMet[SM_SECURE] = 0;
167  piSysMet[SM_DBCSENABLED] = UserIsDBCSEnabled();
168  piSysMet[SM_SHOWSOUNDS] = gspv.bShowSounds;
169  piSysMet[SM_MIDEASTENABLED] = 0;
170  piSysMet[SM_CMONITORS] = 1;
171  piSysMet[SM_SAMEDISPLAYFORMAT] = 1;
172  piSysMet[SM_IMMENABLED] = 0;
173 
174  /* Reserved */
175  piSysMet[SM_RESERVED1] = 0;
176  piSysMet[SM_RESERVED2] = 0;
177  piSysMet[SM_RESERVED3] = 0;
178  piSysMet[SM_RESERVED4] = 0;
179  piSysMet[64] = 0;
180  piSysMet[65] = 0;
181  piSysMet[66] = 0;
182 #if (_WIN32_WINNT >= 0x0600)
183  piSysMet[90] = 0;
184 #endif
185 
187  Setup = TRUE;
188 
189  return TRUE;
190 }
#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
#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:17
NONCLIENTMETRICSW ncm
Definition: sysparams.h:51
#define SM_CXMENUCHECK
Definition: winuser.h:1025
#define SM_CYCURSOR
Definition: winuser.h:969
#define SM_CMOUSEBUTTONS
Definition: winuser.h:1000
#define SM_CXEDGE
Definition: winuser.h:1002
#define SM_CYSMICON
Definition: winuser.h:1007
BOOL APIENTRY UserIsDBCSEnabled(VOID)
Definition: metric.c:17
#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
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:1022
#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
#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 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
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:930
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 456 of file main.c.

457 {
459  PCLIENTINFO pci;
460  PTHREADINFO ptiCurrent;
461  int i;
463  PTEB pTeb;
464  PRTL_USER_PROCESS_PARAMETERS ProcessParams;
465  PKL pDefKL;
466 
467  Process = Thread->ThreadsProcess;
468 
469  pTeb = NtCurrentTeb();
470  ASSERT(pTeb);
471 
472  ProcessParams = pTeb->ProcessEnvironmentBlock->ProcessParameters;
473 
474  /* Allocate a new Win32 thread info */
475  Status = AllocW32Thread(Thread, &ptiCurrent);
476  if (!NT_SUCCESS(Status))
477  {
478  ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
480  return Status;
481  }
482 
483  /* Initialize the THREADINFO */
484  ptiCurrent->pEThread = Thread;
485  ptiCurrent->ppi = PsGetProcessWin32Process(Process);
486  IntReferenceProcessInfo(ptiCurrent->ppi);
487  pTeb->Win32ThreadInfo = ptiCurrent;
488  ptiCurrent->pClientInfo = (PCLIENTINFO)pTeb->Win32ClientInfo;
489  ptiCurrent->pcti = &ptiCurrent->cti;
490 
491  /* Mark the process as having threads */
492  ptiCurrent->ppi->W32PF_flags |= W32PF_THREADCONNECTED;
493 
494  InitializeListHead(&ptiCurrent->WindowListHead);
498  InitializeListHead(&ptiCurrent->PtiLink);
499  for (i = 0; i < NB_HOOKS; i++)
500  {
501  InitializeListHead(&ptiCurrent->aphkStart[i]);
502  }
503  ptiCurrent->ptiSibling = ptiCurrent->ppi->ptiList;
504  ptiCurrent->ppi->ptiList = ptiCurrent;
505  ptiCurrent->ppi->cThreads++;
506 
507  ptiCurrent->hEventQueueClient = NULL;
508  Status = ZwCreateEvent(&ptiCurrent->hEventQueueClient, EVENT_ALL_ACCESS,
510  if (!NT_SUCCESS(Status))
511  {
512  ERR_CH(UserThread, "Event creation failed, Status 0x%08x.\n", Status);
513  goto error;
514  }
517  (PVOID*)&ptiCurrent->pEventQueueServer, NULL);
518  if (!NT_SUCCESS(Status))
519  {
520  ERR_CH(UserThread, "Failed referencing the event object, Status 0x%08x.\n", Status);
522  ptiCurrent->hEventQueueClient = NULL;
523  goto error;
524  }
525 
526  ptiCurrent->pcti->timeLastRead = EngGetTickCount32();
527 
528  ptiCurrent->MessageQueue = MsqCreateMessageQueue(ptiCurrent);
529  if (ptiCurrent->MessageQueue == NULL)
530  {
531  ERR_CH(UserThread, "Failed to allocate message loop\n");
533  goto error;
534  }
535 
536  pDefKL = W32kGetDefaultKeyLayout();
537  UserAssignmentLock((PVOID*)&(ptiCurrent->KeyboardLayout), pDefKL);
538 
539  ptiCurrent->TIF_flags &= ~TIF_INCLEANUP;
540 
541  // FIXME: Flag SYSTEM threads with... TIF_SYSTEMTHREAD !!
542 
543  /* CSRSS threads have some special features */
544  if (Process == gpepCSRSS || !gpepCSRSS)
546 
547  /* Initialize the CLIENTINFO */
548  pci = (PCLIENTINFO)pTeb->Win32ClientInfo;
549  RtlZeroMemory(pci, sizeof(*pci));
550  pci->ppi = ptiCurrent->ppi;
551  pci->fsHooks = ptiCurrent->fsHooks;
552  pci->dwTIFlags = ptiCurrent->TIF_flags;
553  if (pDefKL)
554  {
555  pci->hKL = pDefKL->hkl;
556  pci->CodePage = pDefKL->CodePage;
557  }
558 
559  /* Need to pass the user Startup Information to the current process. */
560  if ( ProcessParams )
561  {
562  if ( ptiCurrent->ppi->usi.cb == 0 ) // Not initialized yet.
563  {
564  if ( ProcessParams->WindowFlags != 0 ) // Need window flags set.
565  {
566  ptiCurrent->ppi->usi.cb = sizeof(USERSTARTUPINFO);
567  ptiCurrent->ppi->usi.dwX = ProcessParams->StartingX;
568  ptiCurrent->ppi->usi.dwY = ProcessParams->StartingY;
569  ptiCurrent->ppi->usi.dwXSize = ProcessParams->CountX;
570  ptiCurrent->ppi->usi.dwYSize = ProcessParams->CountY;
571  ptiCurrent->ppi->usi.dwFlags = ProcessParams->WindowFlags;
572  ptiCurrent->ppi->usi.wShowWindow = (WORD)ProcessParams->ShowWindowFlags;
573  }
574  }
575  }
576 
577  /*
578  * Assign a default window station and desktop to the process.
579  * Do not try to open a desktop or window station before the very first
580  * (interactive) window station has been created by Winlogon.
581  */
582  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)) &&
583  ptiCurrent->ppi->hdeskStartup == NULL &&
585  {
586  HWINSTA hWinSta = NULL;
587  HDESK hDesk = NULL;
588  UNICODE_STRING DesktopPath;
589  PDESKTOP pdesk;
590 
591  /*
592  * Inherit the thread desktop and process window station (if not yet inherited)
593  * from the process startup info structure. See documentation of CreateProcess().
594  */
596  if (ProcessParams && ProcessParams->DesktopInfo.Length > 0)
597  {
598  Status = IntSafeCopyUnicodeStringTerminateNULL(&DesktopPath, &ProcessParams->DesktopInfo);
599  }
600  if (!NT_SUCCESS(Status))
601  {
602  RtlInitUnicodeString(&DesktopPath, NULL);
603  }
604 
606  &DesktopPath,
607  !!(ProcessParams->WindowFlags & STARTF_INHERITDESKTOP),
608  &hWinSta,
609  &hDesk);
610 
611  if (DesktopPath.Buffer)
612  ExFreePoolWithTag(DesktopPath.Buffer, TAG_STRING);
613 
614  if (!NT_SUCCESS(Status))
615  {
616  ERR_CH(UserThread, "Failed to assign default desktop and winsta to process\n");
617  goto error;
618  }
619 
620  if (!UserSetProcessWindowStation(hWinSta))
621  {
623  ERR_CH(UserThread, "Failed to set initial process winsta\n");
624  goto error;
625  }
626 
627  /* Validate the new desktop */
628  Status = IntValidateDesktopHandle(hDesk, UserMode, 0, &pdesk);
629  if (!NT_SUCCESS(Status))
630  {
631  ERR_CH(UserThread, "Failed to validate initial desktop handle\n");
632  goto error;
633  }
634 
635  /* Store the parsed desktop as the initial desktop */
636  ASSERT(ptiCurrent->ppi->hdeskStartup == NULL);
637  ASSERT(Process->UniqueProcessId != gpidLogon);
638  ptiCurrent->ppi->hdeskStartup = hDesk;
639  ptiCurrent->ppi->rpdeskStartup = pdesk;
640  }
641 
642  if (ptiCurrent->ppi->hdeskStartup != NULL)
643  {
644  if (!IntSetThreadDesktop(ptiCurrent->ppi->hdeskStartup, FALSE))
645  {
646  ERR_CH(UserThread, "Failed to set thread desktop\n");
648  goto error;
649  }
650  }
651 
652  /* Mark the thread as fully initialized */
653  ptiCurrent->TIF_flags |= TIF_GUITHREADINITIALIZED;
654 
655  if (!(ptiCurrent->ppi->W32PF_flags & (W32PF_ALLOWFOREGROUNDACTIVATE | W32PF_APPSTARTING)) &&
656  (gptiForeground && gptiForeground->ppi == ptiCurrent->ppi ))
657  {
658  ptiCurrent->TIF_flags |= TIF_ALLOWFOREGROUNDACTIVATE;
659  }
660  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
661 
662  /* Create the default input context */
663  if (IS_IMM_MODE())
664  {
666  }
667 
668  /* Last things to do only if we are not a SYSTEM or CSRSS thread */
669  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)))
670  {
671  /* Callback to User32 Client Thread Setup */
672  TRACE_CH(UserThread, "Call co_IntClientThreadSetup...\n");
674  if (!NT_SUCCESS(Status))
675  {
676  ERR_CH(UserThread, "ClientThreadSetup failed with Status 0x%08lx\n", Status);
677  goto error;
678  }
679  TRACE_CH(UserThread, "co_IntClientThreadSetup succeeded!\n");
680  }
681  else
682  {
683  TRACE_CH(UserThread, "co_IntClientThreadSetup cannot be called...\n");
684  }
685 
686  TRACE_CH(UserThread, "UserCreateW32Thread pti 0x%p\n", ptiCurrent);
687  return STATUS_SUCCESS;
688 
689 error:
690  ERR_CH(UserThread, "InitThreadCallback failed! Freeing pti 0x%p for TID:0x%lx\n",
691  ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
693  return Status;
694 }
ULONG fsHooks
Definition: ntuser.h:311
USERSTARTUPINFO usi
Definition: win32.h:269
ULONG Win32ClientInfo[31]
Definition: compat.h:706
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:705
LIST_ENTRY WindowListHead
Definition: win32.h:151
PTHREADINFO ptiSibling
Definition: win32.h:112
#define IS_IMM_MODE()
Definition: ntuser.h:1204
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:260
#define EngGetTickCount32()
Definition: eng.h:43
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
FLONG TIF_flags
Definition: win32.h:91
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:122
PRTL_USER_PROCESS_PARAMETERS ProcessParameters
Definition: btrfs_drv.h:1913
UNICODE_STRING DesktopInfo
Definition: rtltypes.h:1555
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:256
POBJECT_TYPE ExEventObjectType
Definition: event.c:18
PPROCESSINFO ppi
Definition: win32.h:84
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:254
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:257
#define TAG_STRING
Definition: oslist.h:22
LIST_ENTRY SentMessagesListHead
Definition: win32.h:96
#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:163
#define IntReferenceProcessInfo(ppi)
Definition: win32.h:177
Definition: input.h:26
LIST_ENTRY W32CallbackListHead
Definition: win32.h:152
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:278
struct _CLIENTTHREADINFO * pcti
Definition: win32.h:87
#define TIF_ALLOWFOREGROUNDACTIVATE
Definition: ntuser.h:259
INT cThreads
Definition: win32.h:253
Status
Definition: gdiplustypes.h:24
ULONG fsHooks
Definition: win32.h:113
#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:249
PKEVENT pEventQueueServer
Definition: win32.h:121
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:90
HKL hKL
Definition: ntuser.h:322
HANDLE UniqueThread
Definition: compat.h:685
#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:139
#define VOID
Definition: acefi.h:82
CLIENTTHREADINFO cti
Definition: win32.h:140
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:702
struct tagKL * KeyboardLayout
Definition: win32.h:86
HANDLE hEventQueueClient
Definition: win32.h:119
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:85
Definition: compat.h:694
USHORT CodePage
Definition: ntuser.h:323
#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:133
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
Definition: desktop.c:3252
#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:214
_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:247
#define STATUS_SUCCESS
Definition: shellext.h:65
struct _PROCESSINFO * ppi
Definition: ntuser.h:329
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
DWORD dwTIFlags
Definition: ntuser.h:307
PIMC FASTCALL UserCreateInputContext(ULONG_PTR dwClientImcData)
Definition: ime.c:1561
#define TIF_INCLEANUP
Definition: ntuser.h:254
#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:84
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:126
#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:672
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
struct @1591 Msg[]
int APIENTRY IntDDEPostCallback(IN PWND pWnd, IN UINT Msg, IN WPARAM wParam, IN OUT LPARAM *lParam, IN OUT PVOID *Buffer)
Definition: dde.c:48
short cfFormat
Definition: dde.h:59
#define WM_DDE_REQUEST
Definition: dde.h:43
WPARAM wParam
Definition: combotst.c:138
short cfFormat
Definition: dde.h:74
#define USERTAG_DDE5
Definition: tags.h:214
PPROCESSINFO ppi
Definition: win32.h:84
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:126
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:672
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
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
struct @1591 Msg[]
#define USERTAG_DDE1
Definition: tags.h:211
WPARAM wParam
Definition: combotst.c:138
PPROCESSINFO ppi
Definition: win32.h:84
#define FALSE
Definition: types.h:117
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:126
#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:672
#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

Referenced by co_IntSendMessageTimeoutSingle().

◆ IntGetWindowContextHelpId()

DWORD FASTCALL IntGetWindowContextHelpId ( PWND  pWnd)

Definition at line 433 of file window.c.

434 {
435  DWORD HelpId;
436 
437  do
438  {
440  if (!HelpId) break;
441  pWnd = IntGetParent(pWnd);
442  }
443  while (pWnd && pWnd->fnid != FNID_DESKTOP);
444  return HelpId;
445 }
#define TRUE
Definition: types.h:120
PSERVERINFO gpsi
Definition: imm.c:17
ATOM atomContextHelpIdProp
Definition: ntuser.h:1038
#define DWORD
Definition: nt_native.h:44
DWORD fnid
Definition: ntuser.h:688
#define FNID_DESKTOP
Definition: ntuser.h:841
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:208

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:672
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:126
#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:84
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:91
LONG NTSTATUS
Definition: precomp.h:26
_SEH2_END
Definition: create.c:4400
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:278
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:254

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

◆ NC_DoNCPaint()

LRESULT NC_DoNCPaint ( PWND  ,
HDC  ,
INT   
)

Definition at line 1042 of file nonclient.c.

1043 {
1044  DWORD Style, ExStyle;
1045  PWND Parent;
1046  RECT WindowRect, CurrentRect, TempRect;
1047  BOOL Active = FALSE;
1048 
1049  if (!IntIsWindowVisible(pWnd) ||
1050  (pWnd->state & WNDS_NONCPAINT && !(pWnd->state & WNDS_FORCEMENUDRAW)) ||
1051  IntEqualRect(&pWnd->rcWindow, &pWnd->rcClient) )
1052  return 0;
1053 
1054  Style = pWnd->style;
1055 
1056  TRACE("DefWndNCPaint: pWnd %p, hDc %p, Active %s.\n", pWnd, hDC, Flags & DC_ACTIVE ? "TRUE" : "FALSE");
1057 
1058  Parent = IntGetParent(pWnd);
1059  ExStyle = pWnd->ExStyle;
1060 
1061  if (Flags == -1) // NC paint mode.
1062  {
1063  if (ExStyle & WS_EX_MDICHILD)
1064  {
1066 
1067  if (Active)
1069  }
1070  else
1071  {
1072  Active = (gpqForeground == pWnd->head.pti->MessageQueue);
1073  }
1074  Flags = DC_NC; // Redraw everything!
1075  }
1076  else
1077  Flags |= DC_NC;
1078 
1079 
1080  IntGetWindowRect(pWnd, &WindowRect);
1081 
1082  CurrentRect.top = CurrentRect.left = 0;
1083  CurrentRect.right = WindowRect.right - WindowRect.left;
1084  CurrentRect.bottom = WindowRect.bottom - WindowRect.top;
1085 
1086  /* Draw outer edge */
1087  if (UserHasWindowEdge(pWnd->style, pWnd->ExStyle))
1088  {
1089  DrawEdge(hDC, &CurrentRect, EDGE_RAISED, BF_RECT | BF_ADJUST);
1090  }
1091  else if (pWnd->ExStyle & WS_EX_STATICEDGE)
1092  {
1093 #if 0
1094  DrawEdge(hDC, &CurrentRect, BDR_SUNKENINNER, BF_RECT | BF_ADJUST | BF_FLAT);
1095 #else
1097  NtGdiPatBlt(hDC, CurrentRect.left, CurrentRect.top, CurrentRect.right - CurrentRect.left, 1, PATCOPY);
1098  NtGdiPatBlt(hDC, CurrentRect.left, CurrentRect.top, 1, CurrentRect.bottom - CurrentRect.top, PATCOPY);
1099 
1101  NtGdiPatBlt(hDC, CurrentRect.left, CurrentRect.bottom - 1, CurrentRect.right - CurrentRect.left, 1, PATCOPY);
1102  NtGdiPatBlt(hDC, CurrentRect.right - 1, CurrentRect.top, 1, CurrentRect.bottom - CurrentRect.top, PATCOPY);
1103 
1104  RECTL_vInflateRect(&CurrentRect, -1, -1);
1105 #endif
1106  }
1107 
1108  if (Flags & DC_FRAME) NC_DrawFrame(hDC, &CurrentRect, Active ? Active : (Flags & DC_ACTIVE), Style, ExStyle);
1109 
1110  /* Draw caption */
1111  if ((Style & WS_CAPTION) == WS_CAPTION)
1112  {
1113  HPEN PreviousPen;
1114  BOOL Gradient = FALSE;
1115 
1116  if (Flags & DC_REDRAWHUNGWND)
1117  {
1118  Flags &= ~DC_REDRAWHUNGWND;
1119  Flags |= DC_NOSENDMSG;
1120  }
1121 
1122  if (UserSystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, &Gradient, 0) && Gradient)
1123  {
1124  Flags |= DC_GRADIENT;
1125  }
1126 
1127  if (Active)
1128  {
1129  if (pWnd->state & WNDS_ACTIVEFRAME)
1130  Flags |= DC_ACTIVE;
1131  else
1132  {
1133  ERR("Wnd is active and not set active!\n");
1134  }
1135  }
1136 
1137  TempRect = CurrentRect;
1138 
1139  if (ExStyle & WS_EX_TOOLWINDOW)
1140  {
1141  Flags |= DC_SMALLCAP;
1142  TempRect.bottom = TempRect.top + UserGetSystemMetrics(SM_CYSMCAPTION) - 1;
1143  CurrentRect.top += UserGetSystemMetrics(SM_CYSMCAPTION);
1144  }
1145  else
1146  {
1147  TempRect.bottom = TempRect.top + UserGetSystemMetrics(SM_CYCAPTION) - 1;
1148  CurrentRect.top += UserGetSystemMetrics(SM_CYCAPTION);
1149  }
1150 
1151  UserDrawCaption(pWnd, hDC, &TempRect, NULL, NULL, NULL, Flags);
1152 
1153  /* Draw buttons */
1154  if (Style & WS_SYSMENU)
1155  {
1158  {
1161  }
1162  }
1163  if (!(Style & WS_MINIMIZE))
1164  {
1165  /* Line under caption */
1166  PreviousPen = NtGdiSelectPen(hDC, NtGdiGetStockObject(DC_PEN));
1167 
1171 
1172  GreMoveTo(hDC, TempRect.left, TempRect.bottom, NULL);
1173 
1174  NtGdiLineTo(hDC, TempRect.right, TempRect.bottom);
1175 
1176  NtGdiSelectPen(hDC, PreviousPen);
1177  }
1178  }
1179 
1180  if (!(Style & WS_MINIMIZE))
1181  {
1182  /* Draw menu bar */
1183  if (pWnd->state & WNDS_HASMENU && pWnd->IDMenu) // Should be pWnd->spmenu
1184  {
1185  if (!(Flags & DC_NOSENDMSG))
1186  {
1187  PMENU menu;
1188  // Fix crash in test_menu_locked_by_window, should use pWnd->spmenu....
1189  if ((menu = UserGetMenuObject(UlongToHandle(pWnd->IDMenu)))) // FIXME! Use pWnd->spmenu,
1190  {
1191  TempRect = CurrentRect;
1192  TempRect.bottom = TempRect.top + menu->cyMenu; // Should be pWnd->spmenu->cyMenu;
1193  CurrentRect.top += MENU_DrawMenuBar(hDC, &TempRect, pWnd, FALSE);
1194  }
1195  }
1196  }
1197 
1198  if (ExStyle & WS_EX_CLIENTEDGE)
1199  {
1200  DrawEdge(hDC, &CurrentRect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
1201  }
1202 
1203  /* Draw the scrollbars */
1204  if ((Style & WS_VSCROLL) && (Style & WS_HSCROLL) &&
1206  {
1207  RECT ParentClientRect;
1208 
1209  TempRect = CurrentRect;
1210 
1212  TempRect.right = TempRect.left + UserGetSystemMetrics(SM_CXVSCROLL);
1213  else
1214  TempRect.left = TempRect.right - UserGetSystemMetrics(SM_CXVSCROLL);
1215 
1216  TempRect.top = TempRect.bottom - UserGetSystemMetrics(SM_CYHSCROLL);
1217 
1219 
1220  if (Parent)
1221  {
1222  IntGetClientRect(Parent, &ParentClientRect);
1223 
1224  if (HASSIZEGRIP(Style, ExStyle, Parent->style, WindowRect, ParentClientRect))
1225  {
1227  }
1228  }
1229 
1230  IntDrawScrollBar(pWnd, hDC, SB_VERT);
1231  IntDrawScrollBar(pWnd, hDC, SB_HORZ);
1232  }
1233  else
1234  {
1236  {
1237  IntDrawScrollBar(pWnd, hDC, SB_VERT);
1238  }
1239  else if (Style & WS_HSCROLL && IntIsScrollBarVisible(pWnd, OBJID_HSCROLL))
1240  {
1241  IntDrawScrollBar(pWnd, hDC, SB_HORZ);
1242  }
1243  }
1244  }
1245  return 0; // For WM_NCPAINT message, return 0.
1246 }
#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:1162
#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:735
#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)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:728
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:2742
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:753
#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:151
ULONG cyMenu
Definition: ntuser.h:406
#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:194
#define UserHMGetHandle(obj)
Definition: ntuser.h:222
#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:148
#define DFCS_CAPTIONCLOSE
Definition: winuser.h:480
VOID NC_DrawFrame(HDC hDC, RECT *CurrentRect, BOOL Active, DWORD Style, DWORD ExStyle)
Definition: nonclient.c:854
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:193
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:594
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:672
static HDC hDC
Definition: 3dtext.c:33
#define DC_NOSENDMSG
Definition: undocuser.h:147
#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:208
#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:596
#define SM_CXVSCROLL
Definition: winuser.h:955
#define DFC_SCROLL
Definition: winuser.h:475
#define HASSIZEGRIP(Style, ExStyle, ParentStyle, WindowRect, ParentClientRect)
Definition: nonclient.c:34
LONG bottom
Definition: windef.h:309
#define WNDS_FORCEMENUDRAW
Definition: ntuser.h:603
_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:916
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2090
#define WNDS_HASMENU
Definition: ntuser.h:588
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 854 of file nonclient.c.

855 {
856  /* Firstly the "thick" frame */
857  if ((Style & WS_THICKFRAME) && !(Style & WS_MINIMIZE))
858  {
859  LONG Width =
862 
863  LONG Height =
866 
868 
869  /* Draw frame */
870  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, CurrentRect->right - CurrentRect->left, Height, PATCOPY);
871  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
872  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->bottom - 1, CurrentRect->right - CurrentRect->left, -Height, PATCOPY);
873  NtGdiPatBlt(hDC, CurrentRect->right - 1, CurrentRect->top, -Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
874 
875  RECTL_vInflateRect(CurrentRect, -Width, -Height);
876  }
877 
878  /* Now the other bit of the frame */
880  {
883 
889 
890  /* Draw frame */
891  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, CurrentRect->right - CurrentRect->left, Height, PATCOPY);
892  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->top, Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
893  NtGdiPatBlt(hDC, CurrentRect->left, CurrentRect->bottom - 1, CurrentRect->right - CurrentRect->left, -Height, PATCOPY);
894  NtGdiPatBlt(hDC, CurrentRect->right - 1, CurrentRect->top, -Width, CurrentRect->bottom - CurrentRect->top, PATCOPY);
895 
896  RECTL_vInflateRect(CurrentRect, -Width, -Height);
897  }
898 }
#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:194
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:683
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:194
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:695
#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:685

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:194
#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:208
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 1382 of file nonclient.c.

1383 {
1384  INT Flags;
1385  /* Lotus Notes draws menu descriptions in the caption of its main
1386  * window. When it wants to restore original "system" view, it just
1387  * sends WM_NCACTIVATE message to itself. Any optimizations here in
1388  * attempt to minimize redrawings lead to a not restored caption.
1389  */
1390  if (wParam & DC_ACTIVE)
1391  {
1394  }
1395  else
1396  {
1397  Wnd->state &= ~WNDS_ACTIVEFRAME;
1398  wParam = DC_CAPTION;
1399  }
1400 
1401  if ((Wnd->state & WNDS_NONCPAINT) || !(Wnd->style & WS_VISIBLE))
1402  return TRUE;
1403 
1404  /* This isn't documented but is reproducible in at least XP SP2 and
1405  * Outlook 2007 depends on it
1406  */
1407  // MSDN:
1408  // If this parameter is set to -1, DefWindowProc does not repaint the
1409  // nonclient area to reflect the state change.
1410  if ( lParam != -1 &&
1411  ( Flags = NC_DoNCActive(Wnd)) != 0 )
1412  {
1413  HDC hDC;
1414  HRGN hRgnTemp = NULL, hRgn = (HRGN)lParam;
1415 
1416  if (GreIsHandleValid(hRgn))
1417  {
1418  hRgnTemp = NtGdiCreateRectRgn(0, 0, 0, 0);
1419  if (NtGdiCombineRgn(hRgnTemp, hRgn, 0, RGN_COPY) == ERROR)
1420  {
1421  GreDeleteObject(hRgnTemp);
1422  hRgnTemp = NULL;
1423  }
1424  }
1425 
1426  if ((hDC = UserGetDCEx(Wnd, hRgnTemp, DCX_WINDOW|DCX_USESTYLE)))
1427  {
1428  NC_DoNCPaint(Wnd, hDC, wParam | Flags); // Redraw MENUs.
1429  UserReleaseDC(Wnd, hDC, FALSE);
1430  }
1431  else
1432  GreDeleteObject(hRgnTemp);
1433  }
1434 
1435  return TRUE;
1436 }
__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:1042
#define DC_ACTIVE
Definition: winuser.h:427
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define WNDS_ACTIVEFRAME
Definition: ntuser.h:594
__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:680
#define NULL
Definition: types.h:112
static INT NC_DoNCActive(PWND Wnd)
Definition: nonclient.c:1364
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:918
#define WNDS_NONCPAINT
Definition: ntuser.h:596
#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:591
DWORD style
Definition: ntuser.h:685

Referenced by IntDefWindowProc().

◆ NC_HandleNCCalcSize()

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

Definition at line 1248 of file nonclient.c.

1249 {
1250  LRESULT Result = 0;
1251  SIZE WindowBorders;
1252  RECT OrigRect;
1253  LONG Style = Wnd->style;
1254  LONG exStyle = Wnd->ExStyle;
1255 
1256  if (Rect == NULL)
1257  {
1258  return Result;
1259  }
1260  OrigRect = *Rect;
1261 
1262  Wnd->state &= ~WNDS_HASCAPTION;
1263 
1264  if (wparam)
1265  {
1266  if (Wnd->pcls->style & CS_VREDRAW)
1267  {
1268  Result |= WVR_VREDRAW;
1269  }
1270  if (Wnd->pcls->style & CS_HREDRAW)
1271  {
1272  Result |= WVR_HREDRAW;
1273  }
1275  }
1276 
1277  if (!(Wnd->style & WS_MINIMIZE))
1278  {
1279  if (UserHasWindowEdge(Wnd->style, Wnd->ExStyle))
1280  {
1281  UserGetWindowBorders(Wnd->style, Wnd->ExStyle, &WindowBorders, FALSE);
1282  RECTL_vInflateRect(Rect, -WindowBorders.cx, -WindowBorders.cy);
1283  }
1284  else if ((Wnd->ExStyle & WS_EX_STATICEDGE) || (Wnd->style & WS_BORDER))
1285  {
1286  RECTL_vInflateRect(Rect, -1, -1);
1287  }
1288 
1289  if ((Wnd->style & WS_CAPTION) == WS_CAPTION)
1290  {
1291  Wnd->state |= WNDS_HASCAPTION;
1292 
1293  if (Wnd->ExStyle & WS_EX_TOOLWINDOW)
1295  else
1297  }
1298 
1299  if (HAS_MENU(Wnd, Style))
1300  {
1301  HDC hDC = UserGetDCEx(Wnd, 0, DCX_USESTYLE | DCX_WINDOW);
1302 
1303  Wnd->state |= WNDS_HASMENU;
1304 
1305  if (hDC)
1306  {
1307  RECT CliRect = *Rect;
1308  CliRect.bottom -= OrigRect.top;
1309  CliRect.right -= OrigRect.left;
1310  CliRect.left -= OrigRect.left;
1311  CliRect.top -= OrigRect.top;
1312  if (!Suspended) Rect->top += MENU_DrawMenuBar(hDC, &CliRect, Wnd, TRUE);
1313  UserReleaseDC(Wnd, hDC, FALSE);
1314  }
1315  }
1316 
1317  if (Wnd->ExStyle & WS_EX_CLIENTEDGE)
1318  {
1320  }
1321 
1322  if (Style & WS_VSCROLL)
1323  {
1324  if (Rect->right - Rect->left >= UserGetSystemMetrics(SM_CXVSCROLL))
1325  {
1326  Wnd->state |= WNDS_HASVERTICALSCROOLLBAR;
1327 
1328  /* rectangle is in screen coords when wparam is false */
1329  if (!wparam && (exStyle & WS_EX_LAYOUTRTL)) exStyle ^= WS_EX_LEFTSCROLLBAR;
1330 
1331  if((exStyle & WS_EX_LEFTSCROLLBAR) != 0)
1333  else
1335  }
1336  }
1337 
1338  if (Style & WS_HSCROLL)
1339  {
1340  if( Rect->bottom - Rect->top > UserGetSystemMetrics(SM_CYHSCROLL))
1341  {
1342  Wnd->state |= WNDS_HASHORIZONTALSCROLLBAR;
1343 
1345  }
1346  }
1347 
1348  if (Rect->top > Rect->bottom)
1349  Rect->bottom = Rect->top;
1350 
1351  if (Rect->left > Rect->right)
1352  Rect->right = Rect->left;
1353  }
1354  else
1355  {
1356  Rect->right = Rect->left;
1357  Rect->bottom = Rect->top;
1358  }
1359 
1360  return Result;
1361 }
#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:590
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:2742
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:589
#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:194
#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:588
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:591
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 1610 of file nonclient.c.

1611 {
1612  ULONG Style;
1613 
1614  Style = pWnd->style;
1615  switch(wParam)
1616  {
1617  case HTCAPTION:
1618  {
1619  /* Maximize/Restore the window */
1620  if((Style & WS_CAPTION) == WS_CAPTION && (Style & WS_MAXIMIZEBOX))
1621  {
1623  }
1624  break;
1625  }
1626  case HTSYSMENU:
1627  {
1628  PMENU SysMenu = IntGetSystemMenu(pWnd, FALSE);
1630 
1631  /* If the close item of the sysmenu is disabled or not present do nothing */
1632  if ((state & (MF_DISABLED | MF_GRAYED)) || (state == 0xFFFFFFFF))
1633  break;
1634 
1636  break;
1637  }
1638  case HTTOP:
1639  case HTBOTTOM:
1640  {
1641  RECT sizingRect = pWnd->rcWindow, mouseRect;
1642 
1643  if (pWnd->ExStyle & WS_EX_MDICHILD)
1644  break;
1645 
1646  UserSystemParametersInfo(SPI_GETWORKAREA, 0, &mouseRect, 0);
1647 
1648  co_WinPosSetWindowPos(pWnd,
1649  0,
1650  sizingRect.left,
1651  mouseRect.top,
1652  sizingRect.right - sizingRect.left,
1653  mouseRect.bottom - mouseRect.top,
1654  0);
1655  break;
1656  }
1657  default:
1658  return NC_HandleNCLButtonDown(pWnd, wParam, lParam);
1659  }
1660  return(0);
1661 }
#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:1721
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:222
#define WS_CAPTION
Definition: pedump.c:624
const DWORD Style
Definition: appswitch.c:71
PMENU FASTCALL IntGetSystemMenu(PWND Window, BOOL bRevert)
Definition: menu.c:5381
#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:1519
#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:4973
#define WS_MAXIMIZE
Definition: pedump.c:623

Referenced by IntDefWindowProc().

◆ NC_HandleNCLButtonDown()

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

Definition at line 1519 of file nonclient.c.

1520 {
1521  switch (wParam)
1522  {
1523  case HTCAPTION:
1524  {
1525  PWND TopWnd = pWnd, parent;
1526  while(1)
1527  {
1528  if ((TopWnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD)
1529  break;
1530  parent = UserGetAncestor( TopWnd, GA_PARENT );
1531  if (!parent || UserIsDesktopWindow(parent)) break;
1532  TopWnd = parent;
1533  }
1534 
1535  if ( co_IntSetForegroundWindowMouse(TopWnd) ||
1536  //NtUserCallHwndLock(hTopWnd, HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE) ||
1537  UserGetActiveWindow() == UserHMGetHandle(TopWnd))
1538  {
1540  }
1541  break;
1542  }
1543  case HTSYSMENU:
1544  {
1545  LONG style = pWnd->style;
1546  if (style & WS_SYSMENU)
1547  {
1548  if(!(style & WS_MINIMIZE) )
1549  {
1550  RECT rect;
1551  HDC hDC = UserGetWindowDC(pWnd);
1552  NC_GetInsideRect(pWnd, &rect);
1553  UserDrawSysMenuButton(pWnd, hDC, &rect, TRUE);
1554  UserReleaseDC( pWnd, hDC, FALSE );
1555  }
1557  }
1558  break;
1559  }
1560  case HTMENU:
1561  {
1563  break;
1564  }
1565  case HTHSCROLL:
1566  {
1568  break;
1569  }
1570  case HTVSCROLL:
1571  {
1573  break;
1574  }
1575  case HTMINBUTTON:
1576  case HTMAXBUTTON:
1577  case HTCLOSE:
1578  {
1579  NC_DoButton(pWnd, wParam, lParam);
1580  break;
1581  }
1582  case HTLEFT:
1583  case HTRIGHT:
1584  case HTTOP:
1585  case HTBOTTOM:
1586  case HTTOPLEFT:
1587  case HTTOPRIGHT:
1588  case HTBOTTOMLEFT:
1589  case HTBOTTOMRIGHT:
1590  {
1591  /* Old comment:
1592  * "make sure hittest fits into 0xf and doesn't overlap with HTSYSMENU"
1593  * This was previously done by setting wParam=SC_SIZE + wParam - 2
1594  */
1595  /* But that is not what WinNT does. Instead it sends this. This
1596  * is easy to differentiate from HTSYSMENU, because HTSYSMENU adds
1597  * SC_MOUSEMENU into wParam.
1598  */