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.
 
 
 
 
 
 

600 lines
15 KiB

/******************************Module*Header*******************************\
*
* *******************
* * GDI SAMPLE CODE *
* *******************
*
* Module Name: log.c
*
*
* Copyright (c) 1992-1999 Microsoft Corporation. All rights reserved.
**************************************************************************/
#include "precomp.h"
#include "gdi.h"
#include "log.h"
// Logging support
#define MAX_LOG_FILE_NAME_SIZE 80
#define LF_PUNTED 0x1
#define LF_DSTVM 0x2
#define LF_SRCVM 0x4
#define LF_CALLDEPTHMASK 0xf0
#define LE_NULL 0
#define LE_BITBLT 1
#define LE_COPYBITS 2
#define LE_SURFCREATED 3
#define LE_SURFMOVEDTOSM 4
#define LE_SURFMOVEDTOVM 5
#define LE_LOGOPENED 6
#define LE_LOGCLOSED 7
#define LE_ALPHABLEND 8
#define LE_TRANSPARENTBLT 9
#define LE_TEXTOUT 10
#define LE_FILLPATH 11
#define LE_STROKEPATH 12
#define LE_LINETO 13
#define LE_SURFDELETED 14
#define LE_GRADIENTFILL 15
typedef struct LogEntry
{
USHORT elapsedTime;
BYTE flags;
BYTE event;
ULONG_PTR src; // format or pdsurf
ULONG_PTR dst; // format or pdsurf
USHORT rop4;
} LogEntry;
LogEntry * gLog = NULL; // pointer to mapped log file
ULONG_PTR giFile = NULL;
LogEntry * gLogPos; // current position in log file
LogEntry * gLogSentinel; // end of log file
wchar_t gLogFileName[MAX_LOG_FILE_NAME_SIZE+1];
BOOL gPunted = FALSE;
ULONG ulLogOpen(LPWSTR pwsz, ULONG ulSize)
{
ULONG ulResult = 0;
// Make sure the log the log will be big enough to store atleast the log
// open and the log close events
if(gLog == NULL && ulSize >= (sizeof(LogEntry) * 2))
{
if(wcslen(pwsz) <= MAX_LOG_FILE_NAME_SIZE)
{
wcscpy(gLogFileName, pwsz);
gLog = (LogEntry *) EngMapFile(gLogFileName, ulSize, &giFile);
if (gLog != NULL)
{
// NOTE: we subtract one to save room for the close event
gLogSentinel = gLog + ((ulSize / sizeof(LogEntry)) - 1);
memset(gLog, 0, ulSize);
gLogPos = gLog;
gLogPos->event = LE_LOGOPENED;
{
LONGLONG frequency;
EngQueryPerformanceFrequency(&frequency);
if(frequency < 0xFFFFFFFF)
gLogPos->dst = (ULONG) (frequency & 0xFFFFFFFF);
}
gLogPos++;
ulResult = TRUE;
}
}
}
return ulResult;
}
ULONG ulLogClose(void)
{
ULONG ulResult = 0;
if(gLog != NULL)
{
// there is always room for the closed event
gLogPos->event = LE_LOGCLOSED;
ulResult = (ULONG) EngUnmapFile((ULONG_PTR) giFile);
}
gLog = NULL;
return ulResult;
}
void vLogPunt(void)
{
if(gLog != NULL)
gLogPos->flags |= LF_PUNTED;
}
void
vLogBitBlt(
SURFOBJ* psoDst,
SURFOBJ* psoSrc,
SURFOBJ* psoMsk,
CLIPOBJ* pco,
XLATEOBJ* pxlo,
RECTL* prclDst,
POINTL* pptlSrc,
POINTL* pptlMsk,
BRUSHOBJ* pbo,
POINTL* pptlBrush,
ROP4 rop4,
LONGLONG elapsedTime,
ULONG ulCallDepth)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
if(psoDst->dhsurf != NULL)
{
Surf * surf = (Surf *) psoDst->dhsurf;
gLogPos->dst = (ULONG_PTR) surf;
if(surf->flags & SF_VM)
gLogPos->flags |= LF_DSTVM;
}
else
{
gLogPos->dst = (ULONG) psoDst->iBitmapFormat;
}
if(psoSrc != NULL)
{
if(psoSrc->dhsurf != NULL)
{
Surf * surf = (Surf *) psoSrc->dhsurf;
gLogPos->src = (ULONG_PTR) surf;
if(surf->flags & SF_VM)
gLogPos->flags |= LF_SRCVM;
}
else
{
gLogPos->src = (ULONG) psoSrc->iBitmapFormat;
}
}
else
{
gLogPos->src = 0;
}
gLogPos->rop4 = (USHORT) rop4;
gLogPos->elapsedTime = (elapsedTime > 0xFFFF ? 0xFFFF
: (USHORT) elapsedTime);
gLogPos->event = LE_BITBLT;
gLogPos->flags |=(ulCallDepth >= 15 ? 0xF0 : (BYTE) (ulCallDepth << 4));
gLogPos++;
}
}
void
vLogCopyBits(
SURFOBJ* psoDst,
SURFOBJ* psoSrc,
CLIPOBJ* pco,
XLATEOBJ* pxlo,
RECTL* prclDst,
POINTL* pptlSrc,
LONGLONG elapsedTime,
ULONG ulCallDepth)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
if(psoDst->dhsurf != NULL)
{
Surf * surf = (Surf *) psoDst->dhsurf;
gLogPos->dst = (ULONG_PTR) surf;
if(surf->flags & SF_VM)
gLogPos->flags |= LF_DSTVM;
}
else
{
gLogPos->dst = (ULONG) psoDst->iBitmapFormat;
}
if(psoSrc != NULL)
{
if(psoSrc->dhsurf != NULL)
{
Surf * surf = (Surf *) psoSrc->dhsurf;
gLogPos->src = (ULONG_PTR) surf;
if(surf->flags & SF_VM)
gLogPos->flags |= LF_SRCVM;
}
else
{
gLogPos->src = (ULONG) psoSrc->iBitmapFormat;
}
}
else
{
gLogPos->src = 0;
}
gLogPos->elapsedTime = (elapsedTime > 0xFFFF ? 0xFFFF
: (USHORT) elapsedTime);
gLogPos->event = LE_COPYBITS;
gLogPos->flags |=(ulCallDepth >= 15 ? 0xF0 : (BYTE) (ulCallDepth << 4));
gLogPos++;
}
}
void
vLogTransparentBlt(
SURFOBJ * psoDst,
SURFOBJ * psoSrc,
CLIPOBJ * pco,
XLATEOBJ * pxlo,
RECTL * prclDst,
RECTL * prclSrc,
ULONG iTransColor,
LONGLONG elapsedTime,
ULONG ulCallDepth)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
if(psoDst->dhsurf != NULL)
{
Surf * surf = (Surf *) psoDst->dhsurf;
gLogPos->dst = (ULONG_PTR) surf;
if(surf->flags & SF_VM)
gLogPos->flags |= LF_DSTVM;
}
else
{
gLogPos->dst = (ULONG) psoDst->iBitmapFormat;
}
if(psoSrc != NULL)
{
if(psoSrc->dhsurf != NULL)
{
Surf * surf = (Surf *) psoSrc->dhsurf;
gLogPos->src = (ULONG_PTR) surf;
if(surf->flags & SF_VM)
gLogPos->flags |= LF_SRCVM;
}
else
{
gLogPos->src = (ULONG) psoSrc->iBitmapFormat;
}
}
else
{
gLogPos->src = 0;
}
gLogPos->elapsedTime = (elapsedTime > 0xFFFF ? 0xFFFF
: (USHORT) elapsedTime);
gLogPos->event = LE_TRANSPARENTBLT;
gLogPos->flags |=(ulCallDepth >= 15 ? 0xF0 : (BYTE) (ulCallDepth << 4));
gLogPos++;
}
}
void
vLogAlphaBlend(
SURFOBJ *psoDst,
SURFOBJ *psoSrc,
CLIPOBJ *pco,
XLATEOBJ *pxlo,
RECTL *prclDst,
RECTL *prclSrc,
BLENDOBJ *pBlendObj,
LONGLONG elapsedTime,
ULONG ulCallDepth)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
if(psoDst->dhsurf != NULL)
{
Surf * surf = (Surf *) psoDst->dhsurf;
gLogPos->dst = (ULONG_PTR) surf;
if(surf->flags & SF_VM)
gLogPos->flags |= LF_DSTVM;
}
else
{
gLogPos->dst = (ULONG) psoDst->iBitmapFormat;
}
if(psoSrc != NULL)
{
if(psoSrc->dhsurf != NULL)
{
Surf * surf = (Surf *) psoSrc->dhsurf;
gLogPos->src = (ULONG_PTR) surf;
if(surf->flags & SF_VM)
gLogPos->flags |= LF_SRCVM;
}
else
{
gLogPos->src = (ULONG_PTR) psoSrc->iBitmapFormat;
}
}
else
{
gLogPos->src = 0;
}
gLogPos->elapsedTime = (elapsedTime > 0xFFFF ? 0xFFFF
: (USHORT) elapsedTime);
gLogPos->event = LE_ALPHABLEND;
gLogPos->flags |=(ulCallDepth >= 15 ? 0xF0 : (BYTE) (ulCallDepth << 4));
gLogPos++;
}
}
void
vLogGradientFill(
SURFOBJ *psoDst,
CLIPOBJ *pco,
XLATEOBJ *pxlo,
TRIVERTEX *pVertex,
ULONG nVertex,
PVOID pMesh,
ULONG nMesh,
RECTL *prclExtents,
POINTL *pptlDitherOrg,
ULONG ulMode,
LONGLONG elapsedTime,
ULONG ulCallDepth)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
if(psoDst->dhsurf != NULL)
{
Surf * surf = (Surf *) psoDst->dhsurf;
gLogPos->dst = (ULONG_PTR) surf;
if(surf->flags & SF_VM)
gLogPos->flags |= LF_DSTVM;
}
else
{
gLogPos->dst = (ULONG) psoDst->iBitmapFormat;
}
gLogPos->elapsedTime = (elapsedTime > 0xFFFF ? 0xFFFF
: (USHORT) elapsedTime);
gLogPos->event = LE_GRADIENTFILL;
gLogPos->flags |=(ulCallDepth >= 15 ? 0xF0 : (BYTE) (ulCallDepth << 4));
gLogPos++;
}
}
void
vLogTextOut(
SURFOBJ* psoDst,
STROBJ* pstro,
FONTOBJ* pfo,
CLIPOBJ* pco,
RECTL* prclExtra,
RECTL* prclOpaque,
BRUSHOBJ* pboFore,
BRUSHOBJ* pboOpaque,
POINTL* pptlBrush,
MIX mix,
LONGLONG elapsedTime,
ULONG ulCallDepth)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
if(psoDst->dhsurf != NULL)
{
Surf * surf = (Surf *) psoDst->dhsurf;
gLogPos->dst = (ULONG_PTR) surf;
if(surf->flags & SF_VM)
gLogPos->flags |= LF_DSTVM;
}
else
{
gLogPos->dst = (ULONG) psoDst->iBitmapFormat;
}
gLogPos->elapsedTime = (elapsedTime > 0xFFFF ? 0xFFFF
: (USHORT) elapsedTime);
gLogPos->event = LE_TEXTOUT;
gLogPos->flags |=(ulCallDepth >= 15 ? 0xF0 : (BYTE) (ulCallDepth << 4));
gLogPos++;
}
}
void
vLogLineTo(
SURFOBJ* psoDst,
CLIPOBJ* pco,
BRUSHOBJ* pbo,
LONG x1,
LONG y1,
LONG x2,
LONG y2,
RECTL* prclBounds,
MIX mix,
LONGLONG elapsedTime,
ULONG ulCallDepth)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
if(psoDst->dhsurf != NULL)
{
Surf * surf = (Surf *) psoDst->dhsurf;
gLogPos->dst = (ULONG_PTR) surf;
if(surf->flags & SF_VM )
gLogPos->flags |= LF_DSTVM;
}
else
{
gLogPos->dst = (ULONG) psoDst->iBitmapFormat;
}
gLogPos->elapsedTime = (elapsedTime > 0xFFFF ? 0xFFFF
: (USHORT) elapsedTime);
gLogPos->event = LE_LINETO;
gLogPos->flags |=(ulCallDepth >= 15 ? 0xF0 : (BYTE) (ulCallDepth << 4));
gLogPos++;
}
}
void
vLogFillPath(
SURFOBJ* psoDst,
PATHOBJ* ppo,
CLIPOBJ* pco,
BRUSHOBJ* pbo,
POINTL* pptlBrush,
MIX mix,
FLONG flOptions,
LONGLONG elapsedTime,
ULONG ulCallDepth)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
if(psoDst->dhsurf != NULL)
{
Surf * surf = (Surf *) psoDst->dhsurf;
gLogPos->dst = (ULONG_PTR) surf;
if(surf->flags & SF_VM )
gLogPos->flags |= LF_DSTVM;
}
else
{
gLogPos->dst = (ULONG) psoDst->iBitmapFormat;
}
gLogPos->elapsedTime = (elapsedTime > 0xFFFF ? 0xFFFF
: (USHORT) elapsedTime);
gLogPos->event = LE_FILLPATH;
gLogPos->flags |=(ulCallDepth >= 15 ? 0xF0 : (BYTE) (ulCallDepth << 4));
gLogPos++;
}
}
void
vLogStrokePath(
SURFOBJ* psoDst,
PATHOBJ* ppo,
CLIPOBJ* pco,
XFORMOBJ* pxo,
BRUSHOBJ* pbo,
POINTL* pptlBrush,
LINEATTRS* pla,
MIX mix,
LONGLONG elapsedTime,
ULONG ulCallDepth)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
if(psoDst->dhsurf != NULL)
{
Surf * surf = (Surf *) psoDst->dhsurf;
gLogPos->dst = (ULONG_PTR) surf;
if(surf->flags & SF_VM )
gLogPos->flags |= LF_DSTVM;
}
else
{
gLogPos->dst = (ULONG) psoDst->iBitmapFormat;
}
gLogPos->elapsedTime = (elapsedTime > 0xFFFF ? 0xFFFF
: (USHORT) elapsedTime);
gLogPos->event = LE_STROKEPATH;
gLogPos->flags |=(ulCallDepth >= 15 ? 0xF0 : (BYTE) (ulCallDepth << 4));
gLogPos++;
}
}
void
vLogSurfMovedToVM(
Surf* psurf)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
gLogPos->dst = (ULONG_PTR) psurf;
gLogPos->event = LE_SURFMOVEDTOVM;
gLogPos++;
}
}
void
vLogSurfMovedToSM(
Surf* psurf)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
gLogPos->dst = (ULONG_PTR) psurf;
gLogPos->event = LE_SURFMOVEDTOSM;
gLogPos++;
}
}
void
vLogSurfCreated(
Surf* psurf)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
gLogPos->dst = (ULONG_PTR) psurf;
gLogPos->event = LE_SURFCREATED;
gLogPos++;
}
}
void
vLogSurfDeleted(
Surf* psurf)
{
if(gLog != NULL && gLogPos < gLogSentinel)
{
gLogPos->dst = (ULONG_PTR) psurf;
gLogPos->event = LE_SURFDELETED;
gLogPos++;
}
}