|
|
//************************************************************************
// 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) { int len; PWSTR szTmp;
// +slash+NULL
len = wcslen(szPath); len += wcslen(szFileName); len += (1 + 1); // slash + NULL
if ((szTmp = WFLOCALALLOC(len * sizeof(WCHAR), 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 || !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); }
|