/*++ Copyright (c) 1995 Microsoft Corporation Module Name: printupg.c Abstract: Module to upgrade printer drivers and related stuff. Top-level routines: UpgradePrinters Author: Ted Miller (tedm) 4-Aug-1995 Revision History: --*/ #include "setupp.h" #pragma hdrstop // // Maximum time to wait for the spooler service to start // #define MAXIMUM_WAIT_TIME 30000 DWORD UpgradePrinters( VOID ) /*++ Routine Description: Top level routine to upgrade printer drivers. Call out to ntprint.dll to to the upgrade. Arguments: None. Return Value: Win32 error code indicating outcome of operation. NO_ERROR if successful. --*/ { DWORD ReturnCode; BOOL b; SERVICE_STATUS ServiceStatus; DWORD InitialTickCount; SC_HANDLE hSC,hService; HINSTANCE NtPrintLibrary; UPGRADEPRINTERSPROC UpgradeRoutine; // // Make sure the spooler is running. // hSC = OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT); SetupDebugPrint( L"UpgradePrinters: Just opened SCManager"); if(hSC == NULL) { ReturnCode = GetLastError(); SetuplogError( LogSevWarning, SETUPLOG_USE_MESSAGEID, MSG_LOG_PRINTUPG_FAILED, NULL, SETUPLOG_USE_MESSAGEID, MSG_LOG_X_PARAM_RETURNED_WINERR, szOpenSCManager, ReturnCode, L"SC_MANAGER_CONNECT", NULL,NULL); return(ReturnCode); } hService = OpenService(hSC,L"Spooler",SERVICE_START | SERVICE_QUERY_STATUS); SetupDebugPrint1( L"UpgradePrinters: Just opened service spooler, ret = %d", hService); CloseServiceHandle(hSC); if(hService == NULL) { ReturnCode = GetLastError(); SetuplogError( LogSevWarning, SETUPLOG_USE_MESSAGEID, MSG_LOG_PRINTUPG_FAILED, NULL, SETUPLOG_USE_MESSAGEID, MSG_LOG_X_PARAM_RETURNED_WINERR, szOpenService, ReturnCode, L"Spooler", NULL,NULL); return(ReturnCode); } if( !StartSpooler()) { ReturnCode = GetLastError(); SetuplogError( LogSevWarning, SETUPLOG_USE_MESSAGEID, MSG_LOG_PRINTUPG_FAILED, NULL, SETUPLOG_USE_MESSAGEID, MSG_LOG_X_PARAM_RETURNED_WINERR, szStartService, ReturnCode, L"Spooler", NULL,NULL); KdPrint(("SETUP: Unable to start spooler for printer upgrade (%u)\n",ReturnCode)); CloseServiceHandle(hService); return(ReturnCode); } // // Wait for the service to start. // InitialTickCount = GetTickCount(); while(TRUE) { if(QueryServiceStatus(hService,&ServiceStatus)) { if( ServiceStatus.dwCurrentState == SERVICE_RUNNING ) { KdPrint(("SETUP: spooler started after %u seconds. \n",(GetTickCount() - InitialTickCount) /1000)); break; } else if( ServiceStatus.dwCurrentState == SERVICE_START_PENDING ) { if( ( GetTickCount() - InitialTickCount ) < MAXIMUM_WAIT_TIME ) { // KdPrint(("SETUP: spooler has been starting for the past %u seconds. \n",(GetTickCount() - InitialTickCount) /1000)); // Sleep( ServiceStatus.dwWaitHint ); Sleep( 1000 ); } else { // // Assume that the service is hung // KdPrint(("SETUP: the spooler appears to be hung. It has been starting for more than %u seconds. \n", MAXIMUM_WAIT_TIME/1000)); SetuplogError( LogSevWarning, SETUPLOG_USE_MESSAGEID, MSG_LOG_PRINTUPG_FAILED, NULL, SETUPLOG_USE_MESSAGEID, MSG_LOG_SPOOLER_TIMEOUT, NULL, NULL); // // Return the same error code that EnumPrinterDrivers() // would return if called, but the spooler wasn't started // CloseServiceHandle(hService); return(RPC_S_SERVER_UNAVAILABLE); } } else { // // The service is not running and is not starting // KdPrint(("SETUP: Spooler is not running and is is not starting. ServiecState = (%u)\n", ServiceStatus.dwCurrentState)); SetuplogError( LogSevWarning, SETUPLOG_USE_MESSAGEID, MSG_LOG_PRINTUPG_FAILED, NULL, SETUPLOG_USE_MESSAGEID, MSG_LOG_SPOOLER_NOT_RUNNING, NULL, NULL); // // Return the same error code that EnumPrinterDrivers() // would return if called, but the spooler wasn't started // CloseServiceHandle(hService); return(RPC_S_SERVER_UNAVAILABLE); } } else { // // If unable to query the spooler status, then ignore the // error, wait for some time, and assume that the service is up // and running. If it is not started, then the EnumeratePrinterDrivers // will fail, an we will catch the error there. // ReturnCode = GetLastError(); KdPrint(("SETUP: Unable to query spooler status. Error = (%u)\n",ReturnCode)); Sleep( 10000 ); break; } } CloseServiceHandle(hService); NtPrintLibrary = LoadLibrary(L"NTPRINT"); if(!NtPrintLibrary) { ReturnCode = GetLastError(); SetuplogError( LogSevWarning, SETUPLOG_USE_MESSAGEID, MSG_LOG_PRINTUPG_FAILED, NULL, SETUPLOG_USE_MESSAGEID, MSG_LOG_X_PARAM_RETURNED_WINERR, L"LoadLibrary", ReturnCode, L"NTPRINT.DLL", NULL,NULL); return(ReturnCode); } UpgradeRoutine = (UPGRADEPRINTERSPROC)GetProcAddress( NtPrintLibrary, UPGRADEPRINTERSPROCNAME ); if(!UpgradeRoutine) { ReturnCode = GetLastError(); SetuplogError( LogSevWarning, SETUPLOG_USE_MESSAGEID, MSG_LOG_PRINTUPG_FAILED, NULL, SETUPLOG_USE_MESSAGEID, MSG_LOG_X_PARAM_RETURNED_WINERR, L"GetProcAddress", ReturnCode, L"NTPRINT.DLL", NULL,NULL); FreeLibrary(NtPrintLibrary); return(ReturnCode); } ReturnCode = UpgradeRoutine(MainWindowHandle,&InternalSetupData); if(ReturnCode != NO_ERROR) { SetuplogError( LogSevWarning, SETUPLOG_USE_MESSAGEID, MSG_LOG_PRINTUPG_FAILED, NULL, SETUPLOG_USE_MESSAGEID, MSG_LOG_X_RETURNED_WINERR, L"NTPRINT.DLL", ReturnCode, NULL,NULL); } FreeLibrary(NtPrintLibrary); SetupDebugPrint1( L"UpgradePrinters: leaving ret = %d", ReturnCode); return(ReturnCode); }