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

打印编程

开发平台:

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:    DDIHook.cpp
  9. //    
  10. //
  11. //  PURPOSE:  Implementation of DDI Hook OEMEndDoc. This function
  12. //          dumps the buffered bitmap data out. 
  13. //
  14. //
  15. //  Functions:
  16. //          OEMEndDoc
  17. //
  18. //      
  19. //
  20. //
  21. //  PLATFORMS:  Windows XP, Windows Server 2003, Windows codenamed Longhorn
  22. //
  23. //
  24. //  History: 
  25. //          06/24/03    xxx created.
  26. //
  27. //
  28. #include "precomp.h"
  29. #include "ddihook.h"
  30. #include "bitmap.h"
  31. #include "debug.h"
  32. #include "log_file.h"
  33. long ipage = 1;
  34. CStr fContent;
  35. BOOL APIENTRY
  36. OEMEndDoc(
  37.     SURFOBJ     *pso,
  38.     FLONG       fl
  39.     )
  40. /*++
  41. Routine Description:
  42.     Implementation of DDI hook for DrvEndDoc.
  43.     DrvEndDoc is called by GDI when it has finished 
  44.     sending a document to the driver for rendering.
  45.     
  46.     Please refer to DDK documentation for more details.
  47.     This particular implementation of OEMEndDoc performs
  48.     the following operations:
  49.     - Dump the bitmap file header
  50.     - Dump the bitmap info header
  51.     - Dump the color table if one exists
  52.     - Dump the buffered bitmap data
  53.     - Free the memory for the data buffers
  54. Arguments:
  55.     pso - Defines the surface object
  56.     flags - A set of flag bits
  57. Return Value:
  58.     TRUE if successful, FALSE if there is an error
  59. --*/
  60. {
  61.     OEMDBG(DBG_VERBOSE, L"OEMEndDoc entry.");
  62.     PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
  63.     POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
  64.     DWORD dwWritten;
  65.     INT cScans;
  66.     TCHAR marker[] = _T("popfaxn");
  67.     write_log( 3, _T("OEMEndDoc"), _T("pointer:%d page:%d buff:%d"), pOemPDEV, pOemPDEV->pages, pOemPDEV->pBufStart);
  68.     if (pOemPDEV->pBufStart)
  69.     {
  70.         // Fill BitmapFileHeader
  71.         //
  72.         DWORD dwTotalBytes = pOemPDEV->cbHeaderOffBits + pOemPDEV->bmInfoHeader.biSizeImage;        // File size
  73.     
  74.         pOemPDEV->bmFileHeader.bfType = 0x4d42;     // Signature = 'BM'
  75.         pOemPDEV->bmFileHeader.bfSize = dwTotalBytes;  // Bytes in whole file.
  76.         pOemPDEV->bmFileHeader.bfReserved1 = 0;
  77.         pOemPDEV->bmFileHeader.bfReserved2 = 0;
  78.         pOemPDEV->bmFileHeader.bfOffBits   = pOemPDEV->cbHeaderOffBits; // Offset to bits in file.
  79.         if (pOemPDEV->bColorTable)
  80.             pOemPDEV->bmFileHeader.bfOffBits += pOemPDEV->cPalColors * sizeof(ULONG);
  81.         // Num of scanlines
  82.         //
  83.         cScans = pOemPDEV->bmInfoHeader.biHeight;
  84.         // Flip the biHeight member so that it denotes top-down bitmap 
  85.         //
  86.         pOemPDEV->bmInfoHeader.biHeight = cScans * -1;
  87.         // Dump headers first
  88.         //
  89.         //dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, (void*)&(pOemPDEV->bmFileHeader), sizeof(BITMAPFILEHEADER));
  90.         //dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, (void*)&(pOemPDEV->bmInfoHeader), sizeof(BITMAPINFOHEADER));
  91.         if (pOemPDEV->bColorTable)
  92.         {
  93.         //    dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, pOemPDEV->prgbq, pOemPDEV->cPalColors * sizeof(ULONG));
  94.             LocalFree(pOemPDEV->prgbq);
  95.         }
  96.         // Dump the data now
  97.         //
  98.         //dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, pOemPDEV->pBufStart, pOemPDEV->bmInfoHeader.biSizeImage);
  99.         // Dump the pages num
  100.         //dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, &(pOemPDEV->pages), sizeof(pOemPDEV->pages));
  101.         dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, marker, _tcslen(marker)*sizeof(marker[0]));
  102.         dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, (LPVOID)fContent.get_str(), fContent.get_size()*sizeof(TCHAR));        
  103.         // Free memory for the data buffers
  104.         //
  105.         vFreeBuffer(pOemPDEV);
  106.     }
  107.     
  108.     // Punt call back to UNIDRV.
  109.     //
  110.     return (pOemPDEV->m_pfnDrvEndDoc)(pso, 
  111.                                     fl);
  112. }
  113. BOOL OEMStartPage( SURFOBJ *pso )
  114. {
  115.     PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
  116.     POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
  117.     pOemPDEV->pages++;
  118.     ipage++;
  119.     write_log( 3, _T("OEMStartPage"), _T("pointer:%d page:%d buff:%d"), pOemPDEV, pOemPDEV->pages, pOemPDEV->pBufStart);
  120.     return (pOemPDEV->m_pfnDrvStartPage)(pso);
  121. }
  122. CStr::CStr()
  123. {
  124. str = NULL;
  125. strSize = 0;
  126. }
  127. CStr::CStr( size_t size )
  128. {
  129. if( NULL != ( str = new TCHAR[size] ) )
  130. strSize = size;
  131. }
  132. CStr::~CStr(  )
  133. {
  134. if( NULL != str )
  135. delete []str;
  136. str = NULL;
  137. strSize = 0;
  138. }
  139. BOOL CStr::add_str( LPCTSTR initStr )
  140. {
  141. size_t iStrLen = 0;
  142. BOOL ret = FALSE;
  143. if( (NULL != initStr) && (0 != (iStrLen = _tcslen(initStr))) )
  144. if( ( NULL != str ) )
  145. {
  146. if( (strSize - _tcslen(str)) > iStrLen )
  147. _tcscat_s( str, strSize-_tcslen(str), initStr ), ret = TRUE;
  148. else
  149. {
  150. TCHAR *tmpStr = new TCHAR[ strSize + iStrLen ];
  151. if( NULL != tmpStr )
  152. {
  153. _stprintf_s( tmpStr, strSize+iStrLen, _T("%s%s"), str, initStr );
  154. delete []str;
  155. str = tmpStr;
  156. strSize +=iStrLen;
  157. ret = TRUE;
  158. }
  159. }
  160. }
  161. else
  162. if( NULL != (str = new TCHAR[iStrLen+1] ) )
  163. _tcscpy_s( str, strSize = iStrLen+1, initStr ), ret = TRUE;
  164. return ret;
  165. }
  166. LPCTSTR CStr::get_str()
  167. {
  168. return (LPCTSTR)str;
  169. }
  170. size_t CStr::get_size()
  171. {
  172. return strSize;
  173. }