/*============================================================================= * FILENAME: exports.cpp * Copyright (C) 1996-1998 HDE, Inc. All Rights Reserved. HDE Confidential. * Copyright (C) 1999 NEC Technologies, Inc. All Rights Reserved. * * DESCRIPTION: Contains exported functions required to get an OEM plug-in * to work. * NOTES: *============================================================================= */ #include "precomp.h" #include #include #include #include #include "nc46nt.h" #include "oemps.h" /* For OEMEnableDriver */ static const DRVFN OEMHookFuncs[] = { { INDEX_DrvStartDoc, (PFN) OEMStartDoc }, { INDEX_DrvEndDoc, (PFN) OEMEndDoc }, }; /****************************************************************************** * DESCRIPTION: Called by the postscript driver after the dll is loaded * to get plug-in information * *****************************************************************************/ extern "C" BOOL APIENTRY OEMGetInfo( DWORD dwMode, PVOID pBuffer, DWORD cbSize, PDWORD pcbNeeded ) { // Validate parameters. if( NULL == pcbNeeded ) { EngSetLastError(ERROR_INVALID_PARAMETER); return FALSE; } // Set expected buffer size and number of bytes written. *pcbNeeded = sizeof(DWORD); // Check buffer size is sufficient. if((cbSize < *pcbNeeded) || (NULL == pBuffer)) { EngSetLastError(ERROR_INSUFFICIENT_BUFFER); return FALSE; } switch(dwMode) { case OEMGI_GETSIGNATURE: // OEM DLL Signature *(PDWORD)pBuffer = OEM_SIGNATURE; break; case OEMGI_GETVERSION: // OEM DLL version *(PDWORD)pBuffer = OEM_VERSION; break; case OEMGI_GETINTERFACEVERSION: // version the Printer driver supports *(PDWORD)pBuffer = PRINTER_OEMINTF_VERSION; break; case OEMGI_GETPUBLISHERINFO: // fill PUBLISHERINFO structure // fall through to not supported default: // dwMode not supported. // Set written bytes to zero since nothing was written. *pcbNeeded = 0; EngSetLastError(ERROR_NOT_SUPPORTED); return FALSE; } return TRUE; } /****************************************************************************** * DESCRIPTION: Exported function that allows setting of private and public * devmode fields. * NOTE: This function must be in entered under EXPORTS in rntapsui.def to be called *****************************************************************************/ extern "C" BOOL APIENTRY OEMDevMode( DWORD dwMode, POEMDMPARAM pOemDMParam ) { POEMDEV pOEMDevIn; POEMDEV pOEMDevOut; switch(dwMode) // kernel mode rendering dll { case OEMDM_SIZE: // size of oem devmode if( pOemDMParam ) pOemDMParam->cbBufSize = sizeof( OEMDEV ); break; case OEMDM_DEFAULT: // fill oem devmode with default data if( pOemDMParam && pOemDMParam->pOEMDMOut ) { pOEMDevOut = (POEMDEV)pOemDMParam->pOEMDMOut; pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV); pOEMDevOut->dmOEMExtra.dwSignature = OEM_SIGNATURE; pOEMDevOut->dmOEMExtra.dwVersion = OEM_VERSION; } break; case OEMDM_MERGE: // set the public devmode fields case OEMDM_CONVERT: // convert any old oem devmode to new version if( pOemDMParam && pOemDMParam->pOEMDMOut && pOemDMParam->pOEMDMIn ) { pOEMDevIn = (POEMDEV)pOemDMParam->pOEMDMIn; pOEMDevOut = (POEMDEV)pOemDMParam->pOEMDMOut; if( pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature ) { // wcscpy( pOEMDevOut->szUserName, pOEMDevIn->szUserName ); StringCbCopy( pOEMDevOut->szUserName, sizeof(pOEMDevOut->szUserName), pOEMDevIn->szUserName ); } } break; } return( TRUE ); } /****************************************************************************** * DESCRIPTION: Windows dll required entry point function. * *****************************************************************************/ extern "C" BOOL WINAPI DllInitialize(ULONG ulReason) { switch(ulReason) { case DLL_PROCESS_ATTACH: break; case DLL_THREAD_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_DETACH: break; } return( TRUE ); } extern "C" VOID APIENTRY OEMDisableDriver() { // DebugMsg(DLLTEXT("OEMDisableDriver() entry.\r\n")); } extern "C" BOOL APIENTRY OEMEnableDriver(DWORD dwOEMintfVersion, DWORD dwSize, PDRVENABLEDATA pded) { // DebugMsg(DLLTEXT("OEMEnableDriver() entry.\r\n")); // List DDI functions that are hooked. pded->iDriverVersion = PRINTER_OEMINTF_VERSION; pded->c = sizeof(OEMHookFuncs) / sizeof(DRVFN); pded->pdrvfn = (DRVFN *) OEMHookFuncs; return TRUE; } extern "C" PDEVOEM APIENTRY OEMEnablePDEV( PDEVOBJ pdevobj, PWSTR pPrinterName, ULONG cPatterns, HSURF *phsurfPatterns, ULONG cjGdiInfo, GDIINFO *pGdiInfo, ULONG cjDevInfo, DEVINFO *pDevInfo, DRVENABLEDATA *pded // Unidrv's hook table ) { POEMPDEV poempdev; INT i, j; DWORD dwDDIIndex; PDRVFN pdrvfn; // // Allocate the OEMDev // // poempdev = new OEMPDEV; poempdev = (POEMPDEV) EngAllocMem(FL_ZERO_MEMORY, sizeof(OEMPDEV), OEM_SIGNATURE); if (NULL == poempdev) { return NULL; } // // Allocate memory for poempdev->szDocName // poempdev->szDocName = (char *) EngAllocMem(FL_ZERO_MEMORY, NEC_DOCNAME_BUF_LEN+2, OEM_SIGNATURE); if (NULL == poempdev->szDocName) { return NULL; } /* MMM */ // // Allocate memory for poempdev->pPrinterName poempdev->pPrinterName = (PWSTR) EngAllocMem(FL_ZERO_MEMORY, (wcslen(pPrinterName)+1)*sizeof(WCHAR), OEM_SIGNATURE); if (NULL == poempdev->pPrinterName) { return NULL; } /* MMM */ // // Fill in OEMDEV as you need // // _tcscpy(poempdev->pPrinterName, pPrinterName); /* MMM */ StringCbCopy( poempdev->pPrinterName, sizeof(poempdev->pPrinterName), pPrinterName); // // Fill in OEMDEV // for (i = 0; i < MAX_DDI_HOOKS; i++) { // // search through Unidrv's hooks and locate the function ptr // dwDDIIndex = OEMHookFuncs[i].iFunc; for (j = pded->c, pdrvfn = pded->pdrvfn; j > 0; j--, pdrvfn++) { if (dwDDIIndex == pdrvfn->iFunc) { poempdev->pfnPS[i] = pdrvfn->pfn; break; } } if (j == 0) { // // didn't find the Unidrv hook. Should happen only with DrvRealizeBrush // poempdev->pfnPS[i] = NULL; } } return (POEMPDEV) poempdev; } extern "C" VOID APIENTRY OEMDisablePDEV( PDEVOBJ pdevobj ) { // DebugMsg(DLLTEXT("OEMDisablePDEV() entry.\r\n")); POEMPDEV poempdev = (POEMPDEV) pdevobj->pdevOEM; // // Free memory for OEMPDEV and any memory block that hangs off OEMPDEV. // if(NULL != poempdev->szDocName) { EngFreeMem(poempdev->szDocName); poempdev->szDocName = (char *)NULL; } /* MMM */ if(NULL != poempdev->pPrinterName) { EngFreeMem(poempdev->pPrinterName); poempdev->pPrinterName = (PWSTR)NULL; } /* MMM */ assert(NULL != pdevobj->pdevOEM); // delete pdevobj->pdevOEM; EngFreeMem(pdevobj->pdevOEM); } extern "C" BOOL APIENTRY OEMResetPDEV( PDEVOBJ pdevobjOld, PDEVOBJ pdevobjNew ) { POEMPDEV poempdevOld = (POEMPDEV)pdevobjOld->pdevOEM; POEMPDEV poempdevNew = (POEMPDEV)pdevobjNew->pdevOEM; if((NULL != poempdevNew->szDocName) && (NULL != poempdevOld->szDocName)) { strncpy(poempdevNew->szDocName, poempdevOld->szDocName, NEC_DOCNAME_BUF_LEN); } // // If you want to carry over anything from old pdev to new pdev, do it here. // return TRUE; }