Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

399 lines
12 KiB

#include "hp5sipch.h"
#include "modinit.c"
DRVFN DrvFunctions[] =
{
/* REQUIRED FUNCTIONS */
{ INDEX_OEMEnablePDEV, (PFN) OEMEnablePDEV },
{ INDEX_OEMDisablePDEV, (PFN) OEMDisablePDEV },
{ INDEX_OEMDisableDriver, (PFN) OEMDisableDriver },
{ INDEX_OEMResetPDEV, (PFN) OEMResetPDEV },
{ INDEX_OEMDevMode, (PFN) OEMDevMode },
/* OPTIONAL FUNCTIONS */
{ INDEX_OEMCommandCallback, (PFN) OEMCommandCallback },
#if OPTIONALFNS
{ INDEX_DrvCompletePDEV, (PFN) DrvCompletePDEV },
{ INDEX_DrvEnableSurface, (PFN) DrvEnableSurface },
{ INDEX_DrvDisableSurface, (PFN) DrvDisableSurface },
{ INDEX_DrvEscape, (PFN)DrvEscape },
{ INDEX_DrvGetGlyphMode, (PFN)DrvGetGlyphMode },
{ INDEX_DrvTextOut, (PFN)DrvTextOut },
{ INDEX_DrvQueryFont, (PFN)DrvQueryFont },
{ INDEX_DrvQueryFontTree, (PFN)DrvQueryFontTree },
{ INDEX_DrvQueryFontData, (PFN)DrvQueryFontData },
{ INDEX_DrvQueryAdvanceWidths, (PFN)DrvQueryAdvanceWidths },
{ INDEX_DrvBitBlt, (PFN)DrvBitBlt },
{ INDEX_DrvStretchBlt, (PFN)DrvStretchBlt },
{ INDEX_DrvCopyBits, (PFN)DrvCopyBits },
{ INDEX_DrvDitherColor, (PFN)DrvDitherColor },
{ INDEX_DrvStartDoc, (PFN)DrvStartDoc },
{ INDEX_DrvStartPage, (PFN)DrvStartPage },
{ INDEX_DrvSendPage, (PFN)DrvSendPage },
{ INDEX_DrvEndDoc, (PFN)DrvEndDoc },
{ INDEX_DrvFontManagement, (PFN)DrvFontManagement },
{ INDEX_DrvStartBanding, (PFN)DrvStartBanding },
{ INDEX_DrvNextBand, (PFN)DrvNextBand }
#endif OPTIONALFNS
};
#define DRIVER_FUNCTIONS sizeof(DrvFunctions)/sizeof(DRVFN)
/***************************** Function Header *******************************
* OEMEnableDriver
*
* RETURNS:
*
* HISTORY:
*
*****************************************************************************/
BOOL OEMEnableDriver(
OEMDRVENABLEDATA *pOEMDrvEnableData
)
{
DRVENABLEDATA *pded;
BOOL b = FALSE;
TRY
/*
* cb is a count of the number of bytes available in pded. It is not
* clear that there is any significant use of the engine version number.
* Returns TRUE if successfully enabled, otherwise FALSE.
*/
if (pOEMDrvEnableData->dwDriverVersion < DDI_DRIVER_VERSION) {
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: Invalid Engine Version=%08lx, Req=%08lx\n",
pOEMDrvEnableData->dwDriverVersion, DDI_DRIVER_VERSION));
EngSetLastError(ERROR_BAD_DRIVER_LEVEL);
LEAVE;
}
if (pOEMDrvEnableData->cbSize < sizeof(DRVENABLEDATA))
{
EngSetLastError(ERROR_INVALID_PARAMETER);
TRACE(1, ("HP5SIM!OEMEnableDriver: cb = %ld, should be %ld\n",
pOEMDrvEnableData->cbSize, sizeof(DRVENABLEDATA)));
LEAVE;
}
/*
* Fill in the driver table returned to the engine. We return
* the minimum of the number of functions supported OR the number
* the engine has asked for.
*/
pded = pOEMDrvEnableData->pded;
pded->iDriverVersion = DDI_DRIVER_VERSION;
pded->c = DRIVER_FUNCTIONS;
pded->pdrvfn = DrvFunctions;
b = TRUE;
ENDTRY
FINALLY
ENDFINALLY
return(b);
}
/***************************** Function Header *******************************
* OEMDisableDriver
*
* RETURNS:
*
* HISTORY:
*
*****************************************************************************/
void OEMDisableDriver()
{
}
PHP5PDEV
pBuildDefaultPDEV(PHP5PDEV pOurPdev)
{
memset(&(pOurPdev->gpcPJLSettings), '\0', sizeof(pOurPdev->gpcPJLSettings));
pOurPdev->dOutputDest = GPCUI_TOPBIN;
pOurPdev->bCollation = TRUE;
pOurPdev->dMailboxMode = GPCUI_HCI_MAILBOX;
pOurPdev->Copies = 1; /* Copy count. */
pOurPdev->currentMBSelection = 0; /* current Mailbox sel. */
return pOurPdev;
}
/***************************** Function Header *******************************
* OEMEnablePDEV
*
* RETURNS:
*
* HISTORY:
*
*****************************************************************************/
DHPDEV OEMEnablePDEV(
POEMPDEV pOEMPDEV,
POEMENABLEPDEVPARAM pOEMEPDParam)
{
PHP5PDEV pOurPdev = 0;
PMOPIERDM pOEMDMIn = 0;
PDEVMODE pPublicDMIn = 0;
TRY
/* Grab devmodes out of param block.
*/
pOEMDMIn = (PMOPIERDM) pOEMEPDParam->pOEMDevMode;
pPublicDMIn = pOEMEPDParam->pdm;
/* Allocate and save PDEV.
*/
pOurPdev = OEMALLOC(pOEMPDEV, sizeof(HP5PDEV));
if (!pOurPdev) {
LEAVE;
}
pOurPdev->pdev = pOurPdev;
/* Validity Check.
*
*
* 1) Check that pOEMDMIn matches current Registry settings. If there are
* discrepancies at this point, go with the Document Default sheet created by
* the query to the registry.
*
* NOTE: bApproveDevMode returns FALSE if either pPublicDMIn or pOEMDMIn are == 0.
*/
if (bApproveDevMode(pOEMPDEV,
pOEMEPDParam->hModule,
pOEMEPDParam->hDriver,
pOEMEPDParam->pwszDeviceName,
pPublicDMIn,
pOEMDMIn) == TRUE) {
TRACE(1, ("HP5SIM!OEMEnablePDEV: DM_COLLATE is %s in dmFields\n",
pPublicDMIn->dmFields & DM_COLLATE ? "SET" : "CLEAR"));
TRACE(1, ("HP5SIM!OEMEnablePDEV: DM_COPIES is %s in dmFields\n",
pPublicDMIn->dmFields & DM_COPIES ? "SET" : "CLEAR"));
TRACE(1, ("HP5SIM!OEMEnablePDEV: OEM collation is %s\n",
pOEMDMIn->bCollation ? "ON" : "OFF"));
TRACE(1, ("HP5SIM!OEMEnablePDEV: Copy count is %d\n",
pPublicDMIn->dmCopies));
TRACE(1, ("HP5SIM!OEMEnablePDEV: Public dmCollate is %s\n",
pPublicDMIn->dmCollate == DMCOLLATE_TRUE ? "TRUE" : "FALSE"));
/* Initialize current PJL settings to 0. That way, sure to write out
* the PJL strings the first time.
*/
memset(&(pOurPdev->gpcPJLSettings), 0, sizeof(pOurPdev->gpcPJLSettings));
pOurPdev->dOutputDest = pOEMDMIn->dOutputDest;
pOurPdev->dMailboxMode = pOEMDMIn->dMailboxMode;
pOurPdev->bCollation = pOEMDMIn->bCollation || pPublicDMIn->dmCollate == DMCOLLATE_TRUE;
pOurPdev->currentMBSelection = pOEMDMIn->currentMBSelection;
pOurPdev->bTopaz = pOEMDMIn->bTopaz;
pOurPdev->Copies = pPublicDMIn->dmCopies;
TRACE(1, ("HP5SIM!OEMEnablePDEV: Driver %s collate this job.\n",
pOurPdev->bCollation ? "WILL" : "WILL NOT"));
}
else {
/* Even if devmode is completely unrecognizeable, we'll print something. Try
* to preserve copy count, if possible.
*
* Note that pBuildDefaultPDEV always returns pOurPdev.
*/
pOurPdev = pBuildDefaultPDEV(pOurPdev);
if(pPublicDMIn) {
pOurPdev->Copies = pPublicDMIn->dmCopies;
}
}
ENDTRY
FINALLY
ENDFINALLY
return((DHPDEV) pOurPdev);
}
/***************************** Function Header *******************************
* OEMDisablePDEV
*
* RETURNS: None.
*
* HISTORY:
*
*****************************************************************************/
VOID OEMDisablePDEV(
POEMPDEV pdev
)
{
TRY
/* Free private PDEV.
*/
if (pdev && pdev->OEMPrivatePDev) {
OEMFREE(pdev, pdev->OEMPrivatePDev);
pdev->OEMPrivatePDev = 0;
}
ENDTRY
FINALLY
ENDFINALLY
}
/***************************** Function Header *******************************
* OEMResetPDEV
*
* RETURNS: (BOOL) TRUE for success.
*
* HISTORY:
*
*****************************************************************************/
BOOL OEMResetPDEV(
POEMPDEV pdevold,
POEMPDEV pdevnew)
{
/*******************************************/
/* Code to fix diff type printing options. */
PHP5PDEV pHP5pdevnew = 0;
PHP5PDEV pHP5pdevold = 0;
TRACE(1, ("HP5SIM!OEMResetPDEV\n"));
if(pdevold)
pHP5pdevold = (PHP5PDEV) pdevold->OEMPrivatePDev;
if(pdevnew)
pHP5pdevnew = (PHP5PDEV) pdevnew->OEMPrivatePDev;
/* Copy PJL state from old to new pdev. */
if(pHP5pdevold && pHP5pdevnew)
pHP5pdevnew->gpcPJLSettings = pHP5pdevold->gpcPJLSettings;
return(TRUE);
}
//---------------------------**OEMCommandCallback*----------------------------//
// Function: OEMCommandCallback
//
// Action: Explicitly examine wCmdCbId returned from TTY's GPC data for
// CMDID Values. This command will construct a command string
// for the returned value and send it to the spooler via WriteSpoolBuf.
//
// Notes: There can be up to 254 callback id#'s.
// There can be at most 254 callback id#'s due to the size of
// this id field in the Command Descriptor structure being BYTE.
void OEMCommandCallback(
POEMPDEV pdev, // Pointer to OEMPDEV
DWORD dwID, // Command callback id#, placed in minidriver GPC data
LPDWORD lpdwParams) // Pointer to optional parameters of the command
{
PHP5PDEV pHP5pdev = 0;
PCHAR pDirective = 0;
PGPCPJLSETTINGS pgpcPJLSettings = 0;
TRY
/* print jonah at upper left of page.
*/
if(pdev)
pHP5pdev = (PHP5PDEV) pdev->OEMPrivatePDev;
if(pHP5pdev)
pgpcPJLSettings = &(pHP5pdev->gpcPJLSettings);
TRACE(1, ("HP5SIM!OEMCommandCallback: id = %ld\n", dwID));
switch (dwID)
{
case CMDID_PAGEPROTECT_ON:
case CMDID_PAGEPROTECT_OFF:
/* 0) Set PJLSettings changed flag to FALSE to start with. */
pgpcPJLSettings->bSettingsChanged = FALSE;
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: PAGEPROTECT_ON_OFF\n"));
if(pgpcPJLSettings->dwPageProtection != dwID) {
pgpcPJLSettings->dwPageProtection = dwID;
pgpcPJLSettings->bSettingsChanged = TRUE;
}
break;
case CMDID_BEGINDOC:
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: STARTJOB\n"));
/* 1) check to see if # of copies has changed. */
if(pHP5pdev->Copies != pgpcPJLSettings->Copies) {
pgpcPJLSettings->Copies = pHP5pdev->Copies;
pgpcPJLSettings->bSettingsChanged = TRUE;
}
/* 2) check to see if output destination has changed. */
if(pHP5pdev->dOutputDest != pgpcPJLSettings->dwOutputDest) {
pgpcPJLSettings->dwOutputDest = pHP5pdev->dOutputDest;
pgpcPJLSettings->bSettingsChanged = TRUE;
}
break;
case CMDID_RET_DEF: /* TEXTQUALITY */
case CMDID_RET_OFF:
case CMDID_RET_ON:
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: CMDID_RET\n"));
if(pgpcPJLSettings->dwRet != dwID) {
pgpcPJLSettings->dwRet = dwID;
pgpcPJLSettings->bSettingsChanged = TRUE;
}
break;
case CMDID_ECONO_DEF: /* PAPER QUALITY */
case CMDID_ECONO_OFF:
case CMDID_ECONO_ON:
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: ECONO_ON_OFF_DEF\n"));
if(pgpcPJLSettings->dwEconomode != dwID) {
pgpcPJLSettings->dwEconomode = dwID;
pgpcPJLSettings->bSettingsChanged = TRUE;
}
break;
case CMDID_RES_600: /* RESOLUTION */
case CMDID_RES_300:
case CMDID_RES_150:
case CMDID_RES_75:
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: ECONO_RES_600_300_150_75\n"));
if(pgpcPJLSettings->dwResolution != dwID) {
pgpcPJLSettings->dwResolution = dwID;
pgpcPJLSettings->bSettingsChanged = TRUE;
}
/* Finally, when resolution has been checked, send this off to spooler. */
if(pgpcPJLSettings->bSettingsChanged == TRUE) {
bJDStartJob(pdev, pHP5pdev);
pgpcPJLSettings->bPrinted = TRUE;
}
break;
case CMDID_FF:
OEMWRITESPOOLBUF(pdev, "\f", strlen("\f"));
break;
case CMDID_COPIES:
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: COPIES\n"));
/* Only check on copies if #copies has possibly changed. */
if(pgpcPJLSettings->bSettingsChanged == TRUE)
bJDCopyCheck(pdev, lpdwParams[0]);
break;
case CMDID_ENDJOB:
TRACE(1, ("HP5SIM!OEMDrvEnableDriver: ENDJOB\n"));
JDEndJob(pdev);
break;
default:
break;
}
ENDTRY
FINALLY
ENDFINALLY
}