265 lines
9 KiB
C
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);
|
||
|
}
|
||
|
|