312 lines
6.7 KiB
C
312 lines
6.7 KiB
C
/*++
|
||
|
||
Copyright (c) 1996 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
upgrade.c
|
||
|
||
Abstract:
|
||
|
||
This file handles the DrvUpgradePrinter spooler API
|
||
|
||
Environment:
|
||
|
||
Win32 subsystem, DriverUI module, user mode
|
||
|
||
Revision History:
|
||
|
||
02/13/97 -davidx-
|
||
Implement OEM plugin support.
|
||
|
||
02/06/97 -davidx-
|
||
Rewrote it to use common data management functions.
|
||
|
||
07/17/96 -amandan-
|
||
Created it.
|
||
|
||
--*/
|
||
|
||
#include "precomp.h"
|
||
|
||
//
|
||
// Forward and external function declarations
|
||
//
|
||
|
||
BOOL BInitOrUpgradePrinterProperties(PCOMMONINFO);
|
||
BOOL BUpgradeFormTrayTable(PCOMMONINFO);
|
||
VOID VUpgradeDefaultDevmode(PCOMMONINFO);
|
||
|
||
#if defined(UNIDRV) && !defined(WINNT_40)
|
||
BOOL
|
||
BUpgradeSoftFonts(
|
||
PCOMMONINFO pci,
|
||
PDRIVER_UPGRADE_INFO_2 pUpgradeInfo);
|
||
#endif //defined(UNIDRV) && !defined(WINNT_40)
|
||
|
||
|
||
|
||
BOOL
|
||
DrvUpgradePrinter(
|
||
DWORD dwLevel,
|
||
LPBYTE pDriverUpgradeInfo
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function is called by the spooler everytime a new driver
|
||
is copied to the system. This function checks for appropriate
|
||
registry keys in the registry. If the new registry keys are not
|
||
present, it will set the new keys with default values. This function
|
||
will handle the upgrading of information in the registry to the new driver format.
|
||
|
||
Arguments:
|
||
|
||
dwLevel - version info for DRIVER_UPGRADE_INFO
|
||
pDriverUpgradeInfo - pointer to DRIVER_UPGRADE_INFO_1
|
||
|
||
Return Value:
|
||
|
||
TRUE for success and FALSE for failure
|
||
|
||
--*/
|
||
|
||
{
|
||
PDRIVER_UPGRADE_INFO_1 pUpgradeInfo1 = (PDRIVER_UPGRADE_INFO_1) pDriverUpgradeInfo;
|
||
PCOMMONINFO pci;
|
||
BOOL bResult = TRUE;
|
||
DWORD dwSize, dwType = REG_SZ;
|
||
PFN_OEMUpgradePrinter pfnOEMUpgradePrinter;
|
||
PFN_OEMUpgradeRegistry pfnOEMUpgradeRegistry;
|
||
|
||
//
|
||
// Verify the validity of input parameters
|
||
//
|
||
|
||
|
||
if (pDriverUpgradeInfo == NULL)
|
||
{
|
||
ERR(("Invalid DrvUpgradePrinter parameters.\n"));
|
||
SetLastError(ERROR_INVALID_PARAMETER);
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
#if defined(WINNT_40)
|
||
if (dwLevel != 1 )
|
||
{
|
||
ERR(("DrvUpgradePrinter...dwLevel != 1\n"));
|
||
SetLastError(ERROR_INVALID_PARAMETER);
|
||
return FALSE;
|
||
}
|
||
#else // NT 5.0
|
||
if (dwLevel != 1 && dwLevel != 2)
|
||
{
|
||
WARNING(("Level is neither 1 nor 2.\n"));
|
||
SetLastError(ERROR_INVALID_PARAMETER);
|
||
return FALSE;
|
||
}
|
||
#endif // defined(WINNT_40)
|
||
|
||
|
||
//
|
||
// Open the printer with administrator access
|
||
// and load basic printer information
|
||
//
|
||
|
||
pci = PLoadCommonInfo(NULL,
|
||
pUpgradeInfo1->pPrinterName,
|
||
FLAG_OPENPRINTER_ADMIN |
|
||
FLAG_INIT_PRINTER |
|
||
FLAG_REFRESH_PARSED_DATA |
|
||
FLAG_UPGRADE_PRINTER);
|
||
|
||
if (pci == NULL)
|
||
{
|
||
ERR(("DrvUpgradePrinter..pci==NULL.\n"));
|
||
return FALSE;
|
||
}
|
||
|
||
//
|
||
// Update printer properties information
|
||
//
|
||
|
||
(VOID) BInitOrUpgradePrinterProperties(pci);
|
||
(VOID) BUpgradeFormTrayTable(pci);
|
||
|
||
VUpgradeDefaultDevmode(pci);
|
||
|
||
#ifndef WINNT_40
|
||
|
||
VNotifyDSOfUpdate(pci->hPrinter);
|
||
|
||
#endif // !WINNT_40
|
||
|
||
|
||
#if defined(UNIDRV) && !defined(WINNT_40)
|
||
|
||
//
|
||
// NT 5.0 UniDriver specific upgrade steps
|
||
//
|
||
|
||
//
|
||
// Make sure that the DRIVER_UPGRADE_INFO's level is 2.
|
||
//
|
||
|
||
if (dwLevel == 2)
|
||
{
|
||
BUpgradeSoftFonts(pci, (PDRIVER_UPGRADE_INFO_2)pUpgradeInfo1);
|
||
}
|
||
|
||
#endif //defined(UNIDRV) && !defined(WINNT_40)
|
||
|
||
//
|
||
// call OEMUpgradePrinter entrypoint for each plugin
|
||
//
|
||
|
||
FOREACH_OEMPLUGIN_LOOP(pci)
|
||
|
||
if (HAS_COM_INTERFACE(pOemEntry))
|
||
{
|
||
//
|
||
// If the OEM does not implement upgradeprinter, then they
|
||
// cannot support upgraderegistry since you can only upgrade
|
||
// registry if you support upgradeprinter.
|
||
//
|
||
|
||
HRESULT hr;
|
||
|
||
hr = HComOEMUpgradePrinter(pOemEntry,
|
||
dwLevel,
|
||
pDriverUpgradeInfo) ;
|
||
|
||
if (hr == E_NOTIMPL)
|
||
continue;
|
||
|
||
bResult = SUCCEEDED(hr);
|
||
|
||
}
|
||
else
|
||
{
|
||
|
||
if ((pfnOEMUpgradePrinter = GET_OEM_ENTRYPOINT(pOemEntry, OEMUpgradePrinter)) &&
|
||
!pfnOEMUpgradePrinter(dwLevel, pDriverUpgradeInfo))
|
||
{
|
||
ERR(("OEMUpgradePrinter failed for '%ws': %d\n",
|
||
CURRENT_OEM_MODULE_NAME(pOemEntry),
|
||
GetLastError()));
|
||
|
||
bResult = FALSE;
|
||
}
|
||
|
||
if ((pfnOEMUpgradeRegistry = GET_OEM_ENTRYPOINT(pOemEntry, OEMUpgradeRegistry)) &&
|
||
!pfnOEMUpgradeRegistry(dwLevel, pDriverUpgradeInfo, BUpgradeRegistrySettingForOEM))
|
||
{
|
||
ERR(("OEMUpgradeRegistry failed for '%ws': %d\n",
|
||
CURRENT_OEM_MODULE_NAME(pOemEntry),
|
||
GetLastError()));
|
||
|
||
bResult = FALSE;
|
||
}
|
||
|
||
}
|
||
END_OEMPLUGIN_LOOP
|
||
|
||
VFreeCommonInfo(pci);
|
||
return bResult;
|
||
}
|
||
|
||
|
||
|
||
BOOL
|
||
BUpgradeFormTrayTable(
|
||
PCOMMONINFO pci
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Upgrade the form-to-tray assignment table in the registry
|
||
|
||
Arguments:
|
||
|
||
pci - Points to basic printer information
|
||
|
||
Return Value:
|
||
|
||
TRUE if upgrade is successful, FALSE otherwise
|
||
|
||
--*/
|
||
|
||
{
|
||
PWSTR pFormTrayTable;
|
||
DWORD dwSize;
|
||
BOOL bResult;
|
||
|
||
//
|
||
// Get a copy of the current form-to-tray assignment table.
|
||
// If new format data is not present but old format data is,
|
||
// this will call the appropriate library function to convert
|
||
// old format data to new format.
|
||
//
|
||
|
||
pFormTrayTable = PGetFormTrayTable(pci->hPrinter, &dwSize);
|
||
|
||
if (pFormTrayTable == NULL)
|
||
return TRUE;
|
||
|
||
//
|
||
// Save the form-to-tray assignment table back to registry
|
||
//
|
||
|
||
bResult = BSaveFormTrayTable(pci->hPrinter, pFormTrayTable, dwSize);
|
||
MemFree(pFormTrayTable);
|
||
|
||
return bResult;
|
||
}
|
||
|
||
|
||
|
||
VOID
|
||
VUpgradeDefaultDevmode(
|
||
PCOMMONINFO pci
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Upgrade the default printer devmode, if necessary
|
||
|
||
Arguments:
|
||
|
||
pci - Points to basic printer information
|
||
|
||
Return Value:
|
||
|
||
NONE
|
||
|
||
--*/
|
||
|
||
{
|
||
PPRINTER_INFO_2 pPrinterInfo2;
|
||
PDEVMODE pdm;
|
||
|
||
if ((pPrinterInfo2 = MyGetPrinter(pci->hPrinter, 2)) &&
|
||
(pdm = pPrinterInfo2->pDevMode) &&
|
||
BFillCommonInfoDevmode(pci, pdm, NULL) &&
|
||
(pci->pdm->dmSpecVersion != pdm->dmSpecVersion ||
|
||
pci->pdm->dmDriverVersion != pdm->dmDriverVersion ||
|
||
pci->pdm->dmSize != pdm->dmSize ||
|
||
pci->pdm->dmDriverExtra != pdm->dmDriverExtra))
|
||
{
|
||
pPrinterInfo2->pDevMode = pci->pdm;
|
||
SetPrinter(pci->hPrinter, 2, (PBYTE) pPrinterInfo2, 0);
|
||
}
|
||
|
||
MemFree(pPrinterInfo2);
|
||
}
|
||
|