⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddiproxy.cpp

📁 Windows 图形编程 书籍
💻 CPP
字号:
//-----------------------------------------------------------------------------------//
//              Windows Graphics Programming: Win32 GDI and DirectDraw               //
//                             ISBN  0-13-086985-6                                   //
//                                                                                   //
//  Written            by  Yuan, Feng                             www.fengyuan.com   //
//  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
//  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
//                                                                                   //
//  FileName   : ddiproxy.cpp	                                                     //
//  Description: Proxy routines for device driver entry points                       //
//  Version    : 1.00.000, May 31, 2000                                              //
//-----------------------------------------------------------------------------------//

#define NOCRYPT
#define _WIN32_WINNT 0x0500
#define WINNT

#include <windows.h>
#include <winddi.h>

#include "DDISpy.h"

typedef struct
{
	PFN   pProxy;
	PFN   pReal;
}   PROXYFN;

#define DrvSetPalette			NULL
#define DrvDitherColor			NULL
#define DrvDeleteDeviceBitmap	NULL
#define DrvCreateDeviceBitmap	NULL
#define DrvOffset				NULL
#define DrvAssertMode			NULL
#define DrvRealizeBrush			NULL

PROXYFN DDI_Proxy [] = 
{
	(PFN) DrvEnablePDEV,			NULL,
	(PFN) DrvCompletePDEV,			NULL,
	(PFN) DrvDisablePDEV,			NULL,
    (PFN) DrvEnableSurface,			NULL,
    
	(PFN) DrvDisableSurface,		NULL,
    (PFN) DrvAssertMode,			NULL,
    (PFN) DrvOffset,				NULL,
    (PFN) DrvResetPDEV,				NULL,
    
	(PFN) DrvDisableDriver,			NULL,
	(PFN) NULL,						NULL,
    (PFN) DrvCreateDeviceBitmap,	NULL,
    (PFN) DrvDeleteDeviceBitmap,	NULL,
    
	(PFN) DrvRealizeBrush,			NULL,
    (PFN) DrvDitherColor,			NULL,
    (PFN) DrvStrokePath,			NULL,
    (PFN) DrvFillPath,				NULL,
    
	(PFN) DrvStrokeAndFillPath,		NULL,
    (PFN) DrvPaint,					NULL,
    (PFN) DrvBitBlt,				NULL,
    (PFN) DrvCopyBits,				NULL,
    
	(PFN) DrvStretchBlt,			NULL,
	(PFN) NULL,						NULL,
    (PFN) DrvSetPalette,			NULL,
    (PFN) DrvTextOut,				NULL,
};

unsigned char Buffer[BUFFER_SIZE];
int			  BufferPos;

void DDISpy_Start(unsigned fntable, int count)
{
	unsigned * pFuncTable = (unsigned *) fntable;

	memset(Buffer, 0, sizeof(Buffer));
	BufferPos = 0;

	for (int i=0; i<count; i++)
		if ( pFuncTable[i] > 0xa0000000  ) // either in win32k.sys or device driver
		if ( DDI_Proxy[i].pProxy != NULL ) // we have a proxy
		{
			DDI_Proxy[i].pReal = (PFN) pFuncTable[i];		// actual function to call

			pFuncTable[i] = (unsigned) DDI_Proxy[i].pProxy;	// hack it !!!
		}
}

void DDISpy_Stop(unsigned fntable, int count)
{
	unsigned * pFuncTable = (unsigned *) fntable;

	for (int i=0; i<count; i++)
		if ( pFuncTable[i] > 0xa0000000  ) // either in win32k.sys or device driver
		if ( DDI_Proxy[i].pProxy != NULL ) // we have a proxy
		{
			pFuncTable[i] = (unsigned) DDI_Proxy[i].pReal;	// reWrite it !!!
		}
}

/*
BOOL APIENTRY DrvEnableDriver(ULONG iEngineVersion, ULONG cj, DRVENABLEDATA *pded)
{
    return FALSE; 
}
*/


void Write(unsigned ch)
{
	Buffer[BufferPos] = ch;
	BufferPos = (BufferPos + 1) % BUFFER_SIZE;
}

int call = 0;

void Write(const char * str)
{
	call ++;

	Write((char)(call / 1000 + '0')); 
	Write((char)(call / 100 % 10 + '0'));
	Write((char)(call / 10 % 10  + '0'));
	Write((char)(call      % 10 + '0'));
	Write(' ');

	while ( * str )
	{
		Write( * str );
		str ++;
	}
	Write(' ');
}


#define Call(name)  (*(PFN_ ## name) DDI_Proxy[INDEX_ ## name].pReal)

void APIENTRY DrvDisableDriver(void)
{
	Write("DisableDriver");
	
	Call(DrvDisableDriver)();
}


DHPDEV APIENTRY DrvEnablePDEV(DEVMODEW *pdm,
              LPWSTR    pwszLogAddress,
              ULONG     cPat,
              HSURF    *phsurfPatterns,
              ULONG     cjCaps,
              ULONG    *pdevcaps,
              ULONG     cjDevInfo,
              DEVINFO  *pdi,
              HDEV      hdev,
              PWSTR     pwszDeviceName,
              HANDLE    hDriver)
{
	Write("EnablePDEV");

	return Call(DrvEnablePDEV) (pdm, pwszLogAddress, cPat, phsurfPatterns, 
		cjCaps, (GDIINFO *) pdevcaps, cjDevInfo, pdi, hdev, pwszDeviceName, hDriver);
}


void APIENTRY DrvCompletePDEV(DHPDEV dhpdev, HDEV hdev)
{
	Write("CompletePDEV");

	Call(DrvCompletePDEV) (dhpdev, hdev);
}


BOOL APIENTRY DrvResetPDEV(DHPDEV dhpdevOld, DHPDEV dhpdevNew)
{
	Write("ResetPDEV");

	return Call(DrvResetPDEV) (dhpdevOld, dhpdevNew);
}


void APIENTRY DrvDisablePDEV(DHPDEV dhpdev)
{
	Write("DisablePDEV");

	Call(DrvDisablePDEV) (dhpdev);
}


HSURF APIENTRY DrvEnableSurface(DHPDEV dhpdev)
{
	Write("EnableSurface");

	return Call(DrvEnableSurface) (dhpdev);
}


void APIENTRY DrvDisableSurface(DHPDEV dhpdev)
{
	Write("DisableSurface");

	Call(DrvDisableSurface) (dhpdev);
}

BOOL APIENTRY DrvStrokePath(SURFOBJ   *pso,
							PATHOBJ   *ppo,
							CLIPOBJ   *pco,
                            XFORMOBJ  *pxo, 
							BRUSHOBJ  *pbo,
							POINTL    *pptlBrushOrg,
                            LINEATTRS *plineattrs,
							MIX        mix)
{
	Write("StrokePath");

	return Call(DrvStrokePath) (pso, ppo, pco, pxo, pbo, pptlBrushOrg, plineattrs, mix);
}


BOOL APIENTRY DrvFillPath(SURFOBJ  *pso,
						  PATHOBJ  *ppo,
						  CLIPOBJ  *pco,
						  BRUSHOBJ *pbo,
                          POINTL   *pptlBrushOrg,
						  MIX       mix,
						  FLONG     flOptions)
{
	Write("FillPath");

	return Call(DrvFillPath) (pso, ppo, pco, pbo, pptlBrushOrg, mix, flOptions);
}


BOOL APIENTRY DrvStrokeAndFillPath(SURFOBJ *pso,PATHOBJ *ppo,CLIPOBJ *pco,
                                   XFORMOBJ *pxo,BRUSHOBJ *pboStroke,
                                   LINEATTRS *plineattrs,BRUSHOBJ *pboFill,
                                   POINTL *pptlBrushOrg,MIX mixFill,FLONG flOptions)
{
	Write("StrokeAndFillPath");

	return Call(DrvStrokeAndFillPath) (pso, ppo, pco, pxo, pboStroke, plineattrs,
		pboFill, pptlBrushOrg, mixFill, flOptions);
}


BOOL APIENTRY DrvLineTo(SURFOBJ *pso, CLIPOBJ *pco, BRUSHOBJ *pbo, LONG x1, 
                        LONG y1, LONG x2, LONG y2, RECTL *prclBounds, MIX mix)
{
	Write("LineTo");

	return Call(DrvLineTo)(pso, pco, pbo, x1, y1, x2, y2, prclBounds, mix);
}


BOOL APIENTRY DrvPaint(SURFOBJ  *pso, 
					   CLIPOBJ  *pco, 
					   BRUSHOBJ *pbo,
					   POINTL   *pptlBrushOrg,
					   MIX       mix)
{
	Write("Paint");

	return Call(DrvPaint) (pso, pco, pbo, pptlBrushOrg, mix);
}


BOOL APIENTRY DrvBitBlt(SURFOBJ  *psoTrg,
						SURFOBJ  *psoSrc,
						SURFOBJ  *psoMask,
                        CLIPOBJ  *pco,
						XLATEOBJ *pxlo,
						RECTL    *prclTrg,
						POINTL   *pptlSrc,
                        POINTL   *pptlMask,
						BRUSHOBJ *pbo,
						POINTL   *pptlBrush,
						ROP4      rop4)
{
	Write("BitBlt");

	return Call(DrvBitBlt) (psoTrg, psoSrc, psoMask, pco, pxlo, prclTrg, 
		pptlSrc, pptlMask, pbo, pptlBrush, rop4);
}


BOOL APIENTRY DrvCopyBits(SURFOBJ  *psoDest,
						  SURFOBJ  *psoSrc,
						  CLIPOBJ  *pco,
                          XLATEOBJ *pxlo,
						  RECTL    *prclDest,
						  POINTL   *pptlSrc)
{
	Write("CopyBits");

	return Call(DrvCopyBits)(psoDest, psoSrc, pco, pxlo, prclDest, pptlSrc);
}


BOOL APIENTRY DrvStretchBlt(SURFOBJ         *psoDest,
							SURFOBJ         *psoSrc,
							SURFOBJ         *psoMask,
                            CLIPOBJ         *pco,
							XLATEOBJ        *pxlo,
							COLORADJUSTMENT *pca,
                            POINTL          *pptlHTOrg,
							RECTL           *prclDest,
                            RECTL           *prclSrc,
                            POINTL          *pptlMask,
							ULONG            iMode)
{
	Write("StretchBlt");

	return Call(DrvStretchBlt) (psoDest, psoSrc, psoMask, pco, pxlo, pca, pptlHTOrg,
		prclDest, prclSrc, pptlMask, iMode);
}


BOOL APIENTRY DrvTextOut(SURFOBJ  *pso,
           STROBJ   *pstro,
           FONTOBJ  *pfo,
           CLIPOBJ  *pco,
           RECTL    *prclExtra,
           RECTL    *prclOpaque,
           BRUSHOBJ *pboFore,
           BRUSHOBJ *pboOpaque,
           POINTL   *pptlOrg,
           MIX       mix)
{
	Write("TextOut");

	return Call(DrvTextOut) (pso, pstro, pfo, pco, prclExtra, prclOpaque, 
		pboFore, pboOpaque, pptlOrg, mix);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -