- Rename GDIOBJ_AllocObj to GDIOBJ_allocObjWithHandle and make it return a pointer to a locked object.c

- Implement GDIOBJ_AllocObjDepricated as a wrapper for those functions that currently still need the old way of allocation. Will be gone soon
- Implement GDIOBJ_AllocObj that only allocates a memory object without a handle
- Rename GDIOBJ_FreeObject to GDIOBJ_FreeObjByHandle
- Implement GDIOBJ_FreeObj that only frees the memory object
- Rename all XXX_Alloc and XXX_Free functions accordingly
- Fix NtGdiCreateClientObject and NtGdiDeleteClientObject
- Reformat TextIntCreateFontIndirect
- NtGdiHfontCreate: reformat and MmCopyFromCaller -> SEH

svn path=/trunk/; revision=32721
This commit is contained in:
Timo Kreuzer 2008-03-19 00:56:40 +00:00
parent 835306e6f4
commit 3a8626a802
19 changed files with 324 additions and 272 deletions

View file

@ -82,7 +82,7 @@ EngDeletePalette(IN HPALETTE Palette)
{ {
GDIOBJ_SetOwnership(Palette, PsGetCurrentProcess()); GDIOBJ_SetOwnership(Palette, PsGetCurrentProcess());
return PALETTE_FreePalette(Palette); return PALETTE_FreePaletteByHandle(Palette);
} }
/* /*

View file

@ -264,7 +264,7 @@ IntCreateBitmap(IN SIZEL Size,
if (Format == 0) if (Format == 0)
return 0; return 0;
NewBitmap = BITMAPOBJ_AllocBitmap(); NewBitmap = BITMAPOBJ_AllocBitmapDepricated();
if (NewBitmap == NULL) if (NewBitmap == NULL)
return 0; return 0;
@ -272,7 +272,7 @@ IntCreateBitmap(IN SIZEL Size,
if (! BITMAPOBJ_InitBitsLock(BitmapObj)) if (! BITMAPOBJ_InitBitsLock(BitmapObj))
{ {
BITMAPOBJ_UnlockBitmap(BitmapObj); BITMAPOBJ_UnlockBitmap(BitmapObj);
BITMAPOBJ_FreeBitmap(NewBitmap); BITMAPOBJ_FreeBitmapByHandle(NewBitmap);
return 0; return 0;
} }
SurfObj = &BitmapObj->SurfObj; SurfObj = &BitmapObj->SurfObj;
@ -325,7 +325,7 @@ IntCreateBitmap(IN SIZEL Size,
if (SurfObj->pvBits == NULL) if (SurfObj->pvBits == NULL)
{ {
BITMAPOBJ_UnlockBitmap(BitmapObj); BITMAPOBJ_UnlockBitmap(BitmapObj);
BITMAPOBJ_FreeBitmap(NewBitmap); BITMAPOBJ_FreeBitmapByHandle(NewBitmap);
return 0; return 0;
} }
} }
@ -396,7 +396,7 @@ EngCreateDeviceSurface(IN DHSURF dhsurf,
SURFOBJ *SurfObj; SURFOBJ *SurfObj;
BITMAPOBJ *BitmapObj; BITMAPOBJ *BitmapObj;
NewSurface = (HSURF)BITMAPOBJ_AllocBitmap(); NewSurface = (HSURF)BITMAPOBJ_AllocBitmapDepricated();
if (NewSurface == NULL) if (NewSurface == NULL)
return 0; return 0;
@ -406,7 +406,7 @@ EngCreateDeviceSurface(IN DHSURF dhsurf,
if (! BITMAPOBJ_InitBitsLock(BitmapObj)) if (! BITMAPOBJ_InitBitsLock(BitmapObj))
{ {
BITMAPOBJ_UnlockBitmap(BitmapObj); BITMAPOBJ_UnlockBitmap(BitmapObj);
BITMAPOBJ_FreeBitmap(NewSurface); BITMAPOBJ_FreeBitmapByHandle(NewSurface);
return 0; return 0;
} }
SurfObj = &BitmapObj->SurfObj; SurfObj = &BitmapObj->SurfObj;
@ -513,7 +513,7 @@ BOOL STDCALL
EngDeleteSurface(IN HSURF Surface) EngDeleteSurface(IN HSURF Surface)
{ {
GDIOBJ_SetOwnership(Surface, PsGetCurrentProcess()); GDIOBJ_SetOwnership(Surface, PsGetCurrentProcess());
BITMAPOBJ_FreeBitmap(Surface); BITMAPOBJ_FreeBitmapByHandle(Surface);
return TRUE; return TRUE;
} }

View file

@ -26,10 +26,12 @@ typedef struct _BITMAPOBJ
/* Internal interface */ /* Internal interface */
#define BITMAPOBJ_AllocBitmap() \ #define BITMAPOBJ_AllocBitmap() ((PBITMAPOBJ) GDIOBJ_AllocObj(GDIObjType_SURF_TYPE))
((HBITMAP) GDIOBJ_AllocObj (GDI_OBJECT_TYPE_BITMAP)) #define BITMAPOBJ_AllocBitmapWithHandle() ((PBITMAPOBJ) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP))
#define BITMAPOBJ_FreeBitmap(hBMObj) \ #define BITMAPOBJ_AllocBitmapDepricated() ((HBITMAP) GDIOBJ_AllocObjDepricated(GDI_OBJECT_TYPE_BITMAP))
GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP) #define BITMAPOBJ_FreeBitmap(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_SURF_TYPE)
#define BITMAPOBJ_FreeBitmapByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP)
/* NOTE: Use shared locks! */ /* NOTE: Use shared locks! */
#define BITMAPOBJ_LockBitmap(hBMObj) \ #define BITMAPOBJ_LockBitmap(hBMObj) \
((PBITMAPOBJ) GDIOBJ_ShareLockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP)) ((PBITMAPOBJ) GDIOBJ_ShareLockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP))

View file

@ -72,8 +72,11 @@ typedef struct
#define GDIBRUSH_IS_MASKING 0x8000 /* Pattern bitmap is used as transparent mask (?) */ #define GDIBRUSH_IS_MASKING 0x8000 /* Pattern bitmap is used as transparent mask (?) */
#define GDIBRUSH_CACHED_IS_SOLID 0x80000000 #define GDIBRUSH_CACHED_IS_SOLID 0x80000000
#define BRUSHOBJ_AllocBrush() ((HBRUSH) GDIOBJ_AllocObj (GDI_OBJECT_TYPE_BRUSH)) #define BRUSHOBJ_AllocBrush() ((PGDIBRUSHOBJ) GDIOBJ_AllocObj(GDIObjType_BRUSH_TYPE))
#define BRUSHOBJ_FreeBrush(hBrush) GDIOBJ_FreeObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH) #define BRUSHOBJ_AllocBrushWithHandle() ((PGDIBRUSHOBJ) GDIOBJ_AllocObjWithHandle (GDI_OBJECT_TYPE_BRUSH))
#define BRUSHOBJ_AllocBrushDepricated() ((HBRUSH) GDIOBJ_AllocObjDepricated (GDI_OBJECT_TYPE_BRUSH))
#define BRUSHOBJ_FreeBrush(pBrush) GDIOBJ_FreeObj((POBJ)pBrush, GDIObjType_BRUSH_TYPE)
#define BRUSHOBJ_FreeBrushByHandle(hBrush) GDIOBJ_FreeObjByHandle((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH)
#define BRUSHOBJ_LockBrush(hBrush) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH)) #define BRUSHOBJ_LockBrush(hBrush) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH))
#define BRUSHOBJ_UnlockBrush(pBrush) GDIOBJ_UnlockObjByPtr((POBJ)pBrush) #define BRUSHOBJ_UnlockBrush(pBrush) GDIOBJ_UnlockObjByPtr((POBJ)pBrush)

View file

@ -46,6 +46,11 @@ typedef struct _BASEOBJECT
PW32THREAD Tid; PW32THREAD Tid;
} BASEOBJECT, *POBJ; } BASEOBJECT, *POBJ;
enum BASEFLAGS
{
BASEFLAG_LOOKASIDE = 0x80
};
BOOL INTERNAL_CALL GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle); BOOL INTERNAL_CALL GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle);
VOID INTERNAL_CALL GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS Owner); VOID INTERNAL_CALL GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS Owner);
VOID INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo); VOID INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo);
@ -53,8 +58,11 @@ BOOL INTERNAL_CALL GDIOBJ_ConvertToStockObj(HGDIOBJ *hObj);
VOID INTERNAL_CALL GDIOBJ_UnlockObjByPtr(POBJ Object); VOID INTERNAL_CALL GDIOBJ_UnlockObjByPtr(POBJ Object);
VOID INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object); VOID INTERNAL_CALL GDIOBJ_ShareUnlockObjByPtr(POBJ Object);
BOOL INTERNAL_CALL GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType); BOOL INTERNAL_CALL GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType);
HGDIOBJ INTERNAL_CALL GDIOBJ_AllocObj(ULONG ObjectType); POBJ INTERNAL_CALL GDIOBJ_AllocObj(UCHAR ObjectType);
BOOL INTERNAL_CALL GDIOBJ_FreeObj (HGDIOBJ hObj, DWORD ObjectType); POBJ INTERNAL_CALL GDIOBJ_AllocObjWithHandle(ULONG ObjectType);
HGDIOBJ INTERNAL_CALL GDIOBJ_AllocObjDepricated(ULONG ObjectType);
VOID INTERNAL_CALL GDIOBJ_FreeObj (POBJ pObj, UCHAR ObjectType);
BOOL INTERNAL_CALL GDIOBJ_FreeObjByHandle (HGDIOBJ hObj, DWORD ObjectType);
PGDIOBJ INTERNAL_CALL GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ObjectType); PGDIOBJ INTERNAL_CALL GDIOBJ_LockObj (HGDIOBJ hObj, DWORD ObjectType);
PGDIOBJ INTERNAL_CALL GDIOBJ_ShareLockObj (HGDIOBJ hObj, DWORD ObjectType); PGDIOBJ INTERNAL_CALL GDIOBJ_ShareLockObj (HGDIOBJ hObj, DWORD ObjectType);

View file

@ -64,7 +64,8 @@ HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode,
ULONG Blue); ULONG Blue);
HPALETTE FASTCALL PALETTE_AllocPaletteIndexedRGB(ULONG NumColors, HPALETTE FASTCALL PALETTE_AllocPaletteIndexedRGB(ULONG NumColors,
CONST RGBQUAD *Colors); CONST RGBQUAD *Colors);
#define PALETTE_FreePalette(hPalette) GDIOBJ_FreeObj((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE) #define PALETTE_FreePalette(pPalette) GDIOBJ_FreeObj((POBJ)pPalette, GDIObjType_PAL_TYPE)
#define PALETTE_FreePaletteByHandle(hPalette) GDIOBJ_FreeObjByHandle((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE)
#define PALETTE_LockPalette(hPalette) ((PPALGDI)GDIOBJ_LockObj((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE)) #define PALETTE_LockPalette(hPalette) ((PPALGDI)GDIOBJ_LockObj((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE))
#define PALETTE_UnlockPalette(pPalette) GDIOBJ_UnlockObjByPtr((POBJ)pPalette) #define PALETTE_UnlockPalette(pPalette) GDIOBJ_UnlockObjByPtr((POBJ)pPalette)
BOOL INTERNAL_CALL PALETTE_Cleanup(PVOID ObjectBody); BOOL INTERNAL_CALL PALETTE_Cleanup(PVOID ObjectBody);

View file

@ -6,11 +6,17 @@
/* Internal interface */ /* Internal interface */
#define PENOBJ_AllocPen() ((HPEN)GDIOBJ_AllocObj(GDI_OBJECT_TYPE_PEN)) #define PENOBJ_AllocPen() ((HPEN)GDIOBJ_AllocObj(GDIObjType_BRUSH_TYPE))
#define PENOBJ_FreePen(hBMObj) GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN) #define PENOBJ_AllocPenWithHandle() ((PGDIBRUSHOBJ)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_PEN))
#define PENOBJ_AllocPenDepricated() ((HPEN)GDIOBJ_AllocObjDepricated(GDI_OBJECT_TYPE_PEN))
#define PENOBJ_FreePen(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDI_OBJECT_TYPE_PEN)
#define PENOBJ_FreePenByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN)
#define PENOBJ_LockPen(hBMObj) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN)) #define PENOBJ_LockPen(hBMObj) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_PEN))
#define PENOBJ_AllocExtPen() ((HPEN)GDIOBJ_AllocObj(GDI_OBJECT_TYPE_EXTPEN)) #define PENOBJ_AllocExtPen() ((PGDIBRUSHOBJ)GDIOBJ_AllocObj(GDIObjType_BRUSH_TYPE))
#define PENOBJ_FreeExtPen(hBMObj) GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_EXTPEN) #define PENOBJ_AllocExtPenWithHandle() ((PGDIBRUSHOBJ)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_EXTPEN))
#define PENOBJ_AllocExtPenDepricated() ((HPEN)GDIOBJ_AllocObjDepricated(GDI_OBJECT_TYPE_EXTPEN))
#define PENOBJ_FreeExtPen(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDI_OBJECT_TYPE_EXTPEN)
#define PENOBJ_FreeExtPenByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_EXTPEN)
#define PENOBJ_LockExtPen(hBMObj) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_EXTPEN)) #define PENOBJ_LockExtPen(hBMObj) ((PGDIBRUSHOBJ)GDIOBJ_LockObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_EXTPEN))
#define PENOBJ_UnlockPen(pPenObj) GDIOBJ_UnlockObjByPtr((POBJ)pPenObj) #define PENOBJ_UnlockPen(pPenObj) GDIOBJ_UnlockObjByPtr((POBJ)pPenObj)

View file

@ -21,7 +21,8 @@ typedef struct _ROSRGNDATA
/* Functions ******************************************************************/ /* Functions ******************************************************************/
#define REGION_FreeRgn(hRgn) GDIOBJ_FreeObj((HGDIOBJ)hRgn, GDI_OBJECT_TYPE_REGION) #define REGION_FreeRgn(pRgn) GDIOBJ_FreeObj((POBJ)pRgn, GDIObjType_RGN_TYPE)
#define REGION_FreeRgnByHandle(hRgn) GDIOBJ_FreeObjbyHandle((HGDIOBJ)hRgn, GDI_OBJECT_TYPE_REGION)
#define REGION_LockRgn(hRgn) ((PROSRGNDATA)GDIOBJ_LockObj((HGDIOBJ)hRgn, GDI_OBJECT_TYPE_REGION)) #define REGION_LockRgn(hRgn) ((PROSRGNDATA)GDIOBJ_LockObj((HGDIOBJ)hRgn, GDI_OBJECT_TYPE_REGION))
#define REGION_UnlockRgn(pRgn) GDIOBJ_UnlockObjByPtr((POBJ)pRgn) #define REGION_UnlockRgn(pRgn) GDIOBJ_UnlockObjByPtr((POBJ)pRgn)

View file

@ -68,9 +68,11 @@ typedef struct
/* Internal interface */ /* Internal interface */
#define TEXTOBJ_AllocText() \ #define TEXTOBJ_AllocText() ((PTEXTOBJ) GDIOBJ_AllocObj(GDIObjType_LFONT_TYPE))
((HFONT) GDIOBJ_AllocObj (GDI_OBJECT_TYPE_FONT)) #define TEXTOBJ_AllocTextWithHandle() ((PTEXTOBJ) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_FONT))
#define TEXTOBJ_FreeText(hBMObj) GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_FONT) #define TEXTOBJ_AllocTextDepricated() ((HFONT) GDIOBJ_AllocObj(GDI_OBJECT_TYPE_FONT))
#define TEXTOBJ_FreeText(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDILoObjType_LO_FONT_TYPE)
#define TEXTOBJ_FreeTextByHandle(hBMObj) GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_FONT)
#define TEXTOBJ_LockText(hBMObj) ((PTEXTOBJ) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_FONT)) #define TEXTOBJ_LockText(hBMObj) ((PTEXTOBJ) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_FONT))
#define TEXTOBJ_UnlockText(pBMObj) GDIOBJ_UnlockObjByPtr ((POBJ)pBMObj) #define TEXTOBJ_UnlockText(pBMObj) GDIOBJ_UnlockObjByPtr ((POBJ)pBMObj)

View file

@ -272,7 +272,7 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse)
if ((HANDLE) 1 != TempRegion && NULL != TempRegion) if ((HANDLE) 1 != TempRegion && NULL != TempRegion)
{ {
/* NOTE: The region can already be deleted! */ /* NOTE: The region can already be deleted! */
GDIOBJ_FreeObj(TempRegion, GDI_OBJECT_TYPE_REGION | GDI_OBJECT_TYPE_SILENT); GDIOBJ_FreeObjByHandle(TempRegion, GDI_OBJECT_TYPE_REGION | GDI_OBJECT_TYPE_SILENT);
} }
} }
@ -801,7 +801,7 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs)
if (hRgn != (HANDLE)1 && hRgn != NULL) if (hRgn != (HANDLE)1 && hRgn != NULL)
{ {
/* NOTE: The region can already by deleted! */ /* NOTE: The region can already by deleted! */
GDIOBJ_FreeObj(hRgn, GDI_OBJECT_TYPE_REGION | GDI_OBJECT_TYPE_SILENT); GDIOBJ_FreeObjByHandle(hRgn, GDI_OBJECT_TYPE_REGION | GDI_OBJECT_TYPE_SILENT);
} }
} }

View file

@ -351,16 +351,14 @@ IntGdiCreateDIBBrush(
BitmapObject->hDIBPalette = BuildDIBPalette(BitmapInfo, &PaletteType); BitmapObject->hDIBPalette = BuildDIBPalette(BitmapInfo, &PaletteType);
BITMAPOBJ_UnlockBitmap(BitmapObject); BITMAPOBJ_UnlockBitmap(BitmapObject);
hBrush = BRUSHOBJ_AllocBrush(); BrushObject = BRUSHOBJ_AllocBrushWithHandle();
if (hBrush == NULL) if (BrushObject == NULL)
{ {
NtGdiDeleteObject(hPattern); NtGdiDeleteObject(hPattern);
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
return NULL; return NULL;
} }
hBrush = BrushObject->BaseObject.hHmgr;
BrushObject = BRUSHOBJ_LockBrush(hBrush);
ASSERT(BrushObject != NULL);
BrushObject->flAttrs |= GDIBRUSH_IS_BITMAP | GDIBRUSH_IS_DIB; BrushObject->flAttrs |= GDIBRUSH_IS_BITMAP | GDIBRUSH_IS_DIB;
BrushObject->hbmPattern = hPattern; BrushObject->hbmPattern = hPattern;
@ -394,16 +392,14 @@ IntGdiCreateHatchBrush(
return NULL; return NULL;
} }
hBrush = BRUSHOBJ_AllocBrush(); BrushObject = BRUSHOBJ_AllocBrushWithHandle();
if (hBrush == NULL) if (BrushObject == NULL)
{ {
NtGdiDeleteObject(hPattern); NtGdiDeleteObject(hPattern);
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
return NULL; return NULL;
} }
hBrush = BrushObject->BaseObject.hHmgr;
BrushObject = BRUSHOBJ_LockBrush(hBrush);
ASSERT(BrushObject != NULL);
BrushObject->flAttrs |= GDIBRUSH_IS_HATCH; BrushObject->flAttrs |= GDIBRUSH_IS_HATCH;
BrushObject->hbmPattern = hPattern; BrushObject->hbmPattern = hPattern;
@ -431,16 +427,14 @@ IntGdiCreatePatternBrush(
return NULL; return NULL;
} }
hBrush = BRUSHOBJ_AllocBrush(); BrushObject = BRUSHOBJ_AllocBrushWithHandle();
if (hBrush == NULL) if (BrushObject == NULL)
{ {
NtGdiDeleteObject(hPattern); NtGdiDeleteObject(hPattern);
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
return NULL; return NULL;
} }
hBrush = BrushObject->BaseObject.hHmgr;
BrushObject = BRUSHOBJ_LockBrush(hBrush);
ASSERT(BrushObject != NULL);
BrushObject->flAttrs |= GDIBRUSH_IS_BITMAP; BrushObject->flAttrs |= GDIBRUSH_IS_BITMAP;
BrushObject->hbmPattern = hPattern; BrushObject->hbmPattern = hPattern;
@ -460,15 +454,13 @@ IntGdiCreateSolidBrush(
HBRUSH hBrush; HBRUSH hBrush;
PGDIBRUSHOBJ BrushObject; PGDIBRUSHOBJ BrushObject;
hBrush = BRUSHOBJ_AllocBrush(); BrushObject = BRUSHOBJ_AllocBrushWithHandle();
if (hBrush == NULL) if (BrushObject == NULL)
{ {
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
return NULL; return NULL;
} }
hBrush = BrushObject->BaseObject.hHmgr;
BrushObject = BRUSHOBJ_LockBrush(hBrush);
ASSERT(BrushObject != NULL);
BrushObject->flAttrs |= GDIBRUSH_IS_SOLID; BrushObject->flAttrs |= GDIBRUSH_IS_SOLID;
@ -486,15 +478,14 @@ IntGdiCreateNullBrush(VOID)
HBRUSH hBrush; HBRUSH hBrush;
PGDIBRUSHOBJ BrushObject; PGDIBRUSHOBJ BrushObject;
hBrush = BRUSHOBJ_AllocBrush(); BrushObject = BRUSHOBJ_AllocBrushWithHandle();
if (hBrush == NULL) if (BrushObject == NULL)
{ {
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
return NULL; return NULL;
} }
hBrush = BrushObject->BaseObject.hHmgr;
BrushObject = BRUSHOBJ_LockBrush(hBrush);
ASSERT(BrushObject != NULL);
BrushObject->flAttrs |= GDIBRUSH_IS_NULL; BrushObject->flAttrs |= GDIBRUSH_IS_NULL;
BRUSHOBJ_UnlockBrush(BrushObject); BRUSHOBJ_UnlockBrush(BrushObject);

View file

@ -2270,7 +2270,7 @@ DC_AllocDC(PUNICODE_STRING Driver)
RtlCopyMemory(Buf, Driver->Buffer, Driver->MaximumLength); RtlCopyMemory(Buf, Driver->Buffer, Driver->MaximumLength);
} }
hDC = (HDC) GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DC); hDC = (HDC) GDIOBJ_AllocObjDepricated(GDI_OBJECT_TYPE_DC);
if (hDC == NULL) if (hDC == NULL)
{ {
if(Buf) if(Buf)
@ -2441,7 +2441,7 @@ DC_FreeDC(HDC DCToFree)
DC_FreeDcAttr(DCToFree); DC_FreeDcAttr(DCToFree);
if(!IsObjectDead( DCToFree )) if(!IsObjectDead( DCToFree ))
{ {
if (!GDIOBJ_FreeObj(DCToFree, GDI_OBJECT_TYPE_DC)) if (!GDIOBJ_FreeObjByHandle(DCToFree, GDI_OBJECT_TYPE_DC))
{ {
DPRINT1("DC_FreeDC failed\n"); DPRINT1("DC_FreeDC failed\n");
} }

View file

@ -237,7 +237,7 @@ IntSetDIBits(
XlateObj = IntEngCreateXlate(DDB_Palette_Type, DIB_Palette_Type, DDB_Palette, DIB_Palette); XlateObj = IntEngCreateXlate(DDB_Palette_Type, DIB_Palette_Type, DDB_Palette, DIB_Palette);
if (NULL == XlateObj) if (NULL == XlateObj)
{ {
PALETTE_FreePalette(DIB_Palette); PALETTE_FreePaletteByHandle(DIB_Palette);
EngUnlockSurface(SourceSurf); EngUnlockSurface(SourceSurf);
EngDeleteSurface((HSURF)SourceBitmap); EngDeleteSurface((HSURF)SourceBitmap);
BITMAPOBJ_UnlockBitmap(bitmap); BITMAPOBJ_UnlockBitmap(bitmap);
@ -265,7 +265,7 @@ IntSetDIBits(
// Clean up // Clean up
EngDeleteXlate(XlateObj); EngDeleteXlate(XlateObj);
PALETTE_FreePalette(DIB_Palette); PALETTE_FreePaletteByHandle(DIB_Palette);
EngUnlockSurface(SourceSurf); EngUnlockSurface(SourceSurf);
EngDeleteSurface((HSURF)SourceBitmap); EngDeleteSurface((HSURF)SourceBitmap);
@ -713,7 +713,7 @@ cleanup:
EngDeleteSurface((HSURF)hDestBitmap); EngDeleteSurface((HSURF)hDestBitmap);
if (hDestPalette != NULL && bPaletteMatch == FALSE) if (hDestPalette != NULL && bPaletteMatch == FALSE)
PALETTE_FreePalette(hDestPalette); PALETTE_FreePaletteByHandle(hDestPalette);
BITMAPOBJ_UnlockBitmap(BitmapObj); BITMAPOBJ_UnlockBitmap(BitmapObj);
@ -1147,7 +1147,7 @@ DIB_CreateDIBSection(
if (dib) { ExFreePool(dib); dib = NULL; } if (dib) { ExFreePool(dib); dib = NULL; }
if (bmp) { bmp = NULL; } if (bmp) { bmp = NULL; }
if (res) { BITMAPOBJ_FreeBitmap(res); res = 0; } if (res) { BITMAPOBJ_FreeBitmapByHandle(res); res = 0; }
} }
if (lpRGB != bmi->bmiColors) if (lpRGB != bmi->bmiColors)

View file

@ -72,7 +72,7 @@ OBJ_TYPE_INFO ObjTypeInfo[] =
{1, sizeof(DC), TAG_DC, DC_Cleanup}, /* 01 DC */ {1, sizeof(DC), TAG_DC, DC_Cleanup}, /* 01 DC */
{1, 0, 0, NULL}, /* 02 UNUSED1 */ {1, 0, 0, NULL}, /* 02 UNUSED1 */
{1, 0, 0, NULL}, /* 03 UNUSED2 */ {1, 0, 0, NULL}, /* 03 UNUSED2 */
{1, sizeof(ROSRGNDATA), TAG_REGION, REGION_Cleanup}, /* 04 RGN */ {1, sizeof(ROSRGNDATA), TAG_REGION, REGION_Cleanup}, /* 04 RGN */
{1, sizeof(BITMAPOBJ), TAG_SURFACE, BITMAP_Cleanup}, /* 05 SURFACE */ {1, sizeof(BITMAPOBJ), TAG_SURFACE, BITMAP_Cleanup}, /* 05 SURFACE */
{0, sizeof(DC), TAG_CLIENTOBJ, GDI_CleanupDummy}, /* 06 CLIENTOBJ: METADC,... FIXME: don't use DC struct */ {0, sizeof(DC), TAG_CLIENTOBJ, GDI_CleanupDummy}, /* 06 CLIENTOBJ: METADC,... FIXME: don't use DC struct */
{0, 0, TAG_PATH, NULL}, /* 07 PATH, unused */ {0, 0, TAG_PATH, NULL}, /* 07 PATH, unused */
@ -444,24 +444,51 @@ GDIOBJ_ValidateHandle(HGDIOBJ hObj, ULONG ObjectType)
return FALSE; return FALSE;
} }
POBJ INTERNAL_CALL
GDIOBJ_AllocObj(UCHAR BaseType)
{
POBJ pObject;
ASSERT((BaseType & ~GDIObjTypeTotal) == 0);
// BaseType &= GDI_HANDLE_BASETYPE_MASK;
if (ObjTypeInfo[BaseType].bUseLookaside)
{
PPAGED_LOOKASIDE_LIST LookasideList;
LookasideList = GdiHandleTable->LookasideLists + BaseType;
pObject = ExAllocateFromPagedLookasideList(LookasideList);
}
else
{
pObject = ExAllocatePoolWithTag(PagedPool,
ObjTypeInfo[BaseType].ulBodySize,
ObjTypeInfo[BaseType].Tag);
}
if (pObject)
{
RtlZeroMemory(pObject, ObjTypeInfo[BaseType].ulBodySize);
}
return pObject;
}
/*! /*!
* Allocate memory for GDI object and return handle to it. * Allocate memory for GDI object and return handle to it.
* *
* \param ObjectType - type of object \ref GDI object types * \param ObjectType - type of object \ref GDI object types
* *
* \return Handle of the allocated object. * \return Pointer to the allocated object, which is locked.
*
* \note Use GDIOBJ_Lock() to obtain pointer to the new object.
* \todo return the object pointer and lock it by default.
*/ */
HGDIOBJ INTERNAL_CALL POBJ INTERNAL_CALL
GDIOBJ_AllocObj(ULONG ObjectType) GDIOBJ_AllocObjWithHandle(ULONG ObjectType)
{ {
PW32PROCESS W32Process; PW32PROCESS W32Process;
POBJ newObject = NULL; POBJ newObject = NULL;
PPAGED_LOOKASIDE_LIST LookasideList = NULL;
HANDLE CurrentProcessId, LockedProcessId; HANDLE CurrentProcessId, LockedProcessId;
ULONG TypeIndex; UCHAR TypeIndex;
#ifdef GDI_DEBUG #ifdef GDI_DEBUG
ULONG Attempts = 0; ULONG Attempts = 0;
#endif #endif
@ -475,106 +502,130 @@ GDIOBJ_AllocObj(ULONG ObjectType)
ASSERT(ObjectType != GDI_OBJECT_TYPE_DONTCARE); ASSERT(ObjectType != GDI_OBJECT_TYPE_DONTCARE);
TypeIndex = GDI_OBJECT_GET_TYPE_INDEX(ObjectType); TypeIndex = GDI_OBJECT_GET_TYPE_INDEX(ObjectType);
if (ObjTypeInfo[TypeIndex].bUseLookaside)
newObject = GDIOBJ_AllocObj(TypeIndex);
if (!newObject)
{ {
LookasideList = FindLookasideList(TypeIndex); DPRINT1("Not enough memory to allocate gdi object!\n");
if (LookasideList != NULL) return NULL;
{
newObject = ExAllocateFromPagedLookasideList(LookasideList);
}
} }
else
UINT Index;
PGDI_TABLE_ENTRY Entry;
LONG TypeInfo;
CurrentProcessId = PsGetCurrentProcessId();
LockedProcessId = (HANDLE)((ULONG_PTR)CurrentProcessId | 0x1);
// RtlZeroMemory(newObject, GetObjectSize(TypeIndex));
/* On Windows the higher 16 bit of the type field don't contain the
full type from the handle, but the base type.
(type = BRSUH, PEN, EXTPEN, basetype = BRUSH) */
TypeInfo = (ObjectType & GDI_HANDLE_BASETYPE_MASK) | (ObjectType >> GDI_ENTRY_UPPER_SHIFT);
Index = InterlockedPopFreeEntry();
if (Index != 0)
{ {
newObject = ExAllocatePoolWithTag(PagedPool, HANDLE PrevProcId;
ObjTypeInfo[TypeIndex].ulBodySize,
ObjTypeInfo[TypeIndex].Tag);
}
if (newObject != NULL)
{
UINT Index;
PGDI_TABLE_ENTRY Entry;
LONG TypeInfo;
CurrentProcessId = PsGetCurrentProcessId(); Entry = &GdiHandleTable->Entries[Index];
LockedProcessId = (HANDLE)((ULONG_PTR)CurrentProcessId | 0x1);
RtlZeroMemory(newObject, GetObjectSize(TypeIndex));
/* On Windows the higher 16 bit of the type field don't contain the
full type from the handle, but the base type.
(type = BRSUH, PEN, EXTPEN, basetype = BRUSH) */
TypeInfo = (ObjectType & GDI_HANDLE_BASETYPE_MASK) | (ObjectType >> GDI_ENTRY_UPPER_SHIFT);
Index = InterlockedPopFreeEntry();
if (Index != 0)
{
HANDLE PrevProcId;
Entry = &GdiHandleTable->Entries[Index];
LockHandle: LockHandle:
PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, 0); PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, 0);
if (PrevProcId == NULL) if (PrevProcId == NULL)
{
HGDIOBJ Handle;
Entry->KernelData = newObject;
/* copy the reuse-counter */
TypeInfo |= Entry->Type & GDI_ENTRY_REUSE_MASK;
/* we found a free entry, no need to exchange this field atomically
since we're holding the lock */
Entry->Type = TypeInfo;
/* unlock the entry */
(void)_InterlockedExchangePointer((PVOID*)&Entry->ProcessId, CurrentProcessId);
GDIDBG_CAPTUREALLOCATOR(Index);
if (W32Process != NULL)
{
_InterlockedIncrement(&W32Process->GDIObjects);
}
Handle = (HGDIOBJ)((Index & 0xFFFF) | (TypeInfo << GDI_ENTRY_UPPER_SHIFT));
newObject->hHmgr = Handle;
DPRINT("GDIOBJ_AllocObj: 0x%x ob: 0x%x\n", Handle, newObject);
return Handle;
}
else
{
#ifdef GDI_DEBUG
if (++Attempts > 20)
{
DPRINT1("[%d]Waiting on handle in index 0x%x\n", Attempts, Index);
}
#endif
/* damn, someone is trying to lock the object even though it doesn't
eve nexist anymore, wait a little and try again!
FIXME - we shouldn't loop forever! Give up after some time! */
DelayExecution();
/* try again */
goto LockHandle;
}
}
if (ObjTypeInfo[TypeIndex].bUseLookaside)
{ {
ExFreeToPagedLookasideList(LookasideList, newObject); PW32THREAD Thread = PsGetCurrentThreadWin32Thread();
HGDIOBJ Handle;
Entry->KernelData = newObject;
/* copy the reuse-counter */
TypeInfo |= Entry->Type & GDI_ENTRY_REUSE_MASK;
/* we found a free entry, no need to exchange this field atomically
since we're holding the lock */
Entry->Type = TypeInfo;
/* Create a handle */
Handle = (HGDIOBJ)((Index & 0xFFFF) | (TypeInfo << GDI_ENTRY_UPPER_SHIFT));
/* Initialize BaseObject fields */
newObject->hHmgr = Handle;
newObject->ulShareCount = 0;
newObject->cExclusiveLock = 1;
newObject->Tid = Thread;
/* unlock the entry */
(void)_InterlockedExchangePointer((PVOID*)&Entry->ProcessId, CurrentProcessId);
GDIDBG_CAPTUREALLOCATOR(Index);
if (W32Process != NULL)
{
_InterlockedIncrement(&W32Process->GDIObjects);
}
DPRINT("GDIOBJ_AllocObj: 0x%x ob: 0x%x\n", Handle, newObject);
return newObject;
} }
else else
{ {
ExFreePool(newObject); #ifdef GDI_DEBUG
if (++Attempts > 20)
{
DPRINT1("[%d]Waiting on handle in index 0x%x\n", Attempts, Index);
}
#endif
/* damn, someone is trying to lock the object even though it doesn't
even exist anymore, wait a little and try again!
FIXME - we shouldn't loop forever! Give up after some time! */
DelayExecution();
/* try again */
goto LockHandle;
} }
DPRINT1("Failed to insert gdi object into the handle table, no handles left!\n"); }
GDIDBG_DUMPHANDLETABLE();
GDIOBJ_FreeObj(newObject, TypeIndex);
DPRINT1("Failed to insert gdi object into the handle table, no handles left!\n");
GDIDBG_DUMPHANDLETABLE();
return NULL;
}
/* Wrapper for compatibility with old calls, will be removed later */
HGDIOBJ INTERNAL_CALL
GDIOBJ_AllocObjDepricated(ULONG ObjectType)
{
POBJ pObject;
HGDIOBJ hObject;
pObject = GDIOBJ_AllocObjWithHandle(ObjectType);
hObject = pObject->hHmgr;
GDIOBJ_UnlockObjByPtr(pObject);
return hObject;
}
VOID INTERNAL_CALL
GDIOBJ_FreeObj(POBJ pObject, UCHAR BaseType)
{
/* Object must not have a handle! */
ASSERT(pObject->hHmgr == NULL);
if (ObjTypeInfo[BaseType].bUseLookaside)
{
PPAGED_LOOKASIDE_LIST LookasideList;
LookasideList = GdiHandleTable->LookasideLists + BaseType;
ExFreeToPagedLookasideList(LookasideList, pObject);
} }
else else
{ {
DPRINT1("Not enough memory to allocate gdi object!\n"); ExFreePool(pObject);
} }
return NULL;
} }
/*! /*!
@ -588,10 +639,9 @@ LockHandle:
* to the calling process. * to the calling process.
*/ */
BOOL INTERNAL_CALL BOOL INTERNAL_CALL
GDIOBJ_FreeObj(HGDIOBJ hObj, DWORD ExpectedType) GDIOBJ_FreeObjByHandle(HGDIOBJ hObj, DWORD ExpectedType)
{ {
PGDI_TABLE_ENTRY Entry; PGDI_TABLE_ENTRY Entry;
PPAGED_LOOKASIDE_LIST LookasideList;
HANDLE ProcessId, LockedProcessId, PrevProcId; HANDLE ProcessId, LockedProcessId, PrevProcId;
ULONG HandleType, HandleUpper, TypeIndex; ULONG HandleType, HandleUpper, TypeIndex;
BOOL Silent; BOOL Silent;
@ -658,6 +708,8 @@ LockHandle:
/* push this entry to the free list */ /* push this entry to the free list */
InterlockedPushFreeEntry(GDI_ENTRY_TO_INDEX(GdiHandleTable, Entry)); InterlockedPushFreeEntry(GDI_ENTRY_TO_INDEX(GdiHandleTable, Entry));
Object->hHmgr = NULL;
if (W32Process != NULL) if (W32Process != NULL)
{ {
_InterlockedDecrement(&W32Process->GDIObjects); _InterlockedDecrement(&W32Process->GDIObjects);
@ -668,18 +720,7 @@ LockHandle:
Ret = RunCleanupCallback(Object, TypeIndex); Ret = RunCleanupCallback(Object, TypeIndex);
/* Now it's time to free the memory */ /* Now it's time to free the memory */
if (ObjTypeInfo[TypeIndex].bUseLookaside) GDIOBJ_FreeObj(Object, TypeIndex);
{
LookasideList = FindLookasideList(TypeIndex);
if (LookasideList != NULL)
{
ExFreeToPagedLookasideList(LookasideList, Object);
}
}
else
{
ExFreePool(Object);
}
return Ret; return Ret;
} }
@ -764,7 +805,7 @@ NtGdiDeleteObject(HGDIOBJ hObject)
if (!IsObjectDead(hObject)) if (!IsObjectDead(hObject))
{ {
return NULL != hObject return NULL != hObject
? GDIOBJ_FreeObj(hObject, GDI_OBJECT_TYPE_DONTCARE) : FALSE; ? GDIOBJ_FreeObjByHandle(hObject, GDI_OBJECT_TYPE_DONTCARE) : FALSE;
} }
else else
{ {
@ -818,7 +859,7 @@ GDI_CleanupForProcess(struct _EPROCESS *Process)
simply ignore this fact here. */ simply ignore this fact here. */
ObjectHandle = (HGDIOBJ)(Index | (Entry->Type << GDI_ENTRY_UPPER_SHIFT)); ObjectHandle = (HGDIOBJ)(Index | (Entry->Type << GDI_ENTRY_UPPER_SHIFT));
if (GDIOBJ_FreeObj(ObjectHandle, GDI_OBJECT_TYPE_DONTCARE) && if (GDIOBJ_FreeObjByHandle(ObjectHandle, GDI_OBJECT_TYPE_DONTCARE) &&
W32Process->GDIObjects == 0) W32Process->GDIObjects == 0)
{ {
/* there are no more gdi handles for this process, bail */ /* there are no more gdi handles for this process, bail */
@ -1569,21 +1610,30 @@ NtGdiCreateClientObj(
IN ULONG ulType IN ULONG ulType
) )
{ {
// ATM we use DC object for KernelData. I think it should be at a minimum GDIOBJEMPTYHDR. // ATM we use DC object for KernelData. This is wrong.
// The real type consists of BASEOBJECT and a pointer.
// The UserData is set in user mode, so it is always NULL. // The UserData is set in user mode, so it is always NULL.
// HANDLE should be HGDIOBJ
// //
INT Index; POBJ pObject;
PGDI_TABLE_ENTRY Entry; HANDLE handle;
HANDLE handle = GDIOBJ_AllocObj(GDI_OBJECT_TYPE_CLIOBJ);
// Need to change handle type based on ulType. /* Mask out everything that would change the type in a wrong manner */
Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)handle); ulType &= (GDI_HANDLE_TYPE_MASK & ~GDI_HANDLE_BASETYPE_MASK);
Entry = &GdiHandleTable->Entries[Index];
// mask out lower half and set the type by ulType. /* Allocate a new object */
Entry->Type &= GDI_HANDLE_UPPER_MASK; pObject = GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_CLIOBJ | ulType);
Entry->Type |= ulType >> GDI_ENTRY_UPPER_SHIFT; if (!pObject)
// mask out handle type than set it by ulType. {
handle = (HANDLE)(((ULONG_PTR)(handle)) & (GDI_HANDLE_REUSE_MASK|GDI_HANDLE_STOCK_MASK|0x0ffff)); return NULL;
handle = (HANDLE)(((ULONG_PTR)(handle)) | ulType); }
/* get the handle */
handle = pObject->hHmgr;
/* Unlock it */
GDIOBJ_UnlockObjByPtr(pObject);
return handle; return handle;
} }
@ -1594,7 +1644,16 @@ NtGdiDeleteClientObj(
IN HANDLE h IN HANDLE h
) )
{ {
return GDIOBJ_FreeObj(h, GDI_OBJECT_TYPE_CLIOBJ); /* We first need to get the real type from the handle */
ULONG type = GDI_HANDLE_GET_TYPE(h);
/* Check if it's really a CLIENTOBJ */
if ((type & GDI_HANDLE_BASETYPE_MASK) != GDILoObjType_LO_CLIENTOBJ_TYPE)
{
/* FIXME: SetLastError? */
return FALSE;
}
return GDIOBJ_FreeObjByHandle(h, type);
} }
INT INT

View file

@ -230,7 +230,7 @@ NtGdiCloseEnhMetaFile(HDC hDC)
NtClose( Dc->hFile ); NtClose( Dc->hFile );
} }
hmf = GDIOBJ_AllocObj(GdiHandleTable, GDI_OBJECT_TYPE_ENHMETAFILE); hmf = GDIOBJ_AllocObjDepricated(GdiHandleTable, GDI_OBJECT_TYPE_ENHMETAFILE);
if (hmf != NULL) if (hmf != NULL)
{ {
phmf = GDIOBJ_LockObj(GdiHandleTable, hmf, GDI_OBJECT_TYPE_ENHMETAFILE); phmf = GDIOBJ_LockObj(GdiHandleTable, hmf, GDI_OBJECT_TYPE_ENHMETAFILE);

View file

@ -63,7 +63,7 @@ PALETTE_AllocPalette(ULONG Mode,
HPALETTE NewPalette; HPALETTE NewPalette;
PPALGDI PalGDI; PPALGDI PalGDI;
NewPalette = (HPALETTE) GDIOBJ_AllocObj(GDI_OBJECT_TYPE_PALETTE); NewPalette = (HPALETTE) GDIOBJ_AllocObjDepricated(GDI_OBJECT_TYPE_PALETTE);
if (NULL == NewPalette) if (NULL == NewPalette)
{ {
return NULL; return NULL;
@ -82,7 +82,7 @@ PALETTE_AllocPalette(ULONG Mode,
if (NULL == PalGDI->IndexedColors) if (NULL == PalGDI->IndexedColors)
{ {
PALETTE_UnlockPalette(PalGDI); PALETTE_UnlockPalette(PalGDI);
PALETTE_FreePalette(NewPalette); PALETTE_FreePaletteByHandle(NewPalette);
return NULL; return NULL;
} }
RtlCopyMemory(PalGDI->IndexedColors, Colors, sizeof(PALETTEENTRY) * NumColors); RtlCopyMemory(PalGDI->IndexedColors, Colors, sizeof(PALETTEENTRY) * NumColors);
@ -112,7 +112,7 @@ PALETTE_AllocPaletteIndexedRGB(ULONG NumColors,
PPALGDI PalGDI; PPALGDI PalGDI;
unsigned i; unsigned i;
NewPalette = (HPALETTE) GDIOBJ_AllocObj(GDI_OBJECT_TYPE_PALETTE); NewPalette = (HPALETTE) GDIOBJ_AllocObjDepricated(GDI_OBJECT_TYPE_PALETTE);
if (NULL == NewPalette) if (NULL == NewPalette)
{ {
return NULL; return NULL;
@ -129,7 +129,7 @@ PALETTE_AllocPaletteIndexedRGB(ULONG NumColors,
if (NULL == PalGDI->IndexedColors) if (NULL == PalGDI->IndexedColors)
{ {
PALETTE_UnlockPalette(PalGDI); PALETTE_UnlockPalette(PalGDI);
PALETTE_FreePalette(NewPalette); PALETTE_FreePaletteByHandle(NewPalette);
return NULL; return NULL;
} }
for (i = 0; i < NumColors; i++) for (i = 0; i < NumColors; i++)

View file

@ -51,29 +51,20 @@ IntGdiExtCreatePen(
if (bOldStylePen) if (bOldStylePen)
{ {
hPen = PENOBJ_AllocPen(); PenObject = PENOBJ_AllocPenWithHandle();
} }
else else
{ {
hPen = PENOBJ_AllocExtPen(); PenObject = PENOBJ_AllocExtPenWithHandle();
} }
if (!hPen) if (!PenObject)
{ {
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
DPRINT("Can't allocate pen\n"); DPRINT("Can't allocate pen\n");
return 0; return 0;
} }
hPen = PenObject->BaseObject.hHmgr;
if (bOldStylePen)
{
PenObject = PENOBJ_LockPen(hPen);
}
else
{
PenObject = PENOBJ_LockExtPen(hPen);
}
/* FIXME - Handle PenObject == NULL!!! */
PenObject->ptPenWidth.x = dwWidth; PenObject->ptPenWidth.x = dwWidth;
PenObject->ptPenWidth.y = 0; PenObject->ptPenWidth.y = 0;

View file

@ -2024,7 +2024,7 @@ REGION_AllocRgnWithHandle(INT n)
HRGN hReg; HRGN hReg;
PROSRGNDATA pReg; PROSRGNDATA pReg;
if ((hReg = (HRGN) GDIOBJ_AllocObj(GDI_OBJECT_TYPE_REGION))) if ((hReg = (HRGN) GDIOBJ_AllocObjDepricated(GDI_OBJECT_TYPE_REGION)))
{ {
if (NULL != (pReg = REGION_LockRgn(hReg))) if (NULL != (pReg = REGION_LockRgn(hReg)))
{ {

View file

@ -487,36 +487,24 @@ NTSTATUS FASTCALL
TextIntCreateFontIndirect(CONST LPLOGFONTW lf, HFONT *NewFont) TextIntCreateFontIndirect(CONST LPLOGFONTW lf, HFONT *NewFont)
{ {
PTEXTOBJ TextObj; PTEXTOBJ TextObj;
NTSTATUS Status = STATUS_SUCCESS;
*NewFont = TEXTOBJ_AllocText(); TextObj = TEXTOBJ_AllocTextWithHandle();
if (NULL != *NewFont) if (!TextObj)
{ {
TextObj = TEXTOBJ_LockText(*NewFont); return STATUS_NO_MEMORY;
if (NULL != TextObj)
{
memcpy(&TextObj->logfont.elfEnumLogfontEx.elfLogFont, lf, sizeof(LOGFONTW));
if (lf->lfEscapement != lf->lfOrientation)
{
/* this should really depend on whether GM_ADVANCED is set */
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation =
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement;
}
TEXTOBJ_UnlockText(TextObj);
}
else
{
/* FIXME */
/* ASSERT(FALSE);*/
Status = STATUS_INVALID_HANDLE;
}
}
else
{
Status = STATUS_NO_MEMORY;
} }
return Status; *NewFont = TextObj->BaseObject.hHmgr;
memcpy(&TextObj->logfont.elfEnumLogfontEx.elfLogFont, lf, sizeof(LOGFONTW));
if (lf->lfEscapement != lf->lfOrientation)
{
/* this should really depend on whether GM_ADVANCED is set */
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation =
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement;
}
TEXTOBJ_UnlockText(TextObj);
return STATUS_SUCCESS;
} }
HFONT HFONT
@ -528,51 +516,51 @@ NtGdiHfontCreate(
IN FLONG fl, IN FLONG fl,
IN PVOID pvCliData ) IN PVOID pvCliData )
{ {
ENUMLOGFONTEXDVW SafeLogfont; ENUMLOGFONTEXDVW SafeLogfont;
HFONT NewFont; HFONT hNewFont;
PTEXTOBJ TextObj; PTEXTOBJ TextObj;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
if (NULL != pelfw) if (!pelfw)
{ {
Status = MmCopyFromCaller(&SafeLogfont, pelfw, sizeof(ENUMLOGFONTEXDVW)); return NULL;
if (NT_SUCCESS(Status))
{
NewFont = TEXTOBJ_AllocText();
if (NULL != NewFont)
{
TextObj = TEXTOBJ_LockText(NewFont);
if (NULL != TextObj)
{
RtlCopyMemory ( &TextObj->logfont,
&SafeLogfont,
sizeof(ENUMLOGFONTEXDVW));
if (SafeLogfont.elfEnumLogfontEx.elfLogFont.lfEscapement !=
SafeLogfont.elfEnumLogfontEx.elfLogFont.lfOrientation)
{
/* this should really depend on whether GM_ADVANCED is set */
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation =
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement;
}
TEXTOBJ_UnlockText(TextObj);
}
else
{
/* FIXME */
/* ASSERT(FALSE);*/
Status = STATUS_INVALID_HANDLE;
}
}
}
}
else
{
Status = STATUS_INVALID_PARAMETER;
} }
return NT_SUCCESS(Status) ? NewFont : NULL; _SEH_TRY
{
ProbeForRead(pelfw, sizeof(ENUMLOGFONTEXDVW), 1);
RtlCopyMemory(&SafeLogfont, pelfw, sizeof(ENUMLOGFONTEXDVW));
}
_SEH_HANDLE
{
Status = _SEH_GetExceptionCode();
}
_SEH_END
if (!NT_SUCCESS(Status))
{
return NULL;
}
TextObj = TEXTOBJ_AllocTextWithHandle();
if (!TextObj)
{
return NULL;
}
hNewFont = TextObj->BaseObject.hHmgr;
RtlCopyMemory (&TextObj->logfont, &SafeLogfont, sizeof(ENUMLOGFONTEXDVW));
if (SafeLogfont.elfEnumLogfontEx.elfLogFont.lfEscapement !=
SafeLogfont.elfEnumLogfontEx.elfLogFont.lfOrientation)
{
/* this should really depend on whether GM_ADVANCED is set */
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation =
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement;
}
TEXTOBJ_UnlockText(TextObj);
return hNewFont;
} }
@ -1577,7 +1565,7 @@ NtGdiExtTextOutW(
Dc_Attr = dc->pDc_Attr; Dc_Attr = dc->pDc_Attr;
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr; if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
/* Check if String is valid */ /* Check if String is valid */
if ((Count > 0xFFFF) || (Count > 0 && UnsafeString == NULL)) if ((Count > 0xFFFF) || (Count > 0 && UnsafeString == NULL))
{ {
@ -2159,7 +2147,7 @@ NtGdiGetCharABCWidthsW(
SetLastWin32Error(Status); SetLastWin32Error(Status);
return FALSE; return FALSE;
} }
BufferSize = Count * sizeof(ABC); // Same size! BufferSize = Count * sizeof(ABC); // Same size!
SafeBuff = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT); SafeBuff = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT);
if (!fl) SafeBuffF = (LPABCFLOAT) SafeBuff; if (!fl) SafeBuffF = (LPABCFLOAT) SafeBuff;
@ -2447,7 +2435,7 @@ NtGdiGetGlyphIndicesW(
WCHAR DefChar = 0; WCHAR DefChar = 0;
PWSTR Buffer = NULL; PWSTR Buffer = NULL;
ULONG Size; ULONG Size;
if ((!UnSafepwc) && (!UnSafepgi)) return cwc; if ((!UnSafepwc) && (!UnSafepgi)) return cwc;
dc = DC_LockDc(hdc); dc = DC_LockDc(hdc);
@ -2488,7 +2476,7 @@ NtGdiGetGlyphIndicesW(
goto ErrorRet; goto ErrorRet;
} }
IntGetOutlineTextMetrics(FontGDI, Size, potm); IntGetOutlineTextMetrics(FontGDI, Size, potm);
DefChar = potm->otmTextMetrics.tmDefaultChar; // May need this. DefChar = potm->otmTextMetrics.tmDefaultChar; // May need this.
ExFreePool(potm); ExFreePool(potm);
} }
@ -2508,7 +2496,7 @@ NtGdiGetGlyphIndicesW(
IntLockFreeType; IntLockFreeType;
face = FontGDI->face; face = FontGDI->face;
for (i = 0; i < cwc; i++) for (i = 0; i < cwc; i++)
{ {
Buffer[i] = FT_Get_Char_Index(face, UnSafepwc[i]); Buffer[i] = FT_Get_Char_Index(face, UnSafepwc[i]);
@ -3340,7 +3328,7 @@ NtGdiGetCharSet(HDC hDC)
PDC Dc; PDC Dc;
PDC_ATTR Dc_Attr; PDC_ATTR Dc_Attr;
DWORD cscp = IntGdiGetCharSet(hDC); DWORD cscp = IntGdiGetCharSet(hDC);
// If here, update everything! // If here, update everything!
Dc = DC_LockDc(hDC); Dc = DC_LockDc(hDC);
Dc_Attr = Dc->pDc_Attr; Dc_Attr = Dc->pDc_Attr;
if (!Dc_Attr) Dc_Attr = &Dc->Dc_Attr; if (!Dc_Attr) Dc_Attr = &Dc->Dc_Attr;