windows-nt/Source/XPSP1/NT/printscan/fax/setup/ocm/class.cpp
2020-09-26 16:20:57 +08:00

202 lines
7.3 KiB
C++

/*++
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;i<dwPrinters;i++) {
if (wcscmp(pPrinterInfo[i].pDriverName,FAX_DRIVER_NAME) == 0) {
DebugPrint(( L"Fax printer %s already installed, exiting co-class installer", pPrinterInfo[i].pPrinterName ));
MemFree( pPrinterInfo );
return NO_ERROR;
}
}
MemFree( pPrinterInfo );
}
//
// create a fax printer
//
WCHAR PrinterName[64];
LoadString( hInstance, IDS_DEFAULT_PRINTER_NAME, PrinterName, sizeof(PrinterName)/sizeof(WCHAR) );
if (!CreateLocalFaxPrinter( PrinterName )) {
DebugPrint(( L"CreateLocalFaxPrinter() failed" ));
}
//
// start the fax service
//
StartFaxService();
//
// put the control panel back in place so the user sees it
//
LPTSTR dstFile = ExpandEnvironmentString( TEXT("%systemroot%\\system32\\fax.cpl") );
LPTSTR srcFile = ExpandEnvironmentString( TEXT("%systemroot%\\system32\\fax.cpk") );
if (!MoveFileEx(srcFile, dstFile, MOVEFILE_REPLACE_EXISTING)) {
MoveFileEx(srcFile, dstFile, MOVEFILE_REPLACE_EXISTING | MOVEFILE_DELAY_UNTIL_REBOOT);
}
//
// create the program groups
//
CreateGroupItems( NULL );
//
// restart systray so that we get the fax icon
//
// StartSystray();
}
return NO_ERROR;
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
DebugPrint(( TEXT("FaxModemCoClassInstaller crashed: 0x%08x"), GetExceptionCode() ));
}
return Context->InstallResult;
}