/*++ Copyright (c) 1997 Microsoft Corporation Module Name: class.c Abstract: This file implements the modem co-class installer for fax. Environment: WIN32 User Mode Author: Wesley Witt (wesw) 31-Jul-1997 --*/ #include "faxocm.h" #pragma hdrstop #if DBG typedef struct _DIF_DEBUG { DWORD DifValue; LPTSTR DifString; } DIF_DEBUG, *PDIF_DEBUG; DIF_DEBUG DifDebug[] = { { 0, L"" }, // 0x00000000 { DIF_SELECTDEVICE, L"DIF_SELECTDEVICE" }, // 0x00000001 { DIF_INSTALLDEVICE, L"DIF_INSTALLDEVICE" }, // 0x00000002 { DIF_ASSIGNRESOURCES, L"DIF_ASSIGNRESOURCES" }, // 0x00000003 { DIF_PROPERTIES, L"DIF_PROPERTIES" }, // 0x00000004 { DIF_REMOVE, L"DIF_REMOVE" }, // 0x00000005 { DIF_FIRSTTIMESETUP, L"DIF_FIRSTTIMESETUP" }, // 0x00000006 { DIF_FOUNDDEVICE, L"DIF_FOUNDDEVICE" }, // 0x00000007 { DIF_SELECTCLASSDRIVERS, L"DIF_SELECTCLASSDRIVERS" }, // 0x00000008 { DIF_VALIDATECLASSDRIVERS, L"DIF_VALIDATECLASSDRIVERS" }, // 0x00000009 { DIF_INSTALLCLASSDRIVERS, L"DIF_INSTALLCLASSDRIVERS" }, // 0x0000000A { DIF_CALCDISKSPACE, L"DIF_CALCDISKSPACE" }, // 0x0000000B { DIF_DESTROYPRIVATEDATA, L"DIF_DESTROYPRIVATEDATA" }, // 0x0000000C { DIF_VALIDATEDRIVER, L"DIF_VALIDATEDRIVER" }, // 0x0000000D { DIF_MOVEDEVICE, L"DIF_MOVEDEVICE" }, // 0x0000000E { DIF_DETECT, L"DIF_DETECT" }, // 0x0000000F { DIF_INSTALLWIZARD, L"DIF_INSTALLWIZARD" }, // 0x00000010 { DIF_DESTROYWIZARDDATA, L"DIF_DESTROYWIZARDDATA" }, // 0x00000011 { DIF_PROPERTYCHANGE, L"DIF_PROPERTYCHANGE" }, // 0x00000012 { DIF_ENABLECLASS, L"DIF_ENABLECLASS" }, // 0x00000013 { DIF_DETECTVERIFY, L"DIF_DETECTVERIFY" }, // 0x00000014 { DIF_INSTALLDEVICEFILES, L"DIF_INSTALLDEVICEFILES" }, // 0x00000015 { DIF_UNREMOVE, L"DIF_UNREMOVE" }, // 0x00000016 { DIF_SELECTBESTCOMPATDRV, L"DIF_SELECTBESTCOMPATDRV" }, // 0x00000017 { DIF_ALLOW_INSTALL, L"DIF_ALLOW_INSTALL" }, // 0x00000018 { DIF_REGISTERDEVICE, L"DIF_REGISTERDEVICE" }, // 0x00000019 { 0, L"" }, // 0x0000001A { 0, L"" }, // 0x0000001B { 0, L"" }, // 0x0000001C { 0, L"" }, // 0x0000001D { 0, L"" }, // 0x0000001E { 0, L"" }, // 0x0000001F { DIF_INSTALLINTERFACES, L"DIF_INSTALLINTERFACES" }, // 0x00000020 { DIF_DETECTCANCEL, L"DIF_DETECTCANCEL" }, // 0x00000021 { DIF_REGISTER_COINSTALLERS, L"DIF_REGISTER_COINSTALLERS" }, // 0x00000022 { 0, L"" } // 0x00000023 }; #endif VOID StartSystray( VOID ) { STARTUPINFO si; PROCESS_INFORMATION pi; LPWSTR szSystray = ExpandEnvironmentString( L"%systemroot%\\system32\\systray.exe" ); GetStartupInfo(&si); if ( CreateProcess(NULL,szSystray,NULL,NULL,FALSE,DETACHED_PROCESS,NULL,NULL,&si,&pi) ) { CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } MemFree( szSystray ); } DWORD CALLBACK FaxModemCoClassInstaller( IN DI_FUNCTION InstallFunction, IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN OUT PCOINSTALLER_CONTEXT_DATA Context ) { __try { DebugPrint(( L"FaxModemCoClassInstaller: processing %s request", DifDebug[InstallFunction].DifString )); if (InstallFunction == DIF_FIRSTTIMESETUP) { NtGuiMode = TRUE; return Context->InstallResult; } if (InstallFunction == DIF_INSTALLDEVICE) { if (!Context->PostProcessing) { DebugPrint(( L"FaxModemCoClassInstaller: pre-installation, waiting for post-installation call" )); return ERROR_DI_POSTPROCESSING_REQUIRED; } if (Context->InstallResult != NO_ERROR) { DebugPrint(( L"FaxModemCoClassInstaller: previous error causing installation failure, 0x%08x", Context->InstallResult )); return Context->InstallResult; } if (!NtGuiMode) { // // check if we have a fax printer // PPRINTER_INFO_2 pPrinterInfo; DWORD dwPrinters, i; // // note: if this call returns NULL, assume this means that there are zero printers installed, // not a spooler errror // pPrinterInfo = (PPRINTER_INFO_2) MyEnumPrinters(NULL,2,&dwPrinters,PRINTER_ENUM_LOCAL); if (pPrinterInfo) { for (i=0;iInstallResult; }