/*++ Copyright (c) 1996 Microsoft Corporation Module Name: install.c Abstract: This module contains installation functions. Author: Andrew Ritz (andrewr) 9-Dec-1997 Revision History: --*/ #include "faxapi.h" #pragma hdrstop extern HINSTANCE MyhInstance; BOOL CreatePrinterandGroups(); BOOL CreateLocalFaxPrinter(LPWSTR FaxPrinterName,LPWSTR SourceRoot); VOID CreateGroupItems(LPWSTR ServerName); BOOL AddMethodKey( HKEY hKey, LPCWSTR MethodName, LPCWSTR FriendlyName, LPCWSTR FunctionName, LPCWSTR Guid, DWORD Priority ) ; WINFAXAPI BOOL WINAPI FaxRegisterServiceProviderW( IN LPCWSTR DeviceProvider, IN LPCWSTR FriendlyName, IN LPCWSTR ImageName, IN LPCWSTR TspName ) { HKEY hKey; BOOL RetVal = TRUE; WCHAR KeyName[256]; if (!DeviceProvider || !FriendlyName || !ImageName ||!TspName) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } wsprintf(KeyName,L"%s\\%s\\%s",REGKEY_SOFTWARE,REGKEY_DEVICE_PROVIDERS,DeviceProvider); hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE, KeyName, TRUE, 0); if (!hKey) { return FALSE; } // // add values // if (! (SetRegistryString(hKey,REGVAL_FRIENDLY_NAME,FriendlyName) && SetRegistryStringExpand(hKey,REGVAL_IMAGE_NAME,ImageName) && SetRegistryString(hKey,REGVAL_PROVIDER_NAME,TspName) )) { goto error_exit; } RegCloseKey(hKey); // // create printer, program group, etc. // if (!CreatePrinterandGroups()) { return FALSE; } return TRUE; error_exit: // // delete the subkey on failure // wsprintf(KeyName,L"%s\\%s",REGKEY_SOFTWARE,REGKEY_DEVICE_PROVIDERS); hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE,KeyName,FALSE,0); RegDeleteKey(hKey, DeviceProvider ); RegCloseKey(hKey); return FALSE; } WINFAXAPI BOOL WINAPI FaxRegisterRoutingExtensionW( IN HANDLE FaxHandle, IN LPCWSTR ExtensionName, IN LPCWSTR FriendlyName, IN LPCWSTR ImageName, IN PFAX_ROUTING_INSTALLATION_CALLBACKW CallBack, IN LPVOID Context ) { HKEY hKey = NULL; BOOL RetVal = FALSE; WCHAR KeyName[256]; PFAX_GLOBAL_ROUTING_INFO RoutingInfo; DWORD dwMethods; WCHAR MethodName[64]; WCHAR MethodFriendlyName[64]; WCHAR MethodFunctionName[64]; WCHAR MethodGuid[64]; if (!ValidateFaxHandle(FaxHandle, FHT_SERVICE)) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (!ExtensionName || !FriendlyName || !ImageName ||!CallBack) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } // // local installation only // if (!IsLocalFaxConnection(FaxHandle) ) { SetLastError(ERROR_INVALID_FUNCTION); return FALSE; } // // get the number of current methods for priority // if (!FaxEnumGlobalRoutingInfo(FaxHandle,&RoutingInfo,&dwMethods) ){ DebugPrint((TEXT("FaxEnumGlobalRoutingInfo() failed, ec = %d\n"),GetLastError() )); return FALSE; } FaxFreeBuffer(RoutingInfo); wsprintf(KeyName,L"%s\\%s\\%s",REGKEY_SOFTWARE,REGKEY_ROUTING_EXTENSIONS,ExtensionName); hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE, KeyName, TRUE, 0); if (!hKey) { return FALSE; } // // add values // if (! (SetRegistryString(hKey,REGVAL_FRIENDLY_NAME,FriendlyName) && SetRegistryStringExpand(hKey,REGVAL_IMAGE_NAME,ImageName) )) { RetVal = FALSE; goto error_exit; } RegCloseKey (hKey); wcscat(KeyName, L"\\"); wcscat(KeyName, REGKEY_ROUTING_METHODS); hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE, KeyName, TRUE, 0); if (!hKey) { goto error_exit; } while (TRUE) { ZeroMemory( MethodName, sizeof(MethodName) ); ZeroMemory( MethodFriendlyName, sizeof(MethodFriendlyName) ); ZeroMemory( MethodFunctionName, sizeof(MethodFunctionName) ); ZeroMemory( MethodGuid, sizeof(MethodGuid) ); __try { RetVal = CallBack(FaxHandle, Context, MethodName, MethodFriendlyName, MethodFunctionName, MethodGuid ); if (!RetVal) { break; } dwMethods++; if (!AddMethodKey(hKey,MethodName,MethodFriendlyName,MethodFunctionName,MethodGuid,dwMethods) ) { goto error_exit; } } __except (EXCEPTION_EXECUTE_HANDLER) { goto error_exit; } } RegCloseKey( hKey ); return TRUE; error_exit: if (hKey) { RegCloseKey( hKey ); } // // delete the subkey on failure // wsprintf(KeyName,L"%s\\%s",REGKEY_SOFTWARE,REGKEY_ROUTING_METHODS); hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE,KeyName,FALSE,0); RegDeleteKey(hKey, ExtensionName ); RegCloseKey(hKey); return FALSE; } BOOL AddMethodKey( HKEY hKey, LPCWSTR MethodName, LPCWSTR FriendlyName, LPCWSTR FunctionName, LPCWSTR Guid, DWORD Priority ) { HKEY hKeyNew; hKeyNew = OpenRegistryKey(hKey, MethodName, TRUE, 0); if (!hKeyNew) { return FALSE; } // // add values // if (! (SetRegistryString(hKeyNew, REGVAL_FRIENDLY_NAME,FriendlyName) && SetRegistryString(hKeyNew, REGVAL_FUNCTION_NAME,FunctionName) && SetRegistryString(hKeyNew, REGVAL_GUID,Guid) && SetRegistryDword(hKeyNew, REGVAL_PRIORITY,Priority) )) { goto error_exit; } RegCloseKey(hKeyNew); return TRUE; error_exit: RegCloseKey(hKeyNew); RegDeleteKey(hKey, MethodName); return FALSE; } BOOL CreatePrinterandGroups() { WCHAR PrinterName[64]; HKEY hKeySource; LPWSTR SourcePath; HMODULE hModSetup; LPWSTR FaxPrinter; FARPROC CreateLocalFaxPrinter; FARPROC CreateGroupItems; // // check if we have a fax printer installed, add one if we don't have one. // if ((FaxPrinter = GetFaxPrinterName())) { MemFree(FaxPrinter); //return EnsureFaxServiceIsStarted(NULL); return TRUE; } else { // // printer installation routines in faxocm.dll module. // hModSetup = LoadLibrary(L"faxocm.dll"); if (!hModSetup) { return FALSE; } CreateLocalFaxPrinter = GetProcAddress(hModSetup, "CreateLocalFaxPrinter"); CreateGroupItems = GetProcAddress(hModSetup, "CreateGroupItems"); if (!CreateLocalFaxPrinter || !CreateGroupItems) { FreeLibrary(hModSetup); return FALSE; } // // create a fax printer // LoadString( MyhInstance, IDS_DEFAULT_PRINTER_NAME, PrinterName, sizeof(PrinterName)/sizeof(WCHAR) ); hKeySource = OpenRegistryKey( HKEY_LOCAL_MACHINE, REGKEY_WINDOWSNT_CURRVER, FALSE, KEY_READ ); if (hKeySource) { SourcePath = GetRegistryString( hKeySource, REGVAL_SOURCE_PATH, EMPTY_STRING ); RegCloseKey( hKeySource ); } else { SourcePath = StringDup( EMPTY_STRING ); } if (SourcePath) { if (!CreateLocalFaxPrinter( PrinterName, SourcePath )) { DebugPrint(( L"CreateLocalFaxPrinter() failed" )); } MemFree( SourcePath ); } // // add program group items // CreateGroupItems( NULL ); FreeLibrary(hModSetup); // // start the fax service, which should add new devices // //return EnsureFaxServiceIsStarted(NULL); return TRUE; } }