/******************************Module*Header*******************************\ * Module Name: hmgshare.h * * Define shared dc attributes * * Created: 13-Apr-1995 * Author: Mark Enstrom [marke] * * Copyright (c) 1995-1999 Microsoft Corporation \**************************************************************************/ /******************************WOW64***NOTE********************************\ * Note: Win32k Memory shared with User-Mode and Wow64 * * For Wow64 (Win32 apps on Win64) we build a 32-bit version * of user32.dll & gdi32.dll which can run against the 64-bit kernel * with no changes to the 64-bit kernel code. * * For the 32 on 64 bit dlls all data structures which are shared with * win32k must be 64-bit. These data structures include the shared * sections, as well as the GDI TEB Batch. * These shared data structures are now declared so that they can be * built as 32 bit in a 32 bit dll, 64 bit in a 64 bit dll, and now * 64 bit in a 32 bit dll. * * The following rules should be followed when declaring * shared data structures: * * Pointers in shared data structures use the KPTR_MODIFIER in their * declaration. * * Handles in shared data structures are declared KHxxx. * * xxx_PTR changes to KERNEL_xxx_PTR. * * Pointers to basic types are declared as KPxxx; * * Also on Wow64 every thread has both a 32-bit TEB and a 64-bit TEB. * GetCurrentTeb() returns the current 32-bit TEB while the kernel * will allways reference the 64-bit TEB. * * All client side references to shared data in the TEB should use * the new GetCurrentTebShared() macro which returns the 64-bit TEB * for Wow64 builds and returns GetCurrentTeb() for regular builds. * The exception to this rule is LastErrorValue, which should allways * be referenced through GetCurrentTeb(). * * Ex: * * DECLARE_HANDLE(HFOO); * * typedef struct _MY_STRUCT * KPTR_MODIFIER PMPTR; * * struct _SHARED_STRUCT * { * struct _SHARED_STRUCT * pNext; * PMPTR pmptr; * HFOO hFoo; * UINT_PTR cb; * PBYTE pb; * PVOID pv; * * DWORD dw; * USHORT us; * } SHARED_STRUCT; * * * Changes to: * * * DECLARE_HANDLE(HFOO); * DECLARE_KHANDLE(HFOO); * * typedef struct _MY_STRUCT *PMPTR; * * struct _SHARED_STRUCT * { * struct _SHARED_STRUCT * KPTR_MODIFIER pNext; * PMPTR pmptr; * KHFOO hFoo; * KERNEL_UINT_PTR cb; * KPBYTE pb; * KERNEL_PVOID pv; * * DWORD dw; * USHORT us; * } SHARED_STRUCT; \***************************************************************************/ #ifndef GDIFLAGS_ONLY // used for gdikdx #include //Sundown: offsetof generates truncation warnings in 64bit environment #undef offsetof #define offsetof(c,f) FIELD_OFFSET(c,f) /*********************************Structure********************************\ * * RGNATTR * * Description: * * As an accelerator, this rectangular region is kept in the DC and * represents either a NULL region, a rectangular region, or hte bounding * box of a complex region. This can be used for a trivial reject clip test. * * Fields: * * Flags - state flags * NULLREGION - drawing is allowed anywhere, no trivial clip * SIMPLEREGION - Rect is the clip region * COMPLEXREGION - Rect is the bounding box of a complex clip region * ERROR - this information may not be used * * LRFlags - valid and dirty flags * * Rect - clip rectangle or bounding rectangle when in use * \**************************************************************************/ #endif // GDIFLAGS_ONLY used for gdikdx #define RREGION_INVALID ERROR // // ExtSelectClipRgn iMode extra flag for batching // #define REGION_NULL_HRGN 0X8000000 #ifndef GDIFLAGS_ONLY // used for gdikdx typedef struct _RGNATTR { ULONG AttrFlags; ULONG Flags; RECTL Rect; } RGNATTR,*PRGNATTR; /*******************************STRUCTURE**********************************\ * BRUSHATTR * * Fields: * * lbColor - Color from CreateSolidBrush * lflag - Brush operation flags * * CACHED - Set only when brush is cached on PEB * TO_BE_DELETED - Set only after DelteteBrush Called in kernel * when reference count of brush > 1, this will * cause the brush to be deleted via lazy delete * when it is selected out later. * NEW_COLOR - Set when color changes (retrieve cached brush) * ATTR_CANT_SELECT - Set when user calls DeleteObject(hbrush), * brush is marked so can't be seleced in user * mode. Not deleted until kernel mode DeleteBrush. * This is not currently implemented. * * History: * * 6-Feb-1996 -by- Mark Enstrom [marke] * \**************************************************************************/ typedef struct _BRUSHATTR { ULONG AttrFlags; COLORREF lbColor; } BRUSHATTR,*PBRUSHATTR; #endif // GDIFLAGS_ONLY used for gdikdx // // Common flags for dealing with RGN/BRUSH ATTR memory // #define ATTR_CACHED 0x00000001 #define ATTR_TO_BE_DELETED 0x00000002 #define ATTR_NEW_COLOR 0x00000004 #define ATTR_CANT_SELECT 0x00000008 #define ATTR_RGN_VALID 0x00000010 #define ATTR_RGN_DIRTY 0x00000020 #ifndef GDIFLAGS_ONLY // used for gdikdx // // Define a union so these objects can be managed together // typedef union _OBJECTATTR { RGNATTR Rgnattr; BRUSHATTR Brushattr; }OBJECTATTR,*POBJECTATTR; /**************************************************************************\ * * XFORM related structures and macros * \**************************************************************************/ // // These types are used to get things right when C code is passing C++ // defined transform data around. // typedef struct _MATRIX_S { EFLOAT_S efM11; EFLOAT_S efM12; EFLOAT_S efM21; EFLOAT_S efM22; EFLOAT_S efDx; EFLOAT_S efDy; FIX fxDx; FIX fxDy; FLONG flAccel; } MATRIX_S; #endif // GDIFLAGS_ONLY used for gdikdx // // status and dirty flags // #define DIRTY_FILL 0x00000001 #define DIRTY_LINE 0x00000002 #define DIRTY_TEXT 0x00000004 #define DIRTY_BACKGROUND 0x00000008 #define DIRTY_CHARSET 0x00000010 #define SLOW_WIDTHS 0x00000020 #define DC_CACHED_TM_VALID 0x00000040 #define DISPLAY_DC 0x00000080 #define DIRTY_PTLCURRENT 0x00000100 #define DIRTY_PTFXCURRENT 0x00000200 #define DIRTY_STYLESTATE 0x00000400 #define DC_PLAYMETAFILE 0x00000800 #define DC_BRUSH_DIRTY 0x00001000 // cached brush #define DC_PEN_DIRTY 0x00002000 #define DC_DIBSECTION 0x00004000 #define DC_LAST_CLIPRGN_VALID 0x00008000 #define DC_PRIMARY_DISPLAY 0x00010000 #define DIRTY_COLORTRANSFORM 0x00020000 #define ICM_BRUSH_TRANSLATED 0x00040000 #define ICM_PEN_TRANSLATED 0x00080000 #define DIRTY_COLORSPACE 0x00100000 #define BATCHED_DRAWING 0x00200000 #define BATCHED_TEXT 0x00400000 #ifndef GDIFLAGS_ONLY // used for gdikdx #define CLEAR_CACHED_TEXT(pdcattr) (pdcattr->ulDirty_ &= ~(SLOW_WIDTHS)) #define DIRTY_BRUSHES (DIRTY_FILL+DIRTY_LINE+DIRTY_TEXT+DIRTY_BACKGROUND) #define USER_XFORM_DIRTY(pdcattr) (pdcattr->flXform & (PAGE_XLATE_CHANGED | PAGE_EXTENTS_CHANGED | WORLD_XFORM_CHANGED)) #endif // GDIFLAGS_ONLY used for gdikdx /**************************************************************************\ * * ICM related structures and macros * \**************************************************************************/ // // ICM flags // // DC_ATTR.lIcmMode // // 0x0 000 0 0 00 // | | | | + Current ICM Mode (kernel/user) // | | | + Requested ICM Mode (kernel/user) // | | + ICM Mode context (user only) // | + not used // + Destination color type (kernel/user) #define DC_ICM_USERMODE_FLAG 0x0000F000 // // Current ICM mode flags. // #define DC_ICM_OFF 0x00000000 #define DC_ICM_HOST 0x00000001 #define DC_ICM_DEVICE 0x00000002 #define DC_ICM_OUTSIDEDC 0x00000004 #define DC_ICM_METAFILING_ON 0x00000008 #define DC_ICM_LAZY_CORRECTION 0x00000010 // alt mode (preserved through icm mode change) #define DC_ICM_DEVICE_CALIBRATE 0x00000020 // alt mode (preserved through icm mode change) #define DC_ICM_MODE_MASK 0x000000FF #define DC_ICM_ALT_MODE_MASK 0x000000F0 #ifndef GDIFLAGS_ONLY // used for gdikdx #define ICM_MODE(x) ((x) & DC_ICM_MODE_MASK) #define ICM_ALT_MODE(x) ((x) & DC_ICM_ALT_MODE_MASK) #define IS_ICM_DEVICE(x) ((x) & DC_ICM_DEVICE) #define IS_ICM_HOST(x) ((x) & DC_ICM_HOST) #define IS_ICM_INSIDEDC(x) ((x) & (DC_ICM_DEVICE|DC_ICM_HOST)) #define IS_ICM_OUTSIDEDC(x) ((x) & DC_ICM_OUTSIDEDC) #define IS_ICM_ON(x) ((x) & (DC_ICM_DEVICE|DC_ICM_HOST|DC_ICM_OUTSIDEDC)) #define IS_ICM_METAFILING_ON(x) ((x) & DC_ICM_METAFILING_ON) #define IS_ICM_LAZY_CORRECTION(x) ((x) & DC_ICM_LAZY_CORRECTION) #define IS_ICM_DEVICE_CALIBRATE(x) ((x) & DC_ICM_DEVICE_CALIBRATE) #endif // GDIFLAGS_ONLY used for gdikdx // // Request ICM mode flags // #define REQ_ICM_OFF 0x00000000 #define REQ_ICM_HOST 0x00000100 #define REQ_ICM_DEVICE 0x00000200 #define REQ_ICM_OUTSIDEDC 0x00000400 #ifndef GDIFLAGS_ONLY // used for gdikdx #define REQ_ICM_MODE(x) ((x) & 0x00000F00) #define IS_ICM_DEVICE_REQUESTED(x) ((x) & REQ_ICM_DEVICE) // // Convert Request mode to current ICM mode flags. // #define ICM_REQ_TO_MODE(x) ((REQ_ICM_MODE((x))) >> 8) #endif // GDIFLAGS_ONLY used for gdikdx // // Context mode for ICM. // #define CTX_ICM_HOST 0x00001000 // Host ICM #define CTX_ICM_DEVICE 0x00002000 // Device ICM #define CTX_ICM_METAFILING_OUTSIDEDC 0x00004000 // Metfiling outside DC ICM mode #define CTX_ICM_PROOFING 0x00008000 // Proofing mode #ifndef GDIFLAGS_ONLY // used for gdikdx #define SET_HOST_ICM_DEVMODE(x) ((x) |= CTX_ICM_HOST) #define SET_DEVICE_ICM_DEVMODE(x) ((x) |= CTX_ICM_DEVICE) #define SET_ICM_PROOFING(x) ((x) |= CTX_ICM_PROOFING) #define CLEAR_ICM_PROOFING(x) ((x) &= ~CTX_ICM_PROOFING) #define IS_DEVICE_ICM_DEVMODE(x) ((x) & CTX_ICM_DEVICE) #define IS_ICM_PROOFING(x) ((x) & CTX_ICM_PROOFING) #endif // GDIFLAGS_ONLY used for gdikdx // // Destination Color Type // #define DC_ICM_CMYK_COLOR 0x10000000 #define DC_ICM_RGB_COLOR 0x20000000 #define DC_ICM_COLORTYPE_MASK 0xF0000000 #ifndef GDIFLAGS_ONLY // used for gdikdx #define DC_ICM_32BITS_COLOR (DC_ICM_CMYK_COLOR) #define IS_32BITS_COLOR(x) ((x) & DC_ICM_32BITS_COLOR) #define IS_CMYK_COLOR(x) ((x) & DC_ICM_CMYK_COLOR) #define GET_COLORTYPE(x) ((x) & DC_ICM_COLORTYPE_MASK) #define CLEAR_COLORTYPE(x) ((x) &= ~DC_ICM_COLORTYPE_MASK) /******************************Structure***********************************\ * * DC_ATTR: This structure provides a common DC area visible both by in kernel * and user mode. Since elements in the DC_ATTR are visible and modifiable * in user-mode, data that must be kept safe must be stored in the kernel * private DC structure. * \**************************************************************************/ typedef struct _DC_ATTR { // // local dc info // KERNEL_PVOID pvLDC; // // General Purpose Dirty Flags for brushes, fonts, etc. // ULONG ulDirty_; // // brush handle selected into DCATTR, not neccessarily selected // into DC // KHANDLE hbrush; KHANDLE hpen; // // *** Attribute Bundles *** // // When ICM is enabled, // + cr____Clr color is corrected to DC's color space. // + ul____Clr keeps original (un-corrected) color. // COLORREF crBackgroundClr; // Set/GetBkColor ULONG ulBackgroundClr; // Set/GetBkColor client attr COLORREF crForegroundClr; // Set/GetTextColor ULONG ulForegroundClr; // Set/GetTextColor client attr // // *** DC Brush color // // When ICM is enabled, // + cr____Clr color is corrected to DC's color space. // + ul____Clr keeps original (un-corrected) color. // COLORREF crDCBrushClr; // Set/GetDCBrushColor client attr ULONG ulDCBrushClr; // Set/GetDCBrushColor client attr COLORREF crDCPenClr; // Set/GetDCPenColor ULONG ulDCPenClr; // Set/GetDCPenColor client attr // // *** Misc. Attrs. // DWORD iCS_CP; // LOWORD: code page HIWORD charset int iGraphicsMode; // Set/GetGraphicsMode BYTE jROP2; // Set/GetROP2 BYTE jBkMode; // TRANSPARENT/OPAQUE BYTE jFillMode; // ALTERNATE/WINDING BYTE jStretchBltMode; // BLACKONWHITE/WHITEONBLACK/ // COLORONCOLOR/HALFTONE POINTL ptlCurrent; // Current position in logical coordinates // (invalid if DIRTY_PTLCURRENT set) POINTL ptfxCurrent; // Current position in device coordinates // (invalid if DIRTY_PTFXCURRENT set) // // original values set by app // LONG lBkMode; LONG lFillMode; LONG lStretchBltMode; FLONG flFontMapper; // Font mapper flags // // *** ICM attributes // LONG lIcmMode; // Currnt ICM mode (DC_ICM_xxxx) KHANDLE hcmXform; // Handle of Current Color Transform KHCOLORSPACE hColorSpace; // Handle of Source Color Space KERNEL_ULONG_PTR dwDIBColorSpace; // Identifier of DIB Color Space Data (when DIB selected) // Sundown: dwDIBColorSpace actually takes a pointer in, // change from DWORD to ULONG_PTR COLORREF IcmBrushColor; // ICM-ed color for the brush selected in this DCATTR (Solid or Hatch) COLORREF IcmPenColor; // ICM-ed color for the pen selected in this DCATTR KERNEL_PVOID pvICM; // Pointer to client-side ICM information // // *** Text attributes // FLONG flTextAlign; LONG lTextAlign; LONG lTextExtra; // Inter-character spacing LONG lRelAbs; // Moved over from client side LONG lBreakExtra; LONG cBreak; KHANDLE hlfntNew; // Log font selected into DC // // Transform data. // MATRIX_S mxWtoD; // World to Device Transform. MATRIX_S mxDtoW; // Device to World. MATRIX_S mxWtoP; // World transform EFLOAT_S efM11PtoD; // efM11 of the Page transform EFLOAT_S efM22PtoD; // efM22 of the Page transform EFLOAT_S efDxPtoD; // efDx of the Page transform EFLOAT_S efDyPtoD; // efDy of the Page transform INT iMapMode; // Map mode DWORD dwLayout; // Layout orientation bits. LONG lWindowOrgx; // The logical x window origin. POINTL ptlWindowOrg; // Window origin. SIZEL szlWindowExt; // Window extents. POINTL ptlViewportOrg; // Viewport origin. SIZEL szlViewportExt; // Viewport extents. FLONG flXform; // Flags for transform component. SIZEL szlVirtualDevicePixel; // Virtual device size in pels. SIZEL szlVirtualDeviceMm; // Virtual device size in mm's. SIZEL szlVirtualDevice; // Virtual device size POINTL ptlBrushOrigin; // Alignment origin for brushes // // dc regions // RGNATTR VisRectRegion; } DC_ATTR,*PDC_ATTR; // // conditional system definitions // #if !defined(_NTOSP_) && !defined(_USERKDX_) typedef struct _W32THREAD * KPTR_MODIFIER PW32THREAD; typedef ULONG W32PID; DECLARE_HANDLE(HOBJ); DECLARE_KHANDLE(HOBJ); #endif /*****************************Struct***************************************\ * * BASEOBJECT * * Description: * * Each GDI object has a BASEOBJECT at the beggining of the object. This * enables fast references to the handle and back to the entry. * * Fields: * * hHmgr - object handle * ulShareCount - the shared reference count on the object * cExclusiveLock - object exclusive lock count * BaseFlags - flags representing state of underlying memory * tid - thread id of exclusive lock owner * * Note: * * Most of the BASEOBJECT represents state logically associated with the * object. When objects are swapped (for example, when doing a realloc * to grow the object), the BASEOBJECT is swapped to preserve the handle * and locking information. * * However, the BaseFlags field was added as an optimization to allow * allocation from a "lookaside" list of preallocated objects. The * BaseFlags field is metadata associated with the memory containing * an object; it is not associated with the object itself. * * Current BASEOBJECT swapping code "unswaps" the BaseFlags so that it * always remains associated with the memory, not the object. * * If flags are added to BaseFlags, they must not represent object state. * If it is necessary to add such flags, the BaseFlags field could be * reduced to a BYTE field and a new BYTE flags field can be added to * represent state that is associated with the object. * * Currently, BASEOBJECT swapping code is in HmgSwapLockedHandleContents * and RGNOBJ::bSwap (hmgrapi.cxx and rgnobj.cxx, respectively). * \**************************************************************************/ // BASEOBJECT FLAGS // // Due to the read-modify-write cycle and the fact that the Alpha can // load and store a minimum of 32bit values, setting BaseFlags requires // an InterlockedCompareExchange loop so that it doesn't interfere with the // cExclusiveLock. // // HMGR_LOOKASIDE_ALLOC_FLAG is a 'static' flag - it doesn't change after // it is set on object allocation. If anyone adds a 'dynamic' flag they // should probably restructure BASEOBJECT to use a DWORD for the BaseFlags and // a DWORD for the cExclusiveLock. // // If anyone restructures BASEOBJECT they'll have to rewrite all the code // that uses cExclusiveLock and BaseFlags. // This includes: // INC_EXCLUSIVE_REF_CNT and DEC_EXCLUSIVE_REF_CNT // RGNOBJ::bSwap // // Also if anyone adds fields to BASEOBJECT they need to go and fix RGNOBJ::bSwap // to also copy those fields. // // #endif // GDIFLAGS_ONLY used for gdikdx #define HMGR_LOOKASIDE_ALLOC_FLAG 0x8000 #ifndef GDIFLAGS_ONLY // used for gdikdx typedef struct _BASEOBJECT { KHANDLE hHmgr; ULONG ulShareCount; USHORT cExclusiveLock; USHORT BaseFlags; PW32THREAD Tid; } BASEOBJECT, * KPTR_MODIFIER POBJ; /*****************************Struct***************************************\ * * OBJECTOWNER * * Description: * * This object is used for shared and exclusive object ownership * * Fields for shared Object: * * Pid : 31 * Lock : 1 * \**************************************************************************/ // // The lock and the Pid share the same DWORD. // // It seems that this is safe from the word tearing problem on the Alpha architecture // due to the fact that we always use the InterlockedCompareExchange loop for // the Lock and we require that the lock is set when setting the Pid. // typedef struct _OBJECTOWNER_S { ULONG Lock:1; W32PID Pid_Shifted:31; // The lowest two bits of the PID are // reserved for application use. However, // the second bit is used by the // OBJECT_OWNER_xxxx constants and so we // use 31 bits for the Pid_Shifted field. // WARNING: do not access this field directly, // but rather via the macros below. }OBJECTOWNER_S,*POBJECTOWNER_S; #endif // GDIFLAGS_ONLY used for gdikdx // Note: when accessing the Pid_Shifted field the compiler will shift the // value by one bit to account for the field being only in the upper 31 // bits of the OBJECTOWNER_S structure. For example, if the OBJECTOWNER_S // is 8, the Pid_Shifted would be only 4. However, since we are really // interested in the upper 31 bits of the PID, this shifting is not // appropriate (we need masking instead). I'm not aware of any compiler // primitives that will accomplish this and will use the macros below // instead. #define LOCK_MASK 0x00000001 #define PID_MASK 0xfffffffe #define PID_BITS 0xfffffffc // The actual bits used by the PID #ifndef GDIFLAGS_ONLY // used for gdikdx #define OBJECTOWNER_PID(ObjectOwner) \ ((W32PID) ((ObjectOwner).ulObj & PID_MASK)) #define SET_OBJECTOWNER_PID(ObjectOwner, Pid) \ ((ObjectOwner).ulObj) = ((ObjectOwner).ulObj & LOCK_MASK) | ((Pid) & PID_MASK); typedef union _OBJECTOWNER { OBJECTOWNER_S Share; ULONG ulObj; }OBJECTOWNER,*POBJECTOWNER; typedef UCHAR OBJTYPE; typedef union _EINFO { POBJ pobj; // Pointer to object HOBJ hFree; // Next entry in free list } EINFO; #endif // GDIFLAGS_ONLY used for gdikdx /*****************************Struct***************************************\ * * ENTRY * * Description: * * This object is allocated for each entry in the handle manager and * keeps track of object owners, reference counts, pointers, and handle * objt and iuniq * * Fields: * * einfo - pointer to object or next free handle * ObjectOwner - lock object * ObjectInfo - Object Type, Unique and flags * pUser - Pointer to user-mode data * \**************************************************************************/ // entry.Flags flags #define HMGR_ENTRY_UNDELETABLE 0x0001 #define HMGR_ENTRY_LAZY_DEL 0x0002 #define HMGR_ENTRY_INVALID_VIS 0x0004 #define HMGR_ENTRY_LOOKASIDE_ALLOC 0x0010 #ifndef GDIFLAGS_ONLY // used for gdikdx typedef struct _ENTRY { EINFO einfo; OBJECTOWNER ObjectOwner; USHORT FullUnique; OBJTYPE Objt; UCHAR Flags; KERNEL_PVOID pUser; } ENTRY, *PENTRY; typedef union _PENTOBJ { PENTRY pent; POBJ pobj; } PENTOBJ; #endif // GDIFLAGS_ONLY used for gdikdx // // status flags used by metafile in user and kernel // #define MRI_ERROR 0 #define MRI_NULLBOX 1 #define MRI_OK 2 /*******************************STRUCTURE**********************************\ * GDIHANDLECACHE * * Cache common handle types, when a handle with user mode attributes is * deleted, an attempt is made to cache the handle on memory accessable * in user mode. * * Fields: * * Lock - CompareExchange used to gain ownership * pCacheEntr[] - array of offsets to types * ulBuffer - buffer for storage of all handle cache entries * * * History: * * 30-Jan-1996 -by- Mark Enstrom [marke] * \**************************************************************************/ // // defined cached handle types // #define GDI_CACHED_HADNLE_TYPES 4 #define CACHE_BRUSH_ENTRIES 10 #define CACHE_PEN_ENTRIES 8 #define CACHE_REGION_ENTRIES 8 #define CACHE_LFONT_ENTRIES 1 #ifndef GDIFLAGS_ONLY // used for gdikdx typedef enum _HANDLECACHETYPE { BrushHandle, PenHandle, RegionHandle, LFontHandle }HANDLECACHETYPE,*PHANDLECACHETYPE; typedef struct _GDIHANDLECACHE { KERNEL_PVOID Lock; ULONG ulNumHandles[GDI_CACHED_HADNLE_TYPES]; KHANDLE Handle[CACHE_BRUSH_ENTRIES + CACHE_PEN_ENTRIES + CACHE_REGION_ENTRIES + CACHE_LFONT_ENTRIES]; }GDIHANDLECACHE,*PGDIHANDLECACHE; /*********************************MACRO************************************\ * Lock handle cache by placing -1 into lock variable using cmp-exchange * * Arguments: * * p - handle cache pointer * uLock - Thread specific lock ID (TEB or THREAD) * bStatus - Lock status * * History: * * 22-Feb-1996 -by- Mark Enstrom [marke] * \**************************************************************************/ #if defined(BUILD_WOW6432) KERNEL_PVOID InterlockedCompareExchangeKernelPointer( KERNEL_PVOID *Destination, KERNEL_PVOID Exchange, KERNEL_PVOID Compare ); #else #define InterlockedCompareExchangeKernelPointer InterlockedCompareExchangePointer #endif #define LOCK_HANDLE_CACHE(p,uLock,bStatus) \ { \ KERNEL_PVOID OldLock = p->Lock; \ bStatus = FALSE; \ \ if (OldLock == NULL) \ { \ if (InterlockedCompareExchangeKernelPointer( \ &p->Lock, \ uLock, \ OldLock) == OldLock) \ { \ bStatus = TRUE; \ } \ } \ } /*********************************MACRO************************************\ * unlock locked structure by writing null back to lock variable * * Arguments: * * p - pointer to handle cache * * Return Value: * * none * * History: * * 22-Feb-1996 -by- Mark Enstrom [marke] * \**************************************************************************/ #if defined(BUILD_WOW6432) && defined(_X86_) /* It is assumed that p->Lock will be updated atomically. This is true for alpha, but it is not true for the 32bit x86 dll on wow64 since Lock is a 64bit quantity which requires 2 mov instructions. So call InterlockedCompareExchangeKernelPointer to set it. */ #define UNLOCK_HANDLE_CACHE(p) \ InterlockedCompareExchangeKernelPointer(&p->Lock, NULL, p->Lock); #else #define UNLOCK_HANDLE_CACHE(p) \ { \ p->Lock = NULL; \ } #endif #endif // GDIFLAGS_ONLY used for gdikdx /******************************Struct**************************************\ * CFONT * * Client side realized font. Contains widths of all ANSI characters. * * We keep a free list of CFONT structures for fast allocation. The * reference count counts pointers to this structure from all LDC and * LOCALFONT structures. When this count hits zero, the CFONT is freed. * * The only "inactive" CFONTs that we keep around are those referenced by * the LOCALFONT. * * (In the future we could expand this to contain UNICODE info as well.) * * Mon 11-Jun-1995 00:36:14 -by- Gerrit van Wingerden [gerritv] * Addapted for kernel mode * Sun 10-Jan-1993 00:36:14 -by- Charles Whitmer [chuckwh] * Wrote it. \**************************************************************************/ #define CFONT_COMPLETE 0x0001 #define CFONT_EMPTY 0x0002 #define CFONT_DBCS 0x0004 #define CFONT_CACHED_METRICS 0x0008 // we have cached the metrics #define CFONT_CACHED_AVE 0x0010 // we have cached the average width #define CFONT_CACHED_WIDTHS 0x0020 // if off, no widths have been computed #define CFONT_PUBLIC 0x0040 // if public font in public cache #define CFONT_CACHED_RI 0x0080 // if off, RealizationInfo (RI) has not been cached #ifndef GDIFLAGS_ONLY // used for gdikdx #define DEC_CFONT_REF(pcf) {if (!((pcf)->fl & CFONT_PUBLIC)) --(pcf)->cRef;} #define INC_CFONT_REF(pcf) {ASSERTGDI(!((pcf)->fl & CFONT_PUBLIC),"pcfLocate - public font error\n");++(pcf)->cRef;} typedef struct _CFONT * KPTR_MODIFIER PCFONT; typedef struct _CFONT { PCFONT pcfNext; KHFONT hf; ULONG cRef; // Count of all pointers to this CFONT. FLONG fl; LONG lHeight; // Precomputed logical height. // The following are keys to match when looking for a mapping. KHDC hdc; // HDC of realization. 0 for display. EFLOAT_S efM11; // efM11 of WtoD of DC of realization EFLOAT_S efM22; // efM22 of WtoD of DC of realization EFLOAT_S efDtoWBaseline; // Precomputed back transform. (FXtoL) EFLOAT_S efDtoWAscent; // Precomputed back transform. (FXtoL) // various extra width info WIDTHDATA wd; // Font info flags. FLONG flInfo; // The width table. USHORT sWidth[256]; // Widths in pels. // other usefull cached info ULONG ulAveWidth; // bogus average used by USER TMW_INTERNAL tmw; // cached metrics #ifdef LANGPACK // RealizationInfo for this font REALIZATION_INFO ri ; #endif LONG timeStamp; // to check if cached realization info is updated } CFONT; /*******************************STRUCTURE**********************************\ * * This structure controls the address for allocating and mapping the * global shared handle table and device caps (primary display) that * is mapped read-only into all user mode processes * * Fields: * * aentryHmgr - Handle table * DevCaps - Cached primary display device caps * \**************************************************************************/ #define MAX_PUBLIC_CFONT 16 typedef struct _GDI_SHARED_MEMORY { ENTRY aentryHmgr[MAX_HANDLE_COUNT]; DEVCAPS DevCaps; ULONG iDisplaySettingsUniqueness; #ifdef LANGPACK DWORD dwLpkShapingDLLs; #endif CFONT acfPublic[MAX_PUBLIC_CFONT]; LONG timeStamp; } GDI_SHARED_MEMORY, *PGDI_SHARED_MEMORY; /***********************************Structure******************************\ * * GDI TEB Batching * * Contains the data structures and constants used for the batching of * GDI calls to avoid kernel mode transition costs. * * History: * 20-Oct-1995 -by- Mark Enstrom [marke] * \**************************************************************************/ typedef enum _BATCH_TYPE { BatchTypePatBlt, BatchTypePolyPatBlt, BatchTypeTextOut, BatchTypeTextOutRect, BatchTypeSetBrushOrg, BatchTypeSelectClip, BatchTypeSelectFont, BatchTypeDeleteBrush, BatchTypeDeleteRegion } BATCH_TYPE,*PBATCH_TYPE; typedef struct _BATCHCOMMAND { USHORT Length; USHORT Type; }BATCHCOMMAND,*PBATCHCOMMAND; typedef struct _BATCHDELETEBRUSH { USHORT Length; USHORT Type; KHBRUSH hbrush; }BATCHDELETEBRUSH,*PBATCHDELETEBRUSH; typedef struct _BATCHDELETEREGION { USHORT Length; USHORT Type; KHRGN hregion; }BATCHDELETEREGION,*PBATCHDELETEREGION; typedef struct _BATCHSETBRUSHORG { USHORT Length; USHORT Type; int x; int y; }BATCHSETBRUSHORG,*PBATCHSETBRUSHORG; typedef struct _BATCHPATBLT { USHORT Length; USHORT Type; LONG x; LONG y; LONG cx; LONG cy; KHBRUSH hbr; ULONG rop4; ULONG TextColor; ULONG BackColor; COLORREF DCBrushColor; COLORREF IcmBrushColor; POINTL ptlViewportOrg; ULONG ulTextColor; ULONG ulBackColor; ULONG ulDCBrushColor; }BATCHPATBLT,*PBATCHPATBLT; typedef struct _BATCHPOLYPATBLT { USHORT Length; USHORT Type; ULONG rop4; ULONG Mode; ULONG Count; ULONG TextColor; ULONG BackColor; COLORREF DCBrushColor; ULONG ulTextColor; ULONG ulBackColor; ULONG ulDCBrushColor; POINTL ptlViewportOrg; // // Variable length buffer for POLYPATBLT struct. Must be naturally // aligned. // KERNEL_PVOID ulBuffer[1]; }BATCHPOLYPATBLT,*PBATCHPOLYPATBLT; typedef struct _BATCHTEXTOUT { USHORT Length; USHORT Type; ULONG TextColor; ULONG BackColor; ULONG BackMode; ULONG ulTextColor; ULONG ulBackColor; LONG x; LONG y; ULONG fl; RECTL rcl; DWORD dwCodePage; ULONG cChar; ULONG PdxOffset; KHANDLE hlfntNew; UINT flTextAlign; POINTL ptlViewportOrg; // // variable length buffer for WCHAR and pdx data // ULONG ulBuffer[1]; }BATCHTEXTOUT,*PBATCHTEXTOUT; typedef struct _BATCHTEXTOUTRECT { USHORT Length; USHORT Type; ULONG BackColor; ULONG fl; RECTL rcl; POINTL ptlViewportOrg; ULONG ulBackColor; }BATCHTEXTOUTRECT,*PBATCHTEXTOUTRECT; typedef struct _BATCHSELECTCLIP { USHORT Length; USHORT Type; int iMode; RECTL rclClip; }BATCHSELECTCLIP,*PBATCHSELECTCLIP; typedef struct _BATCHSELECTFONT { USHORT Length; USHORT Type; KHANDLE hFont; }BATCHSELECTFONT,*PBATCHSELECTFONT; // // GDI_BATCH_BUFFER_SIZE is space (IN BYTES) in TEB allocated // for GDI batching // #if defined(_GDIPLUS_) #define GDI_BATCH_SIZE 0 #else #define GDI_BATCH_SIZE 4 * GDI_BATCH_BUFFER_SIZE #endif // // Image32 data // typedef enum _IMAGE_TYPE { Image_Alpha, Image_AlphaDIB, Image_Transparent, Image_TransparentDIB, Image_Stretch, Image_StretchDIB }IMAGE_TYPE,*PIMAGE_TYPE; #endif // GDIFLAGS_ONLY used for gdikdx // these strings are included in both gre\mapfile.c and client\output.c // so we put them here so that we can manage the changes from // the unified place. // // This rubbish comment is in win95 sources. I leave it here for reference // [bodind] // // // this static data goes away as soon as we get the correct functionality in // NLS. (its in build 162, use it in buid 163) // #define NCHARSETS 16 #define CHARSET_ARRAYS \ UINT nCharsets = NCHARSETS; \ UINT charsets[] = { \ ANSI_CHARSET, SHIFTJIS_CHARSET, HANGEUL_CHARSET, JOHAB_CHARSET, \ GB2312_CHARSET, CHINESEBIG5_CHARSET, HEBREW_CHARSET, \ ARABIC_CHARSET, GREEK_CHARSET, TURKISH_CHARSET, \ BALTIC_CHARSET, EASTEUROPE_CHARSET, RUSSIAN_CHARSET, THAI_CHARSET, \ VIETNAMESE_CHARSET, SYMBOL_CHARSET}; \ UINT codepages[] ={ 1252, 932, 949, 1361, \ 936, 950, 1255, 1256, \ 1253, 1254, 1257, 1250, \ 1251, 874 , 1258, 42}; \ DWORD fs[] = { FS_LATIN1, FS_JISJAPAN, FS_WANSUNG, FS_JOHAB, \ FS_CHINESESIMP, FS_CHINESETRAD, FS_HEBREW, FS_ARABIC, \ FS_GREEK, FS_TURKISH, FS_BALTIC, FS_LATIN2, \ FS_CYRILLIC, FS_THAI, FS_VIETNAMESE, FS_SYMBOL };