202 lines
7.3 KiB
C++
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;
|
|
}
|