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.
 
 
 
 
 
 

382 lines
13 KiB

/*************************** MODULE HEADER *******************************
* upgrade.c
* NT Raster Printer Upgrade Procedure
*
* This document contains confidential/proprietary information.
* Copyright (c) 1995 Microsoft Corporation, All Rights Reserved.
*
* Revision History:
*
* [00] 10-March-95 Created ganeshp
**************************************************************************/
#include "rasuipch.h"
#pragma hdrstop("rasuipch.h")
#define GLOBAL_MACS
#include "gblmac.h"
#undef GLOBAL_MACS
#include <regkeys.h>
BOOL bUpgradePrinterProperties(HANDLE, PWSTR, FORM_MAP *, INT ) ;
/***************************** Function Header *******************************
* DrvUpgradePrinter
* Upgrade the Driver and write new values in the registry.
* if pOldDir doesn't have the mini driver it will set the
* registry with default values and return with TRUE.
* If the new keys exist, do nothing Return TRUE.
*
* RETURNS:
* Returns TRUE for success
* Else FALSE, only if not able to do SetPrinterData
* or if OpenPrinter fails.
*
* HISTORY:
* 10:38 on Thurs 16 March 1995 -by- Ganesh Pandey [ganeshp]
* First version.
*
*****************************************************************************/
BOOL
DrvUpgradePrinter( dwLevel, pDriverUpgradeInfo )
DWORD dwLevel;
LPBYTE pDriverUpgradeInfo;
{
HANDLE hPrinter = NULL;
PDRIVER_UPGRADE_INFO_1 pUpgradeInfo = (PDRIVER_UPGRADE_INFO_1)pDriverUpgradeInfo;
PRINTER_DEFAULTS PrinterDefault = {NULL, NULL,PRINTER_ACCESS_ADMINISTER};
FORM_MAP aOldFMBin[ MAXBINS ]; /* Old PAPERSOURCE/FORM_DATA mapping */
INT iOldNumPaperBins = 0; /* Max Paperbins for old minidriver */
PWSTR pOldDir = NULL ; /* Old Printer Driver Dir */
BOOL bRet = FALSE ; /* Return Value */
/* Enter the Critical section before doing any upgrade */
EnterCriticalSection(&RasdduiCriticalSection);
RASUIDBGP(DEBUG_TRACE_PP,("\n\n*********Rasddui!DrvUpgradePrinter:ENTERING CRITICAL SECTION*********\n"));
gdwPrinterUpgrade = 0;
/* Check for correct level for upgrade */
if (dwLevel != 1)
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!DrvUpgradePrinter:Bad input Level = %d\n",dwLevel));
SetLastError(ERROR_INVALID_LEVEL);
goto DrvUpgradePrinterExit;
}
/* Open the printer */
if (!OpenPrinter(pUpgradeInfo->pPrinterName, &hPrinter , &PrinterDefault))
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!DrvUpgradePrinter:OpenPrinter Failed Error is %d\n",GetLastError()) );
hPrinter = NULL;
goto DrvUpgradePrinterExit;
}
/* Check if Newkey are there and we can write in the registry */
if( ( bNewkeys(hPrinter)) )
{
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!DrvUpgradePrinter,NewKeys already Present\n") );
bRet = TRUE;
goto DrvUpgradePrinterExit;
}
/* For Debugging, check if hGlobalHeap is initialised */
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!DrvUpgradePrinter: hGlobalHeap is 0x%x\n", hGlobalHeap) );
if (pUpgradeInfo->pOldDriverDirectory )
{
/* Initialize Old driver's directory */
if(!(pOldDir = (WCHAR *)HeapAlloc( hGlobalHeap, HEAP_ZERO_MEMORY, sizeof(WCHAR) * MAX_PATH )))
{
RASUIDBGP(DEBUG_ERROR,("RasdduiDrvUpgradePrinter!HeapAlloc failed\n") );
goto DrvUpgradePrinterExit;
}
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!DrvUpgradePrinter:Size of Buffer allocated for pOldDir = %d\n",MAX_PATH));
wcscpy(pOldDir,pUpgradeInfo->pOldDriverDirectory) ;
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!DrvUpgradePrinter:pUpgradeInfo->pOldDriverDirectory = %ws\n",pUpgradeInfo->pOldDriverDirectory));
}
else
{
RASUIDBGP(DEBUG_TRACE_PP,("RasdduiDrvUpgradePrinter!NULL pUpgradeInfo->pOldDriverDirectory\n") );
}
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!DrvUpgradePrinter:Copied OldDriverDirectory = %ws\n",pOldDir?pOldDir:L"NULL"));
ZeroMemory(aOldFMBin,sizeof(aOldFMBin) );
/* Call bUpgradePrinterProperties to upgrade the printer. */
if ( !bUpgradePrinterProperties(hPrinter, pOldDir, aOldFMBin, iOldNumPaperBins ) )
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!DrvUpgradePrinter:bUpgradePrinterProperties(Old driver) Failed.\n") );
goto DrvUpgradePrinterExit;
}
bRet = TRUE ;
DrvUpgradePrinterExit:
/* Allow the OEM to upgrade
*/
bRet = OEMDrvUpgradePrinter(hPrinter, dwLevel, pDriverUpgradeInfo);
/* Close the printer */
if ( hPrinter && !ClosePrinter( hPrinter ) )
{
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!DrvUpgradePrinter: Null Handle or ClosePrinter Failed Error is %d\n",GetLastError()) );
}
/* Free the buffer */
if( pOldDir )
HeapFree( hGlobalHeap, 0, (LPSTR)pOldDir );
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!DrvUpgradePrinter: Returns %ws\n\n\n",bRet?L"TRUE":L"FALSE") );
gdwPrinterUpgrade = 0;
RASUIDBGP(DEBUG_TRACE_PP,("\n*********Rasddui!DrvUpgradePrinter:LEAVEING CRITICAL SECTION*********\n"));
/* Leave the Critical section before returning */
LeaveCriticalSection(&RasdduiCriticalSection);
return(bRet);
}
/************************* Function Header **********************************
* vMapFMTable()
* This Function Maps the old FormMap Table with new one.
*
* RETURNS: None
*
* HISTORY:
* 8:14 on Mon 20 Mar 1995 -by- Ganesh Pandey [ganeshp]
* Created.
*
*
****************************************************************************/
void
vMapFMTable(pOldFMBin, iOldNumPaperBins, pRasdduiInfo)
FORM_MAP *pOldFMBin; /* Old PAPERSOURCE/FORM_DATA mapping */
INT iOldNumPaperBins; /* Max Paperbins for old minidriver */
PRASDDUIINFO pRasdduiInfo; /* Rasddui UI data */
{
INT iRetVal = -10;
INT iI, iJ;
INT iMappedForms = 0;
/* Initialize the new FormMap Table */
for(iJ = 0; iJ < NumPaperBins; iJ++)
aFMBin[ iJ ].pfd = NULL;
for(iI = 0; iI < iOldNumPaperBins; iI++)
{
for(iJ = 0; iJ < NumPaperBins; iJ++)
{
iRetVal = -10;
/* The Mapping for forms:
* If the Old and New PaperSrcname matches then use the form installed
* in OldFormMap table. If it doesn't, try comparing the Command String.
* If Command string matches the use the form installed.
*/
if( (wcscmp(aFMBin[iJ].awchPaperSrcName, pOldFMBin[iI].awchPaperSrcName ) == 0) ||
(( pOldFMBin[ iI ].iCommandStringLen != -1) &&
( aFMBin[ iJ ].iCommandStringLen != -1) &&
((iRetVal = memcmp((PCHAR)(aFMBin[ iJ ].achCommandString),
(PCHAR)(pOldFMBin[ iI ].achCommandString),
pOldFMBin[ iI ].iCommandStringLen) )== 0) ) )
{
/* Map a Form only if not mapped previously.
* This will take care of the case when two paperbins have
* different name but same command.
*/
if (!aFMBin[ iJ ].pfd)
{
RASUIDBGP(DEBUG_TRACE_PP,("\nRasddui!vMapFMTable:New PaperSrc%d Name = \"%ws\"\n", iJ, (PWSTR)(aFMBin[iJ].awchPaperSrcName) ) );
RASUIDBGP(DEBUG_TRACE_PP,(" :Old PaperSrc%d Name = \"%ws\"\n", iI, (PWSTR)(pOldFMBin[iI].awchPaperSrcName) ) );
RASUIDBGP(DEBUG_TRACE_PP,(" :memcmp for CD returns = %d\n", iRetVal ) );
iMappedForms++ ;
break; //Found a Match
}
}
}
//Set the forms
if (iMappedForms)
{
if (pOldFMBin[ iI ].pfd )
{
aFMBin[ iJ ].pfd = pOldFMBin[ iI ].pfd ;
RASUIDBGP(DEBUG_TRACE_PP,("\nRasddui!vMapFMTable:Mapped Form Name in PaperSrc%d = %ws\n", iJ, (PWSTR)(aFMBin[iJ].pfd->pFI->pName) ) );
}
else
{
aFMBin[ iJ ].pfd = NULL;
RASUIDBGP(DEBUG_TRACE_PP,("\nRasddui!vMapFMTable:Mapped Form Name in PaperSrc%d = NULL\n", iJ ) );
}
iMappedForms = 0;
aFMBin[ iJ ].iCommandStringLen = -1;
}
}
}
#undef aFMBin
#undef NumPaperBins
/************************* Function Header **********************************
* bUpgradePrinterProperties()
* This function first retrieves the current set of priter properties for
* the printer and then write them as new keys.
*
* RETURNS:
* TRUE/FALSE; FALSE for some failure, either getting details of
* the printer.
*
* HISTORY:
* 8:14 on Mon 20 Mar 1995 -by- Ganesh Pandey [ganeshp]
* Created.
*
*
****************************************************************************/
BOOL
bUpgradePrinterProperties(hPrinter,pOldDriver,pOldFMBin,iOldNumPaperBins )
HANDLE hPrinter; /* Spooler's handle to this printer */
PWSTR pOldDriver; /* Old Printer Driver Directory */
FORM_MAP *pOldFMBin; /* Old PAPERSOURCE/FORM_DATA mapping */
INT iOldNumPaperBins; /* Max Paperbins for old minidriver */
{
BOOL bRet = FALSE; /* Return code */
PRINTER_INFO PI; /* Model and data file information */
DWORD dwAttributes=0; /* File attribute of the minidriver */
PRASDDUIINFO pNewRasdduiInfo = NULL; /* UI Data for current driver */
PRASDDUIINFO pOldRasdduiInfo = NULL; /* UI Data for old driver */
PEDM pEDM ; /* Device Mode to be filled in */
TRY
/* Get current UI info. eInfo only, no registry action.
*/
if (!(pNewRasdduiInfo = pGetUIInfo(hPrinter, 0, eInfo, eNoChange, eNoHelp)))
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!bUpgradePrinterProperties: Allocation failed; pRasdduiInfo is NULL\n") );
LEAVE;
}
pEDM = pNewRasdduiInfo->pEDM;
/* Set the Global flag to PPUPGRADE_OLD_DRIVER */
gdwPrinterUpgrade = PPUPGRADE_OLD_DRIVER;
/* If an old driver was supplied, get RASDDUIINFO for it.
*/
if (pOldDriver)
{
PWSTR pwstrDataFileName = NULL;
/* Copy PRINTER_INFO from existing driver. We'll use it to
* locate the old driver file.
*/
PI = pNewRasdduiInfo->PI;
pwstrDataFileName = wcsrchr( PI.pwstrDataFileName, L'\\' );
wcscat(pOldDriver, pwstrDataFileName) ;
RASUIDBGP(DEBUG_TRACE_PP,("\nRasddui!bUpgradePrinterProperties:New Minidriver (PI.pwstrDataFileName) = %ws\n",PI.pwstrDataFileName));
RASUIDBGP(DEBUG_TRACE_PP,("Minidriver name is (pwstrDataFileName) = %ws\n",pwstrDataFileName));
RASUIDBGP(DEBUG_TRACE_PP,("Old minidriver (pOldDriver) = %ws\n",pOldDriver));
/* Check for Existence of the minidriver. If it doesn't exist we still
* need to write new keys, based upon the registry keys.
*/
dwAttributes = GetFileAttributes(pOldDriver);
/* If the old minidriver exist create the qualified path
* for old minidriver.
*/
if (dwAttributes != 0xffffffff)
PI.pwstrDataFileName = pOldDriver;
RASUIDBGP(DEBUG_TRACE_PP,("Old Minidriver %ws \n",(dwAttributes != 0xffffffff?L"Exist":L"Don't Exist")));
RASUIDBGP(DEBUG_TRACE_PP,("Minidriver's PI.pwstrDataFileName = %ws\n",PI.pwstrDataFileName));
/* Now get old minidriver data. This routine will automatically read and update
* old keys if present.
*/
pOldRasdduiInfo = pInternalGetUIInfo(hPrinter, 0, &PI, ePrinter, eNoChange, eNoHelp);
if (pOldRasdduiInfo)
pEDM = pOldRasdduiInfo->pEDM;
else
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!bUpgradePrinterProperties: pInternalGetUIInfo failed; pOldRasdduiInfo is NULL\n") );
LEAVE;
}
}
/* Just write out the user settings as new keys.
*/
if ( bRet = bRegUpdate( hPrinter, pEDM, PI.pwstrModel, pNewRasdduiInfo) )
{
/* Update the printer specific forms */
if ( bRet = bAddMiniForms( hPrinter, TRUE, pNewRasdduiInfo ) )
{
/* If the old minidriver exists, map the old form table to the new one.
*/
if (pOldRasdduiInfo )
{
/* Save the FORM_MAP table */
CopyMemory(pOldFMBin, pOldRasdduiInfo->aFMBin, sizeof(pOldRasdduiInfo->aFMBin) );
iOldNumPaperBins = pOldRasdduiInfo->NumPaperBins ;
gdwPrinterUpgrade = PPUPGRADE_NEW_DRIVER;
if(pOldFMBin && iOldNumPaperBins ) {
vMapFMTable(pOldFMBin, iOldNumPaperBins, pNewRasdduiInfo);
}
bRet = bRegUpdateTrayFormTable (hPrinter, pNewRasdduiInfo) ;
}
}
}
ENDTRY
FINALLY
vReleaseUIInfo(&pNewRasdduiInfo);
vReleaseUIInfo(&pOldRasdduiInfo);
ENDFINALLY
return(bRet); /* 0 return code means AOK */
}