- 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() \ #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)

View file

@ -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

View file

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

View file

@ -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;
} }

View file

@ -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;
} }
/* /*

View file

@ -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

View file

@ -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;
} }

View file

@ -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,

View file

@ -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 ***************/

View file

@ -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);

View file

@ -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(

View file

@ -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,

View file

@ -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)

View file

@ -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;
/* /*

View file

@ -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;

View file

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

View file

@ -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);
} }

View file

@ -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)
{ {

View file

@ -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;
} }

View file

@ -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