360 lines
10 KiB
C++
360 lines
10 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (c) 2001 Microsoft Corporation
|
|||
|
All rights reserved.
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
printupg.hxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
The basic design is:
|
|||
|
|
|||
|
1. All decisions about blocking take place on the server with its
|
|||
|
printupg.inf. This means that you get the same behavior with respect to
|
|||
|
being blocked/warned as if you were on the machine itself: NT4 ==
|
|||
|
nothing blocked. Win2K == only bad level 2 drivers blocked that is
|
|||
|
blocked. Whistler == blocked and warned and we will distinguish between
|
|||
|
different environments and versions correctly in printupg.inf.
|
|||
|
|
|||
|
2. If there is a replacement driver, it is selected by the client,
|
|||
|
after being informed by the server that is blocked/warned. OEM
|
|||
|
installers will get Block/Warn popups like what we have today; we will
|
|||
|
publish the flag to stop this UI appearing (with the implicit threat
|
|||
|
that if OEM try and subvert it and produce a buggy driver we will have
|
|||
|
no choice but to move them to Blocked - don't know about the legalities
|
|||
|
of this).
|
|||
|
|
|||
|
3. The call for AddPrinterDriver to install a bad/warned driver shall fail
|
|||
|
with Block/Warn even if the UI is suppressed.
|
|||
|
|
|||
|
The code works as follows: the class installer calls AddPrinterDriver
|
|||
|
and at the printing service or server side, the spooler reads printupg and
|
|||
|
checks the driver against it for the status of blocking/warning with date,
|
|||
|
environment, and version information. If the driver is either blocked
|
|||
|
or warned, print service will fail the AddPrinterDriver call with last
|
|||
|
error code set to be either blocked or warned. The class installer checks
|
|||
|
the return code of AddPrinterDriver and finds the replacement, if any, for
|
|||
|
the blocked or warned drivers by reading the client side printup.inf. If a
|
|||
|
replacement for a warned or blocked driver is found, it pops up the
|
|||
|
three-button message box to offer the replacement. Otherwise for the
|
|||
|
blocked driver, it pops up the one button message box to abort the
|
|||
|
installation or the two-button message box to install the warned driver or
|
|||
|
abort the installation. The class installer calls AddPrinterDriver again
|
|||
|
to install the warned or replacement driver and when it is the user<EFBFBD>s
|
|||
|
intention to install the warned driver, the class installer sets the
|
|||
|
APD_INSTALL_WARNED_DRIVER while calling AddPrinterDriver.
|
|||
|
|
|||
|
In all cases, the class installer calls AddPrinterDriver with APD_NO_UI
|
|||
|
flag set. This way spooler client stub (winspool) will just pass on the
|
|||
|
return code of AddPrinterDriver from the printing service to the class
|
|||
|
installer.
|
|||
|
|
|||
|
Note on APD_XXX flags: these are new flags that shall be ignore by down
|
|||
|
level servers such win2k servers.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Larry Zhu (LZhu) 20-Feb-2001
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef PRINTUPG_HXX
|
|||
|
#define PRINTUG_HXX
|
|||
|
|
|||
|
#define X86_ENVIRONMENT _T("Windows NT x86")
|
|||
|
#define IA64_ENVIRONMENT _T("Windows IA64")
|
|||
|
#define MIPS_ENVIRONMENT _T("Windows NT R4000")
|
|||
|
#define ALPHA_ENVIRONMENT _T("Windows NT Alpha_AXP")
|
|||
|
#define PPC_ENVIRONMENT _T("Windows NT PowerPC")
|
|||
|
#define WIN95_ENVIRONMENT _T("Windows 4.0")
|
|||
|
|
|||
|
enum EPrintUpgConstants
|
|||
|
{
|
|||
|
kReplacementDriver = 1,
|
|||
|
kWarnLevelWks = 2,
|
|||
|
kWarnLevelSrv = 3,
|
|||
|
kFileTime = 4,
|
|||
|
};
|
|||
|
|
|||
|
enum EPrintUpgLevels
|
|||
|
{
|
|||
|
kBlocked = 1,
|
|||
|
kWarned = 2,
|
|||
|
};
|
|||
|
|
|||
|
extern "C"
|
|||
|
{
|
|||
|
extern TCHAR cszUpgradeInf[];
|
|||
|
extern TCHAR cszPrintDriverMapping[];
|
|||
|
extern TCHAR cszVersion[];
|
|||
|
extern TCHAR cszExcludeSection[];
|
|||
|
|
|||
|
BOOL
|
|||
|
StringToDate(
|
|||
|
IN LPTSTR pszDate,
|
|||
|
OUT SYSTEMTIME *pInfTime
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
HRESULT
|
|||
|
GetFileTimeByName(
|
|||
|
IN LPCTSTR pszPath,
|
|||
|
OUT FILETIME *pFileTime
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
IsDriverBadLocally(
|
|||
|
IN LPCTSTR pszServer, OPTIONAL
|
|||
|
IN DRIVER_INFO_6 *pDriverInfo6,
|
|||
|
IN BOOL bIsDriverPathFullPath,
|
|||
|
OUT DWORD *pdwBlockingStatus,
|
|||
|
OUT LPTSTR *ppszReplacementDriver
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
InternalPrintUpgUI(
|
|||
|
IN LPCTSTR pszDriverModel,
|
|||
|
IN LPCTSTR pszDriverPath, // main rendering driver dll
|
|||
|
IN LPCTSTR pszEnvironment,
|
|||
|
IN DWORD dwVersion,
|
|||
|
IN OUT DWORD *pdwBlockingStatus
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
GetPrinterDriverPath(
|
|||
|
IN LPCTSTR pszServer, OPTIONAL
|
|||
|
IN LPCTSTR pszDriverPath,
|
|||
|
IN LPCTSTR pszEnvionment,
|
|||
|
IN BOOL bIsDriverPathFullPath,
|
|||
|
OUT TString *pstrFullPath
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
GetPrinterDriverVersion(
|
|||
|
IN LPCTSTR pszFileName,
|
|||
|
OUT DWORD *pdwFileMajorVersion, OPTIONAL
|
|||
|
OUT DWORD *pdwFileMinorVersion OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
GetDriverVersionFromFileVersion(
|
|||
|
IN VS_FIXEDFILEINFO *pFileVersion,
|
|||
|
OUT DWORD *pdwFileMajorVersion, OPTIONAL
|
|||
|
OUT DWORD *pdwFileMinorVersion OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
IsDateInLineNoOlderThanDriverDate(
|
|||
|
IN INFCONTEXT *pInfContext,
|
|||
|
IN FILETIME *pDriverFileTime,
|
|||
|
OUT UINT *puWarnLevelSrv,
|
|||
|
OUT UINT *puWarnLevelWks,
|
|||
|
OUT TString *pstrReplacementDriver
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
PrintUpgRetry(
|
|||
|
IN LPCTSTR pszServer, OPTIONAL
|
|||
|
IN DWORD dwLevel,
|
|||
|
IN DRIVER_INFO_6 *pDriverInfo6,
|
|||
|
IN DWORD dwAddDrvFlags,
|
|||
|
IN BOOL bIsDriverPathFullPath,
|
|||
|
IN BOOL bOfferReplacement,
|
|||
|
IN OUT DWORD *pdwBlockingStatus,
|
|||
|
OUT LPTSTR *ppszReplacementDriver
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
PrintUpgUI(
|
|||
|
IN LPCTSTR pszServer, OPTIONAL
|
|||
|
IN DRIVER_INFO_6 *pDriverInfo6,
|
|||
|
IN BOOL bIsDriverPathFullPath,
|
|||
|
IN BOOL bOfferReplacement,
|
|||
|
IN OUT DWORD *pdwBlockingStatus,
|
|||
|
OUT LPTSTR *ppszReplacementDriver
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
InternalCompatibleDriverCheck(
|
|||
|
IN LPCTSTR pszDriverModel,
|
|||
|
IN LPCTSTR pszDriverPath,
|
|||
|
IN LPCTSTR pszEnvironment,
|
|||
|
IN FILETIME *pFileTimeDriver,
|
|||
|
IN LPCTSTR pszPrintUpgInf,
|
|||
|
IN UINT uVersion,
|
|||
|
IN BOOL bIsServer,
|
|||
|
OUT UINT *puBlockingStatus,
|
|||
|
OUT TString *pstrReplacementDriver
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
InternalCompatibleInfDriverCheck(
|
|||
|
IN LPCTSTR pszModelName,
|
|||
|
IN LPCTSTR pszDriverPath,
|
|||
|
IN LPCTSTR pszEnvironment,
|
|||
|
IN FILETIME *pFileTimeDriver,
|
|||
|
IN HINF hPrintUpgInf,
|
|||
|
IN UINT uVersion,
|
|||
|
IN BOOL bIsServer,
|
|||
|
OUT UINT *puBlockingStatus,
|
|||
|
OUT TString *pstrReplacementDriver
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
IsDriverInMappingSection(
|
|||
|
IN LPCTSTR pszModelName,
|
|||
|
IN LPCTSTR pszEnvironment,
|
|||
|
IN UINT uVersion,
|
|||
|
IN HINF hPrintUpgInf,
|
|||
|
IN FILETIME *pFileTimeDriver,
|
|||
|
OUT UINT *puWarnLevelSrv,
|
|||
|
OUT UINT *puWarnLevelWks,
|
|||
|
OUT TString *pstrReplacementDriver
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
GetSectionName(
|
|||
|
IN LPCTSTR pszEnviornment,
|
|||
|
IN UINT uVersion,
|
|||
|
OUT TString *pstrSection
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
InfGetString(
|
|||
|
IN INFCONTEXT *pInfContext,
|
|||
|
IN UINT uFieldIndex,
|
|||
|
OUT TString *pstrReplacementDriver
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
InfGetStringAsFileTime(
|
|||
|
IN INFCONTEXT *pInfContext,
|
|||
|
IN UINT uFieldIndex,
|
|||
|
OUT FILETIME *pFileTime
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
StringTimeToFileTime(
|
|||
|
IN LPCTSTR pszFileTime,
|
|||
|
OUT FILETIME *pFileTime
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
GetBlockingStatusByWksType(
|
|||
|
IN UINT uWarnLevelSrv,
|
|||
|
IN UINT uWarnLevelWks,
|
|||
|
IN BOOL bIsServer,
|
|||
|
OUT UINT *puBlockingStatus
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
IsPrintUpgCheckNeeded(
|
|||
|
IN LPCTSTR pszServer, OPTIONAL
|
|||
|
IN LPCTSTR pszEnvironment,
|
|||
|
IN UINT uVersion,
|
|||
|
OUT BOOL *pbIsServer
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
IsLocalMachineServer(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
IsDriverDllInExcludedSection(
|
|||
|
IN LPCTSTR pszDriverPath,
|
|||
|
IN HINF hPrintUpgInf
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
IsEnvironmentAndVersionNeededToCheck(
|
|||
|
IN LPCTSTR pszEnvironment,
|
|||
|
IN UINT uVersion
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
GetCurrentThreadLastPopup(
|
|||
|
OUT HWND *phwnd
|
|||
|
);
|
|||
|
|
|||
|
#if DBG_PRINTUPG
|
|||
|
|
|||
|
extern TCHAR cszPrintUpgInf[];
|
|||
|
|
|||
|
struct PrintUpgTest
|
|||
|
{
|
|||
|
LPCTSTR pszDriverModel;
|
|||
|
LPCTSTR pszDriverPath;
|
|||
|
LPCTSTR pszEnvironment;
|
|||
|
LPCTSTR pszDriverTime;
|
|||
|
UINT uVersion;
|
|||
|
BOOL bIsServer;
|
|||
|
UINT uBlockingStatus;
|
|||
|
LPCTSTR pszReplacementDriver;
|
|||
|
BOOL bSuccess;
|
|||
|
};
|
|||
|
|
|||
|
HRESULT
|
|||
|
TestPrintUpgOne(
|
|||
|
IN LPCTSTR pszDriverModel,
|
|||
|
IN LPCTSTR pszDriverPath,
|
|||
|
IN LPCTSTR pszEnviornment,
|
|||
|
IN LPCTSTR pszFileTimeDriver,
|
|||
|
IN LPCTSTR pszPrintUpgInf,
|
|||
|
IN UINT uVersion,
|
|||
|
IN BOOL bIsServer,
|
|||
|
IN UINT uBlockingStatus,
|
|||
|
IN LPCTSTR pszReplacementDriver,
|
|||
|
IN BOOL bSuccess
|
|||
|
);
|
|||
|
|
|||
|
HRESULT
|
|||
|
TestPrintUpgAll(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
StringToDate(
|
|||
|
LPTSTR pszDate,
|
|||
|
SYSTEMTIME *pInfTime
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
LocalFreeMem(
|
|||
|
IN VOID *p
|
|||
|
);
|
|||
|
|
|||
|
LPTSTR
|
|||
|
FileNamePart(
|
|||
|
IN LPCTSTR pszFullName
|
|||
|
);
|
|||
|
|
|||
|
LPTSTR
|
|||
|
AllocStr(
|
|||
|
IN LPCTSTR pszStr
|
|||
|
);
|
|||
|
|
|||
|
#ifdef UNICODE
|
|||
|
#define lstrchr wcschr
|
|||
|
#define lstrncmp wcsncmp
|
|||
|
#define lstrncmpi _wcsnicmp
|
|||
|
#else
|
|||
|
#define lstrchr strchr
|
|||
|
#define lstrtok strtok
|
|||
|
#define lstrncmp strncmp
|
|||
|
#define lstrncmpi _strnicmp
|
|||
|
#endif
|
|||
|
|
|||
|
#else // DBG_PRINTUPG
|
|||
|
|
|||
|
#define DBG_MSG(uDbgLevel, argsPrint ) // remove all DBG_MSG
|
|||
|
|
|||
|
#endif // DBG_PRINTUPG
|
|||
|
|
|||
|
#endif // PRINTUG_HXX
|
|||
|
|