Author: tkreuzer
Date: Sun May 6 11:51:57 2012
New Revision: 56525
URL: http://svn.reactos.org/svn/reactos?rev=56525&view=rev
Log:
[WIN32K]
Do not ASSERT that the object is not exclusively locked in GDIOBJ_vDereferenceObject. The idea behind this was to easily detect cases where someone would accidentally dereference an object, instead of unlocking it. But this function is used from other functions, that can definately deal with exclusively locked objects. Changing this would leat to code duplication / more complex code.
Forgetting to unlock an object will still be detected by the kernel, when returning to user mode, since APC would still be disabled.
Should fix failed assertion when running dx9 setup.
Modified:
trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c
Modified: trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c [iso-8859-1] Sun May 6 11:51:57 2012
@@ -476,9 +476,7 @@
{
ULONG cRefs, ulIndex;
- /* Must not be exclusively locked */
- ASSERT(pobj->cExclusiveLock == 0);
-
+ /* Log the event */
DBG_LOGEVENT(&pobj->slhLog, EVENT_DEREFERENCE, cRefs);
/* Check if the object has a handle */
@@ -489,10 +487,10 @@
/* Decrement reference count */
ASSERT((gpaulRefCount[ulIndex] & REF_MASK_COUNT) > 0);
- cRefs = InterlockedDecrement((LONG*)&gpaulRefCount[ulIndex]) & REF_MASK_INUSE;
+ cRefs = InterlockedDecrement((LONG*)&gpaulRefCount[ulIndex]);
/* Check if we reached 0 and handle bit is not set */
- if (cRefs == 0)
+ if ((cRefs & REF_MASK_INUSE) == 0)
{
/* Make sure it's ok to delete the object */
ASSERT(pobj->BaseFlags & BASEFLAG_READY_TO_DIE);
Author: tkreuzer
Date: Sat May 5 22:50:47 2012
New Revision: 56521
URL: http://svn.reactos.org/svn/reactos?rev=56521&view=rev
Log:
[WIN32K]
Fix regression of gdi32_winetest palette
Modified:
trunk/reactos/win32ss/gdi/ntgdi/dibobj.c
Modified: trunk/reactos/win32ss/gdi/ntgdi/dibobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dibobj.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] Sat May 5 22:50:47 2012
@@ -148,9 +148,12 @@
/* Loop all color indices in the DIB */
for (i = 0; i < cColors; i++)
{
- /* Get the RGB value from the DC palette, indexed by the DIB
- color table value */
- crColor = PALETTE_ulGetRGBColorFromIndex(ppalDC, pwColors[i]);
+ /* Get the palette index and handle wraparound when exceeding
+ the number of colors in the DC palette */
+ WORD wIndex = pwColors[i] % ppalDC->NumColors;
+
+ /* USe the RGB value from the DC palette */
+ crColor = PALETTE_ulGetRGBColorFromIndex(ppalDC, wIndex);
PALETTE_vSetRGBColorForIndex(ppal, i, crColor);
}
}
Author: tkreuzer
Date: Sat May 5 22:06:15 2012
New Revision: 56520
URL: http://svn.reactos.org/svn/reactos?rev=56520&view=rev
Log:
[WIN32K]
Someone passes iUsage == 2, so don't assert in that case, but ignore it as long as it's not supported.
Modified:
trunk/reactos/win32ss/gdi/ntgdi/dibobj.c
Modified: trunk/reactos/win32ss/gdi/ntgdi/dibobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dibobj.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] Sat May 5 22:06:15 2012
@@ -171,11 +171,11 @@
/* Mark the palette as a brush hack palette */
ppal->flFlags |= PAL_BRUSHHACK;
}
- else if (iUsage == 2)
- {
+// else if (iUsage == 2)
+// {
// FIXME: this one is undocumented
- ASSERT(FALSE);
- }
+// ASSERT(FALSE);
+// }
else // if (iUsage == DIB_RGB_COLORS)
{
/* The colors are an array of RGBQUAD values */
Author: tkreuzer
Date: Sat May 5 21:09:08 2012
New Revision: 56517
URL: http://svn.reactos.org/svn/reactos?rev=56517&view=rev
Log:
[WIN32K]
When dereferencing an object without a handle, don't check for the ready-to-die flag
Modified:
trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c
Modified: trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c [iso-8859-1] Sat May 5 21:09:08 2012
@@ -479,6 +479,8 @@
/* Must not be exclusively locked */
ASSERT(pobj->cExclusiveLock == 0);
+ DBG_LOGEVENT(&pobj->slhLog, EVENT_DEREFERENCE, cRefs);
+
/* Check if the object has a handle */
if (GDI_HANDLE_GET_INDEX(pobj->hHmgr))
{
@@ -492,6 +494,9 @@
/* Check if we reached 0 and handle bit is not set */
if (cRefs == 0)
{
+ /* Make sure it's ok to delete the object */
+ ASSERT(pobj->BaseFlags & BASEFLAG_READY_TO_DIE);
+
/* Check if the handle was process owned */
if (gpentHmgr[ulIndex].ObjectOwner.ulObj != GDI_OBJ_HMGR_PUBLIC &&
gpentHmgr[ulIndex].ObjectOwner.ulObj != GDI_OBJ_HMGR_NONE)
@@ -504,6 +509,9 @@
/* Push entry to the free list */
ENTRY_vPushFreeEntry(&gpentHmgr[ulIndex]);
+
+ /* Free the object */
+ GDIOBJ_vFreeObject(pobj);
}
}
else
@@ -511,18 +519,13 @@
/* Decrement the objects reference count */
ASSERT(pobj->ulShareCount > 0);
cRefs = InterlockedDecrement((LONG*)&pobj->ulShareCount);
- }
-
- DBG_LOGEVENT(&pobj->slhLog, EVENT_DEREFERENCE, cRefs);
-
- /* Check if we reached 0 */
- if (cRefs == 0)
- {
- /* Make sure it's ok to delete the object */
- ASSERT(pobj->BaseFlags & BASEFLAG_READY_TO_DIE);
-
- /* Free the object */
- GDIOBJ_vFreeObject(pobj);
+
+ /* Check if we reached 0 */
+ if (cRefs == 0)
+ {
+ /* Free the object */
+ GDIOBJ_vFreeObject(pobj);
+ }
}
}
Author: sir_richard
Date: Sat May 5 19:37:34 2012
New Revision: 56516
URL: http://svn.reactos.org/svn/reactos?rev=56516&view=rev
Log:
[NTOS]: Cleanup MiQueryAddressState.
Modified:
trunk/reactos/ntoskrnl/mm/ARM3/virtual.c
Modified: trunk/reactos/ntoskrnl/mm/ARM3/virtual.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/virtual.c…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/virtual.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/virtual.c [iso-8859-1] Sat May 5 19:37:34 2012
@@ -1308,7 +1308,7 @@
PMMPDE PointerPde;
MMPTE TempPte;
BOOLEAN DemandZeroPte = TRUE, ValidPte = FALSE;
- ULONG State = MEM_RESERVE, Protect = 0, LockChange;
+ ULONG State = MEM_RESERVE, Protect = 0;
ASSERT((Vad->StartingVpn <= ((ULONG_PTR)Va >> PAGE_SHIFT)) &&
(Vad->EndingVpn >= ((ULONG_PTR)Va >> PAGE_SHIFT)));
@@ -1322,31 +1322,23 @@
/* Return the next range */
*NextVa = (PVOID)((ULONG_PTR)Va + PAGE_SIZE);
- /* Loop to make sure the PDE is valid */
- do
- {
- /* Try again */
- LockChange = 0;
-
- /* Is the PDE empty? */
- if (!PointerPde->u.Long)
- {
- /* No address in this range used yet, move to the next PDE range */
- *NextVa = MiPdeToAddress(PointerPde + 1);
- break;
- }
-
- /* The PDE is not empty, but is it faulted in? */
- if (!PointerPde->u.Hard.Valid)
- {
- /* It isn't, go ahead and do the fault */
- LockChange = MiMakeSystemAddressValid(MiPdeToPte(PointerPde),
- TargetProcess);
- }
-
- /* Check if the PDE was faulted in, making the PTE readable */
- if (!LockChange) ValidPte = TRUE;
- } while (LockChange);
+ /* Is the PDE demand-zero? */
+ if (PointerPde->u.Long != 0)
+ {
+ /* It is not. Is it valid? */
+ if (PointerPde->u.Hard.Valid == 0)
+ {
+ /* Is isn't, fault it in */
+ PointerPte = MiPteToAddress(PointerPde);
+ MiMakeSystemAddressValid(PointerPte, TargetProcess);
+ ValidPte = TRUE;
+ }
+ }
+ else
+ {
+ /* It is, skip it and move to the next PDE */
+ *NextVa = MiPdeToAddress(PointerPde + 1);
+ }
/* Is it safe to try reading the PTE? */
if (ValidPte)
@@ -1355,36 +1347,52 @@
/* Capture the PTE */
TempPte = *PointerPte;
- if (TempPte.u.Long)
+ if (TempPte.u.Long != 0)
{
/* The PTE is valid, so it's not zeroed out */
DemandZeroPte = FALSE;
- /* Check if it's valid or has a valid protection mask */
- ASSERT(TempPte.u.Soft.Prototype == 0);
- if ((TempPte.u.Soft.Protection != MM_DECOMMIT) ||
- (TempPte.u.Hard.Valid == 1))
- {
- /* This means it's committed */
- State = MEM_COMMIT;
-
- /* Get protection state of this page */
- Protect = MiGetPageProtection(PointerPte);
- }
- else
+ /* Is it a decommited, invalid, or faulted PTE? */
+ if ((TempPte.u.Soft.Protection == MM_DECOMMIT) &&
+ (TempPte.u.Hard.Valid == 0) &&
+ ((TempPte.u.Soft.Prototype == 0) ||
+ (TempPte.u.Soft.PageFileHigh == MI_PTE_LOOKUP_NEEDED)))
{
/* Otherwise our defaults should hold */
ASSERT(Protect == 0);
ASSERT(State == MEM_RESERVE);
}
+ else
+ {
+ /* This means it's committed */
+ State = MEM_COMMIT;
+
+ /* Get protection state of this page */
+ Protect = MiGetPageProtection(PointerPte);
+
+ /* Check if this is an image-backed VAD */
+ if ((TempPte.u.Soft.Valid == 0) &&
+ (TempPte.u.Soft.Prototype == 1) &&
+ (Vad->u.VadFlags.PrivateMemory == 0) &&
+ (Vad->ControlArea))
+ {
+ DPRINT1("Not supported\n");
+ ASSERT(FALSE);
+ }
+ }
}
}
/* Check if this was a demand-zero PTE, since we need to find the state */
if (DemandZeroPte)
{
- /* Check if the VAD is for committed memory */
- if (Vad->u.VadFlags.MemCommit)
+ /* Check if this is private commited memory, or an image-backed VAD */
+ if ((Vad->u.VadFlags.PrivateMemory == 0) && (Vad->ControlArea))
+ {
+ DPRINT1("Not supported\n");
+ ASSERT(FALSE);
+ }
+ else if (Vad->u.VadFlags.MemCommit)
{
/* This is committed memory */
State = MEM_COMMIT;