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.
437 lines
14 KiB
437 lines
14 KiB
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
// PARTICULAR PURPOSE.
|
|
//
|
|
// Copyright 1997-2003 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// FILE: TTYUD.cpp
|
|
//
|
|
//
|
|
// PURPOSE: Main file for TTY kernel mode module.
|
|
//
|
|
//
|
|
// Functions:
|
|
//
|
|
//
|
|
//
|
|
//
|
|
// PLATFORMS: Windows 2000, Windows XP, Windows Server 2003
|
|
//
|
|
//
|
|
|
|
#include <stdarg.h>
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h>
|
|
#include <windef.h>
|
|
#include <winerror.h>
|
|
#include <winbase.h>
|
|
#include <wingdi.h>
|
|
#include <winspool.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <winddi.h>
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
#include <tchar.h>
|
|
#include <excpt.h>
|
|
|
|
|
|
#include <PRINTOEM.H>
|
|
|
|
#include "ttyui.h"
|
|
#include "TTYUD.h"
|
|
#include "debug.h"
|
|
#include <STRSAFE.H>
|
|
|
|
DWORD gdwDrvMemPoolTag = 'Oem5'; // for MemAlloc debugging purposes
|
|
|
|
|
|
|
|
#define TTY_INFO_MARGINS 1
|
|
#define TTY_INFO_CODEPAGE 2
|
|
#define TTY_INFO_NUM_UFMS 3
|
|
#define TTY_INFO_UFM_IDS 4
|
|
|
|
#define NUM_UFMS 3 // for internal use only. use TTY_INFO_NUM_UFMS
|
|
// to query number of font sizes supported.
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////
|
|
// INTERNAL PROTOTYPES
|
|
////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
BOOL APIENTRY OEMGetInfo(IN DWORD dwInfo, OUT PVOID pBuffer, IN DWORD cbSize,
|
|
OUT PDWORD pcbNeeded) ;
|
|
PDEVOEM APIENTRY OEMEnablePDEV(PDEVOBJ pdevobj, PWSTR pPrinterName, ULONG cPatterns,
|
|
HSURF *phsurfPatterns, ULONG cjGdiInfo, GDIINFO *pGdiInfo,
|
|
ULONG cjDevInfo, DEVINFO *pDevInfo, DRVENABLEDATA *pded) ;
|
|
VOID APIENTRY OEMDisablePDEV(PDEVOBJ pdevobj) ;
|
|
BOOL APIENTRY OEMEnableDriver(DWORD dwOEMintfVersion, DWORD dwSize, PDRVENABLEDATA pded) ;
|
|
|
|
|
|
PBYTE APIENTRY OEMImageProcessing(PDEVOBJ pdevobj, PBYTE pSrcBitmap, PBITMAPINFOHEADER pBitmapInfo,
|
|
PBYTE pColorTable, DWORD dwCallbackID, PIPPARAMS pIPParams) ;
|
|
|
|
BOOL APIENTRY OEMFilterGraphics(PDEVOBJ pdevobj, PBYTE pBuf, DWORD dwLen) ;
|
|
|
|
|
|
|
|
|
|
// Need to export these functions as c declarations.
|
|
extern "C" {
|
|
|
|
|
|
PBYTE APIENTRY OEMImageProcessing(PDEVOBJ pdevobj, PBYTE pSrcBitmap, PBITMAPINFOHEADER pBitmapInfo,
|
|
PBYTE pColorTable, DWORD dwCallbackID, PIPPARAMS pIPParams)
|
|
{
|
|
VERBOSE(DLLTEXT("OEMImageProcessing() entry.\r\n"));
|
|
|
|
return ((PBYTE)TRUE);
|
|
}
|
|
|
|
|
|
BOOL APIENTRY OEMFilterGraphics(PDEVOBJ pdevobj, PBYTE pBuf, DWORD dwLen)
|
|
{
|
|
VERBOSE(DLLTEXT("OEMFilterGraphics() entry.\r\n"));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL APIENTRY OEMGetInfo(IN DWORD dwInfo, OUT PVOID pBuffer, IN DWORD cbSize,
|
|
OUT PDWORD pcbNeeded)
|
|
{
|
|
|
|
// Validate parameters.
|
|
if( ( (OEMGI_GETSIGNATURE != dwInfo)
|
|
&&
|
|
(OEMGI_GETINTERFACEVERSION != dwInfo)
|
|
&&
|
|
(OEMGI_GETVERSION != dwInfo)
|
|
)
|
|
||
|
|
(NULL == pcbNeeded)
|
|
)
|
|
{
|
|
VERBOSE(ERRORTEXT("OEMGetInfo() ERROR_INVALID_PARAMETER.\r\n"));
|
|
|
|
// Did not write any bytes.
|
|
if(NULL != pcbNeeded)
|
|
*pcbNeeded = 0;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
// Need/wrote 4 bytes.
|
|
*pcbNeeded = 4;
|
|
|
|
// Validate buffer size. Minimum size is four bytes.
|
|
if( (NULL == pBuffer)
|
|
||
|
|
(4 > cbSize)
|
|
)
|
|
{
|
|
// VERBOSE(ERRORTEXT("OEMGetInfo() ERROR_INSUFFICIENT_BUFFER.\r\n"));
|
|
|
|
EngSetLastError(ERROR_INSUFFICIENT_BUFFER);
|
|
return FALSE;
|
|
}
|
|
|
|
// Write information to buffer.
|
|
switch(dwInfo)
|
|
{
|
|
case OEMGI_GETSIGNATURE:
|
|
*(LPDWORD)pBuffer = OEM_SIGNATURE;
|
|
break;
|
|
|
|
case OEMGI_GETINTERFACEVERSION:
|
|
*(LPDWORD)pBuffer = PRINTER_OEMINTF_VERSION;
|
|
break;
|
|
|
|
case OEMGI_GETVERSION:
|
|
*(LPDWORD)pBuffer = OEM_VERSION;
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
PDEVOEM APIENTRY OEMEnablePDEV(PDEVOBJ pdevobj, PWSTR pPrinterName, ULONG cPatterns,
|
|
HSURF *phsurfPatterns, ULONG cjGdiInfo, GDIINFO *pGdiInfo,
|
|
ULONG cjDevInfo, DEVINFO *pDevInfo, DRVENABLEDATA *pded)
|
|
{
|
|
PREGSTRUCT pMyStuff; // sebset of pGlobals
|
|
DWORD dwStatus, cbNeeded, dwType ;
|
|
LPTSTR pValueName = TEXT("TTY DeviceConfig");
|
|
// these strings must match strings in oemui.cpp - VinitMyStuff()
|
|
|
|
VERBOSE(DLLTEXT("OEMEnablePDEV() entry.\r\n"));
|
|
|
|
pMyStuff = (PREGSTRUCT)MemAlloc(sizeof(REGSTRUCT)) ;
|
|
if(!pMyStuff)
|
|
return ((PDEVOEM)NULL) ; // failed.
|
|
|
|
pdevobj->pdevOEM = (PDEVOEM)pMyStuff ;
|
|
|
|
dwStatus = EngGetPrinterData(
|
|
pdevobj->hPrinter, // handle of printer object
|
|
pValueName, // address of value name
|
|
&dwType, // address receiving value type
|
|
(LPBYTE)pMyStuff,
|
|
// address of array of bytes that receives data
|
|
sizeof(REGSTRUCT), // size, in bytes, of array
|
|
&cbNeeded // address of variable
|
|
// with number of bytes retrieved (or required)
|
|
);
|
|
if (dwStatus != ERROR_SUCCESS || pMyStuff->dwVersion != TTYSTRUCT_VER
|
|
|| dwType != REG_BINARY
|
|
|| cbNeeded != sizeof(REGSTRUCT))
|
|
{
|
|
// Init secret block with defaults
|
|
|
|
pMyStuff->dwVersion = TTYSTRUCT_VER ;
|
|
// version stamp to avoid incompatible structures.
|
|
|
|
pMyStuff->bIsMM = TRUE ; // default to mm units
|
|
// read margin values from registry and store into temp RECT
|
|
|
|
pMyStuff->iCodePage = 1252 ; // keep in sync with oemui.cpp - VinitMyStuff()
|
|
pMyStuff->rcMargin.left = pMyStuff->rcMargin.top =
|
|
pMyStuff->rcMargin.right = pMyStuff->rcMargin.bottom = 0 ;
|
|
pMyStuff->BeginJob.dwLen =
|
|
pMyStuff->EndJob.dwLen =
|
|
pMyStuff->PaperSelect.dwLen =
|
|
pMyStuff->FeedSelect.dwLen =
|
|
pMyStuff->Sel_10_cpi.dwLen =
|
|
pMyStuff->Sel_12_cpi.dwLen =
|
|
pMyStuff->Sel_17_cpi.dwLen =
|
|
pMyStuff->Bold_ON.dwLen =
|
|
pMyStuff->Bold_OFF.dwLen =
|
|
pMyStuff->Underline_ON.dwLen =
|
|
pMyStuff->Underline_OFF.dwLen = 0 ;
|
|
|
|
// more fields here!
|
|
pMyStuff->dwGlyphBufSiz =
|
|
pMyStuff->dwSpoolBufSiz = 0 ;
|
|
pMyStuff->aubGlyphBuf =
|
|
pMyStuff->aubSpoolBuf = NULL ;
|
|
}
|
|
|
|
return ((PDEVOEM)pMyStuff) ;
|
|
}
|
|
|
|
|
|
VOID APIENTRY OEMDisablePDEV(PDEVOBJ pdevobj)
|
|
{
|
|
VERBOSE(DLLTEXT("OEMDisablePDEV() entry.\r\n"));
|
|
|
|
PREGSTRUCT pMyStuff; // sebset of pGlobals
|
|
|
|
pMyStuff = (PREGSTRUCT)pdevobj->pdevOEM ;
|
|
if(pMyStuff->aubGlyphBuf)
|
|
MemFree(pMyStuff->aubGlyphBuf) ;
|
|
if(pMyStuff->aubSpoolBuf)
|
|
MemFree(pMyStuff->aubSpoolBuf) ;
|
|
MemFree(pdevobj->pdevOEM);
|
|
}
|
|
|
|
|
|
BOOL APIENTRY OEMEnableDriver(DWORD dwOEMintfVersion, DWORD dwSize, PDRVENABLEDATA pded)
|
|
{
|
|
VERBOSE(DLLTEXT("OEMEnableDriver() entry.\r\n"));
|
|
|
|
// Validate paramters.
|
|
if( (PRINTER_OEMINTF_VERSION != dwOEMintfVersion) ||
|
|
// above check not needed for COM
|
|
(sizeof(DRVENABLEDATA) > dwSize)
|
|
||
|
|
(NULL == pded)
|
|
)
|
|
{
|
|
// VERBOSE(ERRORTEXT("OEMEnableDriver() ERROR_INVALID_PARAMETER.\r\n"));
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
pded->iDriverVersion = PRINTER_OEMINTF_VERSION ; // not DDI_DRIVER_VERSION;
|
|
pded->c = 0;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL APIENTRY OEMTTYGetInfo(PDEVOBJ pdevobj, DWORD dwInfoIndex,
|
|
PVOID pOutBuf, DWORD dwSize, DWORD *pcbNeeded
|
|
)
|
|
{
|
|
PREGSTRUCT pMyStuff; // sebset of pGlobals
|
|
REGSTRUCT MyStuff; // temp structure to hold registry data
|
|
|
|
pMyStuff = (PREGSTRUCT)pdevobj->pdevOEM ;
|
|
|
|
if(!pMyStuff)
|
|
{
|
|
DWORD dwStatus, cbNeeded, dwType ;
|
|
LPTSTR pValueName = TEXT("TTY DeviceConfig");
|
|
// these strings must match strings in oemui.cpp - VinitMyStuff()
|
|
// and OEMEnablePDEV()
|
|
|
|
pMyStuff = &MyStuff;
|
|
|
|
pMyStuff->dwVersion = 0 ;
|
|
|
|
dwStatus = EngGetPrinterData(
|
|
pdevobj->hPrinter, // handle of printer object
|
|
pValueName, // address of value name
|
|
&dwType, // address receiving value type
|
|
(LPBYTE)pMyStuff ,
|
|
// address of array of bytes that receives data
|
|
sizeof(REGSTRUCT), // size, in bytes, of array
|
|
&cbNeeded // address of variable
|
|
// with number of bytes retrieved (or required)
|
|
);
|
|
if (dwStatus != ERROR_SUCCESS || pMyStuff->dwVersion != TTYSTRUCT_VER
|
|
|| dwType != REG_BINARY
|
|
|| cbNeeded != sizeof(REGSTRUCT))
|
|
{
|
|
// set to defaults
|
|
pMyStuff->iCodePage = 1252 ; // keep in sync with oemui.cpp - VinitMyStuff()
|
|
pMyStuff->rcMargin.left = pMyStuff->rcMargin.top =
|
|
pMyStuff->rcMargin.right = pMyStuff->rcMargin.bottom = 0 ;
|
|
}
|
|
}
|
|
|
|
switch (dwInfoIndex)
|
|
{
|
|
case TTY_INFO_MARGINS:
|
|
*pcbNeeded = sizeof(RECT) ;
|
|
if(!pOutBuf || dwSize < *pcbNeeded)
|
|
return(FALSE) ;
|
|
*(LPRECT)pOutBuf = pMyStuff->rcMargin ;
|
|
break;
|
|
case TTY_INFO_CODEPAGE:
|
|
*pcbNeeded = sizeof(INT) ;
|
|
if(!pOutBuf || dwSize < *pcbNeeded)
|
|
return(FALSE) ;
|
|
*(INT *)pOutBuf = pMyStuff->iCodePage ;
|
|
break;
|
|
case TTY_INFO_NUM_UFMS:
|
|
*pcbNeeded = sizeof(DWORD) ;
|
|
if(!pOutBuf || dwSize < *pcbNeeded)
|
|
return(FALSE) ;
|
|
*(DWORD *)pOutBuf = NUM_UFMS ; // Number of resource IDs returned
|
|
// during a query for TTY_INFO_UFM_IDS
|
|
break;
|
|
case TTY_INFO_UFM_IDS:
|
|
// return resource IDs of the UFMs for 10,12, 17 cpi fonts.
|
|
*pcbNeeded = NUM_UFMS * sizeof(DWORD) ;
|
|
if(!pOutBuf || dwSize < *pcbNeeded)
|
|
return(FALSE) ;
|
|
switch(pMyStuff->iCodePage)
|
|
{
|
|
|
|
case (-1): // codepage 437
|
|
((DWORD *)pOutBuf)[0] = 4 ; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 5;
|
|
((DWORD *)pOutBuf)[2] = 6;
|
|
break;
|
|
case (850): // codepage 850
|
|
((DWORD *)pOutBuf)[0] = 7; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 8;
|
|
((DWORD *)pOutBuf)[2] = 9;
|
|
break;
|
|
|
|
case (-3): // codepage 863
|
|
((DWORD *)pOutBuf)[0] = 7; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 8;
|
|
((DWORD *)pOutBuf)[2] = 9;
|
|
break;
|
|
|
|
case (-17): // codepage 932
|
|
((DWORD *)pOutBuf)[0] = 13 ; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 14 ;
|
|
((DWORD *)pOutBuf)[2] = 15 ;
|
|
break;
|
|
case (-16): // codepage 936
|
|
((DWORD *)pOutBuf)[0] = 16 ; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 17 ;
|
|
((DWORD *)pOutBuf)[2] = 18 ;
|
|
break;
|
|
case (-18): // codepage 949
|
|
((DWORD *)pOutBuf)[0] = 19 ; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 20 ;
|
|
((DWORD *)pOutBuf)[2] = 21 ;
|
|
break;
|
|
case (-10): // codepage 950
|
|
((DWORD *)pOutBuf)[0] = 22 ; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 23 ;
|
|
((DWORD *)pOutBuf)[2] = 24 ;
|
|
break;
|
|
case (1250): // codepage 1250
|
|
((DWORD *)pOutBuf)[0] = 25 ; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 26;
|
|
((DWORD *)pOutBuf)[2] = 27;
|
|
break;
|
|
case (1251): // codepage 1251
|
|
((DWORD *)pOutBuf)[0] = 28; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 29;
|
|
((DWORD *)pOutBuf)[2] = 30;
|
|
break;
|
|
case (1252): // codepage 1252
|
|
((DWORD *)pOutBuf)[0] = 31; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 32;
|
|
((DWORD *)pOutBuf)[2] = 33;
|
|
break;
|
|
case (1253): // codepage 1253
|
|
((DWORD *)pOutBuf)[0] = 34 ; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 35;
|
|
((DWORD *)pOutBuf)[2] = 36;
|
|
break;
|
|
case (1254): // codepage 1254
|
|
((DWORD *)pOutBuf)[0] = 37 ; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 38;
|
|
((DWORD *)pOutBuf)[2] = 39;
|
|
break;
|
|
case (852): // codepage 852
|
|
((DWORD *)pOutBuf)[0] = 40 ; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 41;
|
|
((DWORD *)pOutBuf)[2] = 42;
|
|
|
|
break;
|
|
case (857): // codepage 857
|
|
((DWORD *)pOutBuf)[0] = 43 ; // see tty\rc\tty.rc for resID assignments
|
|
((DWORD *)pOutBuf)[1] = 44;
|
|
((DWORD *)pOutBuf)[2] = 45;
|
|
|
|
break;
|
|
default:
|
|
((DWORD *)pOutBuf)[0] = 1 ; // '10 cpi'
|
|
((DWORD *)pOutBuf)[1] = 2 ; // '12 cpi'
|
|
((DWORD *)pOutBuf)[2] = 3 ; // '17 cpi'
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
*pcbNeeded = 0 ; // no data availible
|
|
return(FALSE) ; // unsupported index
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
} // End of extern "C"
|