windows-nt/Source/XPSP1/NT/base/mvdm/fax/wowfaxui/wfupgrad.c
2020-09-26 16:20:57 +08:00

265 lines
9 KiB
C

//************************************************************************
// Generic Win 3.1 fax printer driver support. User Interface helper
// functions which are called in WOWFAXUI.C, helpers used during upgrade.
//
// History:
// 14-mar-95 reedb Created. These were moved from WOWFAXUI.C.
//
//************************************************************************
#include "windows.h"
#include "wowfaxui.h"
#include "winspool.h"
extern LPCRITICAL_SECTION lpCriticalSection;
extern HINSTANCE ghInst;
//************************************************************************
// AllocPathW - Helper for DrvUpgradePrinter and friends.
//************************************************************************
PWSTR AllocPathW(VOID)
{
PWSTR szTmp;
szTmp = WFLOCALALLOC((MAX_PATH+1) * sizeof(TCHAR), L"AllocPathW");
return(szTmp);
}
//************************************************************************
// BuildPathW - Helper for DrvUpgradePrinter and friends.
//************************************************************************
PWSTR BuildPathW(PWSTR szPath, PWSTR szFileName)
{
PWSTR szTmp;
if ((szTmp = WFLOCALALLOC((MAX_PATH+1) * sizeof(TCHAR), L"BuildPathW")) != NULL) {
wcscpy(szTmp, szPath);
wcscat(szTmp, L"\\");
wcscat(szTmp, szFileName);
return(szTmp);
}
else {
return(NULL);
}
}
//************************************************************************
// MyGetFileTime - Helper for DrvUpgradePrinter and friends.
//************************************************************************
BOOL MyGetFileTime(PWSTR szDir, PWSTR szName, LPFILETIME lpFileTime)
{
LPWIN32_FIND_DATA lpfd;
HANDLE hfd;
PWSTR szTmp;
BOOL bRet = FALSE;
szTmp = BuildPathW(szDir, szName);
lpfd = WFLOCALALLOC(sizeof(WIN32_FIND_DATA), L"MyGetFileTime");
if ((szTmp) && (lpfd)) {
LOGDEBUG(1, (L"WOWFAXUI!GetFileTime, szTmp: %s\n", szTmp));
if ((hfd = FindFirstFile(szTmp, lpfd)) != INVALID_HANDLE_VALUE) {
memcpy(lpFileTime, &(lpfd->ftLastWriteTime), sizeof(FILETIME));
FindClose(hfd);
bRet = TRUE;
LOGDEBUG(1, (L"WOWFAXUI!GetFileTime, FileTimeHi: %X FileTimeLo: %X\n", lpFileTime->dwHighDateTime, lpFileTime->dwLowDateTime));
}
else {
LOGDEBUG(0, (L"WOWFAXUI!GetFileTime, file not found: %s\n", szTmp));
}
}
if (szTmp) {
LocalFree(szTmp);
}
if (lpfd) {
LocalFree(lpfd);
}
return(bRet);
}
//************************************************************************
// CheckForNewerFiles - Helper for DrvUpgradePrinter. Compares the date/time
// of wowfaxui.dll and wowfax.dll in the two passed directories. Returns
// FALSE if files in szOldDriverDir are the same or newer than those
// in szSysDir. Otherwise returns non-zero.
//************************************************************************
BOOL CheckForNewerFiles(PWSTR szOldDriverDir, PWSTR szSysDir)
{
FILETIME ftSourceDriver, ftCurrentDriver;
BOOL bRet = FALSE;
if ((szOldDriverDir) && (szSysDir)) {
if (MyGetFileTime(szOldDriverDir, L"wowfax.dll", &ftCurrentDriver)) {
if (MyGetFileTime(szSysDir, L"wowfax.dll", &ftSourceDriver)) {
// Check time/date to see if we need to update the drivers.
if (CompareFileTime(&ftSourceDriver, &ftCurrentDriver) > 0) {
bRet = TRUE;
}
}
}
if (MyGetFileTime(szOldDriverDir, L"wowfaxui.dll", &ftCurrentDriver)) {
if (MyGetFileTime(szSysDir, L"wowfaxui.dll", &ftSourceDriver)) {
if (CompareFileTime(&ftSourceDriver, &ftCurrentDriver) > 0) {
bRet = TRUE;
}
}
}
}
else {
LOGDEBUG(0, (L"WOWFAXUI!CheckForNewerFiles: NULL directory parameters\n"));
}
return(bRet);
}
//************************************************************************
// DoUpgradePrinter - Called by DrvUpgradePrinter which is called in the
// system context by the spooler.
//************************************************************************
BOOL DoUpgradePrinter(DWORD dwLevel, LPDRIVER_UPGRADE_INFO_1W lpDrvUpgradeInfo)
{
static BOOL bDrvUpgradePrinterLock = FALSE;
HANDLE hPrinter = NULL;
DRIVER_INFO_2 DriverInfo, *pDriverInfo = NULL;
DWORD dwNeeded = 0;
PWSTR szSysDir = NULL;
PWSTR szDstDir = NULL;
PWSTR szSrcPath = NULL;
PWCHAR pwc;
BOOL bRet = FALSE;
TCHAR szName[WOWFAX_MAX_USER_MSG_LEN] = L"";
// Check for correct level for upgrade.
if (dwLevel != 1) {
LOGDEBUG(0, (L"WOWFAXUI!DrvUpgradePrinter, Bad input Level\n"));
SetLastError(ERROR_INVALID_LEVEL);
goto DoUpgradePrinterExit;
}
szDstDir = AllocPathW();
szSysDir = AllocPathW();
if (!szDstDir || !szSysDir) {
LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, work space allocation failed\n"));
goto DoUpgradePrinterExit;
}
if (!GetSystemDirectory(szSysDir, MAX_PATH+1)) {
LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, GetSystemDirectory failed\n"));
goto DoUpgradePrinterExit;
}
if (!lpDrvUpgradeInfo->pPrinterName) {
LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, pPrinterName is NULL\n"));
goto DoUpgradePrinterExit;
}
// Get the paths to the old printer drivers.
if (!OpenPrinter(lpDrvUpgradeInfo->pPrinterName, &hPrinter, NULL)) {
LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, Unable to open: %s\n", lpDrvUpgradeInfo->pPrinterName));
goto DoUpgradePrinterExit;
}
GetPrinterDriver(hPrinter, NULL, 2, (LPBYTE) pDriverInfo, 0, &dwNeeded);
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, GetPrinterDriver failed\n"));
goto DoUpgradePrinterExit;
}
if ((pDriverInfo = WFLOCALALLOC(dwNeeded, L"DoUpgradePrinter")) == NULL) {
LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, work space allocation failed\n"));
goto DoUpgradePrinterExit;
}
if (!GetPrinterDriver(hPrinter, NULL, 2, (LPBYTE) pDriverInfo, dwNeeded, &dwNeeded)) {
LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, GetPrinterDriver failed, GetLastError: %d\n", GetLastError()));
goto DoUpgradePrinterExit;
}
ClosePrinter(hPrinter);
// Strip off the file name.
if ((pwc = wcsrchr(pDriverInfo->pDriverPath, L'\\')) == NULL) {
LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, unable to strip file name\n"));
goto DoUpgradePrinterExit;
}
*pwc = UNICODE_NULL;
// Install new printer driver if it's more recent than the old one.
if (CheckForNewerFiles(pDriverInfo->pDriverPath, szSysDir)) {
LOGDEBUG(1, (L"WOWFAXUI!DoUpgradePrinter, Doing driver update\n"));
memset(&DriverInfo, 0, sizeof(DRIVER_INFO_2));
if (!GetPrinterDriverDirectory(NULL, NULL, 1, (LPBYTE) szDstDir, MAX_PATH, &dwNeeded)) {
LOGDEBUG(0, (L"WOWFAXUI!DoUpgradePrinter, GetPrinterDriverDirectory failed\n"));
goto DoUpgradePrinterExit;
}
// This is a dummy. We've no data file, but spooler won't take NULL.
DriverInfo.pDataFile = BuildPathW(szDstDir, WOWFAX_DLL_NAME);
DriverInfo.pDriverPath = BuildPathW(szDstDir, WOWFAX_DLL_NAME);
LOGDEBUG(1, (L"WOWFAXUI!DoUpgradePrinter, pDriverPath = %s\n", DriverInfo.pDataFile));
if (DriverInfo.pDriverPath) {
szSrcPath = BuildPathW(szSysDir, WOWFAX_DLL_NAME);
if (szSrcPath) {
CopyFile(szSrcPath, DriverInfo.pDriverPath, FALSE);
LocalFree(szSrcPath);
}
}
DriverInfo.pConfigFile = BuildPathW(szDstDir, WOWFAXUI_DLL_NAME);
szSrcPath = BuildPathW(szSysDir, WOWFAXUI_DLL_NAME);
if (DriverInfo.pConfigFile) {
if (szSrcPath) {
CopyFile(szSrcPath, DriverInfo.pConfigFile, FALSE);
LocalFree(szSrcPath);
}
}
// Install the printer driver.
DriverInfo.cVersion = 1;
if (LoadString(ghInst, WOWFAX_NAME_STR, szName, WOWFAX_MAX_USER_MSG_LEN)) {
DriverInfo.pName = szName;
if (AddPrinterDriver(NULL, 2, (LPBYTE) &DriverInfo) == FALSE) {
bRet = (GetLastError() == ERROR_PRINTER_DRIVER_ALREADY_INSTALLED);
}
else {
bRet = TRUE;
}
}
if (DriverInfo.pDataFile) {
LocalFree(DriverInfo.pDataFile);
}
if (DriverInfo.pDriverPath) {
LocalFree(DriverInfo.pDriverPath);
}
if (DriverInfo.pConfigFile) {
LocalFree(DriverInfo.pConfigFile);
}
}
else {
LOGDEBUG(1, (L"WOWFAXUI!DoUpgradePrinter, No driver update\n"));
bRet = TRUE;
}
DoUpgradePrinterExit:
if (szDstDir) {
LocalFree(szDstDir);
}
if (szSysDir) {
LocalFree(szSysDir);
}
if (pDriverInfo) {
LocalFree(pDriverInfo);
}
return(bRet);
}