- 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:
Giannis Adamopoulos 2010-06-03 16:12:43 +00:00
parent a101fb3029
commit 5ec9991072
20 changed files with 102 additions and 459 deletions

View file

@ -33,9 +33,6 @@
#define NtUserMsqClearWakeMask() \
NtUserCallNoParam(NOPARAM_ROUTINE_MSQCLEARWAKEMASK)
#define NtUserAnyPopup() \
(BOOL)NtUserCallNoParam(NOPARAM_ROUTINE_ANYPOPUP)
#define NtUserValidateRgn(hWnd, hRgn) \
(BOOL)NtUserCallTwoParam((DWORD_PTR)hWnd, (DWORD_PTR)hRgn, TWOPARAM_ROUTINE_VALIDATERGN)

View file

@ -45,13 +45,6 @@ PrivateCsrssManualGuiCheck(LONG Check)
NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK);
}
VOID
WINAPI
PrivateCsrssInitialized(VOID)
{
NtUserCallNoParam(NOPARAM_ROUTINE_CSRSS_INITIALIZED);
}
/*
* @implemented

View file

@ -750,7 +750,6 @@
; ROS specific exports
@ stdcall PrivateCsrssManualGuiCheck(long)
@ stdcall PrivateCsrssInitialized()
; Functions exported by Win Vista
@ stdcall SetProcessDPIAware()

View file

@ -423,22 +423,15 @@ GetClassLongA(HWND hWnd, int nIndex)
}
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);
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Wnd = NULL; /* Make sure we call NtUserGetClassLong */
Ret = 0;
}
_SEH2_END;
if (Wnd == NULL)
Ret = NtUserGetClassLong(hWnd, nIndex, TRUE);
return Ret;
}
@ -534,22 +527,14 @@ GetClassLongW ( HWND hWnd, int nIndex )
}
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);
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Wnd = NULL; /* Make sure we call NtUserGetClassLong */
}
_SEH2_END;
if (Wnd == NULL)
Ret = NtUserGetClassLong(hWnd, nIndex, FALSE);
return Ret;
}
@ -617,18 +602,28 @@ GetClassNameW(
WORD
WINAPI
GetClassWord(
HWND hWnd,
int nIndex)
/*
* NOTE: Obsoleted in 32-bit windows
*/
HWND hwnd,
int offset)
{
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 (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;
}

View file

@ -1030,16 +1030,16 @@ GetParent(HWND hWnd)
_SEH2_TRY
{
WndParent = NULL;
if (Wnd->style & WS_CHILD)
{
if (Wnd->spwndParent != NULL)
WndParent = DesktopPtrToUser(Wnd->spwndParent);
}
else if (Wnd->style & WS_POPUP)
if (Wnd->style & WS_POPUP)
{
if (Wnd->spwndOwner != NULL)
WndParent = DesktopPtrToUser(Wnd->spwndOwner);
}
else if (Wnd->style & WS_CHILD)
{
if (Wnd->spwndParent != NULL)
WndParent = DesktopPtrToUser(Wnd->spwndParent);
}
if (WndParent != NULL)
Ret = UserHMGetHandle(WndParent);
@ -1464,7 +1464,7 @@ BOOL WINAPI
IsChild(HWND hWndParent,
HWND hWnd)
{
PWND WndParent, Wnd;
PWND WndParent, DesktopWnd, Wnd;
BOOL Ret = FALSE;
WndParent = ValidateHwnd(hWndParent);
@ -1474,6 +1474,10 @@ IsChild(HWND hWndParent,
if (!Wnd)
return FALSE;
DesktopWnd = GetThreadDesktopWnd();
if (!DesktopWnd)
return FALSE;
_SEH2_TRY
{
while (Wnd != NULL)
@ -1481,6 +1485,10 @@ IsChild(HWND hWndParent,
if (Wnd->spwndParent != NULL)
{
Wnd = DesktopPtrToUser(Wnd->spwndParent);
if(Wnd == DesktopWnd)
Wnd = NULL;
if (Wnd == WndParent)
{
Ret = TRUE;
@ -2062,7 +2070,18 @@ ScrollWindowEx(HWND hWnd,
BOOL WINAPI
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;
}
/*

View file

@ -3135,7 +3135,6 @@ typedef struct tagKMDDELPARAM
#define NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO 0xffff0005
#define NOPARAM_ROUTINE_ANYPOPUP 0xffff0006
#define NOPARAM_ROUTINE_CSRSS_INITIALIZED 0xffff0007
#define ONEPARAM_ROUTINE_CSRSS_GUICHECK 0xffff0008
#define ONEPARAM_ROUTINE_SWITCHCARETSHOWING 0xfffe0008
#define ONEPARAM_ROUTINE_ISWINDOWINDESTROY 0xfffe000c

View file

@ -13,7 +13,6 @@
/* Not defined in any header file */
extern VOID WINAPI PrivateCsrssManualGuiCheck(LONG Check);
extern VOID WINAPI PrivateCsrssInitialized();
extern VOID WINAPI InitializeAppSwitchHook();
/* GLOBALS *******************************************************************/
@ -111,8 +110,6 @@ Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
static BOOL WINAPI
Win32CsrInitComplete(void)
{
PrivateCsrssInitialized();
return TRUE;
}

View file

@ -65,11 +65,6 @@ UserUnregisterClass(IN PUNICODE_STRING ClassName,
IN HINSTANCE hInstance,
OUT PCLSMENUNAME pClassMenuName);
ULONG_PTR
UserGetClassLongPtr(IN PCLS Class,
IN INT Index,
IN BOOL Ansi);
RTL_ATOM
IntGetClassAtom(IN PUNICODE_STRING ClassName,
IN HINSTANCE hInstance OPTIONAL,

View file

@ -122,15 +122,11 @@ co_DestroyThreadWindows(struct _ETHREAD *Thread);
HWND FASTCALL UserGetShellWindow(VOID);
HWND FASTCALL UserGetWindow(HWND hWnd, UINT Relationship);
HDC FASTCALL
UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags);
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);
/*************** MENU.C ***************/

View file

@ -37,11 +37,8 @@ typedef struct _WINDOW_OBJECT
struct _WINDOW_OBJECT* spwndChild;
struct _WINDOW_OBJECT* spwndNext;
struct _WINDOW_OBJECT* spwndPrev;
/* Handle to the parent window. */
struct _WINDOW_OBJECT* spwndParent;
/* Handle to the owner window. */
HWND hOwner; // Use spwndOwner
struct _WINDOW_OBJECT* spwndOwner;
/* Scrollbar info */
PSBINFOEX pSBInfo; // convert to PSBINFO
@ -125,10 +122,6 @@ IntGetAncestor(PWINDOW_OBJECT Wnd, UINT Type);
PWINDOW_OBJECT FASTCALL
IntGetParent(PWINDOW_OBJECT Wnd);
PWINDOW_OBJECT FASTCALL
IntGetOwner(PWINDOW_OBJECT Wnd);
INT FASTCALL
IntGetWindowRgn(PWINDOW_OBJECT Window, HRGN hRgn);
@ -141,9 +134,6 @@ IntGetWindowInfo(PWINDOW_OBJECT WindowObject, PWINDOWINFO pwi);
VOID FASTCALL
IntGetWindowBorderMeasures(PWINDOW_OBJECT WindowObject, UINT *cx, UINT *cy);
BOOL FASTCALL
IntAnyPopup(VOID);
BOOL FASTCALL
IntIsWindowInDestroy(PWINDOW_OBJECT Window);

View file

@ -185,9 +185,7 @@ UserGetCPD(
Example:
If pWnd is created from Ansi and lpfnXxyz is assumed to be Ansi, caller
will ask for Unicode Proc return Proc or CallProcData handle.
This function should replaced NtUserGetClassLong and NtUserGetWindowLong.
*/
*/
ULONG_PTR
APIENTRY
NtUserGetCPD(

View file

@ -1515,96 +1515,6 @@ UserGetClassName(IN PCLS Class,
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
IntSetClassMenuName(IN PCLS Class,
IN PUNICODE_STRING MenuName)
@ -2190,45 +2100,6 @@ InvalidParameter:
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
NtUserSetClassLong(HWND hWnd,
INT Offset,

View file

@ -129,7 +129,7 @@ IntDefWindowProc(
{
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 (wParam)

View file

@ -1423,7 +1423,7 @@ NtUserPaintDesktop(HDC hDC)
RETURN(FALSE);
}
DesktopBrush = (HBRUSH)UserGetClassLongPtr(WndDesktop->Wnd->pcls, GCL_HBRBACKGROUND, FALSE);
DesktopBrush = (HBRUSH)WndDesktop->Wnd->pcls->hbrBackground;
/*

View file

@ -51,12 +51,14 @@ IntGetThreadFocusWindow(VOID)
VOID FASTCALL
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_ACTIVATE,
MAKEWPARAM(WA_INACTIVE, UserGetWindowLong(hWndPrev, GWL_STYLE, FALSE) & WS_MINIMIZE),
(LPARAM)hWnd);
MAKEWPARAM(WA_INACTIVE, WndPrev->Wnd->style & WS_MINIMIZE),
(LPARAM)hWnd);
}
}
@ -83,11 +85,11 @@ co_IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate)
0);
}
if (UserGetWindow(hWnd, GW_HWNDPREV) != NULL)
if (Window->spwndPrev != NULL)
co_WinPosSetWindowPos(Window, HWND_TOP, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSENDCHANGING);
if (!IntGetOwner(Window) && !IntGetParent(Window))
if (!Window->spwndOwner && !IntGetParent(Window))
{
co_IntShellHookNotify(HSHELL_WINDOWACTIVATED, (LPARAM) hWnd);
}
@ -153,7 +155,7 @@ co_IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate)
/* FIXME: WA_CLICKACTIVE */
co_IntSendMessageNoWait(hWnd, WM_ACTIVATE,
MAKEWPARAM(MouseActivate ? WA_CLICKACTIVE : WA_ACTIVE,
UserGetWindowLong(hWnd, GWL_STYLE, FALSE) & WS_MINIMIZE),
Window->Wnd->style & WS_MINIMIZE),
(LPARAM)hWndPrev);
}
}
@ -184,7 +186,7 @@ IntFindChildWindowToOwner(PWINDOW_OBJECT Root, PWINDOW_OBJECT Owner)
for(Child = Root->spwndChild; Child; Child = Child->spwndNext)
{
OwnerWnd = UserGetWindowObject(Child->hOwner);
OwnerWnd = Child->spwndOwner;
if(!OwnerWnd)
continue;

View file

@ -124,6 +124,8 @@ UserInitialize(
NtUserUpdatePerUserSystemParameters(0, TRUE);
CsrInit();
return STATUS_SUCCESS;
}

View file

@ -110,14 +110,6 @@ NtUserCallNoParam(DWORD Routine)
Result = (DWORD_PTR)MsqGetMessageExtraInfo();
break;
case NOPARAM_ROUTINE_ANYPOPUP:
Result = (DWORD_PTR)IntAnyPopup();
break;
case NOPARAM_ROUTINE_CSRSS_INITIALIZED:
Result = (DWORD_PTR)CsrInit();
break;
case NOPARAM_ROUTINE_MSQCLEARWAKEMASK:
RETURN( (DWORD_PTR)IntMsqClearWakeMask());
@ -525,7 +517,7 @@ NtUserCallHwndLock(
SWP_NOZORDER|
SWP_NOACTIVATE|
SWP_FRAMECHANGED );
if (!IntGetOwner(Window) && !IntGetParent(Window))
if (!Window->spwndOwner && !IntGetParent(Window))
{
co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) hWnd);
}

View file

@ -96,6 +96,8 @@ PWINDOW_OBJECT FASTCALL IntGetWindowObject(HWND hWnd)
ASSERT(Window->head.cLockObj >= 0);
Window->head.cLockObj++;
ASSERT(Window->Wnd);
}
return Window;
}
@ -130,6 +132,9 @@ PWINDOW_OBJECT FASTCALL UserGetWindowObject(HWND hWnd)
}
ASSERT(Window->head.cLockObj >= 0);
ASSERT(Window->Wnd);
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
IntGetParent(PWINDOW_OBJECT Wnd)
{
if (!Wnd->Wnd) return NULL;
if (Wnd->Wnd->style & WS_POPUP)
{
return UserGetWindowObject(Wnd->hOwner);
return Wnd->spwndOwner;
}
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
*
@ -265,7 +248,7 @@ static void IntSendDestroyMsg(HWND hWnd)
// USER_REFERENCE_ENTRY Ref;
// UserRefObjectCo(Window, &Ref);
if (!IntGetOwner(Window) && !IntGetParent(Window))
if (!Window->spwndOwner && !IntGetParent(Window))
{
co_IntShellHookNotify(HSHELL_WINDOWDESTROYED, (LPARAM) hWnd);
}
@ -1091,26 +1074,19 @@ IntSetOwner(HWND hWnd, HWND hWndNewOwner)
if(!Wnd)
return NULL;
WndOldOwner = IntGetWindowObject(Wnd->hOwner);
if (WndOldOwner)
{
ret = WndOldOwner->hSelf;
UserDereferenceObject(WndOldOwner);
}
else
{
ret = 0;
}
WndOldOwner = Wnd->spwndOwner;
ret = WndOldOwner ? WndOldOwner->hSelf : 0;
if((WndNewOwner = UserGetWindowObject(hWndNewOwner)))
{
Wnd->hOwner = hWndNewOwner;
Wnd->Wnd->spwndOwner = WndNewOwner->Wnd;
Wnd->spwndOwner= WndNewOwner;
Wnd->Wnd->spwndOwner = WndNewOwner->Wnd;
}
else
{
Wnd->hOwner = NULL;
Wnd->Wnd->spwndOwner = NULL;
Wnd->spwndOwner = NULL;
Wnd->Wnd->spwndOwner = NULL;
}
UserDereferenceObject(Wnd);
@ -1279,31 +1255,6 @@ IntUnlinkWindow(PWINDOW_OBJECT Wnd)
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
IntIsWindowInDestroy(PWINDOW_OBJECT Window)
{
@ -1511,7 +1462,7 @@ NtUserBuildHwndList(
Window = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry);
ASSERT(Window);
if(bChildren || Window->hOwner != NULL)
if(bChildren || Window->spwndOwner != NULL)
{
if(dwCount < *pBufSize && pWnd)
{
@ -1737,7 +1688,7 @@ PWINDOW_OBJECT FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
Window->pti = pti;
Window->hSelf = hWnd;
Window->spwndParent = ParentWindow;
Window->hOwner = OwnerWindow ? OwnerWindow->hSelf : NULL;
Window->spwndOwner = OwnerWindow;
Wnd->head.h = hWnd;
Wnd->head.pti = pti;
@ -2560,7 +2511,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window)
Child = UserGetWindowObject(*ChildHandle);
if (Child == NULL)
continue;
if (Child->hOwner != Window->hSelf)
if (Child->spwndOwner != Window)
{
continue;
}
@ -2576,9 +2527,9 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window)
continue;
}
if (Child->hOwner != NULL)
if (Child->spwndOwner != NULL)
{
Child->hOwner = NULL;
Child->spwndOwner = NULL;
Child->Wnd->spwndOwner = NULL;
}
@ -3041,9 +2992,6 @@ PWINDOW_OBJECT FASTCALL UserGetAncestor(PWINDOW_OBJECT Wnd, UINT Type)
break;
}
//temp hack
// UserDereferenceObject(Parent);
WndAncestor = Parent;
}
break;
@ -3374,7 +3322,7 @@ BOOL APIENTRY
NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView)
{
PWINSTATION_OBJECT WinStaObject;
PWINDOW_OBJECT WndShell;
PWINDOW_OBJECT WndShell, WndListView;
DECLARE_RETURN(BOOL);
USER_REFERENCE_ENTRY Ref;
NTSTATUS Status;
@ -3388,6 +3336,11 @@ NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView)
RETURN(FALSE);
}
if(!(WndListView = UserGetWindowObject(hwndListView)))
{
RETURN(FALSE);
}
Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
KernelMode,
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);
#endif
if (UserGetWindowLong(hwndListView, GWL_EXSTYLE, FALSE) & WS_EX_TOPMOST)
if (WndListView->Wnd->ExStyle & WS_EX_TOPMOST)
{
ObDereferenceObject(WinStaObject);
RETURN( FALSE);
}
}
if (UserGetWindowLong(hwndShell, GWL_EXSTYLE, FALSE) & WS_EX_TOPMOST)
if (WndShell->Wnd->ExStyle & WS_EX_TOPMOST)
{
ObDereferenceObject(WinStaObject);
RETURN( FALSE);
@ -3553,162 +3506,6 @@ 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
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
// RepaintButton, StaticRepaint, NtUserCallHwndLock HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK, etc.
/* Send shell notifications */
if (!IntGetOwner(Window) && !IntGetParent(Window))
if (!Window->spwndOwner && !IntGetParent(Window))
{
co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) hWnd);
}
@ -4908,11 +4705,10 @@ IntShowOwnedPopups(PWINDOW_OBJECT OwnerWnd, BOOL fShow )
count++;
while (--count >= 0)
{
if (UserGetWindow( win_array[count], GW_OWNER ) != OwnerWnd->hSelf)
continue;
if (!(pWnd = UserGetWindowObject( win_array[count] )))
continue;
// if (pWnd == WND_OTHER_PROCESS) continue;
if (pWnd->spwndOwner != OwnerWnd)
continue;
if (fShow)
{

View file

@ -151,7 +151,7 @@ co_WinPosActivateOtherWindow(PWINDOW_OBJECT Window)
}
/* 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 );
if (can_activate_window(WndTo)) goto done;
@ -741,11 +741,15 @@ HWND FASTCALL
WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter)
{
HWND *List = NULL;
HWND Owner = UserGetWindow(hWnd, GW_OWNER);
LONG Style = UserGetWindowLong(hWnd, GWL_STYLE, FALSE);
PWINDOW_OBJECT DesktopWindow, ChildObject;
HWND Owner;
LONG Style;
PWINDOW_OBJECT Window ,DesktopWindow, ChildObject;
int i;
Window = UserGetWindowObject(hWnd);
Owner = Window->spwndOwner ? Window->spwndOwner->hSelf : NULL;
Style = Window->Wnd->style;
if ((Style & WS_POPUP) && Owner)
{
/* Make sure this popup stays above the owner */
@ -804,8 +808,7 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter)
if (!(Wnd = UserGetWindowObject(List[i])))
continue;
if ((Wnd->Wnd->style & WS_POPUP) &&
UserGetWindow(List[i], GW_OWNER) == hWnd)
if (Wnd->Wnd->style & WS_POPUP && Wnd->spwndOwner == Window)
{
USER_REFERENCE_ENTRY Ref;
UserRefObjectCo(Wnd, &Ref);
@ -958,7 +961,7 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWINDOW_OBJECT Window)
* itself.
*/
if ((WinPos->hwnd == WinPos->hwndInsertAfter) ||
(WinPos->hwnd == UserGetWindow(WinPos->hwndInsertAfter, GW_HWNDNEXT)))
(WinPos->hwnd == InsAfterWnd->spwndNext->hSelf))
{
WinPos->flags |= SWP_NOZORDER;
}

View file

@ -684,7 +684,6 @@ NtGdiOffsetWindowOrgEx 4
#
NtUserBuildMenuItemList 4
NtUserCreateCursorIconHandle 2
NtUserGetClassLong 3
NtUserGetMenuDefaultItem 3
NtUserGetLastInputInfo 1
NtUserGetMinMaxInfo 3