367 lines
8.2 KiB
C
367 lines
8.2 KiB
C
|
/*++
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
}
|