[ros-diffs] [jimtabor] 45051: [Win32k] - More movement to WND with updates to related files. Removed unused code rewritten others. Review patch.
jimtabor at svn.reactos.org
jimtabor at svn.reactos.org
Tue Jan 12 06:25:23 CET 2010
- Previous message: [ros-diffs] [dreimer] 45050: Ok, last time I delete my built main tree while playing with clean in a branch! Now clean cleans the branch you are in!
- Next message: [ros-diffs] [sir_richard] 45052: Patch that fixes VMWare boot (and should fix QEMu/KVM boot on the testbot): [NTOS]: A trap can get us into a state where DS/ES are invalid, making any pointer dereference (on DS/ES segmented memory, not SS, the stack) crash (and probably double-fault). Therefore, we have to be careful to switch to a good DS/ES before touching the TrapFrame pointer, which we don't have in ESP like the ASM code, but in a DS/ES-segmented register. For V8086 traps we can switch to the good DS/ES immediately, but for other kinds of traps, we actually need to save the current (bad) segments first. So we save them on the stack now, then switch to the good ones, then store the stack values into the trap frame. This is what happens on a non-optimized (-O0) build. On an optimized build, the segments will end up in registers instead, which is fine too (they'll be direct values). The order of instructions is guaranteed since the segment macros are volatile. [NTOS]: The GPF and Invalid Opcode handlers are performance critical when talking about V8086 traps, because they control the main flow of execution during that mode (GPFs will be issued for any privileged instruction we need to emulate, and invalid opcode might be generated for BOPs). Because of this, we employ a fast entry/exit macro into V8086 mode since we can make certain assumptions. We detect, and use, such scenarios when the V8086 flag is enabled in EFLAGS. However, because we can land in a GPF handler with an invalid DS/ES, as some V8086 code could trample this during BIOS calls for example, we must make sure that we are on a valid DS/ES before dereferencing any pointer. We fixup DS/ES either in KiEnterTrap (for normal entry/exit) or, for V86, in KiEnterV86Trap. Notice the problem: we need to detect which of these to use early on but we can't touch the EFLAGS in the frame because DS/ES could be invalid. Thankfully SS is always guaranteed valid, so stack dereferences are game! We therefore read the EFLAGS here, in assembly, where we can touch ESP as we please. We save this in EDX, which will be used as the second argument for the FASTCALL C trap entry. When we make the fast V86 check, we use the parameter instead of the trap frame, leading us to using the correct trap entry function, which fixes up DS/ES and lets us go on our merry way... [NTOS]: Make appropriate changes to GENERATE_TRAP_HANDLERS macro. [NTOS]: Switch to using well-known NT trap handler names (hex-based, double-zeroed) instead of decimal-based trap handler names which are confusing. [NTOS]: Clean up some debug spew.
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: jimtabor
Date: Tue Jan 12 06:25:22 2010
New Revision: 45051
URL: http://svn.reactos.org/svn/reactos?rev=45051&view=rev
Log:
[Win32k]
- More movement to WND with updates to related files. Removed unused code rewritten others. Review patch.
Modified:
trunk/reactos/subsystems/win32/win32k/eng/engwindow.c
trunk/reactos/subsystems/win32/win32k/include/dce.h
trunk/reactos/subsystems/win32/win32k/include/engobjects.h
trunk/reactos/subsystems/win32/win32k/include/window.h
trunk/reactos/subsystems/win32/win32k/ntuser/caret.c
trunk/reactos/subsystems/win32/win32k/ntuser/focus.c
trunk/reactos/subsystems/win32/win32k/ntuser/hotkey.c
trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c
trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c
trunk/reactos/subsystems/win32/win32k/ntuser/timer.c
trunk/reactos/subsystems/win32/win32k/ntuser/windc.c
trunk/reactos/subsystems/win32/win32k/ntuser/window.c
trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c
Modified: trunk/reactos/subsystems/win32/win32k/eng/engwindow.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/eng/engwindow.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/eng/engwindow.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/eng/engwindow.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -16,26 +16,25 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* PURPOSE: GDI WNDOBJ Functions
- * FILE: subsys/win32k/eng/window.c
+ * FILE: subsystems/win32/win32k/eng/engwindow.c
* PROGRAMER: Gregor Anich
* REVISION HISTORY:
* 16/11/2004: Created
*/
/* TODO: Check how the WNDOBJ implementation should behave with a driver on windows.
-
- Simple! Use Prop's!
*/
#include <w32k.h>
#define NDEBUG
#include <debug.h>
+
+INT gcountPWO = 0;
/*
* Calls the WNDOBJCHANGEPROC of the given WNDOBJ
@@ -153,44 +152,41 @@
PWINDOW_OBJECT Window,
FLONG flChanged)
{
- PLIST_ENTRY CurrentEntry;
WNDGDI *Current;
+ HWND hWnd;
ASSERT_IRQL_LESS_OR_EQUAL(PASSIVE_LEVEL);
- CurrentEntry = Window->WndObjListHead.Flink;
- while (CurrentEntry != &Window->WndObjListHead)
- {
- Current = CONTAINING_RECORD(CurrentEntry, WNDGDI, ListEntry);
-
- if (Current->WndObj.pvConsumer != NULL)
- {
- /* Update the WNDOBJ */
- switch (flChanged)
- {
- case WOC_RGN_CLIENT:
- /* Update the clipobj and client rect of the WNDOBJ */
- IntEngWndUpdateClipObj(Current, Window);
- break;
-
- case WOC_DELETE:
- /* FIXME: Should the WNDOBJs be deleted by win32k or by the driver? */
- break;
- }
-
- /* Call the change proc */
- IntEngWndCallChangeProc(&Current->WndObj, flChanged);
-
- /* HACK: Send WOC_CHANGED after WOC_RGN_CLIENT */
- if (flChanged == WOC_RGN_CLIENT)
- {
- IntEngWndCallChangeProc(&Current->WndObj, WOC_CHANGED);
- }
-
- CurrentEntry = CurrentEntry->Flink;
- }
- }
-
+ hWnd = Window->hSelf; // pWnd->head.h;
+ Current = (WNDGDI *)IntGetProp(Window, AtomWndObj);
+
+ if ( gcountPWO &&
+ Current &&
+ Current->Hwnd == hWnd &&
+ Current->WndObj.pvConsumer != NULL )
+ {
+ /* Update the WNDOBJ */
+ switch (flChanged)
+ {
+ case WOC_RGN_CLIENT:
+ /* Update the clipobj and client rect of the WNDOBJ */
+ IntEngWndUpdateClipObj(Current, Window);
+ break;
+
+ case WOC_DELETE:
+ /* FIXME: Should the WNDOBJs be deleted by win32k or by the driver? */
+ break;
+ }
+
+ /* Call the change proc */
+ IntEngWndCallChangeProc(&Current->WndObj, flChanged);
+
+ /* HACK: Send WOC_CHANGED after WOC_RGN_CLIENT */
+ if (flChanged == WOC_RGN_CLIENT)
+ {
+ IntEngWndCallChangeProc(&Current->WndObj, WOC_CHANGED);
+ }
+ }
}
/*
@@ -254,7 +250,8 @@
WndObjInt->PixelFormat = iPixelFormat;
/* associate object with window */
- InsertTailList(&Window->WndObjListHead, &WndObjInt->ListEntry);
+ IntSetProp(Window, AtomWndObj, WndObjInt);
+ ++gcountPWO;
DPRINT("EngCreateWnd: SUCCESS!\n");
@@ -292,15 +289,15 @@
/* Get window object */
Window = UserGetWindowObject(WndObjInt->Hwnd);
if (Window == NULL)
- {
- DPRINT1("Warning: Couldnt get window object for WndObjInt->Hwnd!!!\n");
- RemoveEntryList(&WndObjInt->ListEntry);
- }
+ {
+ DPRINT1("Warning: Couldnt get window object for WndObjInt->Hwnd!!!\n");
+ }
else
- {
- /* Remove object from window */
- RemoveEntryList(&WndObjInt->ListEntry);
- }
+ {
+ /* Remove object from window */
+ IntRemoveProp(Window, AtomWndObj);
+ --gcountPWO;
+ }
if (!calledFromUser){
UserLeave();
Modified: trunk/reactos/subsystems/win32/win32k/include/dce.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/dce.h?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/dce.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/dce.h [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -28,11 +28,16 @@
LIST_ENTRY List;
HDC hDC;
HWND hwndCurrent;
- HWND hwndDC;
- HRGN hClipRgn;
+ PWND pwndOrg;
+ PWND pwndClip;
+ PWND pwndRedirect;
+ HRGN hrgnClip;
+ HRGN hrgnClipPublic;
+ HRGN hrgnSavedVis;
DWORD DCXFlags;
- PEPROCESS pProcess;
- HANDLE Self;
+ PTHREADINFO ptiOwner;
+ PPROCESSINFO ppiOwner;
+ struct _MONITOR* pMonitor;
} DCE; /* PDCE already declared at top of file */
/* internal DCX flags, see psdk/winuser.h for the rest */
@@ -52,7 +57,6 @@
BOOL FASTCALL DCE_InvalidateDCE(HWND, const PRECTL);
HWND FASTCALL IntWindowFromDC(HDC hDc);
PDCE FASTCALL DceFreeDCE(PDCE dce, BOOLEAN Force);
-void FASTCALL DceFreeWindowDCE(PWINDOW_OBJECT Window);
void FASTCALL DceEmptyCache(void);
VOID FASTCALL DceResetActiveDCEs(PWINDOW_OBJECT Window);
void FASTCALL DceFreeClassDCE(HDC);
Modified: trunk/reactos/subsystems/win32/win32k/include/engobjects.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/engobjects.h?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/engobjects.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/engobjects.h [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -89,7 +89,6 @@
typedef struct _WNDGDI {
WNDOBJ WndObj;
- LIST_ENTRY ListEntry;
HWND Hwnd;
CLIPOBJ *ClientClipObj;
WNDOBJCHANGEPROC ChangeProc;
Modified: trunk/reactos/subsystems/win32/win32k/include/window.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/window.h?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/window.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/window.h [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -14,6 +14,7 @@
#include <include/scroll.h>
extern ATOM AtomMessage;
+extern ATOM AtomWndObj; /* WNDOBJ list */
BOOL FASTCALL UserUpdateUiState(PWND Wnd, WPARAM wParam);
@@ -29,8 +30,6 @@
PTHREADINFO pti; // Use Wnd->head.pti
/* system menu handle. */
HMENU SystemMenu;
- /* Entry in the thread's list of windows. */
- LIST_ENTRY ListEntry;
/* Handle for the window. */
HWND hSelf; // Use Wnd->head.h
/* Window flags. */
@@ -42,19 +41,16 @@
struct _WINDOW_OBJECT* spwndChild;
struct _WINDOW_OBJECT* spwndNext;
struct _WINDOW_OBJECT* spwndPrev;
- /* Entry in the list of thread windows. */
- LIST_ENTRY ThreadListEntry;
/* Handle to the parent window. */
struct _WINDOW_OBJECT* spwndParent;
/* Handle to the owner window. */
HWND hOwner; // Use spwndOwner
- /* DC Entries (DCE) */
- PDCE Dce;
+
+
/* Scrollbar info */
PSBINFOEX pSBInfo; // convert to PSBINFO
- PETHREAD OwnerThread; // Use Wnd->head.pti->pEThread
- /* WNDOBJ list */
- LIST_ENTRY WndObjListHead; // Use Props
+ /* Entry in the list of thread windows. */
+ LIST_ENTRY ThreadListEntry;
} WINDOW_OBJECT; /* PWINDOW_OBJECT already declared at top of file */
/* Window flags. */
@@ -86,16 +82,16 @@
#define IntWndBelongsToThread(WndObj, W32Thread) \
- (((WndObj->OwnerThread && WndObj->OwnerThread->Tcb.Win32Thread)) && \
- (WndObj->OwnerThread->Tcb.Win32Thread == W32Thread))
+ (((WndObj->pti->pEThread && WndObj->pti->pEThread->Tcb.Win32Thread)) && \
+ (WndObj->pti->pEThread->Tcb.Win32Thread == W32Thread))
// ((WndObj->head.pti) && (WndObj->head.pti == W32Thread))
#define IntGetWndThreadId(WndObj) \
- WndObj->OwnerThread->Cid.UniqueThread
+ WndObj->pti->pEThread->Cid.UniqueThread
// WndObj->head.pti->pEThread->Cid.UniqueThread
#define IntGetWndProcessId(WndObj) \
- WndObj->OwnerThread->ThreadsProcess->UniqueProcessId
+ WndObj->pti->pEThread->ThreadsProcess->UniqueProcessId
// WndObj->head.pti->pEThread->ThreadsProcess->UniqueProcessId
BOOL FASTCALL
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/caret.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/caret.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/caret.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/caret.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -245,7 +245,7 @@
if (Window) ASSERT_REFS_CO(Window);
- if(Window && Window->OwnerThread != PsGetCurrentThread())
+ if(Window && Window->pti->pEThread != PsGetCurrentThread())
{
SetLastWin32Error(ERROR_ACCESS_DENIED);
return FALSE;
@@ -280,7 +280,7 @@
if (Window) ASSERT_REFS_CO(Window);
- if(Window && Window->OwnerThread != PsGetCurrentThread())
+ if(Window && Window->pti->pEThread != PsGetCurrentThread())
{
SetLastWin32Error(ERROR_ACCESS_DENIED);
return FALSE;
@@ -332,7 +332,7 @@
RETURN(FALSE);
}
- if(Window->OwnerThread != PsGetCurrentThread())
+ if(Window->pti->pEThread != PsGetCurrentThread())
{
SetLastWin32Error(ERROR_ACCESS_DENIED);
RETURN(FALSE);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/focus.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/focus.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/focus.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/focus.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -217,7 +217,7 @@
}
if (0 == (Wnd->style & WS_VISIBLE) &&
- Window->OwnerThread->ThreadsProcess != CsrProcess)
+ Window->pti->pEThread->ThreadsProcess != CsrProcess)
{
DPRINT("Failed - Invisible\n");
return FALSE;
@@ -339,7 +339,7 @@
{
Wnd = Window->Wnd;
if ((!(Wnd->style & WS_VISIBLE) &&
- Window->OwnerThread->ThreadsProcess != CsrProcess) ||
+ Window->pti->pEThread->ThreadsProcess != CsrProcess) ||
(Wnd->style & (WS_POPUP | WS_CHILD)) == WS_CHILD)
{
return ThreadQueue ? 0 : ThreadQueue->ActiveWindow;
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/hotkey.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/hotkey.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/hotkey.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/hotkey.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -16,8 +16,7 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* PURPOSE: HotKey support
@@ -182,7 +181,7 @@
{
RETURN( FALSE);
}
- HotKeyThread = Window->OwnerThread;
+ HotKeyThread = Window->pti->pEThread;
}
/* Check for existing hotkey */
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -191,6 +191,14 @@
Monitor->rcWork = Monitor->rcMonitor;
Monitor->cWndStack = 0;
+ Monitor->hrgnMonitor= NtGdiCreateRectRgn( Monitor->rcMonitor.left,
+ Monitor->rcMonitor.top,
+ Monitor->rcMonitor.right,
+ Monitor->rcMonitor.bottom );
+
+ // Replace with IntGdiSetRegeionOwner(Monitor->hrgnMonitor, GDI_OBJ_HMGR_PUBLIC);
+ GDIOBJ_SetOwnership(Monitor->hrgnMonitor, NULL);
+
if (gMonitorList == NULL)
{
DPRINT("Primary monitor is beeing attached\n");
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -20,6 +20,7 @@
ERESOURCE UserLock;
ATOM AtomMessage; // Window Message atom.
+ATOM AtomWndObj; // Window Object atom.
BOOL gbInitialized;
HINSTANCE hModClient = NULL;
BOOL ClientPfnInit = FALSE;
@@ -44,6 +45,8 @@
/* System Context Help Id Atom */
gpsi->atomContextHelpIdProp = IntAddGlobalAtom(L"SysCH", TRUE);
+
+ AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
return STATUS_SUCCESS;
}
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/timer.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/timer.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/timer.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/timer.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -199,7 +199,7 @@
if (!pTmr) return 0;
if (Window && (Type & TMRF_TIFROMWND))
- pTmr->pti = Window->OwnerThread->Tcb.Win32Thread;
+ pTmr->pti = Window->pti->pEThread->Tcb.Win32Thread;
else
{
if (Type & TMRF_RIT)
@@ -253,7 +253,7 @@
UINT uElapse,
TIMERPROC lpTimerFunc)
{
- if (Window && Window->OwnerThread->ThreadsProcess != PsGetCurrentProcess())
+ if (Window && Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
{
SetLastWin32Error(ERROR_ACCESS_DENIED);
return 0;
@@ -419,7 +419,7 @@
return 0;
}
- if (Window->OwnerThread->ThreadsProcess != PsGetCurrentProcess())
+ if (Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
{
DPRINT1("Trying to set timer for window in another process (shatter attack?)\n");
SetLastWin32Error(ERROR_ACCESS_DENIED);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/windc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/windc.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/windc.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/windc.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -89,8 +89,13 @@
}
pDce->hwndCurrent = (Window ? Window->hSelf : NULL);
- pDce->hClipRgn = NULL;
- pDce->pProcess = NULL;
+ pDce->pwndOrg = Wnd;
+ pDce->pwndClip = Wnd;
+ pDce->hrgnClip = NULL;
+ pDce->hrgnClipPublic = NULL;
+ pDce->hrgnSavedVis = NULL;
+ pDce->ptiOwner = NULL;
+ pDce->ppiOwner = NULL;
KeEnterCriticalRegion();
if (FirstDce == NULL)
@@ -105,8 +110,9 @@
DCU_SetDcUndeletable(pDce->hDC);
if (Type == DCE_WINDOW_DC || Type == DCE_CLASS_DC) //Window DCE have ownership.
- { // Process should already own it.
- pDce->pProcess = PsGetCurrentProcess();
+ {
+ pDce->ptiOwner = GetW32ThreadInfo();
+ pDce->ppiOwner = pDce->ptiOwner->ppi;
}
else
{
@@ -174,12 +180,12 @@
{
Dce->DCXFlags &= ~DCX_KEEPCLIPRGN;
}
- else if (Dce->hClipRgn != NULL)
- {
- GreDeleteObject(Dce->hClipRgn);
- }
-
- Dce->hClipRgn = NULL;
+ else if (Dce->hrgnClip != NULL)
+ {
+ GreDeleteObject(Dce->hrgnClip);
+ }
+
+ Dce->hrgnClip = NULL;
/* make it dirty so that the vis rgn gets recomputed next time */
Dce->DCXFlags |= DCX_DCEDIRTY;
@@ -225,7 +231,8 @@
DPRINT("Exit!!!!! DCX_CACHE!!!!!! hDC-> %x \n", dce->hDC);
if (!IntGdiSetDCOwnerEx( dce->hDC, GDI_OBJ_HMGR_NONE, FALSE))
return 0;
- dce->pProcess = NULL; // Reset ownership.
+ dce->ptiOwner = NULL; // Reset ownership.
+ dce->ppiOwner = NULL;
}
return 1; // Released!
}
@@ -282,9 +289,9 @@
noparent:
if (Flags & DCX_INTERSECTRGN)
{
- if(Dce->hClipRgn != NULL)
- {
- NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hClipRgn, RGN_AND);
+ if(Dce->hrgnClip != NULL)
+ {
+ NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hrgnClip, RGN_AND);
}
else
{
@@ -296,9 +303,9 @@
}
}
- if (Flags & DCX_EXCLUDERGN && Dce->hClipRgn != NULL)
- {
- NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hClipRgn, RGN_DIFF);
+ if (Flags & DCX_EXCLUDERGN && Dce->hrgnClip != NULL)
+ {
+ NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hrgnClip, RGN_DIFF);
}
Dce->DCXFlags &= ~DCX_DCEDIRTY;
@@ -495,7 +502,7 @@
DPRINT("Owned/Class DCE\n");
/* we should free dce->clip_rgn here, but Windows apparently doesn't */
Dce->DCXFlags &= ~(DCX_EXCLUDERGN | DCX_INTERSECTRGN);
- Dce->hClipRgn = NULL;
+ Dce->hrgnClip = NULL;
}
#if 1 /* FIXME */
@@ -524,7 +531,7 @@
}
#if 0
- if (NULL != Dce->hClipRgn)
+ if (NULL != Dce->hrgnClip)
{
DceDeleteClipRgn(Dce);
}
@@ -543,17 +550,17 @@
{
if (!(Flags & DCX_WINDOW))
{
- Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcClient);
+ Dce->hrgnClip = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcClient);
}
else
{
- Dce->hClipRgn = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcWindow);
+ Dce->hrgnClip = UnsafeIntCreateRectRgnIndirect(&Window->Wnd->rcWindow);
}
Dce->DCXFlags &= ~DCX_KEEPCLIPRGN;
}
else if (ClipRegion != NULL)
{
- Dce->hClipRgn = ClipRegion;
+ Dce->hrgnClip = ClipRegion;
}
DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin);
@@ -568,7 +575,8 @@
DPRINT("ENTER!!!!!! DCX_CACHE!!!!!! hDC-> %x\n", Dce->hDC);
// Need to set ownership so Sync dcattr will work.
IntGdiSetDCOwnerEx( Dce->hDC, GDI_OBJ_HMGR_POWNED, FALSE);
- Dce->pProcess = PsGetCurrentProcess(); // Set the temp owning process
+ Dce->ptiOwner = GetW32ThreadInfo(); // Set the temp owning
+ Dce->ppiOwner = Dce->ptiOwner->ppi;
}
return(Dce->hDC);
}
@@ -607,9 +615,9 @@
if (!Hit) IntGdiDeleteDC(pdce->hDC, TRUE);
- if (pdce->hClipRgn && ! (pdce->DCXFlags & DCX_KEEPCLIPRGN))
- {
- GreDeleteObject(pdce->hClipRgn);
+ if (pdce->hrgnClip && ! (pdce->DCXFlags & DCX_KEEPCLIPRGN))
+ {
+ GreDeleteObject(pdce->hrgnClip);
}
RemoveEntryList(&pdce->List);
@@ -624,73 +632,6 @@
ExFreePoolWithTag(pdce, TAG_PDCE);
return ret;
-}
-
-
-/***********************************************************************
- * DceFreeWindowDCE
- *
- * Remove owned DCE and reset unreleased cache DCEs.
- */
-void FASTCALL
-DceFreeWindowDCE(PWINDOW_OBJECT Window)
-{
- PDCE pDCE;
-
- pDCE = FirstDce;
- KeEnterCriticalRegion();
- do
- {
- if (!pDCE) break;
- if (pDCE->hwndCurrent == Window->hSelf)
- {
- if (!(pDCE->DCXFlags & DCX_CACHE)) /* owned or Class DCE*/
- {
- if (Window->Wnd->pcls->style & CS_CLASSDC ||
- Window->Wnd->style & CS_CLASSDC) /* Test Class first */
- {
- if (pDCE->DCXFlags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN)) /* Class DCE*/
- DceDeleteClipRgn(pDCE);
- // Update and reset Vis Rgn and clear the dirty bit.
- // Should release VisRgn than reset it to default.
- DceUpdateVisRgn(pDCE, Window, pDCE->DCXFlags);
- pDCE->DCXFlags = DCX_DCEEMPTY;
- pDCE->hwndCurrent = 0;
- }
- else if (Window->Wnd->pcls->style & CS_OWNDC ||
- Window->Wnd->style & CS_OWNDC) /* owned DCE*/
- {
- pDCE = DceFreeDCE(pDCE, FALSE);
- if (!pDCE) break;
- Window->Dce = NULL;
- continue;
- }
- else
- {
- ASSERT(FALSE);
- }
- }
- else
- {
- if (pDCE->DCXFlags & DCX_DCEBUSY) /* shared cache DCE */
- {
- /* FIXME: AFAICS we are doing the right thing here so
- * this should be a DPRINT. But this is best left as an ERR
- * because the 'application error' is likely to come from
- * another part of Wine (i.e. it's our fault after all).
- * We should change this to DPRINT when ReactOS is more stable
- * (for 1.0?).
- */
- DPRINT1("[%p] GetDC() without ReleaseDC()!\n", Window->hSelf);
- DceReleaseDC(pDCE, FALSE);
- }
- pDCE->DCXFlags |= DCX_DCEEMPTY;
- pDCE->hwndCurrent = 0;
- }
- }
- pDCE = (PDCE) pDCE->List.Flink;
- } while (pDCE != FirstDce);
- KeLeaveCriticalRegion();
}
void FASTCALL
@@ -789,9 +730,9 @@
NtGdiOffsetRgn(dc->rosdc.hClipRgn, DeltaX, DeltaY);
CLIPPING_UpdateGCRegion(dc);
}
- if (NULL != pDCE->hClipRgn)
+ if (NULL != pDCE->hrgnClip)
{
- NtGdiOffsetRgn(pDCE->hClipRgn, DeltaX, DeltaY);
+ NtGdiOffsetRgn(pDCE->hrgnClip, DeltaX, DeltaY);
}
}
DC_UnlockDc(dc);
@@ -869,29 +810,20 @@
HWND FASTCALL
UserGethWnd( HDC hdc, PWNDOBJ *pwndo)
{
- PWNDGDI pWndgdi = NULL;
- PWINDOW_OBJECT Wnd = NULL;
+ PWNDGDI pWndgdi;
+ PWINDOW_OBJECT Wnd;
HWND hWnd;
- BOOL Hit = FALSE;
- PLIST_ENTRY Entry;
+
hWnd = IntWindowFromDC(hdc);
if (hWnd && !(Wnd = UserGetWindowObject(hWnd)))
{
- KeEnterCriticalRegion();
- Entry = Wnd->WndObjListHead.Flink;
- while (Entry != &Wnd->WndObjListHead)
+ pWndgdi = (WNDGDI *)IntGetProp(Wnd, AtomWndObj);
+
+ if ( pWndgdi && pWndgdi->Hwnd == hWnd )
{
- pWndgdi = (PWNDGDI)Entry;
- if (pWndgdi->Hwnd == hWnd)
- {
- Hit = TRUE;
- break;
- }
- Entry = Entry->Flink;
+ if (pwndo) *pwndo = (PWNDOBJ)pWndgdi;
}
- if (pwndo && Hit) *pwndo = (PWNDOBJ)pWndgdi;
- KeLeaveCriticalRegion();
}
return hWnd;
}
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/window.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/window.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -478,7 +478,6 @@
Window->SystemMenu = (HMENU)0;
}
- DceFreeWindowDCE(Window); /* Always do this to catch orphaned DCs */
#if 0 /* FIXME */
WINPROC_FreeProc(Window->winproc, WIN_PROC_WINDOW);
@@ -1150,7 +1149,7 @@
// return NULL;
/* Window must belong to current process */
- if (Wnd->OwnerThread->ThreadsProcess != PsGetCurrentProcess())
+ if (Wnd->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
return NULL;
WndOldParent = Wnd->spwndParent;
@@ -1948,7 +1947,6 @@
}
}
- Window->OwnerThread = PsGetCurrentThread();
Window->spwndChild = NULL;
Window->spwndPrev = NULL;
Window->spwndNext = NULL;
@@ -1960,7 +1958,6 @@
Wnd->cbwndExtra = Wnd->pcls->cbwndExtra;
InitializeListHead(&Wnd->PropListHead);
- InitializeListHead(&Window->WndObjListHead);
if ( NULL != WindowName->Buffer && WindowName->Length > 0 )
{
@@ -2052,11 +2049,16 @@
InsertTailList (&pti->WindowListHead, &Window->ThreadListEntry);
/* Handle "CS_CLASSDC", it is tested first. */
- if ((Wnd->pcls->style & CS_CLASSDC) && !(Wnd->pcls->pdce)) // One DCE per class to have CLASS.
- Wnd->pcls->pdce = DceAllocDCE(Window, DCE_CLASS_DC);
- /* Allocate a DCE for this window. */
+ if ( (Wnd->pcls->style & CS_CLASSDC) && !(Wnd->pcls->pdce) )
+ { /* One DCE per class to have CLASS. */
+ Wnd->pcls->pdce = DceAllocDCE( Window, DCE_CLASS_DC );
+ }
else if ( Wnd->pcls->style & CS_OWNDC)
- Window->Dce = DceAllocDCE(Window, DCE_WINDOW_DC);
+ { /* Allocate a DCE for this window. */
+ PDCE pDce = DceAllocDCE(Window, DCE_WINDOW_DC);
+ if (!Wnd->pcls->pdce)
+ Wnd->pcls->pdce = pDce;
+ }
Pos.x = x;
Pos.y = y;
@@ -2107,7 +2109,7 @@
PRTL_USER_PROCESS_PARAMETERS ProcessParams;
BOOL CalculatedDefPosSize = FALSE;
- IntGetDesktopWorkArea(((PTHREADINFO)Window->OwnerThread->Tcb.Win32Thread)->Desktop, &WorkArea);
+ IntGetDesktopWorkArea(((PTHREADINFO)Window->pti->pEThread->Tcb.Win32Thread)->Desktop, &WorkArea);
rc = WorkArea;
ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters;
@@ -2624,7 +2626,7 @@
DPRINT("co_UserDestroyWindow \n");
/* Check for owner thread */
- if ( (Window->OwnerThread != PsGetCurrentThread()) ||
+ if ( (Window->pti->pEThread != PsGetCurrentThread()) ||
Wnd->head.pti != PsGetCurrentThreadWin32Thread() )
{
SetLastWin32Error(ERROR_ACCESS_DENIED);
@@ -3765,7 +3767,7 @@
* WndProc is only available to the owner process
*/
if (GWL_WNDPROC == Index
- && Window->OwnerThread->ThreadsProcess != PsGetCurrentProcess())
+ && Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
{
SetLastWin32Error(ERROR_ACCESS_DENIED);
return 0;
@@ -3886,7 +3888,7 @@
/*
* Remove extended window style bit WS_EX_TOPMOST for shell windows.
*/
- WindowStation = ((PTHREADINFO)Window->OwnerThread->Tcb.Win32Thread)->Desktop->WindowStation;
+ WindowStation = Window->pti->Desktop->WindowStation;
if(WindowStation)
{
if (hWnd == WindowStation->ShellWindow || hWnd == WindowStation->ShellListView)
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c?rev=45051&r1=45050&r2=45051&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c [iso-8859-1] Tue Jan 12 06:25:22 2010
@@ -16,8 +16,7 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* PURPOSE: Windows
@@ -120,7 +119,7 @@
if (!Wnd->Wnd) return FALSE;
style = Wnd->Wnd->style;
if (!(style & WS_VISIBLE) &&
- Wnd->OwnerThread->ThreadsProcess != CsrProcess) return FALSE;
+ Wnd->pti->pEThread->ThreadsProcess != CsrProcess) return FALSE;
if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return FALSE;
return !(style & WS_DISABLED);
}
@@ -905,7 +904,7 @@
* Only allow CSRSS to mess with the desktop window
*/
if (Window->hSelf == IntGetDesktopWindow() &&
- Window->OwnerThread->ThreadsProcess != PsGetCurrentProcess())
+ Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess())
{
return FALSE;
}
- Previous message: [ros-diffs] [dreimer] 45050: Ok, last time I delete my built main tree while playing with clean in a branch! Now clean cleans the branch you are in!
- Next message: [ros-diffs] [sir_richard] 45052: Patch that fixes VMWare boot (and should fix QEMu/KVM boot on the testbot): [NTOS]: A trap can get us into a state where DS/ES are invalid, making any pointer dereference (on DS/ES segmented memory, not SS, the stack) crash (and probably double-fault). Therefore, we have to be careful to switch to a good DS/ES before touching the TrapFrame pointer, which we don't have in ESP like the ASM code, but in a DS/ES-segmented register. For V8086 traps we can switch to the good DS/ES immediately, but for other kinds of traps, we actually need to save the current (bad) segments first. So we save them on the stack now, then switch to the good ones, then store the stack values into the trap frame. This is what happens on a non-optimized (-O0) build. On an optimized build, the segments will end up in registers instead, which is fine too (they'll be direct values). The order of instructions is guaranteed since the segment macros are volatile. [NTOS]: The GPF and Invalid Opcode handlers are performance critical when talking about V8086 traps, because they control the main flow of execution during that mode (GPFs will be issued for any privileged instruction we need to emulate, and invalid opcode might be generated for BOPs). Because of this, we employ a fast entry/exit macro into V8086 mode since we can make certain assumptions. We detect, and use, such scenarios when the V8086 flag is enabled in EFLAGS. However, because we can land in a GPF handler with an invalid DS/ES, as some V8086 code could trample this during BIOS calls for example, we must make sure that we are on a valid DS/ES before dereferencing any pointer. We fixup DS/ES either in KiEnterTrap (for normal entry/exit) or, for V86, in KiEnterV86Trap. Notice the problem: we need to detect which of these to use early on but we can't touch the EFLAGS in the frame because DS/ES could be invalid. Thankfully SS is always guaranteed valid, so stack dereferences are game! We therefore read the EFLAGS here, in assembly, where we can touch ESP as we please. We save this in EDX, which will be used as the second argument for the FASTCALL C trap entry. When we make the fast V86 check, we use the parameter instead of the trap frame, leading us to using the correct trap entry function, which fixes up DS/ES and lets us go on our merry way... [NTOS]: Make appropriate changes to GENERATE_TRAP_HANDLERS macro. [NTOS]: Switch to using well-known NT trap handler names (hex-based, double-zeroed) instead of decimal-based trap handler names which are confusing. [NTOS]: Clean up some debug spew.
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Ros-diffs
mailing list