enable.cpp
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:13k
源码类别:

打印编程

开发平台:

Visual C++

  1. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. //  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. //  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. //  PARTICULAR PURPOSE.
  5. //
  6. //  Copyright  1998 - 2003  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  FILE:    Enable.cpp
  9. //
  10. //
  11. //  PURPOSE:  Enable routines for User Mode COM Customization DLL.
  12. //
  13. //
  14. //  Functions:
  15. //          OEMEnableDriver
  16. //          OEMDisableDriver
  17. //          OEMEnablePDEV
  18. //          OEMResetPDEV
  19. //          OEMDisablePDEV
  20. //
  21. //
  22. //
  23. //
  24. //  PLATFORMS:  Windows XP, Windows Server 2003, Windows codenamed Longhorn
  25. //
  26. //
  27. //  History:
  28. //          06/24/03    xxx created.
  29. //
  30. //
  31. #include "precomp.h"
  32. #include <PRCOMOEM.H>
  33. #include "debug.h"
  34. #include "bitmap.h"
  35. #include "ddihook.h"
  36. #include "log_file.h"
  37. // ==================================================================
  38. // The purpose of this array is to inform UNIDRV of the callbacks
  39. // that are implemented in this driver.
  40. //
  41. // Note that there is *NO* order dependency in this array. New
  42. // index values and their corresponding callbacks can be placed
  43. // anywhere within the list as needed.
  44. //
  45. static const DRVFN s_aOemHookFuncs[] =
  46. #if defined(DDIS_HAVE_BEEN_IMPL)
  47. {
  48.     // The following are defined in ddihook.cpp.
  49.     //
  50. #if defined(IMPL_ALPHABLEND)
  51.     {INDEX_DrvAlphaBlend, (PFN)OEMAlphaBlend},
  52. #endif
  53. #if defined(IMPL_BITBLT)
  54.     {INDEX_DrvBitBlt, (PFN)OEMBitBlt},
  55. #endif
  56. #if defined(IMPL_COPYBITS)
  57.     {INDEX_DrvCopyBits, (PFN)OEMCopyBits},
  58. #endif
  59. #if defined(IMPL_DITHERCOLOR)
  60.     {INDEX_DrvDitherColor, (PFN)OEMDitherColor},
  61. #endif
  62. #if defined(IMPL_FILLPATH)
  63.     {INDEX_DrvFillPath, (PFN)OEMFillPath},
  64. #endif
  65. #if defined(IMPL_FONTMANAGEMENT)
  66.     {INDEX_DrvFontManagement, (PFN)OEMFontManagement},
  67. #endif
  68. #if defined(IMPL_GETGLYPHMODE)
  69.     {INDEX_DrvGetGlyphMode, (PFN)OEMGetGlyphMode},
  70. #endif
  71. #if defined(IMPL_GRADIENTFILL)
  72.     {INDEX_DrvGradientFill, (PFN)OEMGradientFill},
  73. #endif
  74. #if defined(IMPL_LINETO)
  75.     {INDEX_DrvLineTo, (PFN)OEMLineTo},
  76. #endif
  77. #if defined(IMPL_PAINT)
  78.     {INDEX_DrvPaint, (PFN)OEMPaint},
  79. #endif
  80. #if defined(IMPL_PLGBLT)
  81.     {INDEX_DrvPlgBlt, (PFN)OEMPlgBlt},
  82. #endif
  83. #if defined(IMPL_QUERYADVANCEWIDTHS)
  84.     {INDEX_DrvQueryAdvanceWidths, (PFN)OEMQueryAdvanceWidths},
  85. #endif
  86. #if defined(IMPL_QUERYFONT)
  87.     {INDEX_DrvQueryFont, (PFN)OEMQueryFont},
  88. #endif
  89. #if defined(IMPL_QUERYFONTDATA)
  90.     {INDEX_DrvQueryFontData, (PFN)OEMQueryFontData},
  91. #endif
  92. #if defined(IMPL_QUERYFONTTREE)
  93.     {INDEX_DrvQueryFontTree, (PFN)OEMQueryFontTree},
  94. #endif
  95. #if defined(IMPL_REALIZEBRUSH)
  96.     {INDEX_DrvRealizeBrush, (PFN)OEMRealizeBrush},
  97. #endif
  98. #if defined(IMPL_STRETCHBLT)
  99.     {INDEX_DrvStretchBlt, (PFN)OEMStretchBlt},
  100. #endif
  101. #if defined(IMPL_STRETCHBLTROP)
  102.     {INDEX_DrvStretchBltROP, (PFN)OEMStretchBltROP},
  103. #endif
  104. #if defined(IMPL_STROKEANDFILLPATH)
  105.     {INDEX_DrvStrokeAndFillPath, (PFN)OEMStrokeAndFillPath},
  106. #endif
  107. #if defined(IMPL_STROKEPATH)
  108.     {INDEX_DrvStrokePath, (PFN)OEMStrokePath},
  109. #endif
  110. #if defined(IMPL_TEXTOUT)
  111.     {INDEX_DrvTextOut, (PFN)OEMTextOut},
  112. #endif
  113. #if defined(IMPL_TRANSPARENTBLT)
  114.     {INDEX_DrvTransparentBlt, (PFN)OEMTransparentBlt},
  115. #endif
  116. #if defined(IMPL_STARTDOC)
  117.     {INDEX_DrvStartDoc, (PFN)OEMStartDoc},
  118. #endif
  119. #if defined(IMPL_ENDDOC)
  120.     {INDEX_DrvEndDoc, (PFN)OEMEndDoc},
  121. #endif
  122. #if defined(IMPL_STARTPAGE)
  123.     {INDEX_DrvStartPage, (PFN)OEMStartPage},
  124. #endif
  125. #if defined(IMPL_SENDPAGE)
  126.     {INDEX_DrvSendPage, (PFN)OEMSendPage},
  127. #endif
  128. #if defined(IMPL_STARTBANDING)
  129.     {INDEX_DrvStartBanding, (PFN)OEMStartBanding},
  130. #endif
  131. #if defined(IMPL_NEXTBAND)
  132.     {INDEX_DrvNextBand, (PFN)OEMNextBand},
  133. #endif
  134. #if defined(IMPL_ESCAPE)
  135.     {INDEX_DrvEscape, (PFN)OEMEscape},
  136. #endif
  137. };
  138. #else
  139.     // No DDI hooks have been enabled. This is provided to eliminate
  140.     // a compiler error.
  141. {
  142.     {0,NULL}
  143. };
  144. #endif
  145. BOOL APIENTRY
  146. OEMEnableDriver(
  147.     DWORD               dwOEMintfVersion,
  148.     DWORD               dwSize,
  149.     PDRVENABLEDATA      pded
  150.     )
  151. /*++
  152. Routine Description:
  153.     Implementation of IPrintOemUni::EnableDriver.
  154.     OEMEnableDriver is called by IPrintOemUni::EnableDriver
  155.     which is defined in intrface.cpp.
  156.     The IPrintOemUni::EnableDriver method allows a rendering
  157.     plug-in to perform the same types of operations as the
  158.     DrvEnableDriver function. Like the DrvEnableDriver function,
  159.     the IPrintOemUni::EnableDriver method is responsible for
  160.     providing addresses of internally supported graphics DDI functions,
  161.     or DDI hook functions.
  162.     The method should fill the supplied DRVENABLEDATA structure
  163.     and allocate an array of DRVFN structures. It should fill the
  164.     array with pointers to hooking functions, along with winddi.h-defined
  165.     index values that identify the hooked out graphics DDI functions.
  166.     Please refer to DDK documentation for more details.
  167. Arguments:
  168.     IN DriverVersion - interface version number. This value is defined
  169.                     by PRINTER_OEMINTF_VERSION, in printoem.h.
  170.     IN cbSize - size, in bytes, of the structure pointed to by pded.
  171.     OUT pded - pointer to a DRVENABLEDATA structure. Fill this structure
  172.             with pointers to the DDI hook functions.
  173. Return Value:
  174.     TRUE if successful, FALSE if there is an error
  175. --*/
  176. {
  177.     OEMDBG(DBG_VERBOSE, L"OEMEnableDriver entry.");
  178.     UNREFERENCED_PARAMETER(dwOEMintfVersion);
  179.     UNREFERENCED_PARAMETER(dwSize);
  180.     // We need to return the DDI functions that have been hooked
  181.     // in pded. Here we fill out the fields in pded.
  182.     //
  183.     pded->iDriverVersion =  PRINTER_OEMINTF_VERSION;
  184.     pded->c = sizeof(s_aOemHookFuncs) / sizeof(DRVFN);
  185.     pded->pdrvfn = (DRVFN *) s_aOemHookFuncs;
  186.     return TRUE;
  187. }
  188. VOID APIENTRY
  189. OEMDisableDriver(
  190.     VOID
  191.     )
  192. /*++
  193. Routine Description:
  194.     Implementation of IPrintOemUni::DisableDriver.
  195.     OEMDisableDriver is called by IPrintOemUni::DisableDriver
  196.     which is defined in intrface.cpp.
  197.     The IPrintOemUni::DisableDriver method allows a rendering
  198.     plug-in for Unidrv to free resources that were allocated by the
  199.     plug-in's IPrintOemUni::EnableDriver method. This is the last
  200.     IPrintOemUni interface method that is called before the rendering
  201.     plug-in is unloaded.
  202.     Please refer to DDK documentation for more details.
  203. Arguments:
  204.     NONE
  205. Return Value:
  206.     NONE
  207. --*/
  208. {
  209.     OEMDBG(DBG_VERBOSE, L"OEMDisableDriver entry.");
  210.     // Do any cleanup stuff here
  211.     //
  212. }
  213. PDEVOEM APIENTRY
  214. OEMEnablePDEV(
  215.     PDEVOBJ             pdevobj,
  216.     __in PWSTR          pPrinterName,
  217.     ULONG               cPatterns,
  218.     HSURF               *phsurfPatterns,
  219.     ULONG               cjGdiInfo,
  220.     GDIINFO             *pGdiInfo,
  221.     ULONG               cjDevInfo,
  222.     DEVINFO             *pDevInfo,
  223.     DRVENABLEDATA       *pded       // Unidrv's hook table
  224.     )
  225. /*++
  226. Routine Description:
  227.     Implementation of IPrintOemUni::EnablePDEV.
  228.     OEMEnablePDEV is    called by IPrintOemUni::EnablePDEV
  229.     which is defined in intrface.cpp.
  230.     The IPrintOemUni::EnablePDEV method performs the same types
  231.     of operations as the DrvEnablePDEV function that is exported
  232.     by a printer graphics DLL. Its purpose is to allow a rendering
  233.     plug-in to create its own PDEV structure. For more information
  234.     about PDEV structures, see "Customized PDEV Structures" in the DDK docs.
  235.     Please refer to DDK documentation for more details.
  236. Arguments:
  237.     IN pdevobj - pointer to a DEVOBJ structure.
  238.     IN pPrinterName - pointer to a text string representing the logical
  239.                     address of the printer.
  240.     IN cPatterns - value representing the number of HSURF-typed
  241.                 surface handles contained in the buffer pointed to
  242.                 by phsurfPatterns.
  243.     IN phsurfPatterns - pointer to a buffer that is large enough to
  244.                     contain cPatterns number of HSURF-typed
  245.                     surface handles.
  246.     IN cjGdiInfo - value representing the size of the structure pointed
  247.                 to by pGdiInfo.
  248.     IN pGdiInfo - pointer to a GDIINFO structure.
  249.     IN cjDevInfo - value representing the size of the structure pointed
  250.                 to by pDevInfo.
  251.     IN pDevInfo - pointer to a DEVINFO structure.
  252.     IN pded - pointer to a DRVENABLEDATA structure containing the
  253.             addresses of the printer driver's graphics DDI hooking functions.
  254. Return Value:
  255.     OUT pDevOem - pointer to a private PDEV structure.
  256.     Return NULL if error occurs.
  257. --*/
  258. {
  259.     OEMDBG(DBG_VERBOSE, L"OEMEnablePDEV entry.");
  260.     UNREFERENCED_PARAMETER(pdevobj);
  261.     UNREFERENCED_PARAMETER(pPrinterName);
  262.     UNREFERENCED_PARAMETER(cPatterns);
  263.     UNREFERENCED_PARAMETER(phsurfPatterns);
  264.     UNREFERENCED_PARAMETER(cjGdiInfo);
  265.     UNREFERENCED_PARAMETER(cjDevInfo);
  266.     // Allocate an instance of our private PDEV.
  267.     //
  268.     POEMPDEV pOemPDEV = new COemPDEV();
  269.     if (NULL == pOemPDEV)
  270.     {
  271.         return NULL;
  272.     }
  273.     pOemPDEV->InitializeDDITable(pded);
  274.     DBG_GDIINFO(DBG_VERBOSE, L"pGdiInfo", pGdiInfo);
  275.     DBG_DEVINFO(DBG_VERBOSE, L"pDevInfo", pDevInfo);
  276.     // Initializing private oempdev stuff
  277.     //
  278.     pOemPDEV->bHeadersFilled = FALSE;
  279.     pOemPDEV->bColorTable = FALSE;
  280.     pOemPDEV->cbHeaderOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  281.     pOemPDEV->bmInfoHeader.biHeight = 0;
  282.     pOemPDEV->bmInfoHeader.biSizeImage = 0;
  283.     pOemPDEV->pBufStart = NULL;
  284.     pOemPDEV->dwBufSize = 0;
  285.     pOemPDEV->pages = 0;
  286.     // We create a BGR palette for 24bpp so that we can avoid color byte order manipulation
  287.     //
  288.     if (pGdiInfo->cBitsPixel == 24)
  289.         pDevInfo->hpalDefault = EngCreatePalette(PAL_BGR, 0, 0, 0, 0, 0);
  290.     // Store the handle to the default palette so that we can fill the color table later
  291.     //
  292.     pOemPDEV->hpalDefault = pDevInfo->hpalDefault;
  293.     write_log( 3, _T("OEMEnablePDEV"), _T("pointer:%d"), pOemPDEV);
  294.     return pOemPDEV;
  295. }
  296. BOOL APIENTRY
  297. OEMResetPDEV(
  298.     PDEVOBJ     pdevobjOld,
  299.     PDEVOBJ     pdevobjNew
  300.     )
  301. /*++
  302. Routine Description:
  303.     Implementation of IPrintOemUni::ResetPDEV.
  304.     OEMResetPDEV is called by IPrintOemUni::ResetPDEV
  305.     which is defined in intrface.cpp.
  306.     A rendering plug-in's IPrintOemUni::ResetPDEV method performs
  307.     the same types of operations as the DrvResetPDEV function. During
  308.     the processing of an application's call to the Platform SDK ResetDC
  309.     function, the IPrintOemUni::ResetPDEV method is called by Unidrv's
  310.     DrvResetPDEV function. For more information about when DrvResetPDEV
  311.     is called, see its description in the DDK docs.
  312.     The rendering plug-in's private PDEV structure's address is contained
  313.     in the pdevOEM member of the DEVOBJ structure pointed to by pdevobjOld.
  314.     The IPrintOemUni::ResetPDEV method should use relevant members of this
  315.     old structure to fill in the new structure, which is referenced through pdevobjNew.
  316.     Please refer to DDK documentation for more details.
  317. Arguments:
  318.     IN pdevobjOld - pointer to a DEVOBJ structure containing
  319.                 current PDEV information.
  320.     OUT pdevobjNew - pointer to a DEVOBJ structure into which
  321.                 the method should place new PDEV information.
  322. Return Value:
  323.     TRUE if successful, FALSE if there is an error
  324. --*/
  325. {
  326.     OEMDBG(DBG_VERBOSE, L"OEMResetPDEV entry.");
  327.     UNREFERENCED_PARAMETER(pdevobjOld);
  328.     UNREFERENCED_PARAMETER(pdevobjNew);
  329.     return TRUE;
  330. }
  331. VOID APIENTRY
  332. OEMDisablePDEV(
  333.     PDEVOBJ     pdevobj
  334.     )
  335. /*++
  336. Routine Description:
  337.     Implementation of IPrintOemUni::DisablePDEV.
  338.     OEMDisablePDEV is called by IPrintOemUni::DisablePDEV
  339.     which is defined in intrface.cpp.
  340.     The IPrintOemUni::DisablePDEV method performs the same types of
  341.     operations as the DrvDisablePDEV function. Its purpose is to allow a
  342.     rendering plug-in to delete the private PDEV structure that is pointed
  343.     to by the DEVOBJ structure's pdevOEM member. This PDEV structure
  344.     is one that was allocated by the plug-in's IPrintOemUni::EnablePDEV method.
  345.     Please refer to DDK documentation for more details.
  346. Arguments:
  347.     IN pdevobj - pointer to a DEVOBJ structure.
  348. Return Value:
  349.     NONE
  350. --*/
  351. {
  352.     OEMDBG(DBG_VERBOSE, L"OEMDisablePDEV entry.");
  353.     // Release our COemPDEV instance created by the call to
  354.     // EnablePDEV.
  355.     //
  356.     POEMPDEV pOemPDEV = (POEMPDEV)pdevobj->pdevOEM;
  357.     write_log( 3, _T("OEMDisablePDEV"), _T("pointer:%d pages:%d buffer:%d"), pOemPDEV, pOemPDEV->pages, pOemPDEV->pBufStart );
  358.     delete pOemPDEV;
  359.     pOemPDEV = NULL;
  360. }