Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

4144 lines
144 KiB

/******************************Module*Header*******************************\
* Module Name: fontexts.cxx
*
* Created: 29-Aug-1994 08:42:10
* Author: Kirk Olynyk [kirko]
*
* Copyright (c) 1994-2000 Microsoft Corporation
*
\**************************************************************************/
#include "precomp.hxx"
// TODO: Break this file up grouping close knit extensions together.
// LOGFONTW
#define GetLOGFONTWField(field) \
GetLOGFONTWSubField(#field, field)
#define GetLOGFONTWSubField(field,local) \
GetFieldData(offLOGFONTW, GDIType(LOGFONTW), field, sizeof(local), &local)
#define GetLOGFONTWOffset(field) \
GetFieldOffset(GDIType(LOGFONTW), #field, &offset)
#define GetLOGFONTWFieldAndOffset(field) { \
GetLOGFONTWField(field); \
GetLOGFONTWOffset(field); \
}
// RFONT
#define GetRFONTField(field) \
GetRFONTSubField(#field, field)
#define GetRFONTSubField(field,local) \
GetFieldData(foSrc, GDIType(RFONT), field, sizeof(local), &local)
#define GetRFONTOffset(field) \
GetFieldOffset(GDIType(RFONT), #field, &offset)
#define GetRFONTFieldAndOffset(field) { \
GetRFONTField(field); \
GetRFONTOffset(field); \
}
// FONTOBJ
#define GetFONTOBJField(field) \
GetFONTOBJSubField(#field, field)
#define GetFONTOBJSubField(field,local) \
GetFieldData(foSrc, GDIType(FONTOBJ), field, sizeof(local), &local)
#define GetFONTOBJOffset(field) \
GetFieldOffset(GDIType(FONTOBJ), #field, &offset)
#define GetFONTOBJFieldAndOffset(field) { \
GetFONTOBJField(field); \
GetFONTOBJOffset(field); \
}
// PFE
#define GetPFEField(field) \
GetPFESubField(#field, field)
#define GetPFESubField(field,local) \
GetFieldData(pfeSrc, GDIType(PFE), field, sizeof(local), &local)
#define GetPFEOffset(field) \
GetFieldOffset(GDIType(PFE), #field, &offset)
#define GetPFEFieldAndOffset(field) { \
GetPFEField(field); \
GetPFEOffset(field); \
}
// IFIMETRICS
#define GetIFIMETRICSField(field) \
GetIFIMETRICSSubField(#field, field)
#define GetIFIMETRICSSubField(field,local) \
GetFieldData(pifiSrc, GDIType(IFIMETRICS), field, sizeof(local), &local)
#define GetIFIMETRICSOffset(field) \
GetFieldOffset(GDIType(IFIMETRICS), #field, &offset)
#define GetIFIMETRICSFieldAndOffset(field) { \
GetIFIMETRICSField(field); \
GetIFIMETRICSOffset(field); \
}
// PFF
#define GetPFFField(field) \
GetPFFSubField(#field, field)
#define GetPFFSubField(field,local) \
GetFieldData(pffSrc, GDIType(PFF), field, sizeof(local), &local)
#define GetPFFOffset(field) \
GetFieldOffset(GDIType(PFF), #field, &offset)
#define GetPFFFieldAndOffset(field) { \
GetPFFField(field); \
GetPFFOffset(field); \
}
// ESTROBJ
#define GetESTROBJField(field) \
GetESTROBJSubField(#field, field)
#define GetESTROBJSubField(field,local) \
GetFieldData(estrobjSrc, GDIType(ESTROBJ), field, sizeof(local), &local)
#define GetESTROBJOffset(field) \
GetFieldOffset(GDIType(ESTROBJ), #field, &offset)
#define GetESTROBJFieldAndOffset(field) { \
GetESTROBJField(field); \
GetESTROBJOffset(field); \
}
// GLYPHPOS
#define GetGLYPHPOSField(field) \
GetGLYPHPOSSubField(#field, field)
#define GetGLYPHPOSSubField(field,local) \
GetFieldData(glyphposSrc, GDIType(GLYPHPOS), field, sizeof(local), &local)
#define GetGLYPHPOSOffset(field) \
GetFieldOffset(GDIType(GLYPHPOS), #field, &offset)
#define GetGLYPHPOSFieldAndOffset(field) { \
GetGLYPHPOSField(field); \
GetGLYPHPOSOffset(field); \
}
// GLYPHBITS
#define GetGLYPHBITSField(field) \
GetGLYPHBITSSubField(#field, field)
#define GetGLYPHBITSSubField(field,local) \
GetFieldData(glyphbitsSrc, GDIType(GLYPHBITS), field, sizeof(local), &local)
#define GetGLYPHBITSOffset(field) \
GetFieldOffset(GDIType(GLYPHBITS), #field, &offset)
#define GetGLYPHBITSFieldAndOffset(field) { \
GetGLYPHBITSField(field); \
GetGLYPHBITSOffset(field); \
}
// GLYPHDEF
#define GetGLYPHDEFField(field) \
GetGLYPHDEFSubField(#field, field)
#define GetGLYPHDEFSubField(field,local) \
GetFieldData(glyphdefSrc, GDIType(GLYPHDEF), field, sizeof(local), &local)
#define GetGLYPHDEFOffset(field) \
GetFieldOffset(GDIType(GLYPHDEF), #field, &offset)
#define GetGLYPHDEFFieldAndOffset(field) { \
GetGLYPHDEFField(field); \
GetGLYPHDEFOffset(field); \
}
// CACHE
#define GetCACHEField(field) \
GetCACHESubField(#field, field)
#define GetCACHESubField(field,local) \
GetFieldData(cacheSrc, GDIType(CACHE), field, sizeof(local), &local)
#define GetCACHEOffset(field) \
GetFieldOffset(GDIType(CACHE), #field, &offset)
#define GetCACHEFieldAndOffset(field) { \
GetCACHEField(field); \
GetCACHEOffset(field); \
}
DWORD adw[4*1024]; // scratch buffer
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
#include <winfont.h>
#define WOW_EMBEDING 2
VOID Gdidpft(PFT *);
void vDumpFONTHASH(FONTHASH*,FONTHASH*);
void vDumpCOLORADJUSTMENT(COLORADJUSTMENT*, COLORADJUSTMENT*);
void vDumpLINEATTRS(LINEATTRS*, LINEATTRS*);
void vDumpIFIMETRICS(IFIMETRICS*, IFIMETRICS*);
void vDumpPFF(PFF*, PFF*);
void vDumpGlyphMemory(RFONT*);
unsigned cjGLYPHBITS(GLYPHBITS*, RFONT*);
void vDumpRFONTList(RFONT*,unsigned*,unsigned*,unsigned*,unsigned*);
#endif // DOES NOT SUPPORT API64
void vDumpLOGFONTW(ULONG64);
void vDumpCACHE(ULONG64);
#define tmalloc(a,b) (a *) LocalAlloc(LMEM_FIXED, (b))
#define tfree(b) LocalFree((b))
/******************************Public*Routine******************************\
*
* Routine Name:
*
* wcsncpy
*
* Routine Description:
*
* Copies a zero terminated Unicode from the source on the remote
* address space to a destination in the local address space.
*
* Arguments:
*
* pwszDst - local address
*
* pwszSrc - remote address
*
* c - maximum count of characters in destination
*
* Called by:
*
* Return Value:
*
\**************************************************************************/
LPWSTR wcsncpy(
LPWSTR pwszDst,
ULONG64 pwszSrc,
size_t c)
{
LPWSTR pwszRet = pwszDst;
ULONG cbRead;
if (c)
{
WCHAR wc;
__try {
ReadMemory( pwszSrc, &wc, sizeof(wc), &cbRead );
}
__except (EXCEPTION_EXECUTE_HANDLER) {
return(NULL);
}
while (wc && c && cbRead) {
pwszSrc += sizeof(wc);
*pwszDst++ = wc;
ReadMemory( pwszSrc, &wc, sizeof(wc), &cbRead );
--c;
}
// Add trailing 0 if we have room.
if (c)
*pwszDst = 0;
}
return(pwszRet);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpHFONT
*
\**************************************************************************/
void vDumpHFONT(ULONG64 hf)
{
ULONG64 pobj, plfwSrc;
ULONG offset;
if (GetObjectAddress(NULL,hf,&pobj) != S_OK) return;
GetFieldOffset("LFONT", "elfw", &offset);
plfwSrc = pobj + offset;
vDumpLOGFONTW(plfwSrc);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* tstats
*
* Routine Description:
*
* Returns statistics for TextOut
* It gives you the distibution of character counts for
* GreExtTextOutW calls.
*
\**************************************************************************/
DECLARE_API( tstats )
{
dprintf("Extension 'tstats' not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
typedef struct _TSTATENTRY {
int c; // number observed
} TSTATENTRY;
typedef struct _TSTAT {
TSTATENTRY NO; // pdx == 0, opaque
TSTATENTRY DO; // pdx != 0, opaque
TSTATENTRY NT; // pdx == 0, transparent
TSTATENTRY DT; // pdx != 0, transparent
} TSTAT;
typedef struct _TEXTSTATS {
int cchMax;
TSTAT ats[1];
} TEXTSTATS;
TEXTSTATS *pTS, TS;
TSTAT *ats, *pts, *ptsBin;
int cj, binsize, cLast, cMin, cNO, cDO, cNT, cDT, cBins;
PARSE_ARGUMENTS(tstats_help);
if(ntok==0) {
binsize=1;
} else {
tok_pos = parse_FindNonSwitch(tokens, ntok);
if(tok_pos==-1) { goto tstats_help; }
//check this and see if it makes more sense to use GetValue() or GetExpression()
sscanf(tokens[tok_pos], "%d", &binsize);
if( (binsize<0) || (binsize>50) ) { goto tstats_help; }
}
pTS = 0;
GetAddress(pTS,"win32k!gTS");
if (pTS == 0) {
dprintf("Could not find address of win32k!gTS\n");
return;
}
move2(&TS,pTS,sizeof(TS));
if (TS.ats == 0) {
dprintf("No statistics are available\n");
return;
}
cj = (TS.cchMax + 2) * sizeof(TSTAT);
if (!(ats = tmalloc(TSTAT,cj))) {
dprintf("memory allocation failure\n");
return;
}
move2(ats, &(pTS->ats), cj);
dprintf("\n\n\n");
dprintf(" +------------+------ OPAQUE -------+----- TRANSPARENT ---+\n");
dprintf(" | strlen | pdx == 0 | pdx != 0 | pdx == 0 | pdx != 0 |\n");
dprintf(" +------------+----------+----------+----------+----------+\n");
// I will partition TS.cchMax+2 entries into bins with
// binsize enties each. The total number of bins needed
// to get everything is ceil((TS.cchMax+2)/binsize)
// which is equal to floor((TS.cchMax+1)/binsize) + 1
// The last one is dealt with separately. Thus the number
// of entries in the very last bin is equal to
//
// cLast = TS.cchMax + 2 - (floor((TS.cchMax+1)/binsize)+1)
//
// which is equal to 1 + (TS.cchMax+1) mod binsize
cLast = 1 + ((TS.cchMax + 1) % binsize);
for (cMin=0,pts=ptsBin=ats; pts<ats+(TS.cchMax+2-cLast); cMin+=binsize) {
ptsBin += binsize;
for (cNO=cDO=cNT=cDT=0 ; pts < ptsBin ; pts++) {
cNO += pts->NO.c;
cDO += pts->DO.c;
cNT += pts->NT.c;
cDT += pts->DT.c;
}
if (binsize == 1)
dprintf(
" %-5d %10d %10d %10d %10d\n" ,
cMin, cNO, cDO, cNT, cDT
);
else
dprintf(
" %5d--%-5d %10d %10d %10d %10d\n" ,
cMin, cMin+binsize-1, cNO, cDO, cNT, cDT
);
}
// do the last bin which may or may not be full
for (cNO=cDO=cNT=cDT=0 ; cLast ; cLast--, pts++) {
cNO += pts->NO.c;
cDO += pts->DO.c;
cNT += pts->NT.c;
cDT += pts->DT.c;
}
dprintf(" %5d--Inf %10d %10d %10d %10d\n\n\n",cMin,cNO,cDO,cNT,cDT);
tfree(ats);
return;
tstats_help:
dprintf("Usage: tstats [-?] [1..50]\n");
dprintf("tstats can be used without parameters in which case the binsize defaults to 1\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* gs
*
* Routine Description:
*
* dumps FD_GLYPHSET structure
*
* Arguments:
*
* address of structure
*
* Return Value:
*
* none
*
\**************************************************************************/
DECLARE_API( gs )
{
dprintf("Extension 'gs' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
FD_GLYPHSET fdg, *pfdg;
FLONG fl;
WCRUN *pwc;
unsigned BytesPerHandle, i;
unsigned u;
HANDLE *ph, *phLast;
FLAGDEF *pfd;
PARSE_POINTER(gs_help);
move( fdg, arg );
if (fdg.cjThis > sizeof(adw))
{
dprintf("FD_GLYPHSET table too big to fit into adw\n");
return;
}
move2( adw, arg, fdg.cjThis );
pfdg = (FD_GLYPHSET*) adw;
dprintf("\t\t cjThis = %u = %-#x\n", pfdg->cjThis, pfdg->cjThis );
dprintf("\t\t flAccel = %-#x\n", pfdg->flAccel );
fl = pfdg->flAccel;
for (pfd=afdGS; pfd->psz; pfd++)
{
if (pfd->fl & fl)
dprintf("\t\t\t %s\n", pfd->psz);
fl &= ~pfd->fl;
}
if (fl) dprintf("\t\t\t %-#x (BAD FLAGS)\n", fl);
dprintf("\t\t cGlyphsSupported = %u\n", pfdg->cGlyphsSupported );
dprintf("\t\t cRuns = %u\n", pfdg->cRuns );
dprintf("\t\t\t\tWCHAR HGLYPH\n");
if ( pfdg->flAccel & GS_UNICODE_HANDLES )
BytesPerHandle = 0;
else
BytesPerHandle = 4;
for ( pwc = pfdg->awcrun; pwc < pfdg->awcrun + pfdg->cRuns; pwc++ )
{
dprintf(" ------------\n");
ph = (HANDLE*)((BYTE*) pwc->phg + (UINT_PTR) adw - (unsigned) arg);
phLast = ph + pwc->cGlyphs;
i = (unsigned) pwc->wcLow;
for ( ; ph < phLast; i++, ph++ )
{
if (CheckControlC()) // CTRL-C hit?
break; // yes stop the loop
u = BytesPerHandle ? (ULONG)(UINT_PTR) *ph : i;
dprintf("\t\t\t\t%-#6x %-#x\n",i,u);
}
}
return;
gs_help:
dprintf ("Usage: gs [-?] pointer to FD_GLYPHSET structure\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* gdata
*
* Routine Description:
*
* dumps a GLYPHDATA structure
*
* Arguments:
*
* address of structure
*
* Return Value:
*
* none
*
\**************************************************************************/
DECLARE_API( gdata )
{
dprintf("Extension 'gdata' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
GLYPHDATA gd, *pgd;
LONG *al;
PARSE_POINTER(gdata_help);
move( gd, arg );
pgd = (GLYPHDATA*) arg;
dprintf("\n\n");
dprintf("[%x] gdf %-#x\n", &(pgd->gdf), gd.gdf.pgb);
dprintf("[%x] hg %-#x\n", &(pgd->hg ), gd.hg);
dprintf("[%x] fxD %-#x\n", &(pgd->fxD), gd.fxD);
dprintf("[%x] fxA %-#x\n", &(pgd->fxA), gd.fxA);
dprintf("[%x] fxAB %-#x\n", &(pgd->fxAB), gd.fxAB);
dprintf("[%x] fxInkTop %-#x\n", &(pgd->fxInkTop), gd.fxInkTop);
dprintf("[%x] fxInkBottom %-#x\n", &(pgd->fxInkBottom), gd.fxInkBottom);
dprintf("[%x] rclInk %d %d %d %d\n",
&(pgd->rclInk),
gd.rclInk.left,
gd.rclInk.top,
gd.rclInk.right,
gd.rclInk.bottom
);
al = (LONG*) &gd.ptqD.x;
dprintf("[%x] ptqD % 8x.%08x % 8x.%08x\n",
&(pgd->ptqD),
al[1], al[0], al[3], al[2]
);
dprintf("\n");
return;
gdata_help:
dprintf ("Usage: gdata [-?] pointer to a GLYPHDATA structure\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
DECLARE_API( fv )
{
dprintf("Extension 'fv' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
FILEVIEW fv, *pfv;
PARSE_POINTER(fv_help);
move( fv, arg );
pfv = (FILEVIEW*) arg;
dprintf("\n");
dprintf("[%x] LastWriteTime %08x%08x\n", &(pfv->LastWriteTime), fv.LastWriteTime.HighPart, fv.LastWriteTime.LowPart);
dprintf("[%x] pvKView %-#x\n" , &(pfv->pvKView), fv.pvKView);
dprintf("[%x] pvViewFD %-#x\n" , &(pfv->pvViewFD), fv.pvViewFD);
dprintf("[%x] cjView %-#x\n" , &(pfv->cjView), fv.cjView);
dprintf("[%x] pSection %-#x\n" , &(pfv->pSection), fv.pSection);
dprintf("\n");
return;
fv_help:
dprintf ("Usage: fv [-?] pointer to a FILEVIEW structure\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
DECLARE_API( ffv )
{
dprintf("Extension 'ffv' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
FONTFILEVIEW ffv, *pffv;
PWSZ pwszDest;
PARSE_POINTER(ffv_help);
move( ffv, arg );
pffv = (FONTFILEVIEW*) arg;
dprintf("\n");
dprintf("[%x] LastWriteTime %08x%08x\n", &pffv->fv.LastWriteTime , ffv.fv.LastWriteTime.HighPart, ffv.fv.LastWriteTime.LowPart);
dprintf("[%x] pvKView %-#x\n" , &pffv->fv.pvKView , ffv.fv.pvKView );
dprintf("[%x] pvViewFD %-#x\n" , &pffv->fv.pvViewFD , ffv.fv.pvViewFD );
dprintf("[%x] cjView %-#x\n" , &pffv->fv.cjView , ffv.fv.cjView );
dprintf("[%x] pSection %-#x\n" , &pffv->fv.pSection , ffv.fv.pSection );
dprintf("[%x] pwszPath %-#x" , &pffv->pwszPath , ffv.pwszPath );
if ( ffv.pwszPath )
{
pwszDest = wcsncpy((PWSZ) adw, ffv.pwszPath, sizeof(adw)/sizeof(WCHAR));
dprintf(" = \"%ws\"\n", pwszDest );
}
else
{
dprintf("\n");
}
dprintf("[%x] ulRegionSize %-#x\n" , &pffv->ulRegionSize , ffv.ulRegionSize );
dprintf("[%x] cKRefCount %-#x\n" , &pffv->cKRefCount , ffv.cKRefCount );
dprintf("[%x] cRefCountFD %-#x\n" , &pffv->cRefCountFD , ffv.cRefCountFD );
dprintf("[%x] SpoolerBase %-#x\n" , &pffv->SpoolerBase , ffv.SpoolerBase );
dprintf("[%x] SpoolerPid %-#x\n" , &pffv->SpoolerPid , ffv.SpoolerPid );
dprintf("\n");
return;
ffv_help:
dprintf ("Usage: ffv [-?] pointer to a FONTFILEVIEW structure\n");
return;
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* History:
* 21-Feb-1995 -by- Lingyun Wang [lingyunw]
* Wrote it.
\**************************************************************************/
DECLARE_API( elf )
{
dprintf("Extension 'elf' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
LOGFONTW lf;
PARSE_POINTER(elf_help);
move(lf,arg);
vDumpLOGFONTW( &lf, (LOGFONTW*) arg );
return;
elf_help:
dprintf ("Usage: elf [-?] pointer to an LOGFONTW structure\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
* History:
* 21-Feb-1995 -by- Lingyun Wang [lingyunw]
* Wrote it.
\**************************************************************************/
DECLARE_API( helf )
{
dprintf("Extension 'helf' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
LOGFONTW lf, *plf;
PARSE_POINTER(helf_help);
plf = (LOGFONTW*) ((BYTE*)_pobj((HANDLE) arg) + offsetof(LFONT,elfw));
move( lf , plf );
vDumpLOGFONTW( &lf, plf );
return;
helf_help:
dprintf ("Usage: helf [-?] font handle\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* dhelf
*
\**************************************************************************/
DECLARE_API( dhelf )
{
dprintf("Extension 'dhelf' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
dprintf("\n\ngdikdx.dhelf will soon be replaced by gdikdx.helf\n\n");
helf(hCurrentProcess, hCurrentThread, dwCurrentPc, dwProcessor, args);
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* ifi
*
\**************************************************************************/
DECLARE_API( ifi )
{
dprintf("Extension 'ifi' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
IFIMETRICS *pifiDst, *pifiSrc;
ULONG cjIFI=0;
PARSE_POINTER(ifi_help);
pifiSrc = (IFIMETRICS *)arg;
move(cjIFI,&pifiSrc->cjThis);
if (cjIFI == 0) {
dprintf("cjIFI == 0 ... no dump\n");
return;
}
pifiDst = tmalloc(IFIMETRICS, cjIFI);
if (pifiDst == 0) {
dprintf("LocalAlloc Failed\n");
return;
}
move2(pifiDst, pifiSrc, cjIFI);
vDumpIFIMETRICS(pifiDst, pifiSrc);
tfree(pifiDst);
return;
ifi_help:
dprintf ("Usage: [-?] pointer to an IFIMETRICS structure\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* difi
*
\**************************************************************************/
DECLARE_API( difi )
{
dprintf("Extension 'difi' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
dprintf("\n\n");
dprintf("WARNING gdikdx.difi will soon be replaced by gdikdx.ifi\n");
dprintf("\n\n");
ifi(hCurrentProcess, hCurrentThread, dwCurrentPc, dwProcessor, args);
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* bParseDbgFlags
*
* Routine Description:
*
* Looks at a flag string of the form
*
* -[abc..]*[ \t]
*
* and and sets the corresponding flags
*
* Arguments:
*
* pszFlags pointer to the flags string
*
* ppszStop pointer to place to put a pointer
* to the terminating character
*
* pai pointer to an ARGINFO structure
*
*
* Return Value:
*
* Returns TRUE if all the flags were good. The corresponding flags are
* set in pai->fl. Returns FALSE if an error occurs. The pointer to
* the terminating character is set.
*
\**************************************************************************/
/*
int bParseDbgFlags(const char *pszFlags, const char **ppchStop, ARGINFO *pai)
{
char ch;
const char *pch;
OPTDEF *pod;
pch = pszFlags; // go to beginning of string
pch += (*pch == '-' || *pch == '/'); // first char a '-'?
for (ch = *pch; !isspace(ch); ch = *pch++) { // character not a space?
for (pod = pai->aod; pod->ch; pod++) { // yes, go to start of table
if (ch == pod->ch) { // found character?
pai->fl |= pod->fl; // yes, set flag
break; // and stop
}
} // go to next table entry
if (pod->ch == 0) // charater found in table?
return(0); // no, return error
} // go to next char in string
return((*ppchStop = pch) != pszFlags); // set stop pos'n and return
}
*/
/******************************Public*Routine******************************\
*
* Routine Name:
*
* bParseDbgArgs
*
* Routine Description:
*
* This routine parses the argument string pointer in pai looking
* for a string of the form:
*
* [ \t]*(-[abc..]*[ \t]+)* hexnumber
*
* The value of the hexadecimal number is placed in pai->pv and the
* flags are set in pai->fl according to the options table set
* in pai->aod;
*
* Arguments:
*
* pai Pointer to an ARGINFO structure
*
* Return Value:
*
* Returns TRUE if parsing was good, FALSE otherwise.
*
\**************************************************************************/
/*
int bParseDbgArgs(ARGINFO *pai)
{
int argc; // # args in command line
char ch;
const char *pch;
int bInArg;
int bParseDbgFlags(const char*,const char**,ARGINFO*);
pai->fl = 0; // clear flags
pai->pv = 0; // clear pointer
for (bInArg=0, pch=pai->psz, argc=0; ch = *pch; pch++) {
if (isspace(ch)) // count the number of args
bInArg = 0;
else {
argc += (bInArg == 0);
bInArg = 1;
}
}
for (pch = pai->psz; 1 < argc; argc--) { // get the flags from the
if (!bParseDbgFlags(pch, &pch, pai)) // first (argc-1) arguments
break;
}
// get the number from the last argument in command line
return (argc == 1 && sscanf(pch, "%x", &(pai->pv)) == 1);
}
*/
/******************************Public*Routine******************************\
*
* History:
* 20-Aug-1995 -by Kirk Olynyk [kirko]
* Now has option flags.
* 21-Feb-1995 -by- Lingyun Wang [lingyunw]
* Wrote it.
\**************************************************************************/
DECLARE_API( fo )
{
INIT_API();
ULONG64 foSrc;
ULONG offset;
ULONG localULONG;
char *psz, ach[128];
int i;
BOOL Maximal=FALSE;
BOOL Transform=FALSE;
BOOL Font=FALSE;
BOOL Header=FALSE;
BOOL Glyphset=FALSE;
BOOL Memory=FALSE;
BOOL Cache=FALSE;
PARSE_POINTER(fo_help);
foSrc = arg;
if(parse_iFindSwitch(tokens, ntok, 'a')!=-1) {Maximal=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'x')!=-1) {Transform=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'f')!=-1) {Font=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'c')!=-1) {Cache=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'h')!=-1) {Header=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'w')!=-1) {Glyphset=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'y')!=-1) {Memory=TRUE;}
if(!(Maximal||Transform||Font||Cache||Header||Glyphset||Memory)) {Header=TRUE;}
#define Dprint(expr, member) \
dprintf("[0x%p] " #expr " " #member "\n", foSrc+offset, ##member)
#define vDumpFoEFLOAT(member) \
GetFieldOffset(GDIType(RFONT), #member, &offset); \
sprintEFLOAT(Client, ach, foSrc+offset); \
dprintf("[0x%p] %s " #member "\n", foSrc+offset, ach)
#define vDumpFoULONG(member) \
GetFieldOffset(GDIType(RFONT), #member, &offset); \
GetRFONTSubField(#member,localULONG); \
dprintf("[0x%p] %20u " #member "\n", foSrc+offset, localULONG)
if(Maximal) {Header=TRUE;}
if (Header) {
FLONG fl;
ULONG iUniq;
ULONG iFace;
ULONG cxMax;
FLONG flFontType;
ULONG64 iTTUniq;
ULONG64 iFile;
SIZE sizLogResPpi;
ULONG ulStyleSize;
ULONG64 pvConsumer;
ULONG64 pvProducer;
GetFONTOBJFieldAndOffset(iUniq);
Dprint( %+#20x, iUniq);
GetFONTOBJFieldAndOffset(iFace);
Dprint( %+#20x, iFace);
GetFONTOBJFieldAndOffset(cxMax);
Dprint( %20d , cxMax);
GetFONTOBJFieldAndOffset(flFontType);
Dprint( %+#20x, flFontType);
for (FLAGDEF *pfd = afdFO; pfd->psz; pfd++)
if (pfd->fl & flFontType)
dprintf(" \t\t%s\n", pfd->psz);
GetFONTOBJFieldAndOffset(iTTUniq);
Dprint( %+#20p, iTTUniq);
GetFONTOBJFieldAndOffset(iFile);
Dprint( %+#20p, iFile);
GetFONTOBJFieldAndOffset(sizLogResPpi.cx);
Dprint( %20u , sizLogResPpi.cx);
GetFONTOBJFieldAndOffset(sizLogResPpi.cy);
Dprint( %20u , sizLogResPpi.cy);
GetFONTOBJFieldAndOffset(ulStyleSize);
Dprint( %20u , ulStyleSize);
GetFONTOBJFieldAndOffset(pvConsumer);
Dprint( %+#20p, pvConsumer);
GetFONTOBJFieldAndOffset(pvProducer);
Dprint( %+#20p, pvProducer);
}
if (Maximal) {
typedef struct _RFONTLINK { /* rfl */
ULONG64 prfntPrev;
ULONG64 prfntNext;
} RFONTLINK, *PRFONTLINK;
typedef struct _CACHE {
// Info for GLYPHDATA portion of cache
ULONG64 pgdNext; // ptr to next free place to put GLYPHDATA
ULONG64 pgdThreshold; // ptr to first uncommited spot
ULONG64 pjFirstBlockEnd; // ptr to end of first GLYPHDATA block
ULONG64 pdblBase; // ptr to base of current GLYPHDATA block
ULONG cMetrics; // number of GLYPHDATA's in the metrics cache
// Info for GLYPHBITS portion of cache
ULONG cjbblInitial; // size of initial bit block
ULONG cjbbl; // size of any individual block in bytes
ULONG cBlocksMax; // max # of blocks allowed
ULONG cBlocks; // # of blocks allocated so far
ULONG cGlyphs; // for statistical purposes only
ULONG cjTotal; // also for stat purposes only
ULONG64 pbblBase; // ptr to the first bit block (head of the list)
ULONG64 pbblCur; // ptr to the block containing next
ULONG64 pgbNext; // ptr to next free place to put GLYPHBITS
ULONG64 pgbThreshold; // end of the current block
// Info for lookaside portion of cache
ULONG64 pjAuxCacheMem; // ptr to lookaside buffer, if any
SIZE_T cjAuxCacheMem; // size of current lookaside buffer
// Miscellany
ULONG cjGlyphMax; // size of largest glyph
// Type of metrics being cached
BOOL bSmallMetrics;
// binary cache search, used mostly for fe fonts
INT iMax;
INT iFirst;
INT cBits;
} CACHE;
ULONG iUnique; // uniqueness number
FLONG flType; // Cache type -
ULONG ulContent; // Type of contents
ULONG64 hdevProducer; // HDEV of the producer of font.
BOOL bDeviceFont; // TRUE if realization of a device specific font
ULONG64 hdevConsumer; // HDEV of the consumer of font.
ULONG64 dhpdev; // device handle of PDEV of the consumer of font
ULONG64 ppfe; // pointer to physical font entry
ULONG64 pPFF; // point to physical font file
FD_XFORM fdx; // N->D transform used to realize font
ULONG cBitsPerPel; // number of bits per pel
// MATRIX mxWorldToDevice;// RFONT was realized with this DC xform
INT iGraphicsMode; // graphics mode used when
// EPOINTFL eptflNtoWScale; // baseline and ascender scaling factors --
BOOL bNtoWIdent; // TRUE if Notional to World is identity
// EXFORMOBJ xoForDDI; // notional to device EXFORMOBJ
// MATRIX mxForDDI; // xoForDDI's matrix
FLONG flRealizedType;
POINTL ptlUnderline1;
POINTL ptlStrikeOut;
POINTL ptlULThickness;
POINTL ptlSOThickness;
LONG lCharInc;
FIX fxMaxAscent;
FIX fxMaxDescent;
FIX fxMaxExtent;
POINTFIX ptfxMaxAscent;
POINTFIX ptfxMaxDescent;
ULONG cxMax; // width in pels of the widest glyph
LONG lMaxAscent;
LONG lMaxHeight;
ULONG cyMax; // did not use to be here
ULONG cjGlyphMax; // (cxMax + 7)/8 * cyMax, or at least it should be
FD_XFORM fdxQuantized;
LONG lNonLinearExtLeading;
LONG lNonLinearIntLeading;
LONG lNonLinearMaxCharWidth;
LONG lNonLinearAvgCharWidth;
ULONG ulOrientation;
// EPOINTFL pteUnitBase;
// EFLOAT efWtoDBase;
// EFLOAT efDtoWBase;
LONG lAscent;
// EPOINTFL pteUnitAscent;
// EFLOAT efWtoDAscent;
// EFLOAT efDtoWAscent;
LONG lEscapement;
// EPOINTFL pteUnitEsc;
// EFLOAT efWtoDEsc;
// EFLOAT efDtoWEsc;
// EFLOAT efEscToBase;
// EFLOAT efEscToAscent;
HGLYPH hgDefault;
HGLYPH hgBreak;
FIX fxBreak;
ULONG64 pfdg; // ptr to wchar-->hglyph map
ULONG64 wcgp; // ptr to wchar->pglyphdata map, if any
FLONG flInfo;
INT cSelected; // number of times selected
RFONTLINK rflPDEV; // doubly linked list links
RFONTLINK rflPFF; // doubly linked list links
ULONG64 hsemCache; // glyph cache semaphore
CACHE cache; // glyph bitmap cache
POINTL ptlSim; // for bitmap scaling
BOOL bNeededPaths; // was this rfont realized for a path bracket
// EFLOAT efDtoWBase_31;
// EFLOAT efDtoWAscent_31;
ULONG64 ptmw; // cached text metrics
LONG lMaxNegA;
LONG lMaxNegC;
LONG lMinWidthD;
BOOL bIsSystemFont; // is this fixedsys/system/or terminal
FLONG flEUDCState; // EUDC state information.
ULONG64 prfntSystemTT; // system TT linked rfont
ULONG64 prfntSysEUDC; // pointer to System wide EUDC Rfont.
ULONG64 prfntDefEUDC; // pointer to Default EUDC Rfont.
ULONG64 paprfntFaceName; // facename links
ULONG64 aprfntQuickBuff;
// quick buffer for face name and remote links
BOOL bFilledEudcArray; // will be TRUE, the buffer is filled.
ULONG ulTimeStamp; // timestamp for current link.
UINT uiNumLinks; // number of linked fonts.
BOOL bVertical; // vertical face flag.
ULONG64 hsemEUDC; // EUDC semaphore
// maximal dump
#define GetAndPrintRFONTFieldAndOffset(expr, member) \
GetRFONTFieldAndOffset(member); Dprint(expr, member)
GetAndPrintRFONTFieldAndOffset( %+#20x, iUnique);
GetAndPrintRFONTFieldAndOffset( %+#20x, flType);
GetAndPrintRFONTFieldAndOffset( %+#20x, ulContent);
GetAndPrintRFONTFieldAndOffset( %+#20x, hdevProducer);
GetAndPrintRFONTFieldAndOffset( %+#20x, bDeviceFont);
GetAndPrintRFONTFieldAndOffset( %+#20x, hdevConsumer);
GetAndPrintRFONTFieldAndOffset( %+#20x, dhpdev);
GetAndPrintRFONTFieldAndOffset( %+#20p, ppfe);
GetAndPrintRFONTFieldAndOffset( %+#20p, pPFF);
GetAndPrintRFONTFieldAndOffset( %+#20x, fdx.eXX);
GetAndPrintRFONTFieldAndOffset( %+#20x, fdx.eXY);
GetAndPrintRFONTFieldAndOffset( %+#20x, fdx.eYX);
GetAndPrintRFONTFieldAndOffset( %+#20x, fdx.eYY);
GetAndPrintRFONTFieldAndOffset( %20u , cBitsPerPel);
GetRFONTOffset (mxWorldToDevice);
dprintf("[0x%p] mxWorldToDevice: \n",foSrc+offset);
vDumpMATRIX(Client, foSrc+offset);
GetAndPrintRFONTFieldAndOffset( %20u , iGraphicsMode);
vDumpFoEFLOAT(eptflNtoWScale.x);
vDumpFoEFLOAT(eptflNtoWScale.y);
GetAndPrintRFONTFieldAndOffset( %20d , bNtoWIdent);
GetRFONTOffset (xoForDDI.pmx);
dprintf("[0x%p] xoForDDI.pmx: \n",foSrc+offset);
vDumpMATRIX(Client, foSrc+offset);
vDumpFoULONG(xoForDDI.ulMode);
GetRFONTOffset (mxForDDI);
dprintf("[0x%p] mxForDDI: \n",foSrc+offset);
vDumpMATRIX(Client, foSrc+offset);
GetAndPrintRFONTFieldAndOffset( %+#20x, flRealizedType);
GetAndPrintRFONTFieldAndOffset( %20d , ptlUnderline1.x);
GetAndPrintRFONTFieldAndOffset( %20d , ptlUnderline1.y);
GetAndPrintRFONTFieldAndOffset( %20d , ptlStrikeOut.x);
GetAndPrintRFONTFieldAndOffset( %20d , ptlStrikeOut.y);
GetAndPrintRFONTFieldAndOffset( %20d , ptlULThickness.x);
GetAndPrintRFONTFieldAndOffset( %20d , ptlULThickness.y);
GetAndPrintRFONTFieldAndOffset( %20d , ptlSOThickness.x);
GetAndPrintRFONTFieldAndOffset( %20d , ptlSOThickness.y);
GetAndPrintRFONTFieldAndOffset( %20d , lCharInc);
GetAndPrintRFONTFieldAndOffset( %+#20x, fxMaxAscent);
GetAndPrintRFONTFieldAndOffset( %+#20x, fxMaxDescent);
GetAndPrintRFONTFieldAndOffset( %+#20x, fxMaxExtent);
GetAndPrintRFONTFieldAndOffset( %+#20x, ptfxMaxAscent.x);
GetAndPrintRFONTFieldAndOffset( %+#20x, ptfxMaxAscent.y);
GetAndPrintRFONTFieldAndOffset( %+#20x, ptfxMaxDescent.x);
GetAndPrintRFONTFieldAndOffset( %+#20x, ptfxMaxDescent.y);
GetAndPrintRFONTFieldAndOffset( %20u , cxMax);
GetAndPrintRFONTFieldAndOffset( %20d , lMaxAscent);
GetAndPrintRFONTFieldAndOffset( %20d , lMaxHeight);
GetAndPrintRFONTFieldAndOffset( %20u , cyMax);
GetAndPrintRFONTFieldAndOffset( %20u , cjGlyphMax);
GetAndPrintRFONTFieldAndOffset( %+#20x, fdxQuantized.eXX);
GetAndPrintRFONTFieldAndOffset( %+#20x, fdxQuantized.eXY);
GetAndPrintRFONTFieldAndOffset( %+#20x, fdxQuantized.eYX);
GetAndPrintRFONTFieldAndOffset( %+#20x, fdxQuantized.eYY);
GetAndPrintRFONTFieldAndOffset( %20d , lNonLinearExtLeading);
GetAndPrintRFONTFieldAndOffset( %20d , lNonLinearIntLeading);
GetAndPrintRFONTFieldAndOffset( %20d , lNonLinearMaxCharWidth);
GetAndPrintRFONTFieldAndOffset( %20d , lNonLinearAvgCharWidth);
GetAndPrintRFONTFieldAndOffset( %20u , ulOrientation);
vDumpFoEFLOAT(pteUnitBase.x);
vDumpFoEFLOAT(pteUnitBase.y);
vDumpFoEFLOAT(efWtoDBase);
vDumpFoEFLOAT(efDtoWBase);
GetAndPrintRFONTFieldAndOffset( %20d , lAscent);
vDumpFoEFLOAT(pteUnitAscent.x);
vDumpFoEFLOAT(pteUnitAscent.y);
vDumpFoEFLOAT(efWtoDAscent);
vDumpFoEFLOAT(efDtoWAscent);
GetAndPrintRFONTFieldAndOffset( %20d , lEscapement);
vDumpFoEFLOAT(pteUnitEsc.x);
vDumpFoEFLOAT(pteUnitEsc.y);
vDumpFoEFLOAT(efWtoDEsc);
vDumpFoEFLOAT(efDtoWEsc);
vDumpFoEFLOAT(efEscToBase);
vDumpFoEFLOAT(efEscToAscent);
GetAndPrintRFONTFieldAndOffset( %+#20x, flInfo);
GetAndPrintRFONTFieldAndOffset( %+#20x, hgBreak);
GetAndPrintRFONTFieldAndOffset( %+#20x, fxBreak);
GetAndPrintRFONTFieldAndOffset( %+#20x, pfdg);
GetAndPrintRFONTFieldAndOffset( %+#20p, wcgp);
GetAndPrintRFONTFieldAndOffset( %20u , cSelected);
//rflPDEV
GetAndPrintRFONTFieldAndOffset( %+#20x, rflPDEV.prfntPrev);
GetAndPrintRFONTFieldAndOffset( %+#20x, rflPDEV.prfntNext);
//rflPFF
GetAndPrintRFONTFieldAndOffset( %+#20x, rflPFF.prfntPrev);
GetAndPrintRFONTFieldAndOffset( %+#20x, rflPFF.prfntNext);
//hsemCache
GetAndPrintRFONTFieldAndOffset( %+#20x, hsemCache);
//cache
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.pgdNext);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.pgdThreshold);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.pjFirstBlockEnd);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.pdblBase);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.cMetrics);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.cjbbl);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.cBlocksMax);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.cBlocks);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.cGlyphs);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.cjTotal);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.pbblBase);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.pbblCur);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.pgbNext);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.pgbThreshold);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.pjAuxCacheMem);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.cjAuxCacheMem);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.cjGlyphMax);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.bSmallMetrics);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.iMax);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.iFirst);
GetAndPrintRFONTFieldAndOffset( %+#20x, cache.cBits);
GetAndPrintRFONTFieldAndOffset( %20d , ptlSim.x);
GetAndPrintRFONTFieldAndOffset( %20d , ptlSim.y);
GetAndPrintRFONTFieldAndOffset( %20d , bNeededPaths);
vDumpFoEFLOAT(efDtoWBase_31);
vDumpFoEFLOAT(efDtoWAscent_31);
GetAndPrintRFONTFieldAndOffset( %+#20x, ptmw);
GetAndPrintRFONTFieldAndOffset( %20d , lMaxNegA);
GetAndPrintRFONTFieldAndOffset( %20d , lMaxNegC);
GetAndPrintRFONTFieldAndOffset( %20d , lMinWidthD);
GetAndPrintRFONTFieldAndOffset( %20d , bIsSystemFont);
GetAndPrintRFONTFieldAndOffset( %+#20x, flEUDCState);
GetAndPrintRFONTFieldAndOffset( %+#20x, prfntSystemTT);
GetAndPrintRFONTFieldAndOffset( %+#20x, prfntSysEUDC);
GetAndPrintRFONTFieldAndOffset( %+#20x, prfntDefEUDC);
GetAndPrintRFONTFieldAndOffset( %+#20x, paprfntFaceName);\
//aprfntQuickBuff
#if 0
GetAndPrintRFONTFieldAndOffset( %+20x, aprfntQuickBuff[0]);
GetAndPrintRFONTFieldAndOffset( %+20x, aprfntQuickBuff[1]);
GetAndPrintRFONTFieldAndOffset( %+20x, aprfntQuickBuff[2]);
GetAndPrintRFONTFieldAndOffset( %+20x, aprfntQuickBuff[3]);
GetAndPrintRFONTFieldAndOffset( %+20x, aprfntQuickBuff[4]);
GetAndPrintRFONTFieldAndOffset( %+20x, aprfntQuickBuff[5]);
GetAndPrintRFONTFieldAndOffset( %+20x, aprfntQuickBuff[6]);
GetAndPrintRFONTFieldAndOffset( %+20x, aprfntQuickBuff[7]);
#endif
GetAndPrintRFONTFieldAndOffset( %20d , bFilledEudcArray);
GetAndPrintRFONTFieldAndOffset( %20u , ulTimeStamp);
GetAndPrintRFONTFieldAndOffset( %20u , uiNumLinks);
GetAndPrintRFONTFieldAndOffset( %20d , bVertical);
}
if (Memory)
{
dprintf("Extension 'fo -y' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
vDumpGlyphMemory((RFONT*)arg);
#endif
}
if (Font) {
ULONG64 ppfe; // pointer to physical font entry
GetRFONTFieldAndOffset(ppfe);
dprintf("[Font Information]\n ppfe = %-#p\n", ppfe);
// print the face name of the font
if (ppfe) {
ULONG64 pfeSrc= ppfe;
ULONG64 pifi;
GetPFEFieldAndOffset(pifi);
if (pifi) {
ULONG dpwszFaceName, cjThis;
ULONG64 pifiSrc = pifi;
GetIFIMETRICSFieldAndOffset(cjThis);
GetIFIMETRICSFieldAndOffset(dpwszFaceName);
if (cjThis) {
WCHAR wszFaceName[MAX_PATH+1];
ReadMemory(pifiSrc+dpwszFaceName, wszFaceName,MAX_PATH, NULL);
dprintf(" [%ws]\n", wszFaceName);
}
}
}
ULONG64 pPFF; // point to physical font file
GetRFONTFieldAndOffset(pPFF);
dprintf(" pPFF = %-#p\n", pPFF);
if (pPFF) {
ULONG64 pffSrc = pPFF;
SIZE_T sizeofThis;
ULONG cFonts; // number of fonts (same as chpfe)
ULONG64 aulData; // data buffer for HPFE and filename
ULONG64 sizeOfPVOID;
sizeOfPVOID = GetTypeSize("PVOID");
GetPFFFieldAndOffset(sizeofThis);
GetPFFFieldAndOffset(cFonts);
GetPFFFieldAndOffset(aulData);
offset = offset + cFonts * (ULONG)sizeOfPVOID;
if (sizeofThis) {
WCHAR wszPathName[MAX_PATH+1];
ReadMemory(pffSrc+offset, wszPathName,MAX_PATH, NULL);
dprintf(" [%ws]\n", wszPathName);
}
}
}
if (Transform) {
dprintf("Extension 'fo -x' is not converted.\n");
#if 0 // DOES NOT SUPPORT API64
LONG l1,l2,l3,l4;
psz = ach;
psz += sprintFLOATL( psz, rf.fdx.eXX );
*psz++ = ' ';
psz += sprintFLOATL( psz, rf.fdx.eXY );
dprintf("[transform]\n fdx = %s\n", ach);
psz = ach;
psz += sprintFLOATL( psz, rf.fdx.eXY );
*psz++ = ' ';
psz += sprintFLOATL( psz, rf.fdx.eYY );
dprintf (" %s\n", ach );
l1 = rf.mxWorldToDevice.efM11.lEfToF();
l2 = rf.mxWorldToDevice.efM12.lEfToF();
l3 = rf.mxWorldToDevice.efM21.lEfToF();
l4 = rf.mxWorldToDevice.efM22.lEfToF();
dprintf(
" mxWorldToDevice =\n"
);
sprintEFLOAT( ach, rf.mxWorldToDevice.efM11 );
dprintf(" efM11 = %s\n", ach );
sprintEFLOAT( ach, rf.mxWorldToDevice.efM12 );
dprintf(" efM12 = %s\n", ach );
sprintEFLOAT( ach, rf.mxWorldToDevice.efM21 );
dprintf(" efM21 = %s\n", ach );
sprintEFLOAT( ach, rf.mxWorldToDevice.efM22 );
dprintf(" efM22 = %s\n", ach );
dprintf(
" fxDx = %-#x\n"
" fxDy = %-#x\n"
, rf.mxWorldToDevice.fxDx
, rf.mxWorldToDevice.fxDy
);
l1 = (LONG) rf.mxWorldToDevice.flAccel;
dprintf(" flAccel = %-#x\n", l1);
for (FLAGDEF *pfd=afdMX; pfd->psz; pfd++)
if (l1 & pfd->fl)
dprintf("\t\t%s\n", pfd->psz);
psz = ach;
psz += sprintEFLOAT( psz, rf.eptflNtoWScale.x);
*psz++ = ' ';
psz += sprintEFLOAT( psz, rf.eptflNtoWScale.y);
dprintf(" eptflNtoWScale = %s\n", ach );
dprintf(
" bNtoWIdent = %d\n"
, rf.bNtoWIdent
);
dprintf(
" xoForDDI =\n"
" mxForDDI =\n"
);
dprintf(
" ulOrientation = %u\n"
, rf.ulOrientation
);
psz = ach;
psz += sprintEFLOAT( ach, rf.pteUnitBase.x );
*psz++ = ' ';
psz += sprintEFLOAT( ach, rf.pteUnitBase.y );
dprintf(" pteUnitBase = %s\n", ach );
sprintEFLOAT( ach, rf.efWtoDBase );
dprintf(" efWtoDBase = %s\n", ach );
sprintEFLOAT( ach, rf.efDtoWBase );
dprintf(" efDtoWBase = %s\n", ach );
dprintf(" lAscent = %d\n", rf.lAscent);
psz = ach;
psz += sprintEFLOAT( ach, rf.pteUnitAscent.x );
*psz++ = ' ';
psz += sprintEFLOAT( ach, rf.pteUnitAscent.y );
dprintf(" pteUnitAscent = %s\n", ach );
sprintEFLOAT( ach, rf.efWtoDAscent );
dprintf(" efWtoDAscent = %s\n", ach );
sprintEFLOAT( ach, rf.efDtoWAscent );
dprintf(" efDtoWAscent = %s\n", ach );
psz = ach;
psz += sprintEFLOAT( ach, rf.pteUnitEsc.x );
*psz++ = ' ';
psz += sprintEFLOAT( ach, rf.pteUnitEsc.y );
dprintf(" pteUnitEsc = %s\n", ach );
sprintEFLOAT( ach, rf.efWtoDEsc );
dprintf(" efWtoDEsc = %s\n", ach );
sprintEFLOAT( ach, rf.efDtoWEsc );
dprintf(" efDtoWEsc = %s\n", ach );
sprintEFLOAT( ach, rf.efEscToBase );
dprintf(" efEscToBase = %s\n", ach );
sprintEFLOAT( ach, rf.efEscToAscent);
dprintf(" efEscToAscent = %s\n", ach );
dprintf("\n");
#endif
}
if (Glyphset) {
dprintf("Extension 'fo -w' is not converted.\n");
#if 0 // DOES NOT SUPPORT API64
if (rf.pfdg) {
FD_GLYPHSET fdg, *pfdg;
WCRUN *pwc;
move( fdg, rf.pfdg );
move2( adw, rf.pfdg, fdg.cjThis );
pfdg = (FD_GLYPHSET*) adw;
dprintf(
"\t\t cjThis = %u = %-#x\n"
, pfdg->cjThis
, pfdg->cjThis
);
dprintf("\t\t flAccel = %-#x\n", pfdg->flAccel );
FLONG flAccel = pfdg->flAccel;
for (FLAGDEF *pfd=afdGS; pfd->psz; pfd++)
if (flAccel & pfd->fl) {
dprintf("\t\t\t\t%s\n", pfd->psz);
flAccel &= ~pfd->fl;
}
if (flAccel)
dprintf("\t\t\t\t????????\n");
dprintf("\t\t\tcGlyphsSupported\t= %u\n", pfdg->cGlyphsSupported );
dprintf("\t\t\tcRuns\t\t= %u\n", pfdg->cRuns );
dprintf("\t\t\t\tWCHAR HGLYPH\n");
for ( pwc = pfdg->awcrun; pwc < pfdg->awcrun + pfdg->cRuns; pwc++ ) {
dprintf("\t\t\t\t------------\n");
HGLYPH *ahg= tmalloc(HGLYPH,sizeof(HGLYPH)*pwc->cGlyphs);
if ( ahg ) {
move2(ahg, pwc->phg, sizeof(HGLYPH) * pwc->cGlyphs );
for (unsigned i = 0; i < pwc->cGlyphs; i++) {
if (CheckControlC()) {
tfree( ahg );
return;
}
dprintf("\t\t\t\t%-#6x %-#x\n",
pwc->wcLow + (USHORT) i, ahg[i]);
}
tfree( ahg );
}
}
}
#endif
}
if (Cache) {
ULONG64 hsemCache; // glyph cache semaphore
GetRFONTFieldAndOffset(hsemCache);
GetRFONTOffset( cache.pgdNext);
dprintf(
"[cache]\n"
" hsemCache = %-#x\n" // semaphore
, hsemCache
);
vDumpCACHE(foSrc+offset);
}
EXIT_API(S_OK);
fo_help:
dprintf("Usage: fo [-?] [-a] [-c] [-f] [-h] [-w] [-x] [-y] pointer to FONTOBJ"
" -a maximal dump\n"
" -c cache\n"
" -x transform data\n"
" -? this message\n"
" -f font\n"
" -h FONTOBJ header\n"
" -w FD_GLYPHSET\n"
" -y Glyph Memory Usage\n");
#undef Dprintf
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpPFE
*
\**************************************************************************/
void vDumpPFE(ULONG64 offPFE)
{
#define N3(a,b,c) \
GetPFEFieldAndOffset(c); \
dprintf( "[%p] %s", pfeSrc + offset, (a)); dprintf( (b), ##c )
#define N2(a,c) \
GetPFEOffset(c); \
dprintf( "[%p] %s", pfeSrc + offset, (a));
ULONG offset;
ULONG64 pfeSrc= offPFE;
FLAGDEF *pfd;
FLONG fl;
ULONG64 pPFF; // pointer to physical font file object
ULONG iFont; // index of the font for IFI or device
FLONG flPFE;
ULONG64 pfdg; // ptr to wc-->hg map
ULONG idfdg; // id returned by driver for FD_GLYPHSET
ULONG64 pifi; // pointer to ifimetrics
ULONG idifi; // id returned by driver for IFIMETRICS
ULONG64 pkp; // pointer to kerning pairs (lazily loaded on demand)
ULONG idkp; // id returned by driver for FD_KERNINGPAIR
ULONG ckp; // count of kerning pairs in the FD_KERNINGPAIR arrary
LONG iOrientation; // Cache IFI orientation.
ULONG cjEfdwPFE; // size of enumeration data needed for this pfe
ULONG64 pgiset; // initialized to NULL;
ULONG ulTimeStamp; // unique time stamp (smaller == older)
ULONG pid;
// QUICKLOOKUP ql; // QUICKLOOKUP if a linked font
ULONG64 pFlEntry; // Pointer to linked font list
ULONG cAlt;
ULONG cPfdgRef;
BYTE aiFamilyName[1]; // aiFamilyNameg[cAltCharSets]
dprintf("\nPFE\n\n");
N3("pPFF ", "%-#x\n", pPFF);
N3("iFont ", "%u\n", iFont);
N3("pifi ", "%-#x\n", pifi);
N3("flPFE ", "%-#x\n", flPFE);
for (fl = flPFE, pfd=afdPFE; pfd->psz; pfd++) {
if (fl & pfd->fl) {
dprintf(" %s\n", pfd->psz);
}
}
N3("pfdg ", "%-#x\n", pfdg);
N2("idifi\n", idifi);
N3("pkp ", "%-#x\n", pkp);
N3("idkp ", "%-#x\n", idkp);
N3("ckp ", "%u\n", ckp);
N3("iOrieintation ", "%d\n", iOrientation);
N3("cjEfdwPFE ", "%-#x\n", cjEfdwPFE);
N3("pgiset ", "%-#x\n", pgiset);
N3("ulTimeStamp ", "%u\n", ulTimeStamp);
N2("ufi\n", ufi);
N3("pid ", "%-#x\n", pid);
N2("ql\n" , ql);
N3("pFlEntry ", "%-#x\n", pFlEntry);
N3("cAlt ", "%u\n", cAlt);
N3("cPfdgRef ", "%u\n", cPfdgRef);
N2("aiFamilyName[]" , aiFamilyName[0]);
dprintf("\n\n");
#undef N2
#undef N3
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* pfe
*
\**************************************************************************/
DECLARE_API( pfe )
{
PARSE_POINTER(pfe_help);
vDumpPFE( arg );
EXIT_API(S_OK);
pfe_help:
dprintf ("Usage: pfe [-?] pointer to PFE\n");
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* History:
* 21-Feb-1995 -by- Lingyun Wang [lingyunw]
* Wrote it.
\**************************************************************************/
DECLARE_API( hpfe )
{
dprintf("Why are you using a handle? Nobody uses a handle to a PFE\n");
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
* vPrintSkeletonPFF
*
* Argument
*
* pLocalPFF points to a complete local PFF structure
* (including PFE*'s and path name)
* all addresses contained are remote
* except for pwszPathname_ which has
* been converted before this routine
* was called
*
* History:
* Tue 30-Aug-1994 07:25:18 by Kirk Olynyk [kirko]
* Wrote it.
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
VOID vPrintSkeletonPFF( PFF *pLocalPFF )
{
PFE **ppPFEl, **ppPFEl_;
if (pLocalPFF->hdev)
dprintf("\t%-#8x (HDEV)\n", pLocalPFF->hdev);
else
dprintf("\t\"%ws\"\n", pLocalPFF->pwszPathname_);
dprintf("\t PFE* IFI*\n");
ppPFEl = (PFE**) &(pLocalPFF->aulData[0]);
ppPFEl_ = ppPFEl + pLocalPFF->cFonts;
while (ppPFEl < ppPFEl_) {
PFE *pPFEr = *ppPFEl;
dprintf("\t %-#10x", pPFEr);
if ( pPFEr ) {
PFE PFEt;
move2(&PFEt, pPFEr, sizeof(PFEt));
dprintf(" %-#10x\t", PFEt.pifi);
{
ULONG sizeofIFI;
IFIMETRICS *pHeapIFI;
move2(
&sizeofIFI
, PFEt.pifi + offsetof(IFIMETRICS,cjThis)
, sizeof(sizeofIFI));
if (pHeapIFI = tmalloc(IFIMETRICS,sizeofIFI)) {
move2(pHeapIFI, PFEt.pifi, sizeofIFI);
IFIOBJ ifio(pHeapIFI);
dprintf(
"\"%ws\" %d %d\n"
, ifio.pwszFaceName()
, ifio.lfHeight()
, ifio.lfWidth()
);
tfree(pHeapIFI);
} else
dprintf("!!! memory allocation failure !!!\n");
}
} else
dprintf(" INVALID PFE\n");
ppPFEl++;
}
// Now print the RFONT list
{
RFONT LocalRFONT, *pRemoteRFONT;
if (pRemoteRFONT = pLocalPFF->prfntList) {
dprintf("\t\tRFONT* PFE*\n");
do {
move2(&LocalRFONT, pRemoteRFONT, sizeof(LocalRFONT));
dprintf("\t\t%-#10x %-#10x\n", pRemoteRFONT, LocalRFONT.ppfe);
pRemoteRFONT = LocalRFONT.rflPFF.prfntNext;
} while (pRemoteRFONT);
}
}
}
#endif // DOES NOT SUPPORT API64
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
void vDumpPFT( PFT *pLocal, PFT *pRemote )
{
COUNT i;
dprintf("[%8x] pfhFamily %-#x\n", &pRemote->pfhFamily, pLocal->pfhFamily);
dprintf("[%8x] pfhFace %-#x\n", &pRemote->pfhFace , pLocal->pfhFace );
dprintf("[%8x] pfhUFI %-#x\n", &pRemote->pfhUFI , pLocal->pfhUFI );
dprintf("[%8x] cBuckets %-#x\n", &pRemote->cBuckets , pLocal->cBuckets );
dprintf("[%8x] cFiles %-#x\n", &pRemote->cFiles , pLocal->cFiles );
for (i = 0; i < pLocal->cBuckets; i++)
{
PFF *pRemotePFF = pLocal->apPFF[i];
if (pRemotePFF)
{
PFF *pLast;
dprintf("[%8x]", &pRemote->apPFF[i]);
pLast = 0;
while (pRemotePFF && !CheckControlC())
{
PFF LocalPFF;
dprintf(" %8x", pRemotePFF);
move(LocalPFF, pRemotePFF);
pLast = pRemotePFF;
pRemotePFF = LocalPFF.pPFFNext;
if (pRemotePFF && pRemotePFF == pLast)
{
dprintf(" <---- BAD PFF ?");
pRemotePFF = 0;
}
}
dprintf("\n");
}
}
dprintf("\n"
"PFF* Pathname_\n"
"-------- ---------\n");
for (i = 0; i < pLocal->cBuckets; i++)
{
PFF *pRemotePFF, LocalPFF;
PWSZ pwszDst;
if ( pRemotePFF = pLocal->apPFF[i] )
{
dprintf("apPFF[%d]\n", i);
for ( ; pRemotePFF; pRemotePFF=LocalPFF.pPFFNext)
{
move(LocalPFF, pRemotePFF);
pwszDst = wcsncpy((PWSZ) adw, LocalPFF.pwszPathname_, sizeof(adw)/sizeof(WCHAR));
if ( pwszDst == 0 )
{
pwszDst = L"";
}
dprintf("%8x \"%ws\"\n", pRemotePFF, pwszDst);
}
dprintf("\n");
}
}
}
#endif // DOES NOT SUPPORT API64
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
void vDumpFONTHASH( FONTHASH *pLocal, FONTHASH *pRemote )
{
UINT i;
union {
UINT id;
char ach[4];
} u;
/*
UINT id; // 'HASH'
FONTHASHTYPE fht; // table type
UINT cBuckets; // total number of buckets
UINT cUsed; // number of buckets in use
UINT cCollisions;
HASHBUCKET *pbktFirst; // first bucket of doubly linked list of hash
// buckets maintained in order loaded into system
HASHBUCKET *pbktLast; // last bucket of doubly linked list of hash
// buckets maintained in order loaded into system
HASHBUCKET *apbkt[1]; // array of bucket pointers.
*/
u.id = pLocal->id;
dprintf("[%8x] id %8x %c%c%c%c\n", &pRemote->id, u.id, u.ach[0], u.ach[1], u.ach[2], u.ach[3]);
dprintf("[%8x] fht %-#10x %s\n", &pRemote->fht, pLocal->fht, pszFONTHASHTYPE(pLocal->fht));
dprintf("[%8x] cBuckets %-#x\n", &pRemote->cBuckets, pLocal->cBuckets);
dprintf("[%8x] cUsed %-#x\n", &pRemote->cUsed, pLocal->cUsed);
dprintf("[%8x] cCollisions %-#x\n", &pRemote->cCollisions, pLocal->cCollisions);
dprintf("[%8x] pbktFirst %-#x\n", &pRemote->pbktFirst, pLocal->pbktFirst);
dprintf("[%8x] pbktLast %-#x\n", &pRemote->pbktLast, pLocal->pbktLast);
dprintf("\n");
i = pLocal->cBuckets * sizeof(HASHBUCKET*);
if (i == 0 )
{
dprintf("No buckets here\n");
return;
}
move2(adw,&(pRemote->apbkt[0]),i);
for ( i = 0; i < pLocal->cBuckets; i++)
{
HASHBUCKET *pRemoteHB = ((HASHBUCKET**) adw)[i];
if ( pRemoteHB )
{
HASHBUCKET LocalHB;
dprintf("apbkt[%3u]", i);
for ( ; pRemoteHB; pRemoteHB = LocalHB.pbktCollision)
{
dprintf(" %-#x", pRemoteHB);
move(LocalHB, pRemoteHB);
}
dprintf("\n");
}
}
dprintf("\n");
for ( i = 0; i < pLocal->cBuckets; i++)
{
HASHBUCKET *pRemoteHB = ((HASHBUCKET**) adw)[i];
if ( pRemoteHB )
{
HASHBUCKET LocalHB;
dprintf("--------------------------------------\n");
dprintf("apbkt[%3u]\n", i);
for ( ; pRemoteHB; pRemoteHB = LocalHB.pbktCollision)
{
dprintf("HASHBUCKET* %-#x ", pRemoteHB);
move(LocalHB, pRemoteHB);
switch ( pLocal->fht )
{
case FHT_FACE:
case FHT_FAMILY:
dprintf("\t\"%ws\"", LocalHB.u.wcCapName);
break;
case FHT_UFI:
dprintf("\tUFI(%-#x,%-#x)", LocalHB.u.ufi.CheckSum, LocalHB.u.ufi.Index);
break;
default:
break;
}
dprintf("\n");
{
PFELINK *ppfel = LocalHB.ppfelEnumHead;
PFELINK pfelLocal;
PFE LocalPFE;
if (ppfel)
{
dprintf("PFE*\n");
while (ppfel)
{
move(pfelLocal, ppfel);
dprintf("%-#x", pfelLocal.ppfe);
move(LocalPFE,pfelLocal.ppfe);
if (LocalPFE.pPFF)
{
PFF LocalPFF;
WCHAR awc[MAX_PATH];
move(LocalPFF, LocalPFE.pPFF);
wcsncpy( awc, LocalPFF.pwszPathname_, MAX_PATH);
awc[MAX_PATH-1]=0;
dprintf(" \"%ws\"", awc);
}
if (LocalPFE.pifi)
{
ULONG dp;
WCHAR awc[LF_FACESIZE+1];
PWSZ pwszSrc;
FWORD fwdAscender, fwdDescender, fwdWidth;
move(dp,&((LocalPFE.pifi)->dpwszFaceName));
pwszSrc = (PWSZ)(((char*) (LocalPFE.pifi)) + dp);
wcsncpy(awc, pwszSrc, LF_FACESIZE);
awc[LF_FACESIZE] = 0;
dprintf(" \"%ws\"", awc);
move(fwdAscender, &LocalPFE.pifi->fwdWinAscender);
move(fwdDescender, &LocalPFE.pifi->fwdWinDescender);
move(fwdWidth, &LocalPFE.pifi->fwdAveCharWidth);
dprintf(" %4d %4d %4d", fwdAscender, fwdDescender, fwdWidth);
}
dprintf("\n");
ppfel = pfelLocal.ppfelNext;
}
}
}
}
}
}
dprintf("--------------------------------------\n");
}
#endif // DOES NOT SUPPORT API64
/******************************Public*Routine******************************\
* vPrintSkeletonPFT
*
* History:
* Mon 29-Aug-1994 15:51:16 by Kirk Olynyk [kirko]
* Wrote it.
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
VOID vPrintSkeletonPFT( PFT *pLocalPFT )
{
PFF *pPFFr, **ppPFFl, **ppPFFl_, *pPFFNext ,*pHeapPFF;
dprintf("pfhFamily = %-#x\n" , pLocalPFT->pfhFamily );
dprintf("pfhFace = %-#x\n" , pLocalPFT->pfhFace );
dprintf("cBuckets = %u\n" , pLocalPFT->cBuckets );
dprintf("cFiles = %u\n" , pLocalPFT->cFiles );
dprintf("\n\n");
for (
ppPFFl = pLocalPFT->apPFF
, ppPFFl_ = pLocalPFT->apPFF + pLocalPFT->cBuckets
; ppPFFl < ppPFFl_
; ppPFFl++
) {
// if the bucket is empty skip to the next otherwise print
// the bucket number and then print the contents of all
// the PFF's hanging off the bucket.
if (!(pPFFr = *ppPFFl))
continue;
dprintf("apPFF[%u]\n", ppPFFl - pLocalPFT->apPFF);
while ( pPFFr ) {
// get the size of the remote PFF and allocate enough space
// on the heap
dprintf(" %-#8x", pPFFr);
PFF FramePFF;
move(FramePFF, pPFFr);
if (pHeapPFF = tmalloc(PFF,FramePFF.sizeofThis)) {
// get a local copy of the PFF and fix up the sting pointer
// to point to the address in the local heap then print
// the local copy. Some of the addresses in the local
// PFF point to remote object but vPrintSkeleton will
// take care of that. When we are done we free the memory.
move2(pHeapPFF, pPFFr, (ULONG)(ULONG_PTR)FramePFF.sizeofThis);
PFFOBJ pffo(pHeapPFF);
pHeapPFF->pwszPathname_ = pffo.pwszCalcPathname();
vPrintSkeletonPFF(
pHeapPFF
);
tfree(pHeapPFF);
}
else {
dprintf("Allocation failure\n");
break;
}
pPFFr = FramePFF.pPFFNext;
}
}
}
#endif // DOES NOT SUPPORT API64
/******************************Public*Routine******************************\
*
* History:
* 21-Feb-1995 -by- Lingyun Wang [lingyunw]
* Wrote it.
\**************************************************************************/
DECLARE_API( pft )
{
dprintf("Extension 'pft' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
PARSE_POINTER(pft_help);
Gdidpft((PFT *) arg);
return;
pft_help:
dprintf ("Usage: pft [-?] pointer to PFT\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
* dpft
*
* History:
* Mon 29-Aug-1994 15:39:39 by Kirk Olynyk [kirko]
* Wrote it.
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
VOID Gdidpft( PFT *pRemotePFT)
{
ULONG size;
PFT LocalPFT, *pLocalPFT;
move(LocalPFT, pRemotePFT);
size = offsetof(PFT, apPFF[0]) + LocalPFT.cBuckets * sizeof(PFF *);
if (pLocalPFT = tmalloc(PFT, size)) {
move2(pLocalPFT, pRemotePFT, size);
vDumpPFT(pLocalPFT, pRemotePFT);
tfree(pLocalPFT);
} else
dprintf("dpft error --- failed to allocate memory\n");
dprintf("\n");
}
#endif // DOES NOT SUPPORT API64
/******************************Public*Routine******************************\
* dpubft
*
* dumps the public font table
*
* History:
* Thu 01-Sep-1994 23:20:54 by Kirk Olynyk [kirko]
* Wrote it.
\**************************************************************************/
DECLARE_API( pubft )
{
dprintf("Extension 'pubft' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
PFT * pft;
PARSE_ARGUMENTS(pubft_help);
GetValue (pft, "win32k!gpPFTPublic");
Gdidpft(pft);
return;
pubft_help:
dprintf("Usage: pubft [-?]\n");
//check that this is true
dprintf("Equivalent to pft win32k!gpPFTPublic\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
* Gdidpvtft( )
*
* dumps the private PFT
*
* History:
* 01-Oct-1996 -by- Xudong Wu [TessieW]
* Wrote it.
\**************************************************************************/
DECLARE_API( pvtft )
{
dprintf("Extension 'pvtft' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
PFT * pft;
PARSE_ARGUMENTS(pvtft_help);
GetValue (pft, "win32k!gpPFTPrivate");
Gdidpft(pft);
return;
pvtft_help:
dprintf("Usage: pvtft [-?]\n");
//check that this is true
dprintf("Equivalent to pft win32k!gpPFTPrivate\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
* ddevft
*
* dumps the device font table
*
* History:
* Thu 01-Sep-1994 23:21:15 by Kirk Olynyk [kirko]
* Wrote it.
\**************************************************************************/
DECLARE_API( devft )
{
dprintf("Extension 'devft' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
PFT *pft;
PARSE_ARGUMENTS(devft_help);
GetValue (pft, "win32k!gpPFTDevice");
Gdidpft(pft);
return;
devft_help:
dprintf("Usage: devft [-?]\n");
//check that this is true
dprintf("Equivalent to pft win32k!gpPFTDevice\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* History:
* Sat 23-Sep-1995 08:26:09 by Kirk Olynyk [kirko]
* Re-wrote it.
* 21-Feb-1995 -by- Lingyun Wang [lingyunw]
* Wrote it.
\**************************************************************************/
DECLARE_API( stro )
{
#define QUICK_FACE_NAME_LINKS 8
ULONG offset;
ULONG64 estrobjSrc;
ULONG cGlyphs; // Number of glyphs.
FLONG flAccel; // Accelerator flags exposed to the driver.
ULONG ulCharInc; // Non-zero if constant character increment.
RECTL rclBkGround; // Background rect of the string.
ULONG64 pgp; // Accelerator if all GLYPHPOS's are valid.
ULONG64 pwszOrg; // pointer to original unicode string.
ULONG cgposCopied; // For enumeration.
ULONG cgposPositionsEnumerated; // only used for enumerating positions in linked strings
ULONG64 prfo; // Remember our RFONTOBJ.
FLONG flTO; // flags
ULONG64 pgpos; // Pointer to the GLYPHPOS structures.
POINTFIX ptfxRef; // Reference point.
POINTFIX ptfxUpdate; // CP advancement for the string.
POINTFIX ptfxEscapement; // The total escapement vector.
RECTFX rcfx; // The TextBox, projected onto the base and ascent.
FIX fxExtent; // The Windows compatible text extent.
FIX xExtra; // computed in H3, G2,3 cases
FIX xBreakExtra; // computed in H3, G2,3 cases
DWORD dwCodePage; // accelerator for ps driver
ULONG cExtraRects; // Rectangles for underline
RECTL arclExtra[3]; // and strikeout.
RECTL rclBkGroundSave; // used to save a copy of BkGroundRect
ULONG64 pwcPartition; // For partitioning
ULONG64 plPartition; // Points to partitioning information
ULONG64 plNext; // Next glyph in font
ULONG64 pgpNext; // For enumeration
LONG lCurrentFont; // For enumeration
POINTL ptlBaseLineAdjust; // Used to adjust SysEUDC baseline
ULONG cTTSysGlyphs; // Number of TT system font glyphs in a string
ULONG cSysGlyphs; // Number of system eudc glyphs in a string.
ULONG cDefGlyphs; // Number of default eudc glyphs in a string.
ULONG cNumFaceNameLinks; // Number of linked face name eudc in a string .
ULONG64 pacFaceNameGlyphs; // Pointer to array of number of face name glyphs.
ULONG acFaceNameGlyphs[QUICK_FACE_NAME_LINKS];
FLONG fl;
FLAGDEF *pfd;
WCHAR *awc;
int i;
BOOL Header=FALSE;
BOOL Position=FALSE;
BOOL East=FALSE;
PARSE_POINTER(stro_help);
estrobjSrc= arg;
if(parse_iFindSwitch(tokens, ntok, 'p')!=-1) {Position=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'h')!=-1) {Header=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'e')!=-1) {East=TRUE;}
if(!(Position||East||Header)) {Header=TRUE;}
if(East) {Header=TRUE;}
if (Header) {
GetESTROBJFieldAndOffset(cGlyphs);
dprintf("[%-#p] cGlyphs %-#x\n", estrobjSrc+offset , cGlyphs );
GetESTROBJFieldAndOffset(flAccel);
dprintf("[%-#p] flAccel %-#x\n", estrobjSrc+offset , flAccel );
for (fl=flAccel, pfd=afdSO; pfd->psz; pfd++)
if (fl & pfd->fl) {
dprintf("\t\t%s\n", pfd->psz);
fl &= ~pfd->fl;
}
GetESTROBJFieldAndOffset(ulCharInc);
dprintf("[%-#p] ulCharInc %-#x=%u\n", estrobjSrc+offset , ulCharInc , ulCharInc );
GetESTROBJFieldAndOffset(rclBkGround.left);
dprintf("[%-#p] rclBkGround.left %-#x=%d\n", estrobjSrc+offset , rclBkGround.left , rclBkGround.left );
GetESTROBJFieldAndOffset(rclBkGround.top);
dprintf("[%-#p] rclBkGround.top %-#x=%d\n", estrobjSrc+offset , rclBkGround.top , rclBkGround.top );
GetESTROBJFieldAndOffset(rclBkGround.right);
dprintf("[%-#p] rclBkGround.right %-#x=%d\n", estrobjSrc+offset , rclBkGround.right , rclBkGround.right );
GetESTROBJFieldAndOffset(rclBkGround.bottom);
dprintf("[%-#p] rclBkGround.bottom %-#x=%d\n", estrobjSrc+offset , rclBkGround.bottom , rclBkGround.bottom );
GetESTROBJFieldAndOffset(pgp);
dprintf("[%-#p] pgp %-#x\n", estrobjSrc+offset , pgp );
GetESTROBJFieldAndOffset(pwszOrg);
awc = (WCHAR*) adw;
awc[0] = 0;
if (pwszOrg && cGlyphs < 256) {
ReadMemory((ULONG_PTR) pwszOrg, adw, cGlyphs * sizeof(WCHAR), 0);
awc[255] = 0;
}
dprintf("[%-#p] pwszOrg %-#x ", estrobjSrc+offset, pwszOrg);
GetESTROBJFieldAndOffset(prfo);
if (awc[0] && prfo) {
#if 0
if (offsetof(RFONTOBJ,prfnt) != 0)
dprintf("\noffsetof(RFONTOBJ,prfnt) != 0\n");
else
#endif
{
ULONG64 foSrc;
FLONG flType; // Cache type -
GetFieldData(prfo, "PVOID", NULL, sizeof(foSrc), &foSrc);
GetRFONTFieldAndOffset( flType);
WCHAR wc, *pwc;
USHORT *pus, *pusStnl;
switch (flType & (RFONT_TYPE_UNICODE | RFONT_TYPE_HGLYPH)) {
case RFONT_TYPE_UNICODE:
dprintf("%c", '\"');
for (pwc = awc; wc = *pwc; pwc++) {
if (wc < 256 )
dprintf("%c", isprint((int)wc) ? (char) wc : 250);
else
dprintf("\\u%04X", wc);
}
dprintf("\"\n");
break;
case RFONT_TYPE_HGLYPH:
for (pwc = awc; wc = *pwc; pwc++)
dprintf("\t\t\t\tu%04X", wc);
dprintf("\n");
break;
default:
dprintf(" flType = %-#x [unknown string type]\n", flType);
break;
}
}
} else
dprintf("\n");
}
if (East) {
GetESTROBJFieldAndOffset(cgposCopied);
dprintf("[%-#p] cgposCopied %-#x\n", estrobjSrc+offset , cgposCopied );
GetESTROBJFieldAndOffset(cgposPositionsEnumerated);
dprintf("[%-#p] cgposPositionsEnumerated %-#x\n", estrobjSrc+offset , cgposPositionsEnumerated );
GetESTROBJFieldAndOffset(prfo);
dprintf("[%-#p] prfo %-#p\n", estrobjSrc+offset , prfo );
GetESTROBJFieldAndOffset(flTO);
dprintf("[%-#p] flTO %-#x\n", estrobjSrc+offset , flTO );
for (fl=flTO, pfd=afdTO; pfd->psz; pfd++)
if (fl & pfd->fl) {
dprintf("\t\t%s\n", pfd->psz);
fl &= ~pfd->fl;
}
GetESTROBJFieldAndOffset(pgpos);
dprintf("[%-#p] pgpos %-#p\n", estrobjSrc+offset , pgpos );
GetESTROBJFieldAndOffset(ptfxRef.x);
dprintf("[%-#p] ptfxRef.x %-#x\n", estrobjSrc+offset , ptfxRef.x );
GetESTROBJFieldAndOffset(ptfxRef.y);
dprintf("[%-#p] ptfxRef.y %-#x\n", estrobjSrc+offset , ptfxRef.y );
GetESTROBJFieldAndOffset(ptfxUpdate.x);
dprintf("[%-#p] ptfxUpdate.x %-#x\n", estrobjSrc+offset , ptfxUpdate.x );
GetESTROBJFieldAndOffset(ptfxUpdate.y);
dprintf("[%-#p] ptfxUpdate.y %-#x\n", estrobjSrc+offset , ptfxUpdate.y );
GetESTROBJFieldAndOffset(ptfxEscapement.x);
dprintf("[%-#p] ptfxEscapement.x %-#x\n", estrobjSrc+offset , ptfxEscapement.x );
GetESTROBJFieldAndOffset(ptfxEscapement.y);
dprintf("[%-#p] ptfxEscapement.y %-#x\n", estrobjSrc+offset , ptfxEscapement.y );
GetESTROBJFieldAndOffset(rcfx.xLeft);
dprintf("[%-#p] rcfx.xLeft %-#x\n", estrobjSrc+offset , rcfx.xLeft );
GetESTROBJFieldAndOffset(rcfx.yTop);
dprintf("[%-#p] rcfx.yTop %-#x\n", estrobjSrc+offset , rcfx.yTop );
GetESTROBJFieldAndOffset(rcfx.xRight);
dprintf("[%-#p] rcfx.xRight %-#x\n", estrobjSrc+offset , rcfx.xRight );
GetESTROBJFieldAndOffset(rcfx.yBottom);
dprintf("[%-#p] rcfx.yBottom %-#x\n", estrobjSrc+offset , rcfx.yBottom );
GetESTROBJFieldAndOffset(fxExtent);
dprintf("[%-#p] fxExtent %-#x\n", estrobjSrc+offset , fxExtent );
GetESTROBJFieldAndOffset(xExtra);
dprintf("[%-#p] xExtra %-#x\n", estrobjSrc+offset , xExtra );
GetESTROBJFieldAndOffset(xBreakExtra);
dprintf("[%-#p] xBreakExtra %-#x\n", estrobjSrc+offset , xBreakExtra );
GetESTROBJFieldAndOffset(dwCodePage);
dprintf("[%-#p] dwCodePage %-#x=%u\n", estrobjSrc+offset , dwCodePage , dwCodePage );
GetESTROBJFieldAndOffset(cExtraRects);
dprintf("[%-#p] cExtraRects %-#x=%u\n", estrobjSrc+offset , cExtraRects , cExtraRects );
GetESTROBJFieldAndOffset(arclExtra[0].left);
dprintf("[%-#p] arclExtra[0].left %-#x=%d\n", estrobjSrc+offset , arclExtra[0].left , arclExtra[0].left );
GetESTROBJFieldAndOffset(arclExtra[0].top);
dprintf("[%-#p] arclExtra[0].top %-#x=%d\n", estrobjSrc+offset , arclExtra[0].top , arclExtra[0].top );
GetESTROBJFieldAndOffset(arclExtra[0].right);
dprintf("[%-#p] arclExtra[0].right %-#x=%d\n", estrobjSrc+offset , arclExtra[0].right , arclExtra[0].right );
GetESTROBJFieldAndOffset(arclExtra[0].bottom);
dprintf("[%-#p] arclExtra[0].bottom %-#x=%d\n", estrobjSrc+offset , arclExtra[0].bottom , arclExtra[0].bottom );
GetESTROBJFieldAndOffset(arclExtra[1].left);
dprintf("[%-#p] arclExtra[1].left %-#x=%d\n", estrobjSrc+offset , arclExtra[1].left , arclExtra[1].left );
GetESTROBJFieldAndOffset(arclExtra[1].top);
dprintf("[%-#p] arclExtra[1].top %-#x=%d\n", estrobjSrc+offset , arclExtra[1].top , arclExtra[1].top );
GetESTROBJFieldAndOffset(arclExtra[1].right);
dprintf("[%-#p] arclExtra[1].right %-#x=%d\n", estrobjSrc+offset , arclExtra[1].right , arclExtra[1].right );
GetESTROBJFieldAndOffset(arclExtra[1].bottom);
dprintf("[%-#p] arclExtra[1].bottom %-#x=%d\n", estrobjSrc+offset , arclExtra[1].bottom , arclExtra[1].bottom );
GetESTROBJFieldAndOffset(arclExtra[2].left);
dprintf("[%-#p] arclExtra[2].left %-#x=%d\n", estrobjSrc+offset , arclExtra[2].left , arclExtra[2].left );
GetESTROBJFieldAndOffset(arclExtra[2].top);
dprintf("[%-#p] arclExtra[2].top %-#x=%d\n", estrobjSrc+offset , arclExtra[2].top , arclExtra[2].top );
GetESTROBJFieldAndOffset(arclExtra[2].right);
dprintf("[%-#p] arclExtra[2].right %-#x=%d\n", estrobjSrc+offset , arclExtra[2].right , arclExtra[2].right );
GetESTROBJFieldAndOffset(arclExtra[2].bottom);
dprintf("[%-#p] arclExtra[2].bottom %-#x=%d\n", estrobjSrc+offset , arclExtra[2].bottom , arclExtra[2].bottom );
GetESTROBJFieldAndOffset(rclBkGroundSave.top);
dprintf("[%-#p] rclBkGroundSave.top %-#x=%d\n", estrobjSrc+offset , rclBkGroundSave.top , rclBkGroundSave.top );
GetESTROBJFieldAndOffset(rclBkGroundSave.left);
dprintf("[%-#p] rclBkGroundSave.left %-#x=%d\n", estrobjSrc+offset , rclBkGroundSave.left , rclBkGroundSave.left );
GetESTROBJFieldAndOffset(rclBkGroundSave.right);
dprintf("[%-#p] rclBkGroundSave.right %-#x=%d\n", estrobjSrc+offset , rclBkGroundSave.right , rclBkGroundSave.right );
GetESTROBJFieldAndOffset(rclBkGroundSave.bottom);
dprintf("[%-#p] rclBkGroundSave.bottom %-#x=%d\n", estrobjSrc+offset, rclBkGroundSave.bottom, rclBkGroundSave.bottom);
GetESTROBJFieldAndOffset(pwcPartition);
dprintf("[%-#p] pwcPartition %-#p\n", estrobjSrc+offset , pwcPartition );
GetESTROBJFieldAndOffset(plPartition);
dprintf("[%-#p] plPartition %-#p\n", estrobjSrc+offset , plPartition );
GetESTROBJFieldAndOffset(plNext);
dprintf("[%-#p] plNext %-#p\n", estrobjSrc+offset , plNext );
GetESTROBJFieldAndOffset(pgpNext);
dprintf("[%-#p] pgpNext %-#p\n", estrobjSrc+offset , pgpNext );
GetESTROBJFieldAndOffset(lCurrentFont);
dprintf("[%-#p] lCurrentFont %-#x\n", estrobjSrc+offset , lCurrentFont );
GetESTROBJFieldAndOffset(ptlBaseLineAdjust.x);
dprintf("[%-#p] ptlBaseLineAdjust.x %-#x\n", estrobjSrc+offset , ptlBaseLineAdjust.x );
GetESTROBJFieldAndOffset(ptlBaseLineAdjust.y);
dprintf("[%-#p] ptlBaseLineAdjust.y %-#x\n", estrobjSrc+offset , ptlBaseLineAdjust.y );
GetESTROBJFieldAndOffset(cTTSysGlyphs);
dprintf("[%-#p] cTTSysGlyphs %-#x\n", estrobjSrc+offset , cTTSysGlyphs );
GetESTROBJFieldAndOffset(cSysGlyphs);
dprintf("[%-#p] cSysGlyphs %-#x\n", estrobjSrc+offset , cSysGlyphs );
GetESTROBJFieldAndOffset(cDefGlyphs);
dprintf("[%-#p] cDefGlyphs %-#x\n", estrobjSrc+offset , cDefGlyphs );
GetESTROBJFieldAndOffset(cNumFaceNameLinks);
dprintf("[%-#p] cNumFaceNameLinks %-#x\n", estrobjSrc+offset , cNumFaceNameLinks );
GetESTROBJFieldAndOffset(pacFaceNameGlyphs);
dprintf("[%-#p] pacFaceNameGlyphs %-#p\n", estrobjSrc+offset , pacFaceNameGlyphs );
GetESTROBJFieldAndOffset(acFaceNameGlyphs[0]);
dprintf("[%-#p] acFaceNameGlyphs[%d] %-#x\n", estrobjSrc+offset, 0, acFaceNameGlyphs[0] );
GetESTROBJFieldAndOffset(acFaceNameGlyphs[1]);
dprintf("[%-#p] acFaceNameGlyphs[%d] %-#x\n", estrobjSrc+offset, 1, acFaceNameGlyphs[1] );
GetESTROBJFieldAndOffset(acFaceNameGlyphs[2]);
dprintf("[%-#p] acFaceNameGlyphs[%d] %-#x\n", estrobjSrc+offset, 2, acFaceNameGlyphs[2] );
GetESTROBJFieldAndOffset(acFaceNameGlyphs[3]);
dprintf("[%-#p] acFaceNameGlyphs[%d] %-#x\n", estrobjSrc+offset, 3, acFaceNameGlyphs[3] );
GetESTROBJFieldAndOffset(acFaceNameGlyphs[4]);
dprintf("[%-#p] acFaceNameGlyphs[%d] %-#x\n", estrobjSrc+offset, 4, acFaceNameGlyphs[4] );
GetESTROBJFieldAndOffset(acFaceNameGlyphs[5]);
dprintf("[%-#p] acFaceNameGlyphs[%d] %-#x\n", estrobjSrc+offset, 5, acFaceNameGlyphs[5] );
GetESTROBJFieldAndOffset(acFaceNameGlyphs[6]);
dprintf("[%-#p] acFaceNameGlyphs[%d] %-#x\n", estrobjSrc+offset, 6, acFaceNameGlyphs[6] );
GetESTROBJFieldAndOffset(acFaceNameGlyphs[7]);
dprintf("[%-#p] acFaceNameGlyphs[%d] %-#x\n", estrobjSrc+offset, 7, acFaceNameGlyphs[7] );
}
if (Position) {
/* GLYPHPOS: */
ULONG hg, i;
ULONG64 pgdf;
POINTL ptl;
/* GLYPHDEF */
ULONG64 pgb = 0;
ULONG64 glyphposSrc, sizeOfGlyphPos;
sizeOfGlyphPos = GetTypeSize("GLYPHPOS");
GetESTROBJFieldAndOffset(rclBkGround.left);
GetESTROBJFieldAndOffset(rclBkGround.top);
GetESTROBJFieldAndOffset(rclBkGround.right);
GetESTROBJFieldAndOffset(rclBkGround.bottom);
GetESTROBJFieldAndOffset(cGlyphs);
GetESTROBJFieldAndOffset(pgp);
glyphposSrc = pgp;
dprintf(" ---------- ---------- ---------- ----------\n");
dprintf(" HGLYPH GLYPHBITS* x y\n");
dprintf(" ---------- ---------- ---------- ----------\n");
for (i = 0; i < cGlyphs; i++) {
char *pszOutOfBounds = "";
GetGLYPHPOSFieldAndOffset(pgdf);
GetGLYPHPOSFieldAndOffset(hg);
GetGLYPHPOSFieldAndOffset(ptl.x);
GetGLYPHPOSFieldAndOffset(ptl.y);
if (pgdf) {
POINTL ptlOrigin;
SIZEL sizlBitmap;
BYTE aj[1];
ULONG64 glyphdefSrc = pgdf;
GetGLYPHDEFFieldAndOffset(pgb);
if (pgb) {
RECT rcGlyph;
ULONG64 glyphbitsSrc = pgb;
GetGLYPHBITSFieldAndOffset(ptlOrigin.x);
GetGLYPHBITSFieldAndOffset(ptlOrigin.y);
GetGLYPHBITSFieldAndOffset(sizlBitmap.cx);
GetGLYPHBITSFieldAndOffset(sizlBitmap.cy);
rcGlyph.left = ptl.x + ptlOrigin.x;
rcGlyph.top = ptl.y + ptlOrigin.y;
rcGlyph.right = rcGlyph.left + sizlBitmap.cx;
rcGlyph.bottom = rcGlyph.top + sizlBitmap.cy;
if (
( rcGlyph.left < rclBkGround.left ) ||
( rcGlyph.right > rclBkGround.right ) ||
( rcGlyph.top < rclBkGround.top ) ||
( rcGlyph.bottom > rclBkGround.bottom )
)
{
pszOutOfBounds = " *** out of bounds ***";
}
} /* if (pgb) */
} /* if (pgdf) */
dprintf(
" %-#10x %-#18p %-10d %-10d%s\n"
, hg
, pgb // print the CONTENTS of the GLYPHDEF
, ptl.x
, ptl.y
, pszOutOfBounds
);
glyphposSrc += sizeOfGlyphPos;
} /* for */
dprintf(" ---------- ---------- ---------- ----------\n\n");
}
EXIT_API(S_OK);
stro_help:
dprintf("!gdikdx.stro [-p] address\n"
"-? print this message\n"
"-p print glyph positions\n"
"-h print header\n"
"-e far east\n");
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* dstro
*
\**************************************************************************/
DECLARE_API( dstro )
{
dprintf("Extension 'dstro' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
dprintf("\n\n");
dprintf("gdikdx.dstro will soon be replaced by gdikdx.stro\n");
dprintf("\n\n");
stro(hCurrentProcess, hCurrentThread, dwCurrentPc, dwProcessor, args);
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Dumps monochrome bitmaps.
*
* History:
* Sat 23-Sep-1995 08:26:43 by Kirk Olynyk [kirko]
* Re-wrote it.
* 21-Feb-1995 -by- Lingyun Wang [lingyunw]
* Wrote it.
\**************************************************************************/
DECLARE_API( gb )
{
#define CH_TOP_LEFT_CORNER '\xDA'
#define CH_HORIZONTAL_BAR '\xC4'
#define CH_VERTICAL_BAR '\xB3'
#define CH_PIXEL_ON '\x02'
#define CH_PIXEL_OFF '\xFA'
#define CH_GARBAGE '+'
ULONG64 glyphbitsSrc;
ULONG offset;
BYTE j, *pj8, *pj, *pjNext, *pjEnd;
int i, k, cj, cjScan, c4, c8, cLast;
char *pch;
POINTL ptlOrigin;
SIZEL sizlBitmap;
BYTE aj[1];
BOOL Gray=FALSE;
BOOL Mono=FALSE;
BOOL Header=FALSE;
PARSE_POINTER(gb_help);
if(parse_iFindSwitch(tokens, ntok, 'h')!=-1) {Header=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'm')!=-1) {Mono=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'g')!=-1) {Gray=TRUE;}
if(Mono&&Gray) {
Gray=FALSE;
dprintf("cannot have Monochrome and Gray simultaneously\n"
"assuming Monochrome\n");
}
if(!(Header||Mono||Gray)) {
Header=TRUE;
Mono=TRUE;
}
//arg from PARSE_POINTER() above.
glyphbitsSrc = arg;
GetGLYPHBITSFieldAndOffset(ptlOrigin.x);
GetGLYPHBITSFieldAndOffset(ptlOrigin.y);
GetGLYPHBITSFieldAndOffset(sizlBitmap.cx);
GetGLYPHBITSFieldAndOffset(sizlBitmap.cy);
// header information
if (Header) {
dprintf(
"ptlOrigin = (%d,%d)\n"
"sizlBitmap = (%d,%d)\n"
"\n\n"
, ptlOrigin.x
, ptlOrigin.y
, sizlBitmap.cx
, sizlBitmap.cy
);
}
// do stuff common to monochrome and gray glyphs
if (Mono||Gray) {
if ( sizlBitmap.cx > 150 ) {
dprintf("\nBitmap is wider than 150 characters\n");
EXIT_API(S_OK);
}
// cjScan = number of bytes per scan
if (Mono) {
cjScan = (sizlBitmap.cx + 7)/8; // 8 pixels per byte
} else
cjScan = (sizlBitmap.cx + 1)/2; // 2 pixels per byte
// cj = number of bytes in image bits (excluding header)
if ( ( cj = cjScan * sizlBitmap.cy ) > sizeof(adw) ) {
dprintf( "\nThe bits will blow out the buffer\n" );
EXIT_API(S_OK);
}
GetGLYPHBITSFieldAndOffset(aj[0]);
ReadMemory((ULONG_PTR) (glyphbitsSrc + offset), adw, cj, NULL);
dprintf("\n\n "); // leave space for number and vertical bar
for (i = 0, k = 0; i < sizlBitmap.cx; i++, k++) {
k = (k > 9) ? 0 : k; // print x-coordinates (mod 10)
dprintf("%1d", k);
} // go to new line
dprintf("\n %c",CH_TOP_LEFT_CORNER); // leave space for number
for (i = 0; i < sizlBitmap.cx; i++) // and then mark corner
dprintf("%c",CH_HORIZONTAL_BAR); // fill out horizontal line
dprintf("\n"); // move down to scan output
}
// monochrome glyph
if (Mono)
{
static char ach[16*4] = {
CH_PIXEL_OFF, CH_PIXEL_OFF, CH_PIXEL_OFF, CH_PIXEL_OFF,
CH_PIXEL_OFF, CH_PIXEL_OFF, CH_PIXEL_OFF, CH_PIXEL_ON ,
CH_PIXEL_OFF, CH_PIXEL_OFF, CH_PIXEL_ON , CH_PIXEL_OFF,
CH_PIXEL_OFF, CH_PIXEL_OFF, CH_PIXEL_ON , CH_PIXEL_ON ,
CH_PIXEL_OFF, CH_PIXEL_ON , CH_PIXEL_OFF, CH_PIXEL_OFF,
CH_PIXEL_OFF, CH_PIXEL_ON , CH_PIXEL_OFF, CH_PIXEL_ON ,
CH_PIXEL_OFF, CH_PIXEL_ON , CH_PIXEL_ON , CH_PIXEL_OFF,
CH_PIXEL_OFF, CH_PIXEL_ON , CH_PIXEL_ON , CH_PIXEL_ON ,
CH_PIXEL_ON , CH_PIXEL_OFF, CH_PIXEL_OFF, CH_PIXEL_OFF,
CH_PIXEL_ON , CH_PIXEL_OFF, CH_PIXEL_OFF, CH_PIXEL_ON ,
CH_PIXEL_ON , CH_PIXEL_OFF, CH_PIXEL_ON , CH_PIXEL_OFF,
CH_PIXEL_ON , CH_PIXEL_OFF, CH_PIXEL_ON , CH_PIXEL_ON ,
CH_PIXEL_ON , CH_PIXEL_ON , CH_PIXEL_OFF, CH_PIXEL_OFF,
CH_PIXEL_ON , CH_PIXEL_ON , CH_PIXEL_OFF, CH_PIXEL_ON ,
CH_PIXEL_ON , CH_PIXEL_ON , CH_PIXEL_ON , CH_PIXEL_OFF,
CH_PIXEL_ON , CH_PIXEL_ON , CH_PIXEL_ON , CH_PIXEL_ON
};
i = sizlBitmap.cx;
c8 = i / 8; // c8 = number of whole bytes
i = i % 8; // i = remaining number of pixels = 0..7
c4 = i / 4; // number of whole nybbles = 0..1
cLast = i % 4; // remaining number of pixels = 0..3
// k = row number
// pjEnd = pointer to address of scan beyond last scan
// pjNext = pointer to next scan
// pj = pointer to current byte
// for each scan ...
for (
pj = (BYTE*)adw, pjNext=pj+cjScan , pjEnd=pjNext+cj, k=0 ;
pjNext < pjEnd ;
pj=pjNext , pjNext+=cjScan, k++
)
{
if (CheckControlC())
EXIT_API(S_OK);
k = (k > 9) ? 0 : k;
// print row number (mod 10) followed by a vertical bar ...
dprintf("%1d%c",k,CH_VERTICAL_BAR);
// then do the pixels of the scan ...
// whole bytes first ...
for (pj8 = pj+c8 ; pj < pj8; pj++)
{
// high nybble first ...
pch = ach + 4 * (*pj >> 4);
dprintf("%c%c%c%c",pch[0],pch[1],pch[2],pch[3]);
// low nybble next ...
pch = ach + 4 * (*pj & 0xf);
dprintf("%c%c%c%c",pch[0],pch[1],pch[2],pch[3]);
}
// last partial byte ...
if (c4 || cLast)
{
// high nybble first ...
pch = ach + 4 * (*pj >> 4);
if (c4)
{
// print the entire high nybble ...
dprintf("%c%c%c%c",pch[0],pch[1],pch[2],pch[3]);
// go to the low nybble ...
pch = ach + 4 * (*pj & 0xf);
}
// last partial nybble ...
switch(cLast)
{
case 3: dprintf("%c",*pch++);
case 2: dprintf("%c",*pch++);
case 1: dprintf("%c",*pch);
}
//
// print any extraneous bits
//
for (j = *pj << i; j; j <<= 1)
{
if ( j & 0x80 )
{
dprintf("%c",CH_GARBAGE);
}
}
}
dprintf("\n");
}
}
// gray glyph
if (Gray)
{
static char achGray[16] = {
CH_PIXEL_OFF,
'1','2','3','4','5','6','7','8','9','a','b','c','d','e',
CH_PIXEL_ON
};
c8 = sizlBitmap.cx / 2; // number of whole bytes;
c4 = sizlBitmap.cx % 2; // number of whole nybbles;
// k = row number
// pjEnd = pointer to address of scan beyond last scan
// pjNext = pointer to next scan
// pj = pointer to current byte
// for each scan ...
for (
pj = (BYTE*)adw, pjNext=pj+cjScan , pjEnd=pjNext+cj, k=0 ;
pjNext < pjEnd ;
pj=pjNext , pjNext+=cjScan, k++
)
{
if (CheckControlC())
EXIT_API(S_OK);
k = (k > 9) ? 0 : k;
// print row number (mod 10) followed by a vertical bar ...
dprintf("%1d%c",k,CH_VERTICAL_BAR);
// then do the pixels of the scan ...
// whole bytes first ...
for (pj8 = pj+c8 ; pj < pj8; pj++)
dprintf("%c%c", achGray[*pj>>4], achGray[*pj & 0xf]);
// last partial byte ...
if (c4)
dprintf("%c", achGray[*pj >> 4]);
dprintf("\n");
}
}
EXIT_API(S_OK);
gb_help:
dprintf("Usage: gb [-?] [-g|-m] [-h] address\n"
" -? this message\n"
" -h print header\n"
" -m print monochrome bitmap\n"
" -g print 4-bpp bitmap\n"
"If no flags are supplied, -m -h assumed.\n"
"Cannot supply -m and -g together.");
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpCOLORADJUSTMENT
*
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
void vDumpCOLORADJUSTMENT(COLORADJUSTMENT *pdca, COLORADJUSTMENT *pdcaSrc)
{
FLAGDEF *pfd;
FLONG fl;
#define M3(aa,bb) \
dprintf("[%x] %s%-#x\n", &(pdcaSrc->##aa), (bb), pdca->##aa)
#define M2(aa,bb) \
dprintf("[%x] %s", &(pdcaSrc->##aa), (bb))
dprintf("\nCOLORADJUSTMENT\n address\n -------\n");
M3( caSize , "caSize " );
// caFlags
M3( caFlags , "caFlags " );
for ( fl = pdca->caFlags, pfd = afdCOLORADJUSTMENT; pfd->psz; pfd++)
if (fl & pfd->fl) {
dprintf("\t\t\t\t\t%s\n", pfd->psz);
fl &= ~pfd->fl;
}
if (fl)
dprintf("\t\t\t\t\tbad flags %-#x\n", fl);
M3( caIlluminantIndex, "caIlluminantIndex " );
M3( caRedGamma , "caRedGamma " );
M3( caGreenGamma , "caGreenGamma " );
M3( caBlueGamma , "caBlueGamma " );
M3( caReferenceBlack , "caReferenceBlack " );
M3( caReferenceWhite , "caReferenceWhite " );
M3( caContrast , "caContrast " );
M3( caBrightness , "caBrightness " );
M3( caColorfulness , "caColorfulness " );
M3( caRedGreenTint , "caRedGreenTint " );
dprintf("\n");
#undef M2
#undef M3
}
#endif // DOES NOT SUPPORT API64
/******************************Public*Routine******************************\
*
* History:
* 21-Feb-1995 -by- Lingyun Wang [lingyunw]
* Wrote it.
\**************************************************************************/
DECLARE_API( gdf )
{
dprintf("Extension 'gdf' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
GLYPHDEF gd;
PARSE_POINTER(gdf_help);
move(gd, arg);
dprintf("\n\nGLYPHDEF\n\n");
dprintf("[%x] %-#x\n", arg, gd.pgb);
dprintf("\n");
return;
gdf_help:
dprintf("Usage: gdf [-?] GLYPHDEF pointer\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpGLYPHPOS
*
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
void vDumpGLYPHPOS(GLYPHPOS *p1, GLYPHPOS *p0)
{
dprintf("\nGLYPHPOS\n\n");
dprintf("[%x] hg %-#x\n" , &p0->hg , p1->hg );
dprintf("[%x] pgdf %-#x\n" , &p0->pgdf, p1->pgdf);
dprintf("[%x] ptl %d %d\n", &p0->ptl , p1->ptl.x, p1->ptl.y);
dprintf("\n");
}
#endif // DOES NOT SUPPORT API64
/******************************Public*Routine******************************\
*
* Routine Name:
*
* gp
*
\**************************************************************************/
DECLARE_API( gp )
{
dprintf("Extension 'gp' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
GLYPHPOS gp;
PARSE_POINTER(gp_help);
move(gp,arg);
vDumpGLYPHPOS(&gp,(GLYPHPOS*)arg);
return;
gp_help:
dprintf("Usage: gp [-?] GLYPHPOS pointer\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* ca
*
\**************************************************************************/
DECLARE_API( ca )
{
dprintf("Extension 'ca' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
COLORADJUSTMENT ca;
PARSE_POINTER(ca_help);
move(ca, arg);
vDumpCOLORADJUSTMENT(&ca, (COLORADJUSTMENT*) arg);
return;
ca_help:
dprintf("Usage: ca [-?] COLORADJUSTMENT pointer\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpDATABLOCK
*
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
void vDumpDATABLOCK(
DATABLOCK *p, // pointer to local DATABLOCK copy
DATABLOCK *p0 // pointer to original DATABLOCK on debug machine
)
{
dprintf( "\nDATABLOCK\n address\n -------\n" );
dprintf( "[%x] pdblNext %-#x\n", &(p0->pdblNext), p->pdblNext);
dprintf( "[%x] cgd %u\n", &(p0->cgd ), p->cgd );
dprintf( "\n" );
}
#endif // DOES NOT SUPPORT API64
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpCACHE
*
\**************************************************************************/
void vDumpCACHE(ULONG64 cacheSrc)
{
ULONG offset;
ULONG64 pgdNext; // ptr to next free place to put GLYPHDATA
ULONG64 pgdThreshold; // ptr to first uncommited spot
ULONG64 pjFirstBlockEnd; // ptr to end of first GLYPHDATA block
ULONG64 pdblBase; // ptr to base of current GLYPHDATA block
ULONG cMetrics; // number of GLYPHDATA's in the metrics cache
ULONG cjbblInitial; // size of initial bit block
ULONG cjbbl; // size of any individual block in bytes
ULONG cBlocksMax; // max # of blocks allowed
ULONG cBlocks; // # of blocks allocated so far
ULONG cGlyphs; // for statistical purposes only
ULONG cjTotal; // also for stat purposes only
ULONG64 pbblBase; // ptr to the first bit block (head of the list)
ULONG64 pbblCur; // ptr to the block containing next
ULONG64 pgbNext; // ptr to next free place to put GLYPHBITS
ULONG64 pgbThreshold; // end of the current block
ULONG64 pjAuxCacheMem; // ptr to lookaside buffer, if any
SIZE_T cjAuxCacheMem; // size of current lookaside buffer
ULONG cjGlyphMax; // size of largest glyph
BOOL bSmallMetrics;
INT iMax;
INT iFirst;
INT cBits;
#define GetAndPrintCACHEFieldAndOffset(expr, member) \
GetCACHEFieldAndOffset(member); dprintf("[0x%p] " #expr " " #member "\n", cacheSrc+offset, ##member)
dprintf("\nCACHE\n address\n -------\n" );
GetAndPrintCACHEFieldAndOffset( %+#20p, pgdNext);
GetAndPrintCACHEFieldAndOffset( %+#20p, pgdThreshold);
GetAndPrintCACHEFieldAndOffset( %+#20p, pjFirstBlockEnd);
GetAndPrintCACHEFieldAndOffset( %+#20p, pdblBase);
GetAndPrintCACHEFieldAndOffset( %+#20x, cMetrics);
GetAndPrintCACHEFieldAndOffset( %+#20x, cjbbl);
GetAndPrintCACHEFieldAndOffset( %+#20x, cBlocksMax);
GetAndPrintCACHEFieldAndOffset( %+#20x, cBlocks);
GetAndPrintCACHEFieldAndOffset( %+#20x, cGlyphs);
GetAndPrintCACHEFieldAndOffset( %+#20x, cjTotal);
GetAndPrintCACHEFieldAndOffset( %+#20p, pbblBase);
GetAndPrintCACHEFieldAndOffset( %+#20p, pbblCur);
GetAndPrintCACHEFieldAndOffset( %+#20p, pgbNext);
GetAndPrintCACHEFieldAndOffset( %+#20p, pgbThreshold);
GetAndPrintCACHEFieldAndOffset( %+#20p, pjAuxCacheMem);
GetAndPrintCACHEFieldAndOffset( %+#20x, cjAuxCacheMem);
GetAndPrintCACHEFieldAndOffset( %+#20x, cjGlyphMax);
GetAndPrintCACHEFieldAndOffset( %+#20x, bSmallMetrics);
GetAndPrintCACHEFieldAndOffset( %+#20x, iMax);
GetAndPrintCACHEFieldAndOffset( %+#20x, iFirst);
GetAndPrintCACHEFieldAndOffset( %+#20x, cBits);
dprintf("\n");
#undef M3
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* cache
*
\**************************************************************************/
DECLARE_API( cache )
{
PARSE_POINTER(cache_help);
vDumpCACHE(arg);
EXIT_API(S_OK);
cache_help:
dprintf("Usage: cache [-?] CACHE pointer\n");
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpLOGFONTW
*
* Arguments:
*
* plfw -- pointer to local copy of LOGFONTW,
* dereferences are off of this address are safe
* plfwSrc -- address of original on debug machine,
* dereferences off of this address are not safe
*
* Return Value:
*
* none
*
\**************************************************************************/
void vDumpLOGFONTW(ULONG64 offLOGFONTW)
{
#define N3(a,b,c) \
dprintf( "[%p] %s", offLOGFONTW + offset, (a)); dprintf( (b), ##c )
// LOGFONTW
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
WCHAR lfFaceName[LF_FACESIZE];
ULONG offset;
dprintf("\nLOGFONTW\n address\n --------\n" );
GetLOGFONTWFieldAndOffset(lfHeight);
N3( "lfHeight " , "%d\n" , lfHeight );
GetLOGFONTWFieldAndOffset(lfWidth);
N3( "lfWidth " , "%d\n" , lfWidth );
GetLOGFONTWFieldAndOffset(lfEscapement);
N3( "lfEscapement " , "%d\n" , lfEscapement );
GetLOGFONTWFieldAndOffset(lfOrientation);
N3( "lfOrientation " , "%d\n" , lfOrientation );
GetLOGFONTWFieldAndOffset(lfWeight);
N3( "lfWeight " , "%d" , lfWeight );
dprintf(" = %s\n", pszFW(lfWeight) );
GetLOGFONTWFieldAndOffset(lfItalic);
N3( "lfItalic " , "0x%02x\n" , lfItalic );
GetLOGFONTWFieldAndOffset(lfUnderline);
N3( "lfUnderline " , "0x%02x\n" , lfUnderline );
GetLOGFONTWFieldAndOffset(lfStrikeOut);
N3( "lfStrikeOut " , "0x%02x\n" , lfStrikeOut );
GetLOGFONTWFieldAndOffset(lfCharSet);
N3( "lfCharSet " , "0x%02x" , lfCharSet );
dprintf(" = %s\n", pszCHARSET(lfCharSet));
GetLOGFONTWFieldAndOffset(lfOutPrecision);
N3( "lfOutPrecision " , "0x%02x" , lfOutPrecision );
dprintf(" = %s\n", pszOUT_PRECIS(lfOutPrecision ));
GetLOGFONTWFieldAndOffset(lfClipPrecision);
N3( "lfClipPrecision " , "0x%02x" , lfClipPrecision );
dprintf(" = %s\n", pszCLIP_PRECIS(lfClipPrecision));
GetLOGFONTWFieldAndOffset(lfQuality);
N3( "lfQuality " , "0x%02x" , lfQuality );
dprintf(" = %s\n", pszQUALITY(lfQuality));
GetLOGFONTWFieldAndOffset(lfPitchAndFamily);
N3( "lfPitchAndFamily " , "0x%02x" , lfPitchAndFamily );
dprintf(" = %s\n", pszPitchAndFamily(lfPitchAndFamily ) );
GetLOGFONTWFieldAndOffset(lfFaceName);
dprintf("[%p] lfFaceName \"%ws\"\n", offLOGFONTW + offset, lfFaceName);
dprintf("\n");
#undef N3
return;
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpFONTDIFF
*
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
void vDumpFONTDIFF(FONTDIFF *p1/*copy*/ , FONTDIFF *p0 /* original */)
{
#define N2(a,c) dprintf("[%x] %s", &p0->##c, (a))
#define N3(a,b,c) dprintf("[%x] %s", &p0->##c, (a)); dprintf((b),p1->##c)
dprintf("\nFONTDIFF\n-------\n");
N3("jReserved1 ", "0x%02x\n", jReserved1);
N3("jReserved2 ", "0x%02x\n", jReserved2);
N3("jReserved3 ", "0x%02x\n", jReserved3);
N3("bWeight ", "0x%02x", bWeight );
dprintf(" = %s\n", pszPanoseWeight(p1->bWeight));
N3("usWinWeight ", "%u" , usWinWeight);
dprintf(" = %s\n", pszFW(p1->usWinWeight));
N3("fsSelection ", "%-#x\n" , fsSelection);
for (FLAGDEF *pfd=afdFM_SEL; pfd->psz; pfd++) {
if ((FLONG)p1->fsSelection & pfd->fl) {
dprintf(" %s\n", pfd->psz);
}
}
N3("fwdAveCharWidth ", "%d\n" , fwdAveCharWidth);
N3("fwdMaxCharInc ", "%d\n" , fwdMaxCharInc);
N2("ptlCaret ", ptlCaret);
dprintf("%d %d\n", p1->ptlCaret.x, p1->ptlCaret.y);
dprintf("\n");
#undef N2
#undef N3
}
#endif // DOES NOT SUPPORT API64
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpIFIMETRICS
*
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
void vDumpIFIMETRICS(IFIMETRICS *p1, IFIMETRICS *p0)
{
FLONG fl;
FLAGDEF *pfd;
#define GETPTR(p,a) ((void*)(((BYTE*)(p))+(a)))
#define N2(a,c) dprintf("[%x] %s", &p0->##c, (a))
#define N3(a,b,c) dprintf("[%x] %s", &p0->##c, (a)); dprintf((b),p1->##c)
dprintf("\nIFIMETICS\n address\n -------\n");
N3("cjThis ", "%u\n" , cjThis );
N3("cjIfiExtra ", "%u\n" , cjIfiExtra );
N3("dpwszFamilyName ", "%-#x" , dpwszFamilyName );
dprintf(" \"%ws\"\n", GETPTR(p1,p1->dpwszFamilyName));
N3("dpwszStyleName ", "%-#x" , dpwszStyleName );
dprintf(" \"%ws\"\n", GETPTR(p1,p1->dpwszStyleName));
N3("dpwszFaceName ", "%-#x" , dpwszFaceName );
dprintf(" \"%ws\"\n", GETPTR(p1,p1->dpwszFaceName));
N3("dpwszUniqueName ", "%-#x" , dpwszUniqueName );
dprintf(" \"%ws\"\n", GETPTR(p1,p1->dpwszUniqueName));
N3("dpFontSim ", "%-#x\n" , dpFontSim );
N3("lEmbedId ", "%-#x\n" , lEmbedId );
N3("lItalicAngle ", "%d\n" , lItalicAngle );
N3("lCharBias ", "%d\n" , lCharBias );
N3("dpCharSets ", "%-#x\n" , dpCharSets );
if (p1->dpCharSets)
{
BYTE *pj0 = (BYTE *) GETPTR(p0,p1->dpCharSets);
BYTE *pj1 = (BYTE *) GETPTR(p1,p1->dpCharSets);
BYTE *pj1End = pj1 + 16; // number of charsets
dprintf(" Supported Charsets: \n");
for (; pj1 < pj1End; pj1++, pj0++)
dprintf("[%x]\t\t\t%s\n", pj0, pszCHARSET(*pj1));
}
N3("jWinCharSet ", "0x%02x", jWinCharSet );
dprintf(" %s\n", pszCHARSET(p1->jWinCharSet));
N3("jWinPitchAndFamily ", "0x%02x", jWinPitchAndFamily );
dprintf(" %s\n", pszPitchAndFamily(p1->jWinPitchAndFamily));
N3("usWinWeight ", "%u" , usWinWeight );
dprintf(" %s\n", pszFW(p1->usWinWeight));
N3("flInfo ", "%-#x\n" , flInfo );
for (fl=p1->flInfo,pfd=afdInfo;pfd->psz;pfd++) {
if (fl & pfd->fl) {
dprintf(" %s\n", pfd->psz);
}
}
N3("fsSelection ", "%-#x\n" , fsSelection );
for (fl = p1->fsSelection, pfd = afdFM_SEL; pfd->psz; pfd++) {
if (fl & pfd->fl) {
dprintf(" %s\n", pfd->psz);
}
}
N3("fsType ", "%-#x\n" , fsType );
for (fl=p1->fsType, pfd=afdFM_TYPE; pfd->psz; pfd++) {
if (fl & pfd->fl) {
dprintf(" %s\n", pfd->psz);
}
}
N3("fwdUnitsPerEm ", "%d\n" , fwdUnitsPerEm );
N3("fwdLowestPPEm ", "%d\n" , fwdLowestPPEm );
N3("fwdWinAscender ", "%d\n" , fwdWinAscender );
N3("fwdWinDescender ", "%d\n" , fwdWinDescender );
N3("fwdMacAscender ", "%d\n" , fwdMacAscender );
N3("fwdMacDescender ", "%d\n" , fwdMacDescender );
N3("fwdMacLineGap ", "%d\n" , fwdMacLineGap );
N3("fwdTypoAscender ", "%d\n" , fwdTypoAscender );
N3("fwdTypoDescender ", "%d\n" , fwdTypoDescender );
N3("fwdTypoLineGap ", "%d\n" , fwdTypoLineGap );
N3("fwdAveCharWidth ", "%d\n" , fwdAveCharWidth );
N3("fwdMaxCharInc ", "%d\n" , fwdMaxCharInc );
N3("fwdCapHeight ", "%d\n" , fwdCapHeight );
N3("fwdXHeight ", "%d\n" , fwdXHeight );
N3("fwdSubscriptXSize ", "%d\n" , fwdSubscriptXSize );
N3("fwdSubscriptYSize ", "%d\n" , fwdSubscriptYSize );
N3("fwdSubscriptXOffset ", "%d\n" , fwdSubscriptXOffset );
N3("fwdSubscriptYOffset ", "%d\n" , fwdSubscriptYOffset );
N3("fwdSuperscriptXSize ", "%d\n" , fwdSuperscriptXSize );
N3("fwdSuperscriptYSize ", "%d\n" , fwdSuperscriptYSize );
N3("fwdSuperscriptXOffset ", "%d\n" , fwdSuperscriptXOffset );
N3("fwdSuperscriptYOffset ", "%d\n" , fwdSuperscriptYOffset );
N3("fwdUnderscoreSize ", "%d\n" , fwdUnderscoreSize );
N3("fwdUnderscorePosition ", "%d\n" , fwdUnderscorePosition );
N3("fwdStrikeoutSize ", "%d\n" , fwdStrikeoutSize );
N3("fwdStrikeoutPosition ", "%d\n" , fwdStrikeoutPosition );
N3("chFirstChar ", "0x%02x\n", chFirstChar );
N3("chLastChar ", "0x%02x\n", chLastChar );
N3("chDefaultChar ", "0x%02x\n", chDefaultChar );
N3("chBreakChar ", "0x%02x\n", chBreakChar );
N3("wcFirstChar ", "%-#x\n" , wcFirstChar );
N3("wcLastChar ", "%-#x\n" , wcLastChar );
N3("wcDefaultChar ", "%-#x\n" , wcDefaultChar );
N3("wcBreakChar ", "%-#x\n" , wcBreakChar );
N2("ptlBaseline ", ptlBaseline);
dprintf("%d %d\n", p1->ptlBaseline.x, p1->ptlBaseline.y);
N2("ptlAspect ", ptlAspect );
dprintf("%d %d\n", p1->ptlAspect.x, p1->ptlAspect.y);
N2("ptlCaret ", ptlCaret );
dprintf("%d %d\n", p1->ptlCaret.x, p1->ptlCaret.y);
N2("rclFontBox ", rclFontBox );
dprintf("%d %d %d %d\n",
p1->rclFontBox.left,
p1->rclFontBox.top,
p1->rclFontBox.right,
p1->rclFontBox.bottom);
N2("achVendId\n" , achVendId[0]);
N3("cKerningPairs ", "%d\n" , cKerningPairs );
N3("ulPanoseCulture ", "%u\n" , ulPanoseCulture );
N2("panose\n", panose);
if (p1->dpFontSim) {
FONTDIFF *pfd0, *pfd1;
FONTSIM *pfs0 = (FONTSIM*) GETPTR(p0, p1->dpFontSim);
FONTSIM *pfs1 = (FONTSIM*) GETPTR(p1, p1->dpFontSim);
if (pfs1->dpBold) {
pfd0 = (FONTDIFF*) GETPTR(pfs0, pfs1->dpBold);
pfd1 = (FONTDIFF*) GETPTR(pfs1, pfs1->dpBold);
dprintf("\nBold Simulation ");
vDumpFONTDIFF(pfd1, pfd0);
}
if (pfs1->dpItalic) {
pfd0 = (FONTDIFF*) GETPTR(pfs0, pfs1->dpItalic);
pfd1 = (FONTDIFF*) GETPTR(pfs1, pfs1->dpItalic);
dprintf("\nItalic Simulation ");
vDumpFONTDIFF(pfd1, pfd0);
}
if (pfs1->dpBoldItalic) {
pfd0 = (FONTDIFF*) GETPTR(pfs0, pfs1->dpBoldItalic);
pfd1 = (FONTDIFF*) GETPTR(pfs1, pfs1->dpBoldItalic);
dprintf("\nBold Italic Simulation ");
vDumpFONTDIFF(pfd1, pfd0);
}
}
if (p1->cjIfiExtra)
{
// #define GETIFIEX(a) ((ULONG)p1 + sizeof(IFIMETRICS) + offsetof(IFIEXTRA,##a))
dprintf("\nIFIEXTRA\n -------\n");
IFIEXTRA *pifiex = (IFIEXTRA *)(p1 + 1);
if (p1->cjIfiExtra > offsetof(IFIEXTRA,ulIdentifier))
dprintf("ulIdentifier: 0x%x\n", pifiex->ulIdentifier);
if (p1->cjIfiExtra > offsetof(IFIEXTRA,dpFontSig))
dprintf("dpFontSig: 0x%x\n", pifiex->dpFontSig);
if (p1->cjIfiExtra > offsetof(IFIEXTRA,cig))
dprintf("cig: %u\n", pifiex->cig);
if (p1->cjIfiExtra > offsetof(IFIEXTRA,dpDesignVector))
dprintf("dpDesignVector: 0x%x\n", pifiex->dpDesignVector);
if (p1->cjIfiExtra > offsetof(IFIEXTRA,dpAxesInfoW))
dprintf("dpAxesInfoW: 0x%x\n", pifiex->dpAxesInfoW);
dprintf("\n -------\n");
}
dprintf("\n");
#undef N3
#undef N2
}
#endif // DOES NOT SUPPORT API64
/******************************Public*Routine******************************\
*
* Routine Name:
*
* pff
*
\**************************************************************************/
DECLARE_API( pff )
{
dprintf("Extension 'pff' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
PFF *pPFFCopy, *pPFFSrc;
ULONG size;
PARSE_POINTER(pff_help);
pPFFSrc = (PFF *)arg;
move(size,&pPFFSrc->sizeofThis);
if (pPFFCopy = tmalloc(PFF, size)) {
move2(pPFFCopy, pPFFSrc, size);
PFFOBJ pffo(pPFFCopy);
pPFFCopy->pwszPathname_ = pffo.pwszCalcPathname();
vDumpPFF(pPFFCopy,pPFFSrc);
tfree(pPFFCopy);
} else
dprintf("could not allocate memory\n");
return;
pff_help:
dprintf("Usage: pff [-?] PFF pointer\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpPFF
*
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
void vDumpPFF(PFF *p1 /*copy*/, PFF *p0 /*original*/)
{
ULONG iFile;
PWSZ pwszSrc, pwszDest;
#define N2(a,c) dprintf("[%x] %s", &p0->##c, (a))
#define N3(a,b,c) dprintf("[%x] %s", &p0->##c, (a)); dprintf((b),p1->##c)
N3("sizeofThis ", "%u\n", sizeofThis);
N3("pPFFNext ", "%-#x\n", pPFFNext);
N3("pPFFPrev ", "%-#x\n", pPFFPrev);
if (p1->hff != HFF_INVALID) // if not device font
{
N2("pwszPathname_ ", pwszPathname_);
move( pwszSrc, &p0->pwszPathname_ );
pwszDest = wcsncpy((PWSZ) adw, pwszSrc, sizeof(adw)/sizeof(WCHAR));
if ( pwszDest )
{
dprintf("%-#x = \"%ws\"\n", pwszSrc, (PWSZ) adw );
}
else
{
dprintf("\n");
}
}
N3("flState ", "%-#x\n", flState);
for (FLAGDEF *pfd = afdPFF; pfd->psz; pfd++) {
if (p1->flState & pfd->fl) {
dprintf(" %s\n", pfd->psz);
}
}
N3("cwc ", "%u\n", cwc);
N3("cFiles ", "%u\n", cFiles);
N3("cLoaded ", "%u\n", cLoaded);
N3("cNotEnum ", "%u\n", cNotEnum);
N3("cRFONT ", "%u\n", cRFONT);
N3("prfntList ", "%-#x\n", prfntList);
N3("hff ", "%-#x\n", hff);
N3("hdev ", "%-#x\n", hdev);
N3("dhpdev ", "%-#x\n", dhpdev);
N3("pfhFace ", "%-#x\n", pfhFace);
N3("pfhFamily ", "%-#x\n", pfhFamily);
N3("pfhUFI ", "%-#x\n", pfhUFI);
N3("pPFT ", "%-#x\n", pPFT);
N3("ulCheckSum ", "%-#x\n", ulCheckSum);
N3("cFonts ", "%u\n", cFonts);
N3("ppfv ", "%-#x\n", ppfv);
N3("pPvtDataHead ", "%-#x\n", pPvtDataHead);
dprintf("\n\n");
#undef N3
#undef N2
}
///******************************Public*Routine******************************\
//*
//* Routine Name:
//*
//* vDumpFONTHASH
//*
//\**************************************************************************/
//
//void vDumpFONTHASH(FONTHASH *p1 /*copy*/,FONTHASH *p0 /*org*/)
//{
// #define N2(a,c) dprintf("[%x] %s", &p0->##c, (a))
// #define N3(a,b,c) dprintf("[%x] %s", &p0->##c, (a)); dprintf((b),p1->##c)
//
// dprintf("\nFONTHASH\n");
// N3("id ", "%4x\n", id);
// N3("fht ", "%d", fht);
// dprintf(" = %s\n", pszFONTHASHTYPE(p1->fht));
// N3("cBuckets ", "%u\n", cBuckets);
// N3("cCollisions ", "%u\n", cCollisions);
// N3("pbktFirst ", "%-#x\n", pbktFirst);
// N3("pbktLast ", "%-#x\n", pbktLast);
// N3("apbkt ", "%-#x\n", apbkt);
//
// #undef N3
// #undef N2
//}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpHASHBUCKET
*
\**************************************************************************/
void vDumpHASHBUCKET(HASHBUCKET *p1 /*copy*/, HASHBUCKET *p0 /*org*/)
{
#define N2(a,c) dprintf("[%x] %s", &p0->##c, (a))
#define N3(a,b,c) dprintf("[%x] %s", &p0->##c, (a)); dprintf((b),p1->##c)
dprintf("\nHASHBUCKET\n");
N3("pbktCollision ", "%-#x\n", pbktCollision);
N3("ppfelEnumHead ", "%-#x\n", ppfelEnumHead);
N3("ppfelEnumTail ", "%-#x\n", ppfelEnumTail);
N3("cTrueType ", "%u\n", cTrueType);
N3("fl ", "%-#x\n", fl);
N3("pbktPrev ", "%-#x\n", pbktPrev);
N3("pbktNext ", "%-#x\n", pbktNext);
N3("ulTime ", "%u\n", ulTime);
N2("u\n", u);
N2("u.wcCapName ", u.wcCapName);
wcscpy((PWSZ) adw, p1->u.wcCapName);
dprintf("\"%ws\"\n", adw);
N2("u.ufi\n", u.ufi);
N3("u.ufi.CheckSum ", "%-#x\n", u.ufi.CheckSum);
N3("u.ufi.Index ", "%u\n", u.ufi.Index);
{
dprintf("\n");
{
PFELINK *ppfel = p1->ppfelEnumHead;
PFELINK pfelLocal;
PFE LocalPFE;
if (ppfel)
{
dprintf("PFE*\n");
while (ppfel)
{
move(pfelLocal, ppfel);
dprintf("%-#x", pfelLocal.ppfe);
move(LocalPFE,pfelLocal.ppfe);
if (LocalPFE.pPFF)
{
PFF LocalPFF;
WCHAR awc[MAX_PATH];
move(LocalPFF, LocalPFE.pPFF);
wcsncpy( awc, LocalPFF.pwszPathname_, MAX_PATH);
awc[MAX_PATH-1]=0;
dprintf(" \"%ws\"", awc);
}
if (LocalPFE.pifi)
{
ULONG dp;
WCHAR awc[LF_FACESIZE+1];
PWSZ pwszSrc;
FWORD fwdAscender, fwdDescender, fwdWidth;
move(dp,&((LocalPFE.pifi)->dpwszFaceName));
pwszSrc = (PWSZ)(((char*) (LocalPFE.pifi)) + dp);
wcsncpy(awc, pwszSrc, LF_FACESIZE);
awc[LF_FACESIZE] = 0;
dprintf(" \"%ws\"", awc);
move(fwdAscender, &LocalPFE.pifi->fwdWinAscender);
move(fwdDescender, &LocalPFE.pifi->fwdWinDescender);
move(fwdWidth, &LocalPFE.pifi->fwdAveCharWidth);
dprintf(" %4d %4d %4d", fwdAscender, fwdDescender, fwdWidth);
}
dprintf("\n");
ppfel = pfelLocal.ppfelNext;
}
}
}
}
#undef N3
#undef N2
}
void vDumpTEXTMETRICW(TEXTMETRICW *ptmLocal, TEXTMETRICW *ptmRemote)
{
#define N3(a,b,c) dprintf("[%x] %s", &ptmRemote->##c, (a)); dprintf((b),ptmLocal->##c)
dprintf("\nTEXTMETRICW\n");
N3("tmHeight ", "%d\n", tmHeight );
N3("tmAscent ", "%d\n", tmAscent );
N3("tmDescent ", "%d\n", tmDescent );
N3("tmInternalLeading ", "%d\n", tmInternalLeading );
N3("tmExternalLeading ", "%d\n", tmExternalLeading );
N3("tmAveCharWidth ", "%d\n", tmAveCharWidth );
N3("tmMaxCharWidth ", "%d\n", tmMaxCharWidth );
N3("tmWeight ", "%d\n", tmWeight );
N3("tmOverhang ", "%d\n", tmOverhang );
N3("tmDigitizedAspectX ", "%d\n", tmDigitizedAspectX );
N3("tmDigitizedAspectY ", "%d\n", tmDigitizedAspectY );
N3("tmFirstChar ", "%-#6x\n", tmFirstChar );
N3("tmLastChar ", "%-#6x\n", tmLastChar );
N3("tmDefaultChar ", "%-#6x\n", tmDefaultChar );
N3("tmBreakChar ", "%-#6x\n", tmBreakChar );
N3("tmItalic ", "%-#4x\n", tmItalic );
N3("tmUnderlined ", "%-#4x\n", tmUnderlined );
N3("tmStruckOut ", "%-#4x\n", tmStruckOut );
N3("tmPitchAndFamily ", "%-#4x\n", tmPitchAndFamily );
N3("tmCharSet ", "%-#4x\n", tmCharSet );
dprintf("\n");
#undef N3
}
void vDumpTMDIFF(TMDIFF *ptmdLocal, TMDIFF *ptmdRemote)
{
#define N3(a,b,c) dprintf("[%x] %s", &ptmdRemote->##c, (a)); dprintf((b),ptmdLocal->##c)
dprintf("\nTMDIFF\n");
N3("cjotma ", "%u\n", cjotma );
N3("chFirst ", "%-#4x\n", chFirst );
N3("chLast ", "%-#4x\n", chLast );
N3("chDefault ", "%-#4x\n", chDefault );
N3("chBreak ", "%-#4x\n", chBreak );
dprintf("\n");
#undef N3
}
#endif 0 // DOES NOT SUPPORT API64
DECLARE_API( tmwi )
{
dprintf("Extension 'tmwi' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
TMW_INTERNAL tmwi, *ptmwi;
PARSE_POINTER(tmwi_help);
ptmwi = (TMW_INTERNAL *)arg;
move(tmwi, ptmwi);
vDumpTEXTMETRICW(&tmwi.tmw, &ptmwi->tmw);
vDumpTMDIFF(&tmwi.tmdTmw, &ptmwi->tmdTmw);
return;
tmwi_help:
dprintf("Usage: tmwi [-?] TMW_INTERNAL pointer\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
DECLARE_API( tm )
{
dprintf("Extension 'tm' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
TEXTMETRICW tm;
PARSE_POINTER(tm_help);
move(tm, arg);
vDumpTEXTMETRICW(&tm, (TEXTMETRICW*) arg);
return;
tm_help:
dprintf("Usage: tm [-?] TEXTMETRIC pointer\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* fh
*
\**************************************************************************/
DECLARE_API( fh )
{
dprintf("Extension 'fh' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
FONTHASH fh;
PARSE_POINTER(fh_help);
move(fh, arg);
vDumpFONTHASH( &fh, (FONTHASH*) arg);
return;
fh_help:
dprintf("Usage: fh [-?] FONTHASH pointer\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* hb
*
\**************************************************************************/
DECLARE_API( hb )
{
dprintf("Extension 'hb' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
HASHBUCKET hb;
PARSE_POINTER(hb_help);
move(hb, arg);
vDumpHASHBUCKET(&hb, (HASHBUCKET*) arg);
return;
hb_help:
dprintf("Usage: hb [-?] HASHBUCKET pointer\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* cjGLYPHBITS
*
* Routine Description:
*
* Calculates the amount of memory associated with a GLYPHBITS structure
*
* Arguments:
*
* pgb pointer to GLYPHBITS structure
* prf pointer to RFONT
*
* Return Value:
*
* count of byte's
*
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
unsigned cjGLYPHBITS(GLYPHBITS *pgb, RFONT *prf)
{
unsigned cj = 0;
if (pgb) {
if (prf->ulContent & FO_GLYPHBITS) {
cj = offsetof(GLYPHBITS, aj);
cj = (cj + 3) & ~3;
unsigned cjRow = pgb->sizlBitmap.cx;
if (prf->fobj.flFontType & FO_GRAY16)
cjRow = (cjRow+1)/2;
else
cjRow = (cjRow+7)/8;
cj += pgb->sizlBitmap.cy * cjRow;
cj = (cj + 3) & ~3;
}
}
return( cj );
}
#endif 0 // DOES NOT SUPPORT API64
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpGlyphMemory
*
* Routine Description:
*
* Dumps the memory usage for the glyphs associated with an RFONT
*
* Arguments:
*
* pRemoteRFONT pointer to a remote RFONT
*
* Return Value:
*
* none
*
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
void vDumpGlyphMemory(RFONT *pRemoteRFONT)
{
unsigned cj;
if (!pRemoteRFONT)
return;
RFONT rf;
move(rf, pRemoteRFONT);
if ( rf.wcgp ) {
WCGP wcgp;
move(wcgp, rf.wcgp);
cj = offsetof(WCGP,agpRun[0]) + wcgp.cRuns * sizeof(GPRUN);
WCGP *pWCGP;
if ( pWCGP = tmalloc(WCGP, cj) ) {
move2(pWCGP, rf.wcgp, cj);
dprintf("------------------\n");
dprintf("character size\n");
dprintf("------------------\n");
GPRUN *pRun = pWCGP->agpRun;
GPRUN *pRunSentinel = pRun + pWCGP->cRuns;
for (; pRun < pRunSentinel ; pRun++ ) {
if (!pRun->apgd)
continue;
cj = sizeof(GLYPHDATA*) * pRun->cGlyphs;
GLYPHDATA **apgd;
if (!(apgd = tmalloc(GLYPHDATA*, cj)))
continue;
move2(apgd, pRun->apgd, cj);
unsigned wc = pRun->wcLow;
unsigned wcSentinel = wc + pRun->cGlyphs;
GLYPHDATA **ppgd = apgd;
for (; wc < wcSentinel; wc++, ppgd++) {
if (!*ppgd)
continue;
GLYPHDEF gdf;
move(gdf, &((*ppgd)->gdf));
if (gdf.pgb) {
GLYPHBITS gb;
move(gb, gdf.pgb);
cj = cjGLYPHBITS(&gb, &rf);
dprintf("%-#8x %8u\n", wc, cj);
}
}
tfree(apgd);
}
dprintf("------------------\n");
tfree(pWCGP);
}
}
}
#endif // DOES NOT SUPPORT API64
/******************************Public*Routine******************************\
*
* Routine Name:
*
* pdev
*
* Routine Description:
*
* Alternate version of PDEV dumper
*
* Arguments:
*
* Return Value:
*
* none
*
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
char *pszDrvProcName(int index);
DECLARE_API( pdev )
{
dprintf("Extension 'pdev' is not converted.\n");
PDEV _pdev, *pPDEV;
RFONT rf, *prf;
CACHE cache;
BOOL HookFn=FALSE;
BOOL GlyphMem=FALSE;
BOOL MemAddr=FALSE;
PARSE_POINTER(pdev_help);
pPDEV = (PDEV *)arg;
if(parse_iFindSwitch(tokens, ntok, 'y')!=-1) {GlyphMem=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'o')!=-1) {MemAddr=TRUE;}
if(parse_iFindSwitch(tokens, ntok, 'f')!=-1) {HookFn=TRUE;}
move( _pdev, arg );
if (GlyphMem) {
dprintf("\n\nGlyph Bits Memory Allocation\n\n");
dprintf("cMetrics, cGlyphs, cjTotal, Total/Max, cBlocks, Ht, Wd, cjGlyphMax, FaceName\n");
unsigned cTouchedTotal, cAllocTotal, cjWastedTotal, cjAllocTotal;
cTouchedTotal = cAllocTotal = cjWastedTotal = cjAllocTotal = 0;
dprintf("[Active Fonts]\n");
vDumpRFONTList(
_pdev.prfntActive,
&cTouchedTotal,
&cAllocTotal,
&cjWastedTotal,
&cjAllocTotal
);
dprintf("[Inactive Fonts]\n");
vDumpRFONTList(
_pdev.prfntInactive,
&cTouchedTotal,
&cAllocTotal,
&cjWastedTotal,
&cjAllocTotal
);
}
//
// offsets
//
if (MemAddr)
{
#define N2(a,c) dprintf("[%x] %s\n", &pPDEV->##c, (a))
#define N3(a,b,c) dprintf("[%x] %s", &pPDEV->##c, (a)); dprintf((b),_pdev.##c)
N3( " hHmgr ", "%-#x\n", hHmgr );
N3( " cExclusiveLock ", "%-#x\n", cExclusiveLock );
N3( " Tid ", "%-#x\n", Tid );
N3( " ppdevNext ", "%-#x\n", ppdevNext );
N3( " cPdevRefs ", "%-#x\n", cPdevRefs );
N3( " pfnDrvSetPointerShape ", "%-#x\n", pfnDrvSetPointerShape );
N3( " pfnDrvMovePointer ", "%-#x\n", pfnDrvMovePointer );
N3( " pfnMovePointer ", "%-#x\n", pfnMovePointer );
N3( " pfnSync ", "%-#x\n", pfnSync );
N3( " pldev ", "%-#x\n", pldev );
N3( " dhpdev ", "%-#x\n", dhpdev );
N3( " ppalSurf ", "%-#x\n", ppalSurf );
N2( " devinfo ", devinfo );
N2( " GdiInfo ", GdiInfo );
N3( " pSurface ", "%-#x\n", pSurface );
N3( " hSpooler ", "%-#x\n", hSpooler );
N2( " ptlOrigin ", ptlOrigin );
N2( " eDirectDrawGlobal ", eDirectDrawGlobal );
N3( " ppdevParent ", "%-#x\n", ppdevParent );
N3( " fl ", "%-#x\n", fl );
N3( " hsemDevLock ", "%-#x\n", hsemDevLock );
N2( " hsemPointer ", hsemPointer );
N2( " ptlPointer ", ptlPointer );
N3( " hlfntDefault ", "%-#x\n", hlfntDefault );
N3( " hlfntAnsiVariable ", "%-#x\n", hlfntAnsiVariable );
N3( " hlfntAnsiFixed ", "%-#x\n", hlfntAnsiFixed );
N2( " ahsurf ", ahsurf );
N3( " pwszDataFile ", "%-#x\n", pwszDataFile );
N3( " pDevHTInfo ", "%-#x\n", pDevHTInfo );
N3( " prfntActive ", "%-#x\n", prfntActive );
N3( " prfntInactive ", "%-#x\n", prfntInactive );
N3( " cInactive ", "%-#x\n", cInactive );
N2( " ajbo ", ajbo );
N3( "cDirectDrawDisableLocks ", "%-#x\n", cDirectDrawDisableLocks );
N3( " TypeOneInfo ", "%-#x\n", TypeOneInfo );
N3( " RemoteTypeOne ", "%-#x\n", RemoteTypeOne );
N2( " apfn ", apfn );
#undef N3
#undef N2
}
if (HookFn)
{
dprintf("\nDispatch Table\n");
for (int i = 0; i < INDEX_LAST; i++)
{
if (_pdev.apfn[i])
{
dprintf("[%-#x] %-#10x %s\n", &(pPDEV->apfn[i]), _pdev.apfn[i], pszDrvProcName(i));
}
}
dprintf("\n");
}
return;
pdev_help:
dprintf("Usage: pdev [-?] [-o] [-f] [-y] pointer to a PDEV\n");
dprintf("-y glyph memory usage\n");
dprintf("-o memory addresses\n");
dprintf("-f functions hooked\n");
EXIT_API(S_OK);
}
#endif // DOES NOT SUPPORT API64
DECLARE_API( fdm )
{
dprintf("Extension 'fdm' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
FD_DEVICEMETRICS Fdm, *pFdm;
FLONG fl;
char ach[128], *psz;
FLAGDEF *pfd;
PARSE_POINTER(fdm_help);
pFdm = (FD_DEVICEMETRICS *)arg;
move( Fdm, arg );
#define N2(a,c) dprintf("[%x] %s", &pFdm->##c, (a))
#define N3(a,b,c) dprintf("[%x] %s", &pFdm->##c, (a)); dprintf((b),Fdm.##c)
N3("flRealizedType ", "%-#x\n", flRealizedType);
fl = Fdm.flRealizedType;
for (pfd=afdFDM; pfd->psz; pfd++) {
if (pfd->fl & fl)
dprintf("\t\t\t %s\n", pfd->psz);
fl &= ~pfd->fl;
}
N2("pteBase ", pteBase);
psz = ach;
psz += sprintFLOATL( psz, Fdm.pteBase.x );
*psz++ = ' ';
psz += sprintFLOATL( psz, Fdm.pteBase.y );
dprintf("%s\n", ach);
N2("pteSide ", pteSide);
psz = ach;
psz += sprintFLOATL( psz, Fdm.pteSide.x );
*psz++ = ' ';
psz += sprintFLOATL( psz, Fdm.pteSide.y );
dprintf("%s\n", ach);
N3("lD ", "%d\n", lD);
N3("fxMaxAscender ", "%-#x\n", fxMaxAscender);
N3("fxMaxDescender ", "%-#x\n", fxMaxDescender);
N2("ptlUnderline1 ", ptlUnderline1);
dprintf("%d %d\n", Fdm.ptlUnderline1.x, Fdm.ptlUnderline1.y);
N2("ptlStrikeOut ", ptlStrikeOut );
dprintf("%d %d\n", Fdm.ptlStrikeOut.x, Fdm.ptlStrikeOut.y );
N2("ptlULThickness ", ptlULThickness);
dprintf("%d %d\n", Fdm.ptlULThickness.x, Fdm.ptlULThickness.y);
N2("ptlSOThickness ", ptlSOThickness);
dprintf("%d %d\n", Fdm.ptlSOThickness.x, Fdm.ptlSOThickness.y);
N3("cxMax ", "%-#x\n", cxMax);
N3("cyMax ", "%-#x\n", cyMax);
N3("cjGlyphMax ", "%-#x\n", cjGlyphMax);
N2("fdxQuantized ", fdxQuantized);
psz = ach;
psz += sprintFLOATL( psz, Fdm.fdxQuantized.eXX );
*psz++ = ' ';
psz += sprintFLOATL( psz, Fdm.fdxQuantized.eXY );
dprintf("%s\n", ach);
psz = ach;
psz += sprintFLOATL( psz, Fdm.fdxQuantized.eYX );
*psz++ = ' ';
psz += sprintFLOATL( psz, Fdm.fdxQuantized.eYY );
dprintf("\t\t\t\t %s\n", ach);
N3("lNonLinearExtLeading ", "%-#x\n", lNonLinearExtLeading);
N3("lNonLinearIntLeading ", "%-#x\n", lNonLinearIntLeading);
N3("lNonLinearMaxCharWidth ", "%-#x\n", lNonLinearMaxCharWidth);
N3("lNonLinearAvgCharWidth ", "%-#x\n", lNonLinearAvgCharWidth);
N3("lMinA ", "%-#x\n", lMinA );
N3("lMinC ", "%-#x\n", lMinC );
N3("lMinD ", "%-#x\n", lMinD );
N3("alReserved[0] ", "%-#x\n", alReserved[0]);
/*
FLONG flRealizedType
POINTE pteBase
POINTE pteSide
LONG lD
FIX fxMaxAscender
FIX fxMaxDescender
POINTL ptlUnderline1
POINTL ptlStrikeOut
POINTL ptlULThickness
POINTL ptlSOThickness
ULONG cxMax;
ULONG cyMax;
ULONG cjGlyphMax;
FD_XFORM fdxQuantized
LONG lNonLinearExtLeading
LONG lNonLinearIntLeading
LONG lNonLinearMaxCharWidth
LONG lNonLinearAvgCharWidth
LONG lMinA
LONG lMinC
LONG lMinD
LONG alReserved
*/
#undef N3
#undef N2
return;
fdm_help:
dprintf("Usage: fdm [-?] pointer to FD_DEVICEMETRICS structure.\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
/******************************Public*Routine******************************\
*
* Routine Name:
*
* vDumpRFONTList
*
* Routine Description:
*
* Dump the memory allocation information for the RFONT structures
* along the linked list.
*
* Arguments:
*
* Return Value:
*
* none
*
\**************************************************************************/
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
void vDumpRFONTList(
RFONT *prfRemote,
unsigned *pcTouchedTotal,
unsigned *pcAllocTotal,
unsigned *pcjWastedTotal,
unsigned *pcjAllocTotal
)
{
RFONT rf, *prf;
for (prf = prfRemote; prf; prf = rf.rflPDEV.prfntNext) {
move( rf, prf );
if (rf.ppfe) {
PFE _pfe;
move(_pfe, rf.ppfe);
if (_pfe.pifi) {
unsigned cjIFI;
move(cjIFI, &(_pfe.pifi->cjThis));
if (cjIFI) {
IFIMETRICS *pifi;
if (pifi = tmalloc(IFIMETRICS, cjIFI)) {
// Create an IFIOBJ to get the face name
// out of the IFIMETRICS structure
move2(pifi, (_pfe.pifi), cjIFI);
IFIOBJ ifio(pifi);
dprintf("%8d, %5d,%8d,%8d,%8d,%8d,%4d,%4d,%ws\n",
rf.cache.cMetrics,
rf.cache.cGlyphs,
rf.cache.cjTotal,
(rf.cache.cjTotal + rf.cache.cjGlyphMax/2) / rf.cache.cjGlyphMax,
rf.cache.cBlocks,
rf.lMaxHeight, rf.cxMax,
rf.cache.cjGlyphMax,
ifio.pwszFaceName()
);
tfree(pifi);
}
}
}
}
}
}
#endif 0 // DOES NOT SUPPORT API64
DECLARE_API ( dispcache )
{
dprintf("Extension 'dispcache' is not converted.\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
PDEV *pPDEV;
char ach[32];
PARSE_ARGUMENTS(dispcache_help);
GetValue( pPDEV, "win32k!ghdev");
sprintf(ach, "-y %p", pPDEV);
pdev( hCurrentProcess, hCurrentThread, dwCurrentPc, dwProcessor, ach );
return;
dispcache_help:
dprintf("Usage: dispcache [-?]\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}
DECLARE_API ( xo )
{
dprintf("Extension 'xo' is not converted.\n");
dprintf("Use 'dt win32k!EXFORMOBJ Address' and '!gdikdx.mx Matrix_Address'\n");
#if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64
EXFORMOBJ xo, *pxo;
MATRIX mx;
PARSE_POINTER(xo_help);
pxo = (EXFORMOBJ *)arg;
move(xo, pxo);
dprintf("EXFORMOBJ\n");
dprintf("[%8x] %8x\n", &pxo->pmx, xo.pmx);
dprintf("[%8x] %8x\n", &pxo->ulMode, xo.ulMode);
if ( xo.pmx ) {
move( mx, xo.pmx );
vDumpMATRIX( &mx, xo.pmx );
}
return;
xo_help:
dprintf("Usage: xo [-?] EXFORMOBJ pointer\n");
#endif // DOES NOT SUPPORT API64
EXIT_API(S_OK);
}