/******************************Module*Header*******************************\ * Module Name: dcexts.cxx * * Copyright (c) 2000 Microsoft Corporation * \**************************************************************************/ #include "precomp.hxx" // class DC #define GetDCField(field) \ GetDCSubField(#field, field) #define GetDCSubField(field,local) \ GetFieldData(offDC, GDIType(DC), field, sizeof(local), &local) #define GetDCOffset(field) \ GetFieldOffset(GDIType(DC), #field, &offset) #define GetDCFieldAndOffset(field) \ do { \ GetDCField(field); \ GetDCOffset(field); \ } while (0) // _DC_ATTR #define GetDCATTRField(field) \ GetDCATTRSubField(#field, field) #define GetDCATTRSubField(field,local) \ GetFieldData(offDCATTR, GDIType(_DC_ATTR), field, sizeof(local), &local) #define GetDCATTROffset(field) \ GetFieldOffset(GDIType(_DC_ATTR), #field, &offset) #define GetDCATTRFieldAndOffset(field) \ do { \ GetDCATTRField(field); \ GetDCATTROffset(field); \ } while (0) // DCLEVEL #define GetDCLEVELField(field) \ GetDCLEVELSubField(#field, field) #define GetDCLEVELSubField(field,local) \ GetFieldData(offDCLEVEL, GDIType(DCLEVEL), field, sizeof(local), &local) #define GetDCLEVELOffset(field) \ GetFieldOffset(GDIType(DCLEVEL), #field, &offset) #define GetDCLEVELFieldAndOffset(field) \ do { \ GetDCLEVELField(field); \ GetDCLEVELOffset(field); \ } while (0) /******************************Public*Routine******************************\ * * Routine Name: * * vDumpDCGeneral * \**************************************************************************/ void vDumpDCgeneral(ULONG64 offDC) { #define DPRINTDCPP(aa,bb) \ DPRINTPP(aa,bb,offDC) #define DPRINTDCPX(aa,bb) \ DPRINTPX(aa,bb,offDC) #define DPRINTDCPS(bb) \ DPRINTPS(bb,offDC) #define GetERECTLvalues { \ GetFieldData(percl, "ERECTL", "left", sizeof(left), &left); \ GetFieldData(percl, "ERECTL", "top", sizeof(top), &top); \ GetFieldData(percl, "ERECTL", "right", sizeof(right), &right); \ GetFieldData(percl, "ERECTL", "bottom", sizeof(bottom), &bottom); \ } ULONG64 ppdev_, dhpdev_; ULONG64 hdcNext_, hdcPrev_; ULONG64 prgnAPI_, prgnVis_, prgnRao_; ULONG64 psurfInfo_, pDCAttr, ebrushobj; ULONG64 hlfntCur_, prfnt_, pPFFList; ULONG64 percl; SHORT ipfdDevMax_; FSHORT fs_; POINTL ptlFillOrigin_; FLONG flGraphicsCaps_,flSimulationFlags_; LONG lEscapement_, left, right, top, bottom; ULONG ulCopyCount_, offset; DCTYPE dctp_; FLAGDEF *pfd; GetDCFieldAndOffset(ppdev_); DPRINTDCPP( ppdev_, "ppdev_ " ); GetDCFieldAndOffset(dhpdev_); DPRINTDCPP( dhpdev_, "dhpdev_ " ); GetDCFieldAndOffset(flGraphicsCaps_); DPRINTDCPX( flGraphicsCaps_, "flGraphicsCaps_ " ); for (pfd = afdGInfo; pfd->psz; pfd++) if (pfd->fl & flGraphicsCaps_) { dprintf("\t\t\t\t%s\n", pfd->psz); flGraphicsCaps_ &= ~pfd->fl; } if (flGraphicsCaps_) dprintf(" \t\t\t%-#x BAD FLAGS\n", flGraphicsCaps_); GetDCFieldAndOffset(hdcNext_); DPRINTDCPP( hdcNext_, "hdcNext_ " ); GetDCFieldAndOffset(hdcPrev_); DPRINTDCPP( hdcPrev_, "hdcPrev_ " ); GetDCOffset(erclClip_); percl = offDC + offset; GetERECTLvalues; DPRINTDCPS( "erclClip " ); dprintf("%d %d %d %d\n", left, top, right, bottom ); GetDCOffset(erclWindow_); percl = offDC + offset; GetERECTLvalues; DPRINTDCPS( "erclWindow " ); dprintf("%d %d %d %d\n", left, top, right, bottom ); GetDCOffset(erclBounds_); percl = offDC + offset; GetERECTLvalues; DPRINTDCPS( "erclBounds_ " ); dprintf("%d %d %d %d\n", left, top, right, bottom ); GetDCOffset(erclBoundsApp_); percl = offDC + offset; GetERECTLvalues; DPRINTDCPS( "erclBoundsApp_ " ); dprintf("%d %d %d %d\n", left, top, right, bottom); GetDCFieldAndOffset(prgnAPI_); DPRINTDCPP( prgnAPI_, "prgnAPI_ " ); GetDCFieldAndOffset(prgnVis_); DPRINTDCPP( prgnVis_, "prgnVis_ " ); GetDCFieldAndOffset(prgnRao_); DPRINTDCPP( prgnRao_, "prgnRao_ " ); GetDCFieldAndOffset(ipfdDevMax_); DPRINTDCPS( "ipfdDevMax_\n" ); GetDCFieldAndOffset(ptlFillOrigin_); DPRINTDCPS( "ptlFillOrigin " ); dprintf("%d %d\n", ptlFillOrigin_.x, ptlFillOrigin_.y); GetDCOffset(eboFill_); ebrushobj = offDC + offset; DPRINTDCPS("eboFill_\n"); GetDCOffset(eboLine_); ebrushobj = offDC + offset; DPRINTDCPS("eboLine_\n"); GetDCOffset(eboText_); ebrushobj = offDC + offset; DPRINTDCPS("eboText_\n"); GetDCOffset(eboBackground_); ebrushobj = offDC + offset; DPRINTDCPS("eboBackground_\n"); GetDCFieldAndOffset(hlfntCur_); DPRINTDCPP( hlfntCur_, "hlfntCur_ " ); GetDCFieldAndOffset(flSimulationFlags_); DPRINTDCPX( flSimulationFlags_, "flSimulationFlags_ " ); for (pfd = afdTSIM; pfd->psz; pfd++) if (pfd->fl & flSimulationFlags_) { dprintf(" \t\t\t\t%s\n", pfd->psz); flSimulationFlags_ &= ~pfd->fl; } if (flSimulationFlags_) dprintf(" \t\t\t%-#x BAD FLAGS\n", flSimulationFlags_); GetDCFieldAndOffset(lEscapement_); DPRINTDCPS("lEscapement_ " ); dprintf( "%d\n", lEscapement_ ); GetDCFieldAndOffset(prfnt_); DPRINTDCPP( prfnt_, "prfnt_ " ); GetDCFieldAndOffset(pPFFList); DPRINTDCPP( pPFFList, "pPFFList " ); GetDCOffset(co_); DPRINTDCPS("co_ " ); dprintf("!gdikdx.dco %p\n", offDC + offset); GetDCFieldAndOffset(pDCAttr); DPRINTDCPP( pDCAttr, "pDCAttr " ); GetDCOffset(dcattr); DPRINTDCPS( "dcattr " ); dprintf("!gdikdx.dca %p\n", offDC + offset); GetDCOffset(dclevel); DPRINTDCPS( "dclevel " ); dprintf("!gdikdx.dcl %p\n", offDC + offset); GetDCFieldAndOffset(ulCopyCount_); DPRINTDCPS( "ulCopyCount_ " ); dprintf("%u\n" , ulCopyCount_); GetDCFieldAndOffset(psurfInfo_); DPRINTDCPP( psurfInfo_, "pSurfInfo " ); GetDCFieldAndOffset(dctp_); DPRINTDCPS( "dctp_ " ); dprintf("%d %s\n", dctp_, pszDCTYPE(dctp_)); GetDCFieldAndOffset(fs_); DPRINTDCPX( fs_, "fs_ " ); for (pfd = afdDCfs; pfd->psz; pfd++) if (pfd->fl & fs_) { dprintf("\t\t\t\t%s\n", pfd->psz); fs_ &= ~pfd->fl; } if (fs_) dprintf(" \t\t\t%-#x BAD FLAGS\n", fs_); dprintf("\n"); #undef GetERECTLvalues return; } /******************************Public*Routine******************************\ * * Routine Name: * * vDumpDC_ATTR * \**************************************************************************/ void vDumpDC_ATTR(ULONG64 offDCATTR) { #define DPRINTDCATTRPP(aa,bb) \ DPRINTPP(aa,bb,offDCATTR) #define DPRINTDCATTRPX(aa,bb) \ DPRINTPX(aa,bb,offDCATTR) #define DPRINTDCATTRPS(bb) \ DPRINTPS(bb,offDCATTR) #define DPRINTDCATTRPD(aa,bb) \ DPRINTPD(aa,bb,offDCATTR) ULONG64 pvLDC, hbrush, hcmXform, hColorSpace, hlfntNew, pvisrectrgn; ULONG ulDirty_, offset, Flags; DWORD crBackgroundClr, crForegroundClr, iCS_CP, IcmBrushColor, IcmPenColor, dwLayout; ULONG ulBackgroundClr, ulForegroundClr; LONG lIcmMode,lBkMode, lFillMode, lStretchBltMode, lTextAlign, lTextExtra, lRelAbs, lBreakExtra, cBreak, lWindowOrgx; FLONG flTextAlign, flFontMapper, flXform; BYTE jROP2, jBkMode, jFillMode, jStretchBltMode; POINTL ptlCurrent, ptfxCurrent, ptlWindowOrg, ptlViewportOrg, ptlBrushOrigin; SIZEL szlWindowExt, szlViewportExt, szlVirtualDevicePixel,szlVirtualDeviceMm; int iGraphicsMode; INT iMapMode; LONG left, top, right, bottom; FLAGDEF *pfd; char ach[128], *psz = ach; if (offDCATTR) { dprintf("\nDC_ATTR\n address\n -------\n"); GetDCATTRFieldAndOffset(pvLDC); DPRINTDCATTRPP(pvLDC, " pvLDC "); GetDCATTRFieldAndOffset(ulDirty_); dprintf("[%x]", offDCATTR + offset); dprintf(" ulDirty_ %-#x\n",ulDirty_); for (pfd=afdDirty; pfd->psz; pfd++) if (ulDirty_ & pfd->fl) { dprintf("\t\t\t\t%s\n", pfd->psz); ulDirty_ &= ~pfd->fl; } if (ulDirty_) dprintf("\t\t\t\t? %-#x\tBAD FLAGS\n", ulDirty_); // // hbrush // GetDCATTRFieldAndOffset(hbrush); DPRINTDCATTRPP(hbrush, "hbrush "); GetDCATTRFieldAndOffset(crBackgroundClr); DPRINTDCATTRPX(crBackgroundClr, "crBackgroundClr "); GetDCATTRFieldAndOffset(ulBackgroundClr); DPRINTDCATTRPX(ulBackgroundClr, "ulBackgroundClr "); GetDCATTRFieldAndOffset(crForegroundClr); DPRINTDCATTRPX(crForegroundClr, "crForegroundClr "); GetDCATTRFieldAndOffset(ulForegroundClr); DPRINTDCATTRPX(ulForegroundClr, "ulForegroundClr "); GetDCATTRFieldAndOffset(iCS_CP); DPRINTDCATTRPX(iCS_CP, "iCS_CP "); GetDCATTRFieldAndOffset(iGraphicsMode); dprintf("[%p] iGraphicsMode %d= %s\n", offDCATTR + offset, iGraphicsMode, pszGraphicsMode(iGraphicsMode)); GetDCATTRFieldAndOffset(jROP2); dprintf("[%p] jROP2 %d= %s\n", offDCATTR + offset, jROP2, pszROP2(jROP2)); GetDCATTRFieldAndOffset(jBkMode); dprintf("[%p] jBkMode %d= %s\n", offDCATTR + offset, jBkMode, pszBkMode(jBkMode)); // jFillMode GetDCATTRFieldAndOffset(jFillMode); switch (jFillMode) { case ALTERNATE: psz = "ALTERNATE"; break; case WINDING : psz = "WINDING" ; break; default : psz = "?FILLMODE"; break; } dprintf("[%p] jFillMode %d = %s\n", offDCATTR + offset, jFillMode, psz); // jStretchBltMode GetDCATTRFieldAndOffset(jStretchBltMode); switch (jStretchBltMode) { case BLACKONWHITE: psz = "BLACKONWHITE"; break; case WHITEONBLACK: psz = "WHITEONBLACK"; break; case COLORONCOLOR: psz = "COLORONCOLOR"; break; case HALFTONE : psz = "HALFTONE" ; break; default : psz = "?STRETCHMODE"; break; } dprintf("[%p] jStretchBltMode %d = %s\n", offDCATTR + offset, jStretchBltMode, psz); // // ICM // GetDCATTRFieldAndOffset(lIcmMode); DPRINTDCATTRPX(lIcmMode, "lIcmMode "); GetDCATTRFieldAndOffset(hcmXform); DPRINTDCATTRPP(hcmXform, "hcmXform "); GetDCATTRFieldAndOffset(hColorSpace); DPRINTDCATTRPP(hColorSpace, "hColorSpace "); GetDCATTRFieldAndOffset(IcmBrushColor); DPRINTDCATTRPX(IcmBrushColor, "IcmBrushColor "); GetDCATTRFieldAndOffset(IcmPenColor); DPRINTDCATTRPX(IcmPenColor, "IcmPenColor "); GetDCATTRFieldAndOffset(ptlCurrent); dprintf("[%p] ptlCurrent %d %d\n", offDCATTR + offset, ptlCurrent.x, ptlCurrent.y); GetDCATTRFieldAndOffset(ptfxCurrent); dprintf("[%p] ptfxCurrent %-#x %-#x\n", offDCATTR + offset, ptfxCurrent.x, ptfxCurrent.y); GetDCATTRFieldAndOffset(lBkMode); dprintf("[%p] lBkMode %d = %s\n", offDCATTR + offset, lBkMode, pszBkMode(lBkMode)); GetDCATTRFieldAndOffset(lFillMode); switch (lFillMode) { case ALTERNATE: psz = "ALTERNATE"; break; case WINDING : psz = "WINDING" ; break; default : psz = "?" ; break; } dprintf("[%p] lFillMode %d = %s\n", offDCATTR + offset, lFillMode, psz); GetDCATTRFieldAndOffset(lStretchBltMode); switch (lStretchBltMode) { case BLACKONWHITE: psz = "BLACKONWHITE"; break; case WHITEONBLACK: psz = "WHITEONBLACK"; break; case COLORONCOLOR: psz = "COLORONCOLOR"; break; case HALFTONE : psz = "HALFTONE" ; break; default : psz = "?" ; break; } dprintf("[%p] lStretchBltMode %d = %s\n", offDCATTR + offset, lStretchBltMode, psz); GetDCATTRFieldAndOffset(flTextAlign); DPRINTDCATTRPS("flTextAlign "); dprintf("%-#x = %s | %s | %s\n", flTextAlign, pszTA_U(flTextAlign), pszTA_H(flTextAlign), pszTA_V(flTextAlign)); GetDCATTRFieldAndOffset(lTextAlign); DPRINTDCATTRPS("lTextAlign "); dprintf("%-#x = %s | %s | %s\n", lTextAlign, pszTA_U(lTextAlign), pszTA_H(lTextAlign), pszTA_V(lTextAlign)); GetDCATTRFieldAndOffset(lTextExtra); DPRINTDCATTRPD(lTextExtra, "lTextExtra "); GetDCATTRFieldAndOffset(lRelAbs); DPRINTDCATTRPD(lRelAbs, "lRelAbs "); GetDCATTRFieldAndOffset(lBreakExtra); DPRINTDCATTRPD(lBreakExtra, "lBreakExtra "); GetDCATTRFieldAndOffset(cBreak); DPRINTDCATTRPD(cBreak, "cBreak "); GetDCATTRFieldAndOffset(hlfntNew); DPRINTDCATTRPP(hlfntNew, "hlfntNew "); GetDCATTRFieldAndOffset(iMapMode); DPRINTDCATTRPX(iMapMode,"iMapMode "); dprintf("\t\t\t\t%s\n",pszMapMode(iMapMode)); GetDCATTRFieldAndOffset(flFontMapper); DPRINTDCATTRPX(flFontMapper, "flFontMapper "); GetDCATTRFieldAndOffset(dwLayout); DPRINTDCATTRPD(dwLayout, "dwLayout "); GetDCATTRFieldAndOffset(lWindowOrgx); DPRINTDCATTRPD(lWindowOrgx, "lWindowOrgx "); GetDCATTRFieldAndOffset(ptlWindowOrg); dprintf("[%p] ptlWindowOrg %d %d\n", offDCATTR + offset, ptlWindowOrg.x, ptlWindowOrg.y); GetDCATTRFieldAndOffset(szlWindowExt); dprintf("[%p] szlWindowExt %d %d\n", offDCATTR + offset, szlWindowExt.cx, szlWindowExt.cy); GetDCATTRFieldAndOffset(ptlViewportOrg); dprintf("[%p] ptlViewportOrg %d %d\n", offDCATTR + offset, ptlViewportOrg.x, ptlViewportOrg.y); GetDCATTRFieldAndOffset(szlViewportExt); dprintf("[%p] szlViewportExt %d %d\n", offDCATTR + offset, szlViewportExt.cx, szlViewportExt.cy); GetDCATTRFieldAndOffset(flXform); DPRINTDCATTRPX(flXform, "flXform "); for (pfd = afdflx; pfd->psz; pfd++) { if (flXform & pfd->fl) { dprintf("\t\t\t\t%s\n", pfd->psz); flXform &= ~pfd->fl; } } if (flXform) dprintf("\t\t\t\t%-#x bad flags\n", flXform); GetDCATTROffset(mxWtoD); dprintf("[%p] mxWorldToDevice !gdikdx.mx %p\n", offDCATTR + offset, offDCATTR + offset); GetDCATTROffset(mxDtoW); dprintf("[%p] mxDeviceToWorld !gdikdx.mx %p\n", offDCATTR + offset, offDCATTR + offset); GetDCATTROffset(mxWtoP); dprintf("[%p] mxWorldToPage !gdikdx.mx %p\n", offDCATTR + offset, offDCATTR + offset); GetDCATTRFieldAndOffset(szlVirtualDevicePixel); dprintf("[%p] szlVirtualDevicePixel %d %d\n", offDCATTR + offset, szlVirtualDevicePixel.cx, szlVirtualDevicePixel.cy); GetDCATTRFieldAndOffset(szlVirtualDeviceMm); dprintf("[%p] szlVirtualDeviceMm %d %d\n", offDCATTR + offset, szlVirtualDeviceMm.cx, szlVirtualDeviceMm.cy); GetDCATTRFieldAndOffset(ptlBrushOrigin); dprintf("[%p] ptlBrushOrigin\t %d %d\n", offDCATTR + offset, ptlBrushOrigin.x, ptlBrushOrigin.y); GetDCATTROffset(VisRectRegion); pvisrectrgn = offDCATTR + offset; dprintf("[%p] VisRectRegion", pvisrectrgn); GetFieldData(pvisrectrgn, "_RGNATTR", "Flags", sizeof(Flags), &Flags); if (Flags & ATTR_RGN_VALID) { GetFieldData(pvisrectrgn, "_RGNATTR", "Rect.left", sizeof(left), &left); GetFieldData(pvisrectrgn, "_RGNATTR", "Rect.top", sizeof(top), &top); GetFieldData(pvisrectrgn, "_RGNATTR", "Rect.right", sizeof(right), &right); GetFieldData(pvisrectrgn, "_RGNATTR", "Rect.bottom", sizeof(bottom), &bottom); dprintf(" %d %d %d %d", left, top, right, bottom); } else dprintf(" INVALID"); dprintf("\n"); } else dprintf("Address of _DC_ATTR is NULL.\n"); return; } /******************************Public*Routine******************************\ * * Routine Name: * * vDumpDCLEVEL * * Routine Description: * * Arguments: * * Return Value: * \**************************************************************************/ void vDumpDCLEVEL(ULONG64 offDCLEVEL) { #define DPRINTDCLEVELPP(aa,bb) \ DPRINTPP(aa,bb,offDCLEVEL) #define DPRINTDCLEVELPX(aa,bb) \ DPRINTPX(aa,bb,offDCLEVEL) #define DPRINTDCLEVELPS(bb) \ DPRINTPS(bb,offDCLEVEL) #define DPRINTDCLEVELPD(aa,bb) \ DPRINTPD(aa,bb,offDCLEVEL) ULONG64 pSurface, hpal, ppal, hdcSave, pbrFill, pbrLine, hpath, pColorSpace; ULONG64 prgnClip, prgnMeta; ULONG64 pfield; FLONG flPath, flFontState, fl, flbrush; LONG lSaveDepth, lIcmMode; SIZEL sizl; ULONG offset; FLAGDEF *pfd; dprintf("\nDCLEVEL @ %p\n address\n -------\n", offDCLEVEL); GetDCLEVELFieldAndOffset(pSurface); DPRINTDCLEVELPP( pSurface, "pSurface " ); GetDCLEVELFieldAndOffset(hpal); DPRINTDCLEVELPP( hpal, "hpal " ); GetDCLEVELFieldAndOffset(ppal); DPRINTDCLEVELPP( ppal, "ppal " ); GetDCLEVELFieldAndOffset(sizl); DPRINTDCLEVELPS("sizl " ); dprintf("%d %d\n", sizl.cx, sizl.cy); GetDCLEVELFieldAndOffset(lSaveDepth); DPRINTDCLEVELPX(lSaveDepth, "lSaveDepth "); GetDCLEVELFieldAndOffset(hdcSave); DPRINTDCLEVELPP( hdcSave, "hdcSave " ); GetDCLEVELFieldAndOffset(pbrFill); DPRINTDCLEVELPP( pbrFill, "pbrFill " ); GetDCLEVELFieldAndOffset(pbrLine); DPRINTDCLEVELPP( pbrLine, "pbrLine " ); GetDCLEVELFieldAndOffset(hpath); DPRINTDCLEVELPP( hpath, "hpath " ); GetDCLEVELFieldAndOffset(pColorSpace); DPRINTDCLEVELPP( pColorSpace, "pColorSpace " ); GetDCLEVELFieldAndOffset(lIcmMode); DPRINTDCLEVELPP( lIcmMode, "lIcmMode " ); // flPath GetDCLEVELFieldAndOffset(flPath); DPRINTDCLEVELPP( flPath, "flPath " ); for (pfd = afdDCPATH; pfd->psz; pfd++) if (flPath & pfd->fl) { dprintf("\t\t\t\t%s\n", pfd->psz); flPath &= ~pfd->fl; } if (flPath) dprintf("\t\t\t\t%-#x bad flags\n", flPath); // laPath GetDCLEVELOffset(laPath); pfield = offDCLEVEL + offset; DPRINTDCLEVELPS("laPath "); dprintf("!gdikdx.la %p\n", pfield); GetDCLEVELFieldAndOffset(prgnClip); DPRINTDCLEVELPP( prgnClip, "prgnClip " ); GetDCLEVELFieldAndOffset(prgnMeta); DPRINTDCLEVELPP( prgnMeta, "prgnMeta " ); // ca GetDCLEVELOffset(ca); pfield = offDCLEVEL + offset; dprintf("[%p] ca !gdikdx.ca %p\n", pfield, pfield); // flFontState GetDCLEVELFieldAndOffset(flFontState); DPRINTDCLEVELPS("flFontState "); if (!flFontState) dprintf("0\n"); else { for (pfd = afdFS2; pfd->psz; pfd++) { if (flFontState & pfd->fl) { dprintf("\t\t\t\t%s\n", pfd->psz); flFontState &= ~pfd->fl; } } if (flFontState) dprintf("\t\t\t\t%-#x bad flags\n", flFontState); } GetDCLEVELOffset(ufi); pfield = offDCLEVEL + offset; DPRINTDCLEVELPS("ufi"); dprintf("\n"); GetDCLEVELFieldAndOffset(fl); DPRINTDCLEVELPX( fl, "fl " ); if (fl == DC_FL_PAL_BACK) dprintf("\t\t\t\t\tDC_FL_PAL_BACK\n"); else if (fl != 0) dprintf("\t\t\t\tbad flags\n"); GetDCLEVELFieldAndOffset(flbrush); DPRINTDCLEVELPX( flbrush, "flbrush " ); GetDCLEVELOffset(mxWorldToDevice); DPRINTDCLEVELPS("mxWorldToDevice\t !gdikdx.mx "); dprintf("%p\n", offDCLEVEL + offset); GetDCLEVELOffset(mxDeviceToWorld); DPRINTDCLEVELPS("mxDeviceToWorld\t !gdikdx.mx "); dprintf("%p\n", offDCLEVEL + offset); GetDCLEVELOffset(mxWorldToPage); DPRINTDCLEVELPS("mxWorldToPage\t !gdikdx.mx "); dprintf("%p\n", offDCLEVEL + offset); dprintf("\n"); return; /* #define M3(aa,bb) \ dprintf("[%x] %s%-#x\n", &(pdclSrc->##aa), (bb), pdcl->##aa) #define M2(aa,bb) \ dprintf("[%x] %s", &(pdclSrc->##aa), (bb)) FLAGDEF *pfd; FLONG fl; LONG l; CHAR ach[128], *psz; GetDCLEVELFieldAndOffset(efM11PtoD); sprintEFLOAT( ach, pdcl->efM11PtoD ); M2( efM11PtoD, "efM11PtoD "); dprintf("%s\n", ach); sprintEFLOAT( ach, pdcl->efM22PtoD ); M2( efM22PtoD, "efM22PtoD "); dprintf("%s\n", ach); sprintEFLOAT( ach, pdcl->efDxPtoD ); M2( efDxPtoD, "efDxPtoD "); dprintf("%s\n", ach); sprintEFLOAT( ach, pdcl->efDyPtoD ); M2( efDyPtoD, "efDyPtoD "); dprintf("%s\n", ach); sprintEFLOAT( ach, pdcl->efM11_TWIPS ); M2( efM11_TWIPS,"efM11_TWIPS "); dprintf("%s\n", ach); sprintEFLOAT( ach, pdcl->efM22_TWIPS ); M2( efM22_TWIPS,"efM22_TWIPS "); dprintf("%s\n", ach); sprintEFLOAT( ach, pdcl->efPr11 ); M2( efPr11, "efPr11 "); dprintf("%s\n", ach); sprintEFLOAT( ach, pdcl->efPr22 ); M2( efPr22, "efPr22 "); dprintf("%s\n", ach); #undef M2 #undef M3 */ } /******************************Public*Routine******************************\ * * Routine Name: * * vDumpDCFontInfo * \**************************************************************************/ void vDumpDCFontInfo(ULONG64 offDC) { ULONG64 prfnt_, hlfntCur_, pDCAttr, offDCLEVEL; FLONG flFontState, fl, flFontMapper, flXform; INT iMapMode; ULONG offset; FLAGDEF *pfd; dprintf("\n"); GetDCFieldAndOffset(prfnt_); dprintf("[%p] prfnt_ %p\t(!gdikdx.fo -f %p)\n", offDC + offset, prfnt_, prfnt_); GetDCFieldAndOffset(hlfntCur_); dprintf("[%p] hlfntCur_ %p", offDC + offset, hlfntCur_); if (hlfntCur_) vDumpHFONT(hlfntCur_); else dprintf("\n"); GetDCField(pDCAttr); if (pDCAttr) { ULONG64 offDCATTR, hlfntNew; int iGraphicsMode; LONG lBkMode, lTextAlign, lTextExtra, lBreakExtra, cBreak; offDCATTR = pDCAttr; GetDCATTRFieldAndOffset(hlfntNew); dprintf("[%p] hlfntNew %p", offDCATTR + offset, hlfntNew); if (hlfntNew != hlfntCur_) vDumpHFONT(hlfntNew); else dprintf(" (same as hlfntCur_)\n"); // iGraphicsMode GetDCATTRFieldAndOffset(iGraphicsMode); dprintf("[%p] iGraphicsMode %d = %s\n", offDCATTR + offset, iGraphicsMode, pszGraphicsMode(iGraphicsMode) ); // lBkMode GetDCATTRFieldAndOffset(lBkMode); dprintf("[%p] lBkMode %d = %s\n", offDCATTR + offset, lBkMode, pszBkMode(lBkMode)); // lTextAlign GetDCATTRFieldAndOffset(lTextAlign); dprintf("[%p] lTextAlign %d =", offDCATTR + offset, lTextAlign); dprintf(" %s | %s | %s\n", pszTA_U(lTextAlign), pszTA_H(lTextAlign),pszTA_V(lTextAlign)); GetDCATTRFieldAndOffset(lTextExtra); dprintf("[%p] lTextExtra %d\n", offDCATTR + offset, lTextExtra); GetDCATTRFieldAndOffset(lBreakExtra); dprintf("[%p] lBreakExtra %d\n", offDCATTR + offset, lBreakExtra); GetDCATTRFieldAndOffset(cBreak); dprintf("[%p] cBreak %d\n", offDCATTR + offset, cBreak); GetDCATTRFieldAndOffset(flFontMapper); dprintf("[%p] flFontMapper %-#x", offDCATTR + offset, flFontMapper); if (flFontMapper == ASPECT_FILTERING) dprintf(" = ASPECT_FILTERING"); else if (flFontMapper != 0) dprintf(" = ?"); dprintf("\n"); GetDCATTRFieldAndOffset(iMapMode); dprintf("[%p] iMapMode %d = %s\n", offDCATTR + offset, iMapMode, pszMapMode(iMapMode) ); GetDCATTRFieldAndOffset(flXform); dprintf("[%p] flXform %-#x\n", offDCATTR + offset, flXform); for (pfd = afdflx; pfd->psz; pfd++) if (flXform & pfd->fl) dprintf("\t\t\t\t%s\n", pfd->psz); } else dprintf("pdc->pDCAttr == 0\n"); GetDCOffset(dclevel); offDCLEVEL= offDC + offset; GetDCLEVELField(flFontState); dprintf("[%p] flFontState %-#x", offDCLEVEL, flFontState); for (pfd = afdDCFS; pfd->psz; pfd++) { if (pfd->fl & flFontState) { dprintf(" = %s", pfd->psz); } } dprintf("\n"); GetDCLEVELOffset(mxWorldToDevice); dprintf("[%p] mxWorldToDevice\n", offDCLEVEL + offset); dprintf("\n"); return; } /******************************Public*Routine******************************\ * * Routine Name: * * dca * \**************************************************************************/ DECLARE_API( dca ) { PARSE_POINTER(dca_help); vDumpDC_ATTR(arg); EXIT_API(S_OK); dca_help: dprintf("Usage: dca [-?] DC_ATTR pointer\n"); EXIT_API(S_OK); } /******************************Public*Routine******************************\ * * Routine Name: * * dcl * \**************************************************************************/ DECLARE_API( dcl ) { PARSE_POINTER(dcl_help); vDumpDCLEVEL(arg); EXIT_API(S_OK); dcl_help: dprintf("Usage: dcl [-?] DCLEVEL pointer\n"); EXIT_API(S_OK); } /******************************Public*Routine******************************\ * * Routine Name: * * hdc * \**************************************************************************/ DECLARE_API( hdc ) { HRESULT hr; ULONG64 addrDC; BOOL General =FALSE; BOOL DCLevel =FALSE; BOOL DCAttr =FALSE; BOOL FontInfo=FALSE; PARSE_POINTER(hdc_help); hr = GetObjectAddress(Client,arg,&addrDC,DC_TYPE,TRUE,TRUE); if(ntok<2) { General=TRUE; } else { if(parse_iFindSwitch(tokens, ntok, 'g')!=-1) {General=TRUE;} if(parse_iFindSwitch(tokens, ntok, 'l')!=-1) {DCLevel=TRUE;} if(parse_iFindSwitch(tokens, ntok, 't')!=-1) {DCAttr=TRUE;} if(parse_iFindSwitch(tokens, ntok, 'f')!=-1) {FontInfo=TRUE;} } if(!(General||DCLevel||DCAttr||FontInfo)) {General=TRUE;} if (hr == S_OK && addrDC) { dprintf("\nDC @ 0x%p\n address\n -------\n", addrDC); // general info if (General) vDumpDCgeneral(addrDC); // dcattr if (DCAttr) { ULONG64 addrDCAttr; ULONG error; if (error = GetFieldData(addrDC, GDIType(DC), "pDCAttr", sizeof(addrDCAttr), &addrDCAttr)) { dprintf("Unable to get pDCAttr\n"); dprintf(" (GetFieldData returned %s)\n", pszWinDbgError(error)); } else { vDumpDC_ATTR(addrDCAttr); } } // dclevel if (DCLevel) { ULONG offDCLevel; GetFieldOffset(GDIType(DC), "dclevel", &offDCLevel); vDumpDCLEVEL(addrDC + offDCLevel); } // font information if (FontInfo) vDumpDCFontInfo(addrDC); } EXIT_API(S_OK); hdc_help: dprintf("Usage: hdc [-?] [-g] [-l] [-t] [-f] handle\n" " -? help\n" " -g general\n" " -l dclevel\n" " -t dcattr\n" " -f font information\n"); EXIT_API(S_OK); } /**************************************************************************\ * DC (ddc) Fields \**************************************************************************/ PCSTR DCAttribFields[] = { "dcattr.*", // "dcattr.ptlBrushOrigin", "pDCAttr", // Extended "ptlFillOrigin_", NULL }; PCSTR DCDrawFields[] = { "pDCAttr", "dclevel.hpath", "dclevel.flPath", // Extended "dclevel.laPath", NULL }; PCSTR DCFontFields[] = { "prfnt_", "pDCAttr", NULL }; PCSTR DCGeneralFields[] = { "hHmgr", "pDCAttr", "dclevel.", "dclevel.pSurface", "dctp_", "prgnVis_", "dclevel.prgnClip", "dclevel.prgnMeta", "prgnAPI_", "prgnRao_", "dclevel.sizl", "erclClip_", "eptlOrigin_", "erclWindow_", "erclBounds_", // Extended "fs_", "dhpdev_", "ppdev_", "hsemDcDevLock_", "flGraphicsCaps_", "flGraphicsCaps2_", "hdcPrev_", "hdcNext_", "hlfntCur_", "prfnt_", NULL }; PCSTR DCLevelFields[] = { "dclevel.*", NULL }; PCSTR DCSavedFields[] = { "dclevel.hdcSave", "dclevel.lSaveDepth", // Extended "dclevel.hpal", "dclevel.ppal", "pDCAttr", //dprintf("\thlfntNew = 0x%08lx\n", pdcattr->hlfntNew); "dclevel.flFontState", //afdDCFS "fs_", // afdDCFS NULL }; PCSTR DCTextFields[] = { "pDCAttr", NULL }; PCSTR DCXformFields[] = { "dclevel.mxWorldToDevice.", "dclevel.mxDeviceToWorld.", "dclevel.mxWorldToPage.", // Extended "dclevel.mxWorldToDevice", NULL }; /******************************Public*Routine******************************\ * DC (ddc) * * Debugger extension to dump a DC. * * History: * 10-Jul-1991 -by- Gilman Wong [gilmanw] * Wrote it. * * 21-Feb-1995 -by- Lingyun Wang [lingyunw] * Made it to work in the kernel. * * 22-Dec-2000 -by- Jason Hartman [jasonha] * Rewrote for type knowledgable debugger. * \**************************************************************************/ DECLARE_API( ddc ) { BEGIN_API( ddc ); HRESULT hr = S_OK; ULONG64 DCAddr; DEBUG_VALUE Arg; ULONG64 Module; ULONG TypeId; OutputControl OutCtl(Client); BOOL BadSwitch = FALSE; BOOL DumpAll = FALSE; BOOL bAttrib = FALSE; BOOL bDraw = FALSE; BOOL bExtend = FALSE; BOOL bFont = FALSE; BOOL bGeneral= FALSE; BOOL bLevel = FALSE; BOOL bSaved = FALSE; BOOL bText = FALSE; BOOL bXform = FALSE; while (!BadSwitch) { while (isspace(*args)) args++; if (*args != '-') break; args++; BadSwitch = (*args == '\0' || isspace(*args)); while (*args != '\0' && !isspace(*args)) { switch (tolower(*args)) { case 'a': bAttrib = TRUE; break; case 'd': bDraw = TRUE; break; case 'e': bExtend = TRUE; break; case 'f': bFont = TRUE; break; case 'g': bGeneral = TRUE; break; case 'l': bLevel = TRUE; break; case 's': bSaved = TRUE; break; case 't': bText = TRUE; break; case 'v': DumpAll = TRUE; break; case 'x': bXform = TRUE; break; default: BadSwitch = TRUE; break; } if (BadSwitch) break; args++; } } if (BadSwitch) { OutCtl.Output("Usage: hdc [-?adefgstvx] \n" "\n" "a - DC_ATTR\n" "d - Drawing attributes\n" "e - Extended info\n" "f - Font data\n\n" "g - General data (default)\n" "l - DCLEVEL\n" "s - Saved data\n" "t - Text attributes\n" "v - Verbose mode (print everything)\n" "x - Transform data\n"); return S_OK; } hr = GetTypeId(Client, "DC", &TypeId, &Module); if (hr != S_OK) { OutCtl.OutErr("Error getting type info for %s (%s).\n", GDIType(DC), pszHRESULT(hr)); } else if ((hr = Evaluate(Client, args, DEBUG_VALUE_INT64, 0, &Arg, NULL)) != S_OK || Arg.I64 == 0) { if (hr == S_OK) { OutCtl.Output("Expression %s evalated to zero.\n", args); } else { OutCtl.OutErr("Evaluate(%s) returned %s.\n", args, pszHRESULT(hr)); } } else { hr = GetObjectAddress(Client, Arg.I64, &DCAddr, DC_TYPE, TRUE, TRUE); if (hr != S_OK || DCAddr == 0) { DEBUG_VALUE ObjHandle; TypeOutputParser TypeParser(Client); OutputState OutState(Client); ULONG64 DCAddrFromHmgr; DCAddr = Arg.I64; if ((hr = OutState.Setup(0, &TypeParser)) != S_OK || (hr = OutState.OutputTypeVirtual(DCAddr, Module, TypeId, 0)) != S_OK || (hr = TypeParser.Get(&ObjHandle, "hHmgr", DEBUG_VALUE_INT64)) != S_OK) { OutCtl.OutErr("Unable to get contents of DC::hHmgr\n"); OutCtl.OutErr(" (Type Read returned %s)\n", pszHRESULT(hr)); OutCtl.OutErr(" 0x%p is neither an HDC nor valid DC address\n", Arg.I64); } else { if (GetObjectAddress(Client, ObjHandle.I64, &DCAddrFromHmgr, DC_TYPE, TRUE, FALSE) == S_OK && DCAddrFromHmgr != DCAddr) { OutCtl.OutWarn("\tNote: DC may not be valid.\n" "\t It does not have a valid handle manager entry.\n"); } } } // // If nothing was specified, dump main section // if (!(bAttrib || bDraw || bFont || bSaved || bText || bXform)) { bGeneral = TRUE; } if (hr == S_OK) { TypeOutputDumper TypeReader(Client, &OutCtl); if (DumpAll) { TypeReader.ExcludeMarked(); // Don't recurse for big sub structures TypeReader.MarkField("dclevel.*"); TypeReader.MarkField("dcattr.*"); TypeReader.MarkField("co_.*"); TypeReader.MarkField("eboFill_.*"); TypeReader.MarkField("eboLine_.*"); TypeReader.MarkField("eboText_.*"); TypeReader.MarkField("eboBackground_.*"); } else { TypeReader.IncludeMarked(); if (bAttrib) { TypeReader.MarkFields(DCAttribFields, bExtend ? -1 : 2); } if (bDraw) { TypeReader.MarkFields(DCDrawFields, bExtend ? -1 : 3); } if (bFont) { TypeReader.MarkFields(DCFontFields); } if (bGeneral) { TypeReader.MarkFields(DCGeneralFields, bExtend ? -1 : 14); } if (bLevel) { TypeReader.MarkFields(DCLevelFields); } if (bSaved) { TypeReader.MarkFields(DCSavedFields, bExtend ? -1 : 2); } if (bText) { TypeReader.MarkFields(DCTextFields); } if (bXform) { TypeReader.MarkFields(DCXformFields, bExtend ? -1 : 3); } } OutCtl.Output(" DC @ 0x%p:\n", DCAddr); hr = TypeReader.OutputVirtual(Module, TypeId, DCAddr); if (hr != S_OK) { OutCtl.OutErr("Type Dump for DC returned %s.\n", pszHRESULT(hr)); } } } return hr; } /******************************Public*Routine******************************\ * DCLIST * * List DC and brief info * \**************************************************************************/ PCSTR DCListFields[] = { "hHmgr", "dhpdev_", "ppdev_", "dclevel.pSurface", NULL }; DECLARE_API( dclist ) { BEGIN_API( dclist ); HRESULT hr; HRESULT hrMask; ULONG64 index; ULONG64 gcMaxHmgr; ULONG64 DCAddr; BOOL BadSwitch = FALSE; BOOL DumpBaseObject = FALSE; BOOL DumpUserFields = FALSE; OutputControl OutCtl(Client); while (isspace(*args)) args++; while (!BadSwitch) { while (isspace(*args)) args++; if (*args != '-') break; args++; BadSwitch = (*args == '\0' || isspace(*args)); while (*args != '\0' && !isspace(*args)) { switch (*args) { case 'b': DumpBaseObject = TRUE; break; default: BadSwitch = TRUE; break; } if (BadSwitch) break; args++; } } if (BadSwitch) { if (*args == '?') { OutCtl.Output("Lists all DCs and a few basic members.\n" "\n"); } OutCtl.Output("Usage: dclist [-?b] []\n" "\n" " b - Dump BASEOBJECT information\n" "\n" " Member List - Space seperated list of other SURFACE members\n" " to be included in the dump\n"); return S_OK; } if ((hr = GetMaxHandles(Client, &gcMaxHmgr)) != S_OK) { OutCtl.OutErr("Unable to get sizeof GDI handle table. HRESULT %s\n", pszHRESULT(hr)); return hr; } gcMaxHmgr = (ULONG64)(ULONG)gcMaxHmgr; OutCtl.Output("Searching 0x%I64x handle entries for DCs.\n", gcMaxHmgr); OutputFilter OutFilter(Client); OutputState OutState(Client, FALSE); OutputControl OutCtlToFilter; ULONG64 Module; ULONG TypeId; ULONG OutputMask; if ((hr = OutState.Setup(DEBUG_OUTPUT_NORMAL, &OutFilter)) == S_OK && (hr = OutCtlToFilter.SetControl(DEBUG_OUTCTL_THIS_CLIENT | DEBUG_OUTCTL_NOT_LOGGED, OutState.Client)) == S_OK && (hr = GetTypeId(Client, "DC", &TypeId, &Module)) == S_OK) { TypeOutputDumper TypeReader(OutState.Client, &OutCtlToFilter); TypeReader.SelectMarks(1); TypeReader.IncludeMarked(); if (DumpBaseObject) TypeReader.MarkFields(BaseObjectFields); // Add user specified fields to dump list PSTR MemberList = NULL; CHAR *pBOF = (CHAR *)args; if (iscsymf(*pBOF)) { MemberList = (PSTR) HeapAlloc(GetProcessHeap(), 0, strlen(pBOF)+1); if (MemberList != NULL) { strcpy(MemberList, pBOF); pBOF = MemberList; DumpUserFields = TRUE; while (iscsymf(*pBOF)) { CHAR *pEOF = pBOF; CHAR EOFChar; // Get member do { pEOF++; } while (iscsym(*pEOF) || *pEOF == '.' || *pEOF == '*'); EOFChar = *pEOF; *pEOF = '\0'; TypeReader.MarkField(pBOF); // Advance to next if (EOFChar != '\0') { do { pEOF++; } while (isspace(*pEOF)); } pBOF = pEOF; } } else { OutCtl.OutErr("Error: Couldn't allocate memory for Member List.\n"); hr = E_OUTOFMEMORY; } } if (hr == S_OK && *pBOF != '\0') { OutCtl.OutErr("Error: \"%s\" is not a valid member list.\n", pBOF); hr = E_INVALIDARG; } if (hr == S_OK) { // Setup default dump specifications TypeReader.SelectMarks(0); TypeReader.IncludeMarked(); TypeReader.MarkFields(DCListFields); OutFilter.Replace(OUTFILTER_REPLACE_THIS, "hHmgr ", NULL); OutFilter.Replace(OUTFILTER_REPLACE_THIS, "DC_TYPE : ", NULL); OutFilter.Replace(OUTFILTER_REPLACE_THIS, " dhpdev_ ", NULL); OutFilter.Replace(OUTFILTER_REPLACE_THIS, " ppdev_ ", NULL); OutFilter.Replace(OUTFILTER_REPLACE_THIS, " dclevel DCLEVEL ", NULL); OutFilter.Replace(OUTFILTER_REPLACE_THIS, " pSurface ", NULL); OutFilter.Replace(OUTFILTER_REPLACE_THIS, "(null)", "(null) "); OutCtl.Output(" &DC HDC dhpdev_ ppdev_ pSurface"); if (DumpBaseObject) OutCtl.Output(" \tBASEOBJECT"); if (DumpUserFields) OutCtl.Output(" %s", args); OutCtl.Output("\n"); for (index = 0; index < gcMaxHmgr; index++) { if (OutCtl.GetInterrupt() == S_OK) { OutCtl.OutWarn("User aborted search:\n" " 0x%I64x entries were checked.\n" " 0x%I64x entries remain.\n", index, gcMaxHmgr - index); break; } // Turn off error and verbose messages for this call to // GetObjectAddress since it will spew for non-DCs. if ((hrMask = Client->GetOutputMask(&OutputMask)) == S_OK && OutputMask & (DEBUG_OUTPUT_ERROR | DEBUG_OUTPUT_VERBOSE)) { hrMask = Client->SetOutputMask(OutputMask & ~(DEBUG_OUTPUT_ERROR | DEBUG_OUTPUT_VERBOSE)); } hr = GetObjectAddress(Client, index, &DCAddr, DC_TYPE, FALSE, FALSE); // Restore mask if (hrMask == S_OK && OutputMask & (DEBUG_OUTPUT_ERROR | DEBUG_OUTPUT_VERBOSE)) { Client->SetOutputMask(OutputMask); } if (hr != S_OK || DCAddr == 0) continue; OutCtl.Output(" 0x%p ", DCAddr); OutFilter.DiscardOutput(); hr = TypeReader.OutputVirtual(Module, TypeId, DCAddr, DEBUG_OUTTYPE_NO_OFFSET | DEBUG_OUTTYPE_COMPACT_OUTPUT); if (hr == S_OK) { if (DumpBaseObject || DumpUserFields) { OutCtlToFilter.Output(" \t"); TypeReader.SelectMarks(1); TypeReader.OutputVirtual(Module, TypeId, DCAddr, DEBUG_OUTTYPE_NO_OFFSET | DEBUG_OUTTYPE_COMPACT_OUTPUT); TypeReader.SelectMarks(0); } OutFilter.OutputText(&OutCtl, DEBUG_OUTPUT_NORMAL); OutCtl.Output("\n"); } else { OutCtl.Output("0x????%4.4I64x ** failed to read DC **\n", index); } } } if (MemberList != NULL) { HeapFree(GetProcessHeap(), 0, MemberList); } } else { OutCtl.OutErr(" Output state/control setup returned %s.\n", pszHRESULT(hr)); } return S_OK; }