/** INCLUDES ******************************************************************/
-//#define GDI_DEBUG
+#define GDI_DEBUG
#include <w32k.h>
#define NDEBUG
break;
case GDI_OBJECT_TYPE_DC:
- DC_FreeDcAttr(hObject);
+// DC_FreeDcAttr(hObject);
break;
}
POBJ Object = NULL;
ULONG HandleType, HandleUpper;
+ GDIDBG_INITLOOPTRACE();
+
HandleIndex = GDI_HANDLE_GET_INDEX(hObj);
HandleType = GDI_HANDLE_GET_TYPE(hObj);
HandleUpper = GDI_HANDLE_GET_UPPER(hObj);
{
if (Object->Tid != Thread)
{
+ GDIDBG_TRACELOOP(hObj, Object->Tid, Thread);
+ GDIDBG_TRACECALLER();
+ GDIDBG_TRACELOCKER(GDI_HANDLE_GET_INDEX(hObj));
+ GDIDBG_TRACEALLOCATOR(GDI_HANDLE_GET_INDEX(hObj));
+
/* Unlock the handle table entry. */
(void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId);
/*
* The handle is currently locked, wait some time and try again.
*/
+ GDIDBG_TRACELOOP(hObj, PrevProcId, NULL);
DelayExecution();
continue;
return MappedView;
}
+/* Locks multiple objects at a time */
+VOID
+INTERNAL_CALL
+GDIOBJ_LockMultipleObjs(ULONG ulCount,
+ IN HGDIOBJ* ahObj,
+ OUT PGDIOBJ* apObj)
+{
+ UINT i;
+ HGDIOBJ hTmp ;
+ BOOL unsorted = TRUE;
+ /* We bubble-sort them */
+ while(unsorted)
+ {
+ unsorted = FALSE ;
+ for(i=0; i<ulCount - 1; i++)
+ {
+ /* The greatest the first */
+ if((ULONG_PTR)ahObj[i] < (ULONG_PTR)ahObj[i+1])
+ {
+ hTmp = ahObj[i];
+ ahObj[i]=ahObj[i+1];
+ ahObj[i+1] = hTmp;
+ unsorted = TRUE ;
+ }
+ }
+ }
+ /* Then we lock them */
+ for(i=0; i<ulCount; i++)
+ {
+ apObj[i]=GDIOBJ_LockObj(ahObj[i], GDI_OBJECT_TYPE_DONTCARE);
+ }
+}
+
+
/** PUBLIC FUNCTIONS **********************************************************/
BOOL
{
pDC = DC_LockDc ( hDC );
MmCopyFromCaller(&pDC->dcattr, pDC->pdcattr, sizeof(DC_ATTR));
+ DC_vFreeDcAttr(pDC);
DC_UnlockDc( pDC );
- DC_FreeDcAttr( hDC ); // Free the dcattr!
-
if (!DC_SetOwnership( hDC, NULL )) // This hDC is inaccessible!
return Ret;
}