home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / Chapt_04 / DDISpy / DDIProxy.cpp next >
Encoding:
C/C++ Source or Header  |  2000-05-11  |  8.5 KB  |  334 lines

  1. //-----------------------------------------------------------------------------------//
  2. //              Windows Graphics Programming: Win32 GDI and DirectDraw               //
  3. //                             ISBN  0-13-086985-6                                   //
  4. //                                                                                   //
  5. //  Written            by  Yuan, Feng                             www.fengyuan.com   //
  6. //  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
  7. //  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
  8. //                                                                                   //
  9. //  FileName   : ddiproxy.cpp                                                         //
  10. //  Description: Proxy routines for device driver entry points                       //
  11. //  Version    : 1.00.000, May 31, 2000                                              //
  12. //-----------------------------------------------------------------------------------//
  13.  
  14. #define NOCRYPT
  15. #define _WIN32_WINNT 0x0500
  16. #define WINNT
  17.  
  18. #include <windows.h>
  19. #include <winddi.h>
  20.  
  21. #include "DDISpy.h"
  22.  
  23. typedef struct
  24. {
  25.     PFN   pProxy;
  26.     PFN   pReal;
  27. }   PROXYFN;
  28.  
  29. #define DrvSetPalette            NULL
  30. #define DrvDitherColor            NULL
  31. #define DrvDeleteDeviceBitmap    NULL
  32. #define DrvCreateDeviceBitmap    NULL
  33. #define DrvOffset                NULL
  34. #define DrvAssertMode            NULL
  35. #define DrvRealizeBrush            NULL
  36.  
  37. PROXYFN DDI_Proxy [] = 
  38. {
  39.     (PFN) DrvEnablePDEV,            NULL,
  40.     (PFN) DrvCompletePDEV,            NULL,
  41.     (PFN) DrvDisablePDEV,            NULL,
  42.     (PFN) DrvEnableSurface,            NULL,
  43.     
  44.     (PFN) DrvDisableSurface,        NULL,
  45.     (PFN) DrvAssertMode,            NULL,
  46.     (PFN) DrvOffset,                NULL,
  47.     (PFN) DrvResetPDEV,                NULL,
  48.     
  49.     (PFN) DrvDisableDriver,            NULL,
  50.     (PFN) NULL,                        NULL,
  51.     (PFN) DrvCreateDeviceBitmap,    NULL,
  52.     (PFN) DrvDeleteDeviceBitmap,    NULL,
  53.     
  54.     (PFN) DrvRealizeBrush,            NULL,
  55.     (PFN) DrvDitherColor,            NULL,
  56.     (PFN) DrvStrokePath,            NULL,
  57.     (PFN) DrvFillPath,                NULL,
  58.     
  59.     (PFN) DrvStrokeAndFillPath,        NULL,
  60.     (PFN) DrvPaint,                    NULL,
  61.     (PFN) DrvBitBlt,                NULL,
  62.     (PFN) DrvCopyBits,                NULL,
  63.     
  64.     (PFN) DrvStretchBlt,            NULL,
  65.     (PFN) NULL,                        NULL,
  66.     (PFN) DrvSetPalette,            NULL,
  67.     (PFN) DrvTextOut,                NULL,
  68. };
  69.  
  70. unsigned char Buffer[BUFFER_SIZE];
  71. int              BufferPos;
  72.  
  73. void DDISpy_Start(unsigned fntable, int count)
  74. {
  75.     unsigned * pFuncTable = (unsigned *) fntable;
  76.  
  77.     memset(Buffer, 0, sizeof(Buffer));
  78.     BufferPos = 0;
  79.  
  80.     for (int i=0; i<count; i++)
  81.         if ( pFuncTable[i] > 0xa0000000  ) // either in win32k.sys or device driver
  82.         if ( DDI_Proxy[i].pProxy != NULL ) // we have a proxy
  83.         {
  84.             DDI_Proxy[i].pReal = (PFN) pFuncTable[i];        // actual function to call
  85.  
  86.             pFuncTable[i] = (unsigned) DDI_Proxy[i].pProxy;    // hack it !!!
  87.         }
  88. }
  89.  
  90. void DDISpy_Stop(unsigned fntable, int count)
  91. {
  92.     unsigned * pFuncTable = (unsigned *) fntable;
  93.  
  94.     for (int i=0; i<count; i++)
  95.         if ( pFuncTable[i] > 0xa0000000  ) // either in win32k.sys or device driver
  96.         if ( DDI_Proxy[i].pProxy != NULL ) // we have a proxy
  97.         {
  98.             pFuncTable[i] = (unsigned) DDI_Proxy[i].pReal;    // reWrite it !!!
  99.         }
  100. }
  101.  
  102. /*
  103. BOOL APIENTRY DrvEnableDriver(ULONG iEngineVersion, ULONG cj, DRVENABLEDATA *pded)
  104. {
  105.     return FALSE; 
  106. }
  107. */
  108.  
  109.  
  110. void Write(unsigned ch)
  111. {
  112.     Buffer[BufferPos] = ch;
  113.     BufferPos = (BufferPos + 1) % BUFFER_SIZE;
  114. }
  115.  
  116. int call = 0;
  117.  
  118. void Write(const char * str)
  119. {
  120.     call ++;
  121.  
  122.     Write((char)(call / 1000 + '0')); 
  123.     Write((char)(call / 100 % 10 + '0'));
  124.     Write((char)(call / 10 % 10  + '0'));
  125.     Write((char)(call      % 10 + '0'));
  126.     Write(' ');
  127.  
  128.     while ( * str )
  129.     {
  130.         Write( * str );
  131.         str ++;
  132.     }
  133.     Write(' ');
  134. }
  135.  
  136.  
  137. #define Call(name)  (*(PFN_ ## name) DDI_Proxy[INDEX_ ## name].pReal)
  138.  
  139. void APIENTRY DrvDisableDriver(void)
  140. {
  141.     Write("DisableDriver");
  142.     
  143.     Call(DrvDisableDriver)();
  144. }
  145.  
  146.  
  147. DHPDEV APIENTRY DrvEnablePDEV(DEVMODEW *pdm,
  148.               LPWSTR    pwszLogAddress,
  149.               ULONG     cPat,
  150.               HSURF    *phsurfPatterns,
  151.               ULONG     cjCaps,
  152.               ULONG    *pdevcaps,
  153.               ULONG     cjDevInfo,
  154.               DEVINFO  *pdi,
  155.               HDEV      hdev,
  156.               PWSTR     pwszDeviceName,
  157.               HANDLE    hDriver)
  158. {
  159.     Write("EnablePDEV");
  160.  
  161.     return Call(DrvEnablePDEV) (pdm, pwszLogAddress, cPat, phsurfPatterns, 
  162.         cjCaps, (GDIINFO *) pdevcaps, cjDevInfo, pdi, hdev, pwszDeviceName, hDriver);
  163. }
  164.  
  165.  
  166. void APIENTRY DrvCompletePDEV(DHPDEV dhpdev, HDEV hdev)
  167. {
  168.     Write("CompletePDEV");
  169.  
  170.     Call(DrvCompletePDEV) (dhpdev, hdev);
  171. }
  172.  
  173.  
  174. BOOL APIENTRY DrvResetPDEV(DHPDEV dhpdevOld, DHPDEV dhpdevNew)
  175. {
  176.     Write("ResetPDEV");
  177.  
  178.     return Call(DrvResetPDEV) (dhpdevOld, dhpdevNew);
  179. }
  180.  
  181.  
  182. void APIENTRY DrvDisablePDEV(DHPDEV dhpdev)
  183. {
  184.     Write("DisablePDEV");
  185.  
  186.     Call(DrvDisablePDEV) (dhpdev);
  187. }
  188.  
  189.  
  190. HSURF APIENTRY DrvEnableSurface(DHPDEV dhpdev)
  191. {
  192.     Write("EnableSurface");
  193.  
  194.     return Call(DrvEnableSurface) (dhpdev);
  195. }
  196.  
  197.  
  198. void APIENTRY DrvDisableSurface(DHPDEV dhpdev)
  199. {
  200.     Write("DisableSurface");
  201.  
  202.     Call(DrvDisableSurface) (dhpdev);
  203. }
  204.  
  205. BOOL APIENTRY DrvStrokePath(SURFOBJ   *pso,
  206.                             PATHOBJ   *ppo,
  207.                             CLIPOBJ   *pco,
  208.                             XFORMOBJ  *pxo, 
  209.                             BRUSHOBJ  *pbo,
  210.                             POINTL    *pptlBrushOrg,
  211.                             LINEATTRS *plineattrs,
  212.                             MIX        mix)
  213. {
  214.     Write("StrokePath");
  215.  
  216.     return Call(DrvStrokePath) (pso, ppo, pco, pxo, pbo, pptlBrushOrg, plineattrs, mix);
  217. }
  218.  
  219.  
  220. BOOL APIENTRY DrvFillPath(SURFOBJ  *pso,
  221.                           PATHOBJ  *ppo,
  222.                           CLIPOBJ  *pco,
  223.                           BRUSHOBJ *pbo,
  224.                           POINTL   *pptlBrushOrg,
  225.                           MIX       mix,
  226.                           FLONG     flOptions)
  227. {
  228.     Write("FillPath");
  229.  
  230.     return Call(DrvFillPath) (pso, ppo, pco, pbo, pptlBrushOrg, mix, flOptions);
  231. }
  232.  
  233.  
  234. BOOL APIENTRY DrvStrokeAndFillPath(SURFOBJ *pso,PATHOBJ *ppo,CLIPOBJ *pco,
  235.                                    XFORMOBJ *pxo,BRUSHOBJ *pboStroke,
  236.                                    LINEATTRS *plineattrs,BRUSHOBJ *pboFill,
  237.                                    POINTL *pptlBrushOrg,MIX mixFill,FLONG flOptions)
  238. {
  239.     Write("StrokeAndFillPath");
  240.  
  241.     return Call(DrvStrokeAndFillPath) (pso, ppo, pco, pxo, pboStroke, plineattrs,
  242.         pboFill, pptlBrushOrg, mixFill, flOptions);
  243. }
  244.  
  245.  
  246. BOOL APIENTRY DrvLineTo(SURFOBJ *pso, CLIPOBJ *pco, BRUSHOBJ *pbo, LONG x1, 
  247.                         LONG y1, LONG x2, LONG y2, RECTL *prclBounds, MIX mix)
  248. {
  249.     Write("LineTo");
  250.  
  251.     return Call(DrvLineTo)(pso, pco, pbo, x1, y1, x2, y2, prclBounds, mix);
  252. }
  253.  
  254.  
  255. BOOL APIENTRY DrvPaint(SURFOBJ  *pso, 
  256.                        CLIPOBJ  *pco, 
  257.                        BRUSHOBJ *pbo,
  258.                        POINTL   *pptlBrushOrg,
  259.                        MIX       mix)
  260. {
  261.     Write("Paint");
  262.  
  263.     return Call(DrvPaint) (pso, pco, pbo, pptlBrushOrg, mix);
  264. }
  265.  
  266.  
  267. BOOL APIENTRY DrvBitBlt(SURFOBJ  *psoTrg,
  268.                         SURFOBJ  *psoSrc,
  269.                         SURFOBJ  *psoMask,
  270.                         CLIPOBJ  *pco,
  271.                         XLATEOBJ *pxlo,
  272.                         RECTL    *prclTrg,
  273.                         POINTL   *pptlSrc,
  274.                         POINTL   *pptlMask,
  275.                         BRUSHOBJ *pbo,
  276.                         POINTL   *pptlBrush,
  277.                         ROP4      rop4)
  278. {
  279.     Write("BitBlt");
  280.  
  281.     return Call(DrvBitBlt) (psoTrg, psoSrc, psoMask, pco, pxlo, prclTrg, 
  282.         pptlSrc, pptlMask, pbo, pptlBrush, rop4);
  283. }
  284.  
  285.  
  286. BOOL APIENTRY DrvCopyBits(SURFOBJ  *psoDest,
  287.                           SURFOBJ  *psoSrc,
  288.                           CLIPOBJ  *pco,
  289.                           XLATEOBJ *pxlo,
  290.                           RECTL    *prclDest,
  291.                           POINTL   *pptlSrc)
  292. {
  293.     Write("CopyBits");
  294.  
  295.     return Call(DrvCopyBits)(psoDest, psoSrc, pco, pxlo, prclDest, pptlSrc);
  296. }
  297.  
  298.  
  299. BOOL APIENTRY DrvStretchBlt(SURFOBJ         *psoDest,
  300.                             SURFOBJ         *psoSrc,
  301.                             SURFOBJ         *psoMask,
  302.                             CLIPOBJ         *pco,
  303.                             XLATEOBJ        *pxlo,
  304.                             COLORADJUSTMENT *pca,
  305.                             POINTL          *pptlHTOrg,
  306.                             RECTL           *prclDest,
  307.                             RECTL           *prclSrc,
  308.                             POINTL          *pptlMask,
  309.                             ULONG            iMode)
  310. {
  311.     Write("StretchBlt");
  312.  
  313.     return Call(DrvStretchBlt) (psoDest, psoSrc, psoMask, pco, pxlo, pca, pptlHTOrg,
  314.         prclDest, prclSrc, pptlMask, iMode);
  315. }
  316.  
  317.  
  318. BOOL APIENTRY DrvTextOut(SURFOBJ  *pso,
  319.            STROBJ   *pstro,
  320.            FONTOBJ  *pfo,
  321.            CLIPOBJ  *pco,
  322.            RECTL    *prclExtra,
  323.            RECTL    *prclOpaque,
  324.            BRUSHOBJ *pboFore,
  325.            BRUSHOBJ *pboOpaque,
  326.            POINTL   *pptlOrg,
  327.            MIX       mix)
  328. {
  329.     Write("TextOut");
  330.  
  331.     return Call(DrvTextOut) (pso, pstro, pfo, pco, prclExtra, prclOpaque, 
  332.         pboFore, pboOpaque, pptlOrg, mix);
  333. }
  334.