/*++ 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 "wizard.h" #pragma hdrstop #if DBG typedef struct _DIF_DEBUG { DWORD DifValue; LPTSTR DifString; } DIF_DEBUG, *PDIF_DEBUG; DIF_DEBUG DifDebug[] = { { 0, TEXT("") }, // 0x00000000 { DIF_SELECTDEVICE, TEXT("DIF_SELECTDEVICE") }, // 0x00000001 { DIF_INSTALLDEVICE, TEXT("DIF_INSTALLDEVICE") }, // 0x00000002 { DIF_ASSIGNRESOURCES, TEXT("DIF_ASSIGNRESOURCES") }, // 0x00000003 { DIF_PROPERTIES, TEXT("DIF_PROPERTIES") }, // 0x00000004 { DIF_REMOVE, TEXT("DIF_REMOVE") }, // 0x00000005 { DIF_FIRSTTIMESETUP, TEXT("DIF_FIRSTTIMESETUP") }, // 0x00000006 { DIF_FOUNDDEVICE, TEXT("DIF_FOUNDDEVICE") }, // 0x00000007 { DIF_SELECTCLASSDRIVERS, TEXT("DIF_SELECTCLASSDRIVERS") }, // 0x00000008 { DIF_VALIDATECLASSDRIVERS, TEXT("DIF_VALIDATECLASSDRIVERS") }, // 0x00000009 { DIF_INSTALLCLASSDRIVERS, TEXT("DIF_INSTALLCLASSDRIVERS") }, // 0x0000000A { DIF_CALCDISKSPACE, TEXT("DIF_CALCDISKSPACE") }, // 0x0000000B { DIF_DESTROYPRIVATEDATA, TEXT("DIF_DESTROYPRIVATEDATA") }, // 0x0000000C { DIF_VALIDATEDRIVER, TEXT("DIF_VALIDATEDRIVER") }, // 0x0000000D { DIF_MOVEDEVICE, TEXT("DIF_MOVEDEVICE") }, // 0x0000000E { DIF_DETECT, TEXT("DIF_DETECT") }, // 0x0000000F { DIF_INSTALLWIZARD, TEXT("DIF_INSTALLWIZARD") }, // 0x00000010 { DIF_DESTROYWIZARDDATA, TEXT("DIF_DESTROYWIZARDDATA") }, // 0x00000011 { DIF_PROPERTYCHANGE, TEXT("DIF_PROPERTYCHANGE") }, // 0x00000012 { DIF_ENABLECLASS, TEXT("DIF_ENABLECLASS") }, // 0x00000013 { DIF_DETECTVERIFY, TEXT("DIF_DETECTVERIFY") }, // 0x00000014 { DIF_INSTALLDEVICEFILES, TEXT("DIF_INSTALLDEVICEFILES") }, // 0x00000015 { DIF_UNREMOVE, TEXT("DIF_UNREMOVE") }, // 0x00000016 { DIF_SELECTBESTCOMPATDRV, TEXT("DIF_SELECTBESTCOMPATDRV") }, // 0x00000017 { DIF_ALLOW_INSTALL, TEXT("DIF_ALLOW_INSTALL") }, // 0x00000018 { DIF_REGISTERDEVICE, TEXT("DIF_REGISTERDEVICE") }, // 0x00000019 { 0, TEXT("") }, // 0x0000001A { 0, TEXT("") }, // 0x0000001B { 0, TEXT("") }, // 0x0000001C { 0, TEXT("") }, // 0x0000001D { 0, TEXT("") }, // 0x0000001E { 0, TEXT("") }, // 0x0000001F { DIF_INSTALLINTERFACES, TEXT("DIF_INSTALLINTERFACES") }, // 0x00000020 { DIF_DETECTCANCEL, TEXT("DIF_DETECTCANCEL") }, // 0x00000021 { DIF_REGISTER_COINSTALLERS, TEXT("DIF_REGISTER_COINSTALLERS") }, // 0x00000022 { 0, TEXT("") } // 0x00000023 }; #endif LRESULT FaxModemDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_INITDIALOG: break; case WM_COMMAND: switch( wParam ) { case IDCANCEL: EndDialog( hwnd, IDCANCEL ); return TRUE; case IDOK: EndDialog( hwnd, IDOK ); return TRUE; } break; } return FALSE; } DWORD CALLBACK FaxModemCoClassInstaller( IN DI_FUNCTION InstallFunction, IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN OUT PCOINSTALLER_CONTEXT_DATA Context ) { DWORD rVal = NO_ERROR; HKEY hKey = INVALID_HANDLE_VALUE; LPTSTR FriendlyName = NULL; LPTSTR ModemAttachedTo = NULL; HANDLE hFile = NULL; TCHAR ComPortName[32]; #if 0 int DlgErr; #endif DebugPrint(( TEXT("FaxModemCoClassInstaller: processing %s request"), DifDebug[InstallFunction].DifString )); if (InstallFunction == DIF_FIRSTTIMESETUP) { NtGuiMode = TRUE; return 0; } if (InstallFunction == DIF_INSTALLDEVICE) { if (!Context->PostProcessing) { DebugPrint(( TEXT("FaxModemCoClassInstaller: pre-installation, waiting for post-installation call") )); return ERROR_DI_POSTPROCESSING_REQUIRED; } if (Context->InstallResult != NO_ERROR) { DebugPrint(( TEXT("FaxModemCoClassInstaller: previous error causing installation failure, 0x%08x"), Context->InstallResult )); return Context->InstallResult; } // // get the modem information // hKey = SetupDiOpenDevRegKey( DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_READ ); if (hKey == INVALID_HANDLE_VALUE) { DebugPrint(( TEXT("FaxModemCoClassInstaller: SetupDiOpenDevRegKey failed") )); rVal = ERROR_GEN_FAILURE; goto fax_install_exit; } FriendlyName = GetRegistryString( hKey, TEXT("FriendlyName"), EMPTY_STRING ); ModemAttachedTo = GetRegistryString( hKey, TEXT("AttachedTo"), EMPTY_STRING ); RegCloseKey( hKey ); // // open the com port that the modem is attached to // _stprintf( ComPortName, TEXT("\\\\.\\%s"), ModemAttachedTo ); hFile = CreateFile( ComPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); if (hFile == INVALID_HANDLE_VALUE) { DebugPrint(( TEXT("FaxModemCoClassInstaller: could not open the com port for modem [%s][%s], ec=%d"), FriendlyName, ModemAttachedTo, GetLastError() )); rVal = ERROR_GEN_FAILURE; goto fax_install_exit; } // // get the fax class for the modem, zero is data only // if (GetModemClass( hFile ) == 0) { DebugPrint(( TEXT("FaxModemCoClassInstaller: modem is NOT a fax modem [%s][%s]"), FriendlyName, ModemAttachedTo )); CloseHandle( hFile ); rVal = ERROR_GEN_FAILURE; goto fax_install_exit; } CloseHandle( hFile ); // // the modem is a valid fax modem // ask the user if they want fax services // #if 0 if (!NtGuiMode) { DlgErr = DialogBoxParam( FaxWizModuleHandle, MAKEINTRESOURCE(IDD_FAX_MODEM_INSTALL), NULL, FaxModemDlgProc, (LPARAM) 0 ); if (DlgErr == -1 || DlgErr == 0) { // // the user does not want fax services // DebugPrint(( TEXT("FaxModemCoClassInstaller: user does not want fax service for modem [%s][%s]"), FriendlyName, ModemAttachedTo )); goto fax_install_exit; } } #endif if (!NtGuiMode) { // // create a fax printer // if (!CreateServerFaxPrinter( NULL, FAX_PRINTER_NAME )) { DebugPrint(( TEXT("CreateServerFaxPrinter() failed") )); } // // start the fax service // StartFaxService(); // // create the program groups // CreateGroupItems( FALSE, NULL ); } fax_install_exit: MemFree( FriendlyName ); MemFree( ModemAttachedTo ); return rVal; } return NO_ERROR; }