mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 20:25:39 +00:00
[user32]
- Remove a reactos only export (PrivateCsrssInitialized) - Don't call NtUserGetClassLong - Move implementation of AnyPopup to user mode - Fix a small bug in GetParent and in IsChild [csrss] - Don't call PrivateCsrssInitialized [win32k] - Call CsrInit in NtUserInitialize so we can remove PrivateCsrssInitialized - Romove a reactos only syscall (NtUserGetClassLong) - Remove UserGetClassLongPtr, UserGetWindow, UserGetWindowLong, IntGetOwner. Instead access objects directly - In WINDOW_OBJECT store pointer to the ownder window instead of a handle svn path=/trunk/; revision=47544
This commit is contained in:
parent
a101fb3029
commit
5ec9991072
20 changed files with 102 additions and 459 deletions
|
@ -33,9 +33,6 @@
|
||||||
#define NtUserMsqClearWakeMask() \
|
#define NtUserMsqClearWakeMask() \
|
||||||
NtUserCallNoParam(NOPARAM_ROUTINE_MSQCLEARWAKEMASK)
|
NtUserCallNoParam(NOPARAM_ROUTINE_MSQCLEARWAKEMASK)
|
||||||
|
|
||||||
#define NtUserAnyPopup() \
|
|
||||||
(BOOL)NtUserCallNoParam(NOPARAM_ROUTINE_ANYPOPUP)
|
|
||||||
|
|
||||||
#define NtUserValidateRgn(hWnd, hRgn) \
|
#define NtUserValidateRgn(hWnd, hRgn) \
|
||||||
(BOOL)NtUserCallTwoParam((DWORD_PTR)hWnd, (DWORD_PTR)hRgn, TWOPARAM_ROUTINE_VALIDATERGN)
|
(BOOL)NtUserCallTwoParam((DWORD_PTR)hWnd, (DWORD_PTR)hRgn, TWOPARAM_ROUTINE_VALIDATERGN)
|
||||||
|
|
||||||
|
|
|
@ -45,13 +45,6 @@ PrivateCsrssManualGuiCheck(LONG Check)
|
||||||
NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK);
|
NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
|
||||||
WINAPI
|
|
||||||
PrivateCsrssInitialized(VOID)
|
|
||||||
{
|
|
||||||
NtUserCallNoParam(NOPARAM_ROUTINE_CSRSS_INITIALIZED);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
|
|
|
@ -750,7 +750,6 @@
|
||||||
|
|
||||||
; ROS specific exports
|
; ROS specific exports
|
||||||
@ stdcall PrivateCsrssManualGuiCheck(long)
|
@ stdcall PrivateCsrssManualGuiCheck(long)
|
||||||
@ stdcall PrivateCsrssInitialized()
|
|
||||||
|
|
||||||
; Functions exported by Win Vista
|
; Functions exported by Win Vista
|
||||||
@ stdcall SetProcessDPIAware()
|
@ stdcall SetProcessDPIAware()
|
||||||
|
|
|
@ -423,22 +423,15 @@ GetClassLongA(HWND hWnd, int nIndex)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* This is a race condition! Call win32k to make sure we're getting
|
|
||||||
the correct result */
|
|
||||||
Wnd = NULL; /* Make sure we call NtUserGetClassLong */
|
|
||||||
|
|
||||||
WARN("Invalid class for hwnd 0x%p!\n", hWnd);
|
WARN("Invalid class for hwnd 0x%p!\n", hWnd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Wnd = NULL; /* Make sure we call NtUserGetClassLong */
|
Ret = 0;
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (Wnd == NULL)
|
|
||||||
Ret = NtUserGetClassLong(hWnd, nIndex, TRUE);
|
|
||||||
|
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -534,22 +527,14 @@ GetClassLongW ( HWND hWnd, int nIndex )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* This is a race condition! Call win32k to make sure we're getting
|
|
||||||
the correct result */
|
|
||||||
Wnd = NULL; /* Make sure we call NtUserGetClassLong */
|
|
||||||
|
|
||||||
WARN("Invalid class for hwnd 0x%p!\n", hWnd);
|
WARN("Invalid class for hwnd 0x%p!\n", hWnd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Wnd = NULL; /* Make sure we call NtUserGetClassLong */
|
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (Wnd == NULL)
|
|
||||||
Ret = NtUserGetClassLong(hWnd, nIndex, FALSE);
|
|
||||||
|
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -617,18 +602,28 @@ GetClassNameW(
|
||||||
WORD
|
WORD
|
||||||
WINAPI
|
WINAPI
|
||||||
GetClassWord(
|
GetClassWord(
|
||||||
HWND hWnd,
|
HWND hwnd,
|
||||||
int nIndex)
|
int offset)
|
||||||
/*
|
|
||||||
* NOTE: Obsoleted in 32-bit windows
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
TRACE("%p %x\n", hWnd, nIndex);
|
PWND Wnd;
|
||||||
|
PCLS class;
|
||||||
|
WORD retvalue = 0;
|
||||||
|
|
||||||
if ((nIndex < 0) && (nIndex != GCW_ATOM))
|
if (offset < 0) return GetClassLongA( hwnd, offset );
|
||||||
|
|
||||||
|
Wnd = ValidateHwnd(hwnd);
|
||||||
|
if (!Wnd)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return (WORD) NtUserGetClassLong ( hWnd, nIndex, TRUE );
|
class = DesktopPtrToUser(Wnd->pcls);
|
||||||
|
if (class == NULL) return 0;
|
||||||
|
|
||||||
|
if (offset <= class->cbclsExtra - sizeof(WORD))
|
||||||
|
memcpy( &retvalue, (char *)(class + 1) + offset, sizeof(retvalue) );
|
||||||
|
else
|
||||||
|
SetLastError( ERROR_INVALID_INDEX );
|
||||||
|
|
||||||
|
return retvalue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1030,16 +1030,16 @@ GetParent(HWND hWnd)
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
WndParent = NULL;
|
WndParent = NULL;
|
||||||
if (Wnd->style & WS_CHILD)
|
if (Wnd->style & WS_POPUP)
|
||||||
{
|
|
||||||
if (Wnd->spwndParent != NULL)
|
|
||||||
WndParent = DesktopPtrToUser(Wnd->spwndParent);
|
|
||||||
}
|
|
||||||
else if (Wnd->style & WS_POPUP)
|
|
||||||
{
|
{
|
||||||
if (Wnd->spwndOwner != NULL)
|
if (Wnd->spwndOwner != NULL)
|
||||||
WndParent = DesktopPtrToUser(Wnd->spwndOwner);
|
WndParent = DesktopPtrToUser(Wnd->spwndOwner);
|
||||||
}
|
}
|
||||||
|
else if (Wnd->style & WS_CHILD)
|
||||||
|
{
|
||||||
|
if (Wnd->spwndParent != NULL)
|
||||||
|
WndParent = DesktopPtrToUser(Wnd->spwndParent);
|
||||||
|
}
|
||||||
|
|
||||||
if (WndParent != NULL)
|
if (WndParent != NULL)
|
||||||
Ret = UserHMGetHandle(WndParent);
|
Ret = UserHMGetHandle(WndParent);
|
||||||
|
@ -1464,7 +1464,7 @@ BOOL WINAPI
|
||||||
IsChild(HWND hWndParent,
|
IsChild(HWND hWndParent,
|
||||||
HWND hWnd)
|
HWND hWnd)
|
||||||
{
|
{
|
||||||
PWND WndParent, Wnd;
|
PWND WndParent, DesktopWnd, Wnd;
|
||||||
BOOL Ret = FALSE;
|
BOOL Ret = FALSE;
|
||||||
|
|
||||||
WndParent = ValidateHwnd(hWndParent);
|
WndParent = ValidateHwnd(hWndParent);
|
||||||
|
@ -1474,6 +1474,10 @@ IsChild(HWND hWndParent,
|
||||||
if (!Wnd)
|
if (!Wnd)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
DesktopWnd = GetThreadDesktopWnd();
|
||||||
|
if (!DesktopWnd)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
while (Wnd != NULL)
|
while (Wnd != NULL)
|
||||||
|
@ -1481,6 +1485,10 @@ IsChild(HWND hWndParent,
|
||||||
if (Wnd->spwndParent != NULL)
|
if (Wnd->spwndParent != NULL)
|
||||||
{
|
{
|
||||||
Wnd = DesktopPtrToUser(Wnd->spwndParent);
|
Wnd = DesktopPtrToUser(Wnd->spwndParent);
|
||||||
|
|
||||||
|
if(Wnd == DesktopWnd)
|
||||||
|
Wnd = NULL;
|
||||||
|
|
||||||
if (Wnd == WndParent)
|
if (Wnd == WndParent)
|
||||||
{
|
{
|
||||||
Ret = TRUE;
|
Ret = TRUE;
|
||||||
|
@ -2062,7 +2070,18 @@ ScrollWindowEx(HWND hWnd,
|
||||||
BOOL WINAPI
|
BOOL WINAPI
|
||||||
AnyPopup(VOID)
|
AnyPopup(VOID)
|
||||||
{
|
{
|
||||||
return NtUserAnyPopup();
|
int i;
|
||||||
|
BOOL retvalue;
|
||||||
|
HWND *list = WIN_ListChildren( GetDesktopWindow() );
|
||||||
|
|
||||||
|
if (!list) return FALSE;
|
||||||
|
for (i = 0; list[i]; i++)
|
||||||
|
{
|
||||||
|
if (IsWindowVisible( list[i] ) && GetWindow( list[i], GW_OWNER )) break;
|
||||||
|
}
|
||||||
|
retvalue = (list[i] != 0);
|
||||||
|
HeapFree( GetProcessHeap(), 0, list );
|
||||||
|
return retvalue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -3135,7 +3135,6 @@ typedef struct tagKMDDELPARAM
|
||||||
|
|
||||||
#define NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO 0xffff0005
|
#define NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO 0xffff0005
|
||||||
#define NOPARAM_ROUTINE_ANYPOPUP 0xffff0006
|
#define NOPARAM_ROUTINE_ANYPOPUP 0xffff0006
|
||||||
#define NOPARAM_ROUTINE_CSRSS_INITIALIZED 0xffff0007
|
|
||||||
#define ONEPARAM_ROUTINE_CSRSS_GUICHECK 0xffff0008
|
#define ONEPARAM_ROUTINE_CSRSS_GUICHECK 0xffff0008
|
||||||
#define ONEPARAM_ROUTINE_SWITCHCARETSHOWING 0xfffe0008
|
#define ONEPARAM_ROUTINE_SWITCHCARETSHOWING 0xfffe0008
|
||||||
#define ONEPARAM_ROUTINE_ISWINDOWINDESTROY 0xfffe000c
|
#define ONEPARAM_ROUTINE_ISWINDOWINDESTROY 0xfffe000c
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
|
|
||||||
/* Not defined in any header file */
|
/* Not defined in any header file */
|
||||||
extern VOID WINAPI PrivateCsrssManualGuiCheck(LONG Check);
|
extern VOID WINAPI PrivateCsrssManualGuiCheck(LONG Check);
|
||||||
extern VOID WINAPI PrivateCsrssInitialized();
|
|
||||||
extern VOID WINAPI InitializeAppSwitchHook();
|
extern VOID WINAPI InitializeAppSwitchHook();
|
||||||
|
|
||||||
/* GLOBALS *******************************************************************/
|
/* GLOBALS *******************************************************************/
|
||||||
|
@ -111,8 +110,6 @@ Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
|
||||||
static BOOL WINAPI
|
static BOOL WINAPI
|
||||||
Win32CsrInitComplete(void)
|
Win32CsrInitComplete(void)
|
||||||
{
|
{
|
||||||
PrivateCsrssInitialized();
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,11 +65,6 @@ UserUnregisterClass(IN PUNICODE_STRING ClassName,
|
||||||
IN HINSTANCE hInstance,
|
IN HINSTANCE hInstance,
|
||||||
OUT PCLSMENUNAME pClassMenuName);
|
OUT PCLSMENUNAME pClassMenuName);
|
||||||
|
|
||||||
ULONG_PTR
|
|
||||||
UserGetClassLongPtr(IN PCLS Class,
|
|
||||||
IN INT Index,
|
|
||||||
IN BOOL Ansi);
|
|
||||||
|
|
||||||
RTL_ATOM
|
RTL_ATOM
|
||||||
IntGetClassAtom(IN PUNICODE_STRING ClassName,
|
IntGetClassAtom(IN PUNICODE_STRING ClassName,
|
||||||
IN HINSTANCE hInstance OPTIONAL,
|
IN HINSTANCE hInstance OPTIONAL,
|
||||||
|
|
|
@ -122,15 +122,11 @@ co_DestroyThreadWindows(struct _ETHREAD *Thread);
|
||||||
|
|
||||||
HWND FASTCALL UserGetShellWindow(VOID);
|
HWND FASTCALL UserGetShellWindow(VOID);
|
||||||
|
|
||||||
HWND FASTCALL UserGetWindow(HWND hWnd, UINT Relationship);
|
|
||||||
|
|
||||||
HDC FASTCALL
|
HDC FASTCALL
|
||||||
UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags);
|
UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags);
|
||||||
|
|
||||||
BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Wnd);
|
BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Wnd);
|
||||||
|
|
||||||
LONG FASTCALL UserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi);
|
|
||||||
|
|
||||||
PWINDOW_OBJECT FASTCALL UserGetAncestor(PWINDOW_OBJECT Wnd, UINT Type);
|
PWINDOW_OBJECT FASTCALL UserGetAncestor(PWINDOW_OBJECT Wnd, UINT Type);
|
||||||
|
|
||||||
/*************** MENU.C ***************/
|
/*************** MENU.C ***************/
|
||||||
|
|
|
@ -37,11 +37,8 @@ typedef struct _WINDOW_OBJECT
|
||||||
struct _WINDOW_OBJECT* spwndChild;
|
struct _WINDOW_OBJECT* spwndChild;
|
||||||
struct _WINDOW_OBJECT* spwndNext;
|
struct _WINDOW_OBJECT* spwndNext;
|
||||||
struct _WINDOW_OBJECT* spwndPrev;
|
struct _WINDOW_OBJECT* spwndPrev;
|
||||||
/* Handle to the parent window. */
|
|
||||||
struct _WINDOW_OBJECT* spwndParent;
|
struct _WINDOW_OBJECT* spwndParent;
|
||||||
/* Handle to the owner window. */
|
struct _WINDOW_OBJECT* spwndOwner;
|
||||||
HWND hOwner; // Use spwndOwner
|
|
||||||
|
|
||||||
|
|
||||||
/* Scrollbar info */
|
/* Scrollbar info */
|
||||||
PSBINFOEX pSBInfo; // convert to PSBINFO
|
PSBINFOEX pSBInfo; // convert to PSBINFO
|
||||||
|
@ -125,10 +122,6 @@ IntGetAncestor(PWINDOW_OBJECT Wnd, UINT Type);
|
||||||
PWINDOW_OBJECT FASTCALL
|
PWINDOW_OBJECT FASTCALL
|
||||||
IntGetParent(PWINDOW_OBJECT Wnd);
|
IntGetParent(PWINDOW_OBJECT Wnd);
|
||||||
|
|
||||||
PWINDOW_OBJECT FASTCALL
|
|
||||||
IntGetOwner(PWINDOW_OBJECT Wnd);
|
|
||||||
|
|
||||||
|
|
||||||
INT FASTCALL
|
INT FASTCALL
|
||||||
IntGetWindowRgn(PWINDOW_OBJECT Window, HRGN hRgn);
|
IntGetWindowRgn(PWINDOW_OBJECT Window, HRGN hRgn);
|
||||||
|
|
||||||
|
@ -141,9 +134,6 @@ IntGetWindowInfo(PWINDOW_OBJECT WindowObject, PWINDOWINFO pwi);
|
||||||
VOID FASTCALL
|
VOID FASTCALL
|
||||||
IntGetWindowBorderMeasures(PWINDOW_OBJECT WindowObject, UINT *cx, UINT *cy);
|
IntGetWindowBorderMeasures(PWINDOW_OBJECT WindowObject, UINT *cx, UINT *cy);
|
||||||
|
|
||||||
BOOL FASTCALL
|
|
||||||
IntAnyPopup(VOID);
|
|
||||||
|
|
||||||
BOOL FASTCALL
|
BOOL FASTCALL
|
||||||
IntIsWindowInDestroy(PWINDOW_OBJECT Window);
|
IntIsWindowInDestroy(PWINDOW_OBJECT Window);
|
||||||
|
|
||||||
|
|
|
@ -185,9 +185,7 @@ UserGetCPD(
|
||||||
Example:
|
Example:
|
||||||
If pWnd is created from Ansi and lpfnXxyz is assumed to be Ansi, caller
|
If pWnd is created from Ansi and lpfnXxyz is assumed to be Ansi, caller
|
||||||
will ask for Unicode Proc return Proc or CallProcData handle.
|
will ask for Unicode Proc return Proc or CallProcData handle.
|
||||||
|
*/
|
||||||
This function should replaced NtUserGetClassLong and NtUserGetWindowLong.
|
|
||||||
*/
|
|
||||||
ULONG_PTR
|
ULONG_PTR
|
||||||
APIENTRY
|
APIENTRY
|
||||||
NtUserGetCPD(
|
NtUserGetCPD(
|
||||||
|
|
|
@ -1515,96 +1515,6 @@ UserGetClassName(IN PCLS Class,
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG_PTR
|
|
||||||
UserGetClassLongPtr(IN PCLS Class,
|
|
||||||
IN INT Index,
|
|
||||||
IN BOOL Ansi)
|
|
||||||
{
|
|
||||||
ULONG_PTR Ret = 0;
|
|
||||||
|
|
||||||
if (Index >= 0)
|
|
||||||
{
|
|
||||||
PULONG_PTR Data;
|
|
||||||
|
|
||||||
TRACE("GetClassLong(%d)\n", Index);
|
|
||||||
if (Index + sizeof(ULONG_PTR) < Index ||
|
|
||||||
Index + sizeof(ULONG_PTR) > Class->cbclsExtra)
|
|
||||||
{
|
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Data = (PULONG_PTR)((ULONG_PTR)(Class + 1) + Index);
|
|
||||||
|
|
||||||
/* FIXME - Data might be a unaligned pointer! Might be a problem on
|
|
||||||
certain architectures, maybe using RtlCopyMemory is a
|
|
||||||
better choice for those architectures! */
|
|
||||||
|
|
||||||
TRACE("Result: %x\n", Ret);
|
|
||||||
return *Data;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (Index)
|
|
||||||
{
|
|
||||||
case GCL_CBWNDEXTRA:
|
|
||||||
Ret = (ULONG_PTR)Class->cbwndExtra;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCL_CBCLSEXTRA:
|
|
||||||
Ret = (ULONG_PTR)Class->cbclsExtra;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_HBRBACKGROUND:
|
|
||||||
Ret = (ULONG_PTR)Class->hbrBackground;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_HCURSOR:
|
|
||||||
/* FIXME - get handle from pointer to CURSOR object */
|
|
||||||
Ret = (ULONG_PTR)Class->hCursor;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_HICON:
|
|
||||||
/* FIXME - get handle from pointer to ICON object */
|
|
||||||
Ret = (ULONG_PTR)Class->hIcon;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_HICONSM:
|
|
||||||
/* FIXME - get handle from pointer to ICON object */
|
|
||||||
Ret = (ULONG_PTR)Class->hIconSm;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_HMODULE:
|
|
||||||
Ret = (ULONG_PTR)Class->hModule;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_MENUNAME:
|
|
||||||
/* NOTE: Returns pointer in kernel heap! */
|
|
||||||
if (Ansi)
|
|
||||||
Ret = (ULONG_PTR)Class->lpszClientAnsiMenuName;
|
|
||||||
else
|
|
||||||
Ret = (ULONG_PTR)Class->lpszClientUnicodeMenuName;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCL_STYLE:
|
|
||||||
Ret = (ULONG_PTR)Class->style;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_WNDPROC:
|
|
||||||
Ret = (ULONG_PTR)IntGetClassWndProc(Class, Ansi);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCW_ATOM:
|
|
||||||
Ret = (ULONG_PTR)Class->atomClassName;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
SetLastWin32Error(ERROR_INVALID_INDEX);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
IntSetClassMenuName(IN PCLS Class,
|
IntSetClassMenuName(IN PCLS Class,
|
||||||
IN PUNICODE_STRING MenuName)
|
IN PUNICODE_STRING MenuName)
|
||||||
|
@ -2190,45 +2100,6 @@ InvalidParameter:
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG_PTR APIENTRY
|
|
||||||
NtUserGetClassLong(IN HWND hWnd,
|
|
||||||
IN INT Offset,
|
|
||||||
IN BOOL Ansi)
|
|
||||||
{
|
|
||||||
PWINDOW_OBJECT Window;
|
|
||||||
ULONG_PTR Ret = 0;
|
|
||||||
|
|
||||||
if (Offset != GCLP_WNDPROC)
|
|
||||||
{
|
|
||||||
UserEnterShared();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UserEnterExclusive();
|
|
||||||
}
|
|
||||||
|
|
||||||
Window = UserGetWindowObject(hWnd);
|
|
||||||
if (Window != NULL)
|
|
||||||
{
|
|
||||||
Ret = UserGetClassLongPtr(Window->Wnd->pcls,
|
|
||||||
Offset,
|
|
||||||
Ansi);
|
|
||||||
|
|
||||||
if ( Ret != 0 &&
|
|
||||||
Offset == GCLP_MENUNAME &&
|
|
||||||
Window->Wnd->pcls->MenuNameIsString)
|
|
||||||
{
|
|
||||||
Ret = (ULONG_PTR)UserHeapAddressToUser((PVOID)Ret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UserLeave();
|
|
||||||
|
|
||||||
return Ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ULONG_PTR APIENTRY
|
ULONG_PTR APIENTRY
|
||||||
NtUserSetClassLong(HWND hWnd,
|
NtUserSetClassLong(HWND hWnd,
|
||||||
INT Offset,
|
INT Offset,
|
||||||
|
|
|
@ -129,7 +129,7 @@ IntDefWindowProc(
|
||||||
{
|
{
|
||||||
if ((Wnd->style & WS_VISIBLE) && wParam) break;
|
if ((Wnd->style & WS_VISIBLE) && wParam) break;
|
||||||
if (!(Wnd->style & WS_VISIBLE) && !wParam) break;
|
if (!(Wnd->style & WS_VISIBLE) && !wParam) break;
|
||||||
if (!Window->hOwner) break;
|
if (!Window->spwndOwner) break;
|
||||||
if (LOWORD(lParam))
|
if (LOWORD(lParam))
|
||||||
{
|
{
|
||||||
if (wParam)
|
if (wParam)
|
||||||
|
|
|
@ -1423,7 +1423,7 @@ NtUserPaintDesktop(HDC hDC)
|
||||||
RETURN(FALSE);
|
RETURN(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
DesktopBrush = (HBRUSH)UserGetClassLongPtr(WndDesktop->Wnd->pcls, GCL_HBRBACKGROUND, FALSE);
|
DesktopBrush = (HBRUSH)WndDesktop->Wnd->pcls->hbrBackground;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -51,11 +51,13 @@ IntGetThreadFocusWindow(VOID)
|
||||||
VOID FASTCALL
|
VOID FASTCALL
|
||||||
co_IntSendDeactivateMessages(HWND hWndPrev, HWND hWnd)
|
co_IntSendDeactivateMessages(HWND hWndPrev, HWND hWnd)
|
||||||
{
|
{
|
||||||
if (hWndPrev)
|
PWINDOW_OBJECT WndPrev ;
|
||||||
|
|
||||||
|
if (hWndPrev && (WndPrev = UserGetWindowObject(hWndPrev)))
|
||||||
{
|
{
|
||||||
co_IntSendMessageNoWait(hWndPrev, WM_NCACTIVATE, FALSE, 0);
|
co_IntSendMessageNoWait(hWndPrev, WM_NCACTIVATE, FALSE, 0);
|
||||||
co_IntSendMessageNoWait(hWndPrev, WM_ACTIVATE,
|
co_IntSendMessageNoWait(hWndPrev, WM_ACTIVATE,
|
||||||
MAKEWPARAM(WA_INACTIVE, UserGetWindowLong(hWndPrev, GWL_STYLE, FALSE) & WS_MINIMIZE),
|
MAKEWPARAM(WA_INACTIVE, WndPrev->Wnd->style & WS_MINIMIZE),
|
||||||
(LPARAM)hWnd);
|
(LPARAM)hWnd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,11 +85,11 @@ co_IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate)
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UserGetWindow(hWnd, GW_HWNDPREV) != NULL)
|
if (Window->spwndPrev != NULL)
|
||||||
co_WinPosSetWindowPos(Window, HWND_TOP, 0, 0, 0, 0,
|
co_WinPosSetWindowPos(Window, HWND_TOP, 0, 0, 0, 0,
|
||||||
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSENDCHANGING);
|
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSENDCHANGING);
|
||||||
|
|
||||||
if (!IntGetOwner(Window) && !IntGetParent(Window))
|
if (!Window->spwndOwner && !IntGetParent(Window))
|
||||||
{
|
{
|
||||||
co_IntShellHookNotify(HSHELL_WINDOWACTIVATED, (LPARAM) hWnd);
|
co_IntShellHookNotify(HSHELL_WINDOWACTIVATED, (LPARAM) hWnd);
|
||||||
}
|
}
|
||||||
|
@ -153,7 +155,7 @@ co_IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate)
|
||||||
/* FIXME: WA_CLICKACTIVE */
|
/* FIXME: WA_CLICKACTIVE */
|
||||||
co_IntSendMessageNoWait(hWnd, WM_ACTIVATE,
|
co_IntSendMessageNoWait(hWnd, WM_ACTIVATE,
|
||||||
MAKEWPARAM(MouseActivate ? WA_CLICKACTIVE : WA_ACTIVE,
|
MAKEWPARAM(MouseActivate ? WA_CLICKACTIVE : WA_ACTIVE,
|
||||||
UserGetWindowLong(hWnd, GWL_STYLE, FALSE) & WS_MINIMIZE),
|
Window->Wnd->style & WS_MINIMIZE),
|
||||||
(LPARAM)hWndPrev);
|
(LPARAM)hWndPrev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -184,7 +186,7 @@ IntFindChildWindowToOwner(PWINDOW_OBJECT Root, PWINDOW_OBJECT Owner)
|
||||||
|
|
||||||
for(Child = Root->spwndChild; Child; Child = Child->spwndNext)
|
for(Child = Root->spwndChild; Child; Child = Child->spwndNext)
|
||||||
{
|
{
|
||||||
OwnerWnd = UserGetWindowObject(Child->hOwner);
|
OwnerWnd = Child->spwndOwner;
|
||||||
if(!OwnerWnd)
|
if(!OwnerWnd)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -124,6 +124,8 @@ UserInitialize(
|
||||||
|
|
||||||
NtUserUpdatePerUserSystemParameters(0, TRUE);
|
NtUserUpdatePerUserSystemParameters(0, TRUE);
|
||||||
|
|
||||||
|
CsrInit();
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -110,14 +110,6 @@ NtUserCallNoParam(DWORD Routine)
|
||||||
Result = (DWORD_PTR)MsqGetMessageExtraInfo();
|
Result = (DWORD_PTR)MsqGetMessageExtraInfo();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NOPARAM_ROUTINE_ANYPOPUP:
|
|
||||||
Result = (DWORD_PTR)IntAnyPopup();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NOPARAM_ROUTINE_CSRSS_INITIALIZED:
|
|
||||||
Result = (DWORD_PTR)CsrInit();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NOPARAM_ROUTINE_MSQCLEARWAKEMASK:
|
case NOPARAM_ROUTINE_MSQCLEARWAKEMASK:
|
||||||
RETURN( (DWORD_PTR)IntMsqClearWakeMask());
|
RETURN( (DWORD_PTR)IntMsqClearWakeMask());
|
||||||
|
|
||||||
|
@ -525,7 +517,7 @@ NtUserCallHwndLock(
|
||||||
SWP_NOZORDER|
|
SWP_NOZORDER|
|
||||||
SWP_NOACTIVATE|
|
SWP_NOACTIVATE|
|
||||||
SWP_FRAMECHANGED );
|
SWP_FRAMECHANGED );
|
||||||
if (!IntGetOwner(Window) && !IntGetParent(Window))
|
if (!Window->spwndOwner && !IntGetParent(Window))
|
||||||
{
|
{
|
||||||
co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) hWnd);
|
co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) hWnd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,6 +96,8 @@ PWINDOW_OBJECT FASTCALL IntGetWindowObject(HWND hWnd)
|
||||||
ASSERT(Window->head.cLockObj >= 0);
|
ASSERT(Window->head.cLockObj >= 0);
|
||||||
|
|
||||||
Window->head.cLockObj++;
|
Window->head.cLockObj++;
|
||||||
|
|
||||||
|
ASSERT(Window->Wnd);
|
||||||
}
|
}
|
||||||
return Window;
|
return Window;
|
||||||
}
|
}
|
||||||
|
@ -130,6 +132,9 @@ PWINDOW_OBJECT FASTCALL UserGetWindowObject(HWND hWnd)
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(Window->head.cLockObj >= 0);
|
ASSERT(Window->head.cLockObj >= 0);
|
||||||
|
|
||||||
|
ASSERT(Window->Wnd);
|
||||||
|
|
||||||
return Window;
|
return Window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,20 +168,12 @@ IntIsWindow(HWND hWnd)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Caller must NOT dereference retval!
|
|
||||||
But if caller want the returned value to persist spanning a co_ call,
|
|
||||||
it must reference the value (because the owner is not garanteed to
|
|
||||||
exist just because the owned window exist)!
|
|
||||||
*/
|
|
||||||
PWINDOW_OBJECT FASTCALL
|
PWINDOW_OBJECT FASTCALL
|
||||||
IntGetParent(PWINDOW_OBJECT Wnd)
|
IntGetParent(PWINDOW_OBJECT Wnd)
|
||||||
{
|
{
|
||||||
if (!Wnd->Wnd) return NULL;
|
|
||||||
|
|
||||||
if (Wnd->Wnd->style & WS_POPUP)
|
if (Wnd->Wnd->style & WS_POPUP)
|
||||||
{
|
{
|
||||||
return UserGetWindowObject(Wnd->hOwner);
|
return Wnd->spwndOwner;
|
||||||
}
|
}
|
||||||
else if (Wnd->Wnd->style & WS_CHILD)
|
else if (Wnd->Wnd->style & WS_CHILD)
|
||||||
{
|
{
|
||||||
|
@ -187,20 +184,6 @@ IntGetParent(PWINDOW_OBJECT Wnd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Caller must NOT dereference retval!
|
|
||||||
But if caller want the returned value to persist spanning a co_ call,
|
|
||||||
it must reference the value (because the owner is not garanteed to
|
|
||||||
exist just because the owned window exist)!
|
|
||||||
*/
|
|
||||||
PWINDOW_OBJECT FASTCALL
|
|
||||||
IntGetOwner(PWINDOW_OBJECT Wnd)
|
|
||||||
{
|
|
||||||
return UserGetWindowObject(Wnd->hOwner);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IntWinListChildren
|
* IntWinListChildren
|
||||||
*
|
*
|
||||||
|
@ -265,7 +248,7 @@ static void IntSendDestroyMsg(HWND hWnd)
|
||||||
// USER_REFERENCE_ENTRY Ref;
|
// USER_REFERENCE_ENTRY Ref;
|
||||||
// UserRefObjectCo(Window, &Ref);
|
// UserRefObjectCo(Window, &Ref);
|
||||||
|
|
||||||
if (!IntGetOwner(Window) && !IntGetParent(Window))
|
if (!Window->spwndOwner && !IntGetParent(Window))
|
||||||
{
|
{
|
||||||
co_IntShellHookNotify(HSHELL_WINDOWDESTROYED, (LPARAM) hWnd);
|
co_IntShellHookNotify(HSHELL_WINDOWDESTROYED, (LPARAM) hWnd);
|
||||||
}
|
}
|
||||||
|
@ -1091,25 +1074,18 @@ IntSetOwner(HWND hWnd, HWND hWndNewOwner)
|
||||||
if(!Wnd)
|
if(!Wnd)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
WndOldOwner = IntGetWindowObject(Wnd->hOwner);
|
WndOldOwner = Wnd->spwndOwner;
|
||||||
if (WndOldOwner)
|
|
||||||
{
|
ret = WndOldOwner ? WndOldOwner->hSelf : 0;
|
||||||
ret = WndOldOwner->hSelf;
|
|
||||||
UserDereferenceObject(WndOldOwner);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if((WndNewOwner = UserGetWindowObject(hWndNewOwner)))
|
if((WndNewOwner = UserGetWindowObject(hWndNewOwner)))
|
||||||
{
|
{
|
||||||
Wnd->hOwner = hWndNewOwner;
|
Wnd->spwndOwner= WndNewOwner;
|
||||||
Wnd->Wnd->spwndOwner = WndNewOwner->Wnd;
|
Wnd->Wnd->spwndOwner = WndNewOwner->Wnd;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Wnd->hOwner = NULL;
|
Wnd->spwndOwner = NULL;
|
||||||
Wnd->Wnd->spwndOwner = NULL;
|
Wnd->Wnd->spwndOwner = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1279,31 +1255,6 @@ IntUnlinkWindow(PWINDOW_OBJECT Wnd)
|
||||||
Wnd->spwndPrev = Wnd->spwndNext = Wnd->spwndParent = NULL;
|
Wnd->spwndPrev = Wnd->spwndNext = Wnd->spwndParent = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL FASTCALL
|
|
||||||
IntAnyPopup(VOID)
|
|
||||||
{
|
|
||||||
PWINDOW_OBJECT Window, Child;
|
|
||||||
|
|
||||||
if(!(Window = UserGetWindowObject(IntGetDesktopWindow())))
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(Child = Window->spwndChild; Child; Child = Child->spwndNext)
|
|
||||||
{
|
|
||||||
if(Child->hOwner && Child->Wnd->style & WS_VISIBLE)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The desktop has a popup window if one of them has
|
|
||||||
* an owner window and is visible
|
|
||||||
*/
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL FASTCALL
|
BOOL FASTCALL
|
||||||
IntIsWindowInDestroy(PWINDOW_OBJECT Window)
|
IntIsWindowInDestroy(PWINDOW_OBJECT Window)
|
||||||
{
|
{
|
||||||
|
@ -1511,7 +1462,7 @@ NtUserBuildHwndList(
|
||||||
Window = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry);
|
Window = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry);
|
||||||
ASSERT(Window);
|
ASSERT(Window);
|
||||||
|
|
||||||
if(bChildren || Window->hOwner != NULL)
|
if(bChildren || Window->spwndOwner != NULL)
|
||||||
{
|
{
|
||||||
if(dwCount < *pBufSize && pWnd)
|
if(dwCount < *pBufSize && pWnd)
|
||||||
{
|
{
|
||||||
|
@ -1737,7 +1688,7 @@ PWINDOW_OBJECT FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
|
||||||
Window->pti = pti;
|
Window->pti = pti;
|
||||||
Window->hSelf = hWnd;
|
Window->hSelf = hWnd;
|
||||||
Window->spwndParent = ParentWindow;
|
Window->spwndParent = ParentWindow;
|
||||||
Window->hOwner = OwnerWindow ? OwnerWindow->hSelf : NULL;
|
Window->spwndOwner = OwnerWindow;
|
||||||
|
|
||||||
Wnd->head.h = hWnd;
|
Wnd->head.h = hWnd;
|
||||||
Wnd->head.pti = pti;
|
Wnd->head.pti = pti;
|
||||||
|
@ -2560,7 +2511,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window)
|
||||||
Child = UserGetWindowObject(*ChildHandle);
|
Child = UserGetWindowObject(*ChildHandle);
|
||||||
if (Child == NULL)
|
if (Child == NULL)
|
||||||
continue;
|
continue;
|
||||||
if (Child->hOwner != Window->hSelf)
|
if (Child->spwndOwner != Window)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -2576,9 +2527,9 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Child->hOwner != NULL)
|
if (Child->spwndOwner != NULL)
|
||||||
{
|
{
|
||||||
Child->hOwner = NULL;
|
Child->spwndOwner = NULL;
|
||||||
Child->Wnd->spwndOwner = NULL;
|
Child->Wnd->spwndOwner = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3041,9 +2992,6 @@ PWINDOW_OBJECT FASTCALL UserGetAncestor(PWINDOW_OBJECT Wnd, UINT Type)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//temp hack
|
|
||||||
// UserDereferenceObject(Parent);
|
|
||||||
|
|
||||||
WndAncestor = Parent;
|
WndAncestor = Parent;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -3374,7 +3322,7 @@ BOOL APIENTRY
|
||||||
NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView)
|
NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView)
|
||||||
{
|
{
|
||||||
PWINSTATION_OBJECT WinStaObject;
|
PWINSTATION_OBJECT WinStaObject;
|
||||||
PWINDOW_OBJECT WndShell;
|
PWINDOW_OBJECT WndShell, WndListView;
|
||||||
DECLARE_RETURN(BOOL);
|
DECLARE_RETURN(BOOL);
|
||||||
USER_REFERENCE_ENTRY Ref;
|
USER_REFERENCE_ENTRY Ref;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -3388,6 +3336,11 @@ NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView)
|
||||||
RETURN(FALSE);
|
RETURN(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!(WndListView = UserGetWindowObject(hwndListView)))
|
||||||
|
{
|
||||||
|
RETURN(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
|
Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
|
||||||
KernelMode,
|
KernelMode,
|
||||||
0,
|
0,
|
||||||
|
@ -3421,14 +3374,14 @@ NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView)
|
||||||
co_WinPosSetWindowPos(hwndListView, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
|
co_WinPosSetWindowPos(hwndListView, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (UserGetWindowLong(hwndListView, GWL_EXSTYLE, FALSE) & WS_EX_TOPMOST)
|
if (WndListView->Wnd->ExStyle & WS_EX_TOPMOST)
|
||||||
{
|
{
|
||||||
ObDereferenceObject(WinStaObject);
|
ObDereferenceObject(WinStaObject);
|
||||||
RETURN( FALSE);
|
RETURN( FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UserGetWindowLong(hwndShell, GWL_EXSTYLE, FALSE) & WS_EX_TOPMOST)
|
if (WndShell->Wnd->ExStyle & WS_EX_TOPMOST)
|
||||||
{
|
{
|
||||||
ObDereferenceObject(WinStaObject);
|
ObDereferenceObject(WinStaObject);
|
||||||
RETURN( FALSE);
|
RETURN( FALSE);
|
||||||
|
@ -3553,162 +3506,6 @@ CLEANUP:
|
||||||
END_CLEANUP;
|
END_CLEANUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
HWND FASTCALL
|
|
||||||
UserGetWindow(HWND hWnd, UINT Relationship)
|
|
||||||
{
|
|
||||||
PWINDOW_OBJECT Parent, Window;
|
|
||||||
HWND hWndResult = NULL;
|
|
||||||
|
|
||||||
if (!(Window = UserGetWindowObject(hWnd)))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
switch (Relationship)
|
|
||||||
{
|
|
||||||
case GW_HWNDFIRST:
|
|
||||||
if((Parent = Window->spwndParent))
|
|
||||||
{
|
|
||||||
if (Parent->spwndChild)
|
|
||||||
hWndResult = Parent->spwndChild->hSelf;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GW_HWNDLAST:
|
|
||||||
if((Parent = Window->spwndParent))
|
|
||||||
{
|
|
||||||
if (Parent->spwndChild)
|
|
||||||
{
|
|
||||||
Window = Parent->spwndChild;
|
|
||||||
if(Window)
|
|
||||||
{
|
|
||||||
while(Window->spwndNext)
|
|
||||||
Window = Window->spwndNext;
|
|
||||||
}
|
|
||||||
hWndResult = Window->hSelf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GW_HWNDNEXT:
|
|
||||||
if (Window->spwndNext)
|
|
||||||
hWndResult = Window->spwndNext->hSelf;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GW_HWNDPREV:
|
|
||||||
if (Window->spwndPrev)
|
|
||||||
hWndResult = Window->spwndPrev->hSelf;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GW_OWNER:
|
|
||||||
if((Parent = UserGetWindowObject(Window->hOwner)))
|
|
||||||
{
|
|
||||||
hWndResult = Parent->hSelf;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GW_CHILD:
|
|
||||||
if (Window->spwndChild)
|
|
||||||
hWndResult = Window->spwndChild->hSelf;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return hWndResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NtUserGetWindowLong
|
|
||||||
*
|
|
||||||
* The NtUserGetWindowLong function retrieves information about the specified
|
|
||||||
* window. The function also retrieves the 32-bit (long) value at the
|
|
||||||
* specified offset into the extra window memory.
|
|
||||||
*
|
|
||||||
* Status
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
|
|
||||||
LONG FASTCALL
|
|
||||||
UserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi)
|
|
||||||
{
|
|
||||||
PWINDOW_OBJECT Window, Parent;
|
|
||||||
PWND Wnd;
|
|
||||||
LONG Result = 0;
|
|
||||||
|
|
||||||
DPRINT("NtUserGetWindowLong(%x,%d,%d)\n", hWnd, (INT)Index, Ansi);
|
|
||||||
|
|
||||||
if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Wnd = Window->Wnd;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* WndProc is only available to the owner process
|
|
||||||
*/
|
|
||||||
if (GWL_WNDPROC == Index
|
|
||||||
&& Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
|
|
||||||
{
|
|
||||||
SetLastWin32Error(ERROR_ACCESS_DENIED);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((INT)Index >= 0)
|
|
||||||
{
|
|
||||||
if ((Index + sizeof(LONG)) > Window->Wnd->cbwndExtra)
|
|
||||||
{
|
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
Result = *((LONG *)((PCHAR)(Window->Wnd + 1) + Index));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (Index)
|
|
||||||
{
|
|
||||||
case GWL_EXSTYLE:
|
|
||||||
Result = Wnd->ExStyle;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GWL_STYLE:
|
|
||||||
Result = Wnd->style;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GWL_WNDPROC:
|
|
||||||
Result = (LONG)IntGetWindowProc(Wnd, Ansi);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GWL_HINSTANCE:
|
|
||||||
Result = (LONG) Wnd->hModule;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GWL_HWNDPARENT:
|
|
||||||
Parent = Window->spwndParent;
|
|
||||||
if(Parent)
|
|
||||||
{
|
|
||||||
if (Parent && Parent->hSelf == IntGetDesktopWindow())
|
|
||||||
Result = (LONG) UserGetWindow(Window->hSelf, GW_OWNER);
|
|
||||||
else
|
|
||||||
Result = (LONG) Parent->hSelf;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GWL_ID:
|
|
||||||
Result = (LONG) Wnd->IDMenu;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GWL_USERDATA:
|
|
||||||
Result = Wnd->dwUserData;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DPRINT1("NtUserGetWindowLong(): Unsupported index %d\n", Index);
|
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
||||||
Result = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
LONG FASTCALL
|
LONG FASTCALL
|
||||||
co_UserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi)
|
co_UserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi)
|
||||||
{
|
{
|
||||||
|
@ -4807,7 +4604,7 @@ NtUserDefSetText(HWND hWnd, PLARGE_STRING WindowText)
|
||||||
// In User32, these are called after: NotifyWinEvent EVENT_OBJECT_NAMECHANGE than
|
// In User32, these are called after: NotifyWinEvent EVENT_OBJECT_NAMECHANGE than
|
||||||
// RepaintButton, StaticRepaint, NtUserCallHwndLock HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK, etc.
|
// RepaintButton, StaticRepaint, NtUserCallHwndLock HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK, etc.
|
||||||
/* Send shell notifications */
|
/* Send shell notifications */
|
||||||
if (!IntGetOwner(Window) && !IntGetParent(Window))
|
if (!Window->spwndOwner && !IntGetParent(Window))
|
||||||
{
|
{
|
||||||
co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) hWnd);
|
co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) hWnd);
|
||||||
}
|
}
|
||||||
|
@ -4908,11 +4705,10 @@ IntShowOwnedPopups(PWINDOW_OBJECT OwnerWnd, BOOL fShow )
|
||||||
count++;
|
count++;
|
||||||
while (--count >= 0)
|
while (--count >= 0)
|
||||||
{
|
{
|
||||||
if (UserGetWindow( win_array[count], GW_OWNER ) != OwnerWnd->hSelf)
|
|
||||||
continue;
|
|
||||||
if (!(pWnd = UserGetWindowObject( win_array[count] )))
|
if (!(pWnd = UserGetWindowObject( win_array[count] )))
|
||||||
continue;
|
continue;
|
||||||
// if (pWnd == WND_OTHER_PROCESS) continue;
|
if (pWnd->spwndOwner != OwnerWnd)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (fShow)
|
if (fShow)
|
||||||
{
|
{
|
||||||
|
|
|
@ -151,7 +151,7 @@ co_WinPosActivateOtherWindow(PWINDOW_OBJECT Window)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If this is popup window, try to activate the owner first. */
|
/* If this is popup window, try to activate the owner first. */
|
||||||
if ((Wnd->style & WS_POPUP) && (WndTo = IntGetOwner(Window)))
|
if ((Wnd->style & WS_POPUP) && (WndTo = Window->spwndOwner))
|
||||||
{
|
{
|
||||||
WndTo = UserGetAncestor( WndTo, GA_ROOT );
|
WndTo = UserGetAncestor( WndTo, GA_ROOT );
|
||||||
if (can_activate_window(WndTo)) goto done;
|
if (can_activate_window(WndTo)) goto done;
|
||||||
|
@ -741,11 +741,15 @@ HWND FASTCALL
|
||||||
WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter)
|
WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter)
|
||||||
{
|
{
|
||||||
HWND *List = NULL;
|
HWND *List = NULL;
|
||||||
HWND Owner = UserGetWindow(hWnd, GW_OWNER);
|
HWND Owner;
|
||||||
LONG Style = UserGetWindowLong(hWnd, GWL_STYLE, FALSE);
|
LONG Style;
|
||||||
PWINDOW_OBJECT DesktopWindow, ChildObject;
|
PWINDOW_OBJECT Window ,DesktopWindow, ChildObject;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
Window = UserGetWindowObject(hWnd);
|
||||||
|
Owner = Window->spwndOwner ? Window->spwndOwner->hSelf : NULL;
|
||||||
|
Style = Window->Wnd->style;
|
||||||
|
|
||||||
if ((Style & WS_POPUP) && Owner)
|
if ((Style & WS_POPUP) && Owner)
|
||||||
{
|
{
|
||||||
/* Make sure this popup stays above the owner */
|
/* Make sure this popup stays above the owner */
|
||||||
|
@ -804,8 +808,7 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter)
|
||||||
if (!(Wnd = UserGetWindowObject(List[i])))
|
if (!(Wnd = UserGetWindowObject(List[i])))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((Wnd->Wnd->style & WS_POPUP) &&
|
if (Wnd->Wnd->style & WS_POPUP && Wnd->spwndOwner == Window)
|
||||||
UserGetWindow(List[i], GW_OWNER) == hWnd)
|
|
||||||
{
|
{
|
||||||
USER_REFERENCE_ENTRY Ref;
|
USER_REFERENCE_ENTRY Ref;
|
||||||
UserRefObjectCo(Wnd, &Ref);
|
UserRefObjectCo(Wnd, &Ref);
|
||||||
|
@ -958,7 +961,7 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWINDOW_OBJECT Window)
|
||||||
* itself.
|
* itself.
|
||||||
*/
|
*/
|
||||||
if ((WinPos->hwnd == WinPos->hwndInsertAfter) ||
|
if ((WinPos->hwnd == WinPos->hwndInsertAfter) ||
|
||||||
(WinPos->hwnd == UserGetWindow(WinPos->hwndInsertAfter, GW_HWNDNEXT)))
|
(WinPos->hwnd == InsAfterWnd->spwndNext->hSelf))
|
||||||
{
|
{
|
||||||
WinPos->flags |= SWP_NOZORDER;
|
WinPos->flags |= SWP_NOZORDER;
|
||||||
}
|
}
|
||||||
|
|
|
@ -684,7 +684,6 @@ NtGdiOffsetWindowOrgEx 4
|
||||||
#
|
#
|
||||||
NtUserBuildMenuItemList 4
|
NtUserBuildMenuItemList 4
|
||||||
NtUserCreateCursorIconHandle 2
|
NtUserCreateCursorIconHandle 2
|
||||||
NtUserGetClassLong 3
|
|
||||||
NtUserGetMenuDefaultItem 3
|
NtUserGetMenuDefaultItem 3
|
||||||
NtUserGetLastInputInfo 1
|
NtUserGetLastInputInfo 1
|
||||||
NtUserGetMinMaxInfo 3
|
NtUserGetMinMaxInfo 3
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue