|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
install.c
Abstract:
This module contains installation functions.
Author:
Andrew Ritz (andrewr) 9-Dec-1997
Revision History: 4-Dec-1999 Danl Remove CreatePrinterandGroups
--*/
#include "faxapi.h"
#pragma hdrstop
extern HINSTANCE g_MyhInstance;
//
// Notice: FaxRegisterServiceProvider and FaxUnregisterServiceProvider are
// implemented directly in winfax.dll since it must exist
// even before the fax optional component is installed.
//
#ifdef UNICODE
BOOL AddMethodKey( HKEY hKey, LPCWSTR MethodName, LPCWSTR FriendlyName, LPCWSTR FunctionName, LPCWSTR Guid, DWORD Priority ) ; #endif // #ifdef UNICODE
#ifdef UNICODE
WINFAXAPI BOOL WINAPI FaxRegisterRoutingExtensionW( IN HANDLE hFaxHandle, IN LPCWSTR lpcwstrExtensionName, IN LPCWSTR lpcwstrFriendlyName, IN LPCWSTR lpcwstrImageName, IN PFAX_ROUTING_INSTALLATION_CALLBACKW pCallBack, IN LPVOID lpvContext ) { HKEY hKey = NULL; BOOL bRetVal = FALSE; DWORD dwRet; WCHAR szKeyName[2000];
PFAX_GLOBAL_ROUTING_INFO pRoutingInfo; DWORD dwMethods; DWORD dwLastError = ERROR_SUCCESS;
WCHAR wszMethodName[101]; WCHAR wszMethodFriendlyName[101]; WCHAR wszMethodFunctionName[101]; WCHAR wszMethodGuid[101];
DEBUG_FUNCTION_NAME(TEXT("FaxRegisterRoutingExtensionW"));
if (!ValidateFaxHandle(hFaxHandle, FHT_SERVICE)) { DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() failed")); SetLastError(ERROR_INVALID_HANDLE); return FALSE; }
if (!lpcwstrExtensionName || !lpcwstrFriendlyName || !lpcwstrImageName || !pCallBack) { SetLastError(ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("At least one of the given pointers is NULL.")); return FALSE; }
//
// Local installation only
//
if (!IsLocalFaxConnection(hFaxHandle) ) { DebugPrintEx(DEBUG_ERR, _T("Not a local fax connection")); SetLastError(ERROR_INVALID_FUNCTION); return FALSE; }
if ((_wcsicmp( lpcwstrExtensionName, REGKEY_ROUTING_EXTENSION ) != 0) && TRUE == IsDesktopSKU()) { DebugPrintEx( DEBUG_ERR, TEXT("We do not support non MS routing extensions on desktop SKUs")); SetLastError (FAX_ERR_NOT_SUPPORTED_ON_THIS_SKU); return FALSE; }
//
// Get the number of current methods for priority
//
if (!FaxEnumGlobalRoutingInfo(hFaxHandle, &pRoutingInfo, &dwMethods) ) { DebugPrintEx(DEBUG_ERR, TEXT("FaxEnumGlobalRoutingInfo() failed, ec = %d"), GetLastError()); return FALSE; }
//
// Store number of methods returned by EnumGlobalRoutingInfo()
//
DWORD dwRegisteredMethods = dwMethods;
//
// Return Value of the Function
//
BOOL bResult = TRUE;
//
// Variables to deal with newly registered Guids, to check their uniqueness
//
LPTSTR *plptstrNewGuids = NULL; LPTSTR lptstrGuid = NULL; LPTSTR *pTmp = NULL;
//
// Variable for different FOR cycles
//
DWORD i = 0;
if (0 > _snwprintf(szKeyName, ARR_SIZE(szKeyName) -1, TEXT("%s\\%s\\%s"), REGKEY_SOFTWARE, REGKEY_ROUTING_EXTENSIONS, lpcwstrExtensionName)) { //
// Extension name exceeds size
//
DebugPrintEx(DEBUG_ERR, _T("Extension name \"%s\" exceeds size"), lpcwstrExtensionName); dwLastError = ERROR_INVALID_PARAMETER; bResult = FALSE; goto FreeRoutingInfo; } szKeyName[ARR_SIZE(szKeyName) -1] = _T('\0');
//
// Try to open registry key with the Extension Name
//
hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE, szKeyName, FALSE, 0); if (!hKey) { //
// This is new Routing Extension, let's register it
//
hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE, szKeyName, TRUE, 0);
if (!hKey) { dwLastError = GetLastError(); DebugPrintEx(DEBUG_ERR, _T("OpenRegistryKey(%s) failed. ec=%ld"), szKeyName, dwLastError); bResult = FALSE; goto FreeRoutingInfo; } } else { //
// Such Routing Extension is already registered
//
RegCloseKey(hKey); DebugPrintEx(DEBUG_ERR, _T("Routing Extension Name is duplicated : %s"), szKeyName);
dwLastError = ERROR_INVALID_PARAMETER; bResult = FALSE; goto FreeRoutingInfo; }
//
// Add values
//
if (! (SetRegistryString(hKey, REGVAL_FRIENDLY_NAME, lpcwstrFriendlyName) && SetRegistryStringExpand(hKey, REGVAL_IMAGE_NAME, lpcwstrImageName) )) { dwLastError = GetLastError(); DebugPrintEx(DEBUG_ERR, _T("SetRegistryString failed. ec=%ld"), dwLastError); goto error_exit; }
dwRet = RegCloseKey (hKey); if (ERROR_SUCCESS != dwRet) { DebugPrintEx(DEBUG_ERR, _T("RegCloseKey failed. ec=%ld"), dwRet); }
wcscat(szKeyName, L"\\"); wcscat(szKeyName, REGKEY_ROUTING_METHODS); hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE, szKeyName, TRUE, 0);
if (!hKey) { dwLastError = GetLastError(); DebugPrintEx(DEBUG_ERR, _T("OpenRegistryKey(%s) failed. ec=%ld"), szKeyName, dwLastError); goto error_exit; }
while (TRUE) { ZeroMemory( wszMethodName, sizeof(wszMethodName) ); ZeroMemory( wszMethodFriendlyName, sizeof(wszMethodFriendlyName) ); ZeroMemory( wszMethodFunctionName, sizeof(wszMethodFunctionName) ); ZeroMemory( wszMethodGuid, sizeof(wszMethodGuid) );
__try { bRetVal = pCallBack(hFaxHandle, lpvContext, wszMethodName, wszMethodFriendlyName, wszMethodFunctionName, wszMethodGuid );
if (!bRetVal) { break; } } __except (EXCEPTION_EXECUTE_HANDLER) { dwLastError = GetExceptionCode(); DebugPrintEx(DEBUG_ERR, _T("pCallBack caused exception. ec=%ld"), dwLastError); goto error_exit; }
//
// Check that Method Name is existing
//
if (wcslen(wszMethodName) < 1) { DebugPrintEx(DEBUG_ERR, _T("Callback returned empty MethodName")); dwLastError = ERROR_INVALID_PARAMETER; goto error_exit; }
//
// Check that new Guid is valid GUID
//
if ( ERROR_SUCCESS != (dwRet = IsValidGUID(wszMethodGuid)) ) { DebugPrintEx(DEBUG_ERR, _T("IsValidGUID failed: %s, ec=%d"), wszMethodGuid, dwRet); dwLastError = dwRet; goto error_exit; }
//
// Check that new Guid is unique between all already registered Routing Methods
//
for ( i = 0 ; i < dwRegisteredMethods ; i++ ) { if ( _tcsicmp(pRoutingInfo[i].Guid, wszMethodGuid) == 0 ) { //
// Such Guid already registered
//
DebugPrintEx(DEBUG_ERR, _T("Duplicated Guid : %s."), wszMethodGuid); dwLastError = ERROR_DS_OBJ_GUID_EXISTS; goto error_exit; } }
//
// Check that new Guid is unique between newly added Routing Methods
//
if ( plptstrNewGuids ) { //
// There is ( dwMethods - dwRegisteredMethods ) new Methods
//
for( i = 0 ; i < (dwMethods - dwRegisteredMethods) ; i++ ) { if ( _tcsicmp(plptstrNewGuids[i], wszMethodGuid) == 0 ) { //
// Such Guid already registered
//
DebugPrintEx(DEBUG_ERR, _T("Duplicated Guid : %s."), wszMethodGuid); dwLastError = ERROR_DS_OBJ_GUID_EXISTS; goto error_exit; } } }
//
// We're using the dwMethods as priority for new methods
//
dwMethods++; if (!AddMethodKey(hKey, wszMethodName, wszMethodFriendlyName, wszMethodFunctionName, wszMethodGuid, dwMethods)) { dwLastError = GetLastError(); DebugPrintEx(DEBUG_ERR, _T("AddMethodKey failed. ec=%ld"), dwLastError); goto error_exit; }
//
// We succeded to add a method. Store its Guid to compare with next Methods
//
lptstrGuid = (LPTSTR)MemAlloc( ( _tcslen(wszMethodGuid) + 1 ) * sizeof(TCHAR)); if (!lptstrGuid) { dwLastError = ERROR_NOT_ENOUGH_MEMORY; DebugPrintEx(DEBUG_ERR, _T("MemAlloc failed")); goto error_exit; }
_tcscpy(lptstrGuid, wszMethodGuid);
//
// ReAllocate Memory for extended pNewGuids
//
if (plptstrNewGuids) { pTmp = (LPTSTR *)MemReAlloc(plptstrNewGuids, (sizeof(LPTSTR)) * (dwMethods - dwRegisteredMethods)); } else { pTmp = (LPTSTR *)MemAlloc((sizeof(LPTSTR)) * (dwMethods - dwRegisteredMethods)); } if (!pTmp) { dwLastError = ERROR_NOT_ENOUGH_MEMORY; DebugPrintEx(DEBUG_ERR, _T("MemReAlloc failed")); goto error_exit; }
plptstrNewGuids = pTmp;
//
// Put also last added Method's Guid
//
plptstrNewGuids[ (dwMethods - dwRegisteredMethods - 1) ] = lptstrGuid; }
dwRet = RegCloseKey (hKey); if (ERROR_SUCCESS != dwRet) { dwLastError = dwRet; DebugPrintEx(DEBUG_ERR, _T("RegCloseKey failed. ec=%ld"), dwRet); }
goto FreeRoutingInfo;
error_exit:
if (hKey) { dwRet = RegCloseKey (hKey); if (ERROR_SUCCESS != dwRet) { DebugPrintEx(DEBUG_ERR, _T("RegCloseKey failed. ec=%ld"), dwRet); } }
//
// Delete the subkey on failure
//
wsprintf(szKeyName, L"%s\\%s", REGKEY_SOFTWARE, REGKEY_ROUTING_EXTENSIONS); hKey = OpenRegistryKey(HKEY_LOCAL_MACHINE, szKeyName, FALSE, 0); if (hKey) { //
// Delete the Extension Routing Key and all its Subkeys
//
dwRet = DeleteRegistryKey(hKey, lpcwstrExtensionName ); if (ERROR_SUCCESS != dwRet) { DebugPrintEx(DEBUG_ERR, _T("DeleteRegistryKey (%s) failed. ec=%ld"), lpcwstrExtensionName, dwRet); } dwRet = RegCloseKey (hKey); if (ERROR_SUCCESS != dwRet) { DebugPrintEx(DEBUG_ERR, _T("RegCloseKey failed. ec=%ld"), dwRet); } }
bResult = FALSE;
FreeRoutingInfo:
FaxFreeBuffer(pRoutingInfo);
if (plptstrNewGuids) { for ( i = 0 ; i < ( dwMethods - dwRegisteredMethods ) ; i++ ) { MemFree(plptstrNewGuids[i]); }
MemFree(plptstrNewGuids); }
if (ERROR_SUCCESS != dwLastError) { SetLastError(dwLastError); } return bResult;
} // FaxRegisterRoutingExtensionW
BOOL AddMethodKey( HKEY hKey, LPCWSTR lpcwstrMethodName, LPCWSTR lpcwstrFriendlyName, LPCWSTR lpcwstrFunctionName, LPCWSTR lpcwstrGuid, DWORD dwPriority ) { HKEY hKeyNew; DWORD dwRet; DEBUG_FUNCTION_NAME(TEXT("AddMethodKey"));
hKeyNew = OpenRegistryKey(hKey, lpcwstrMethodName, TRUE, 0); if (!hKeyNew) { DebugPrintEx(DEBUG_ERR, TEXT("OpenRegistryKey(%s) failed. ec=%ld"), lpcwstrMethodName, GetLastError ()); return FALSE; } //
// Add values
//
if (!(SetRegistryString(hKeyNew, REGVAL_FRIENDLY_NAME, lpcwstrFriendlyName) && SetRegistryString(hKeyNew, REGVAL_FUNCTION_NAME, lpcwstrFunctionName) && SetRegistryString(hKeyNew, REGVAL_GUID, lpcwstrGuid) && SetRegistryDword (hKeyNew, REGVAL_ROUTING_PRIORITY, dwPriority) )) { DebugPrintEx(DEBUG_ERR, TEXT("SetRegistry failed. ec=%ld"), GetLastError ()); goto error_exit; }
dwRet = RegCloseKey (hKeyNew); if (ERROR_SUCCESS != dwRet) { DebugPrintEx(DEBUG_ERR, TEXT("RegCloseKey failed. ec=%ld"), dwRet); } return TRUE;
error_exit: dwRet = RegCloseKey (hKeyNew); if (ERROR_SUCCESS != dwRet) { DebugPrintEx(DEBUG_ERR, TEXT("RegCloseKey failed. ec=%ld"), dwRet); } dwRet = RegDeleteKey (hKey, lpcwstrMethodName); if (ERROR_SUCCESS != dwRet) { DebugPrintEx(DEBUG_ERR, TEXT("RegDeleteKey (%s) failed. ec=%ld"), lpcwstrMethodName, dwRet); } return FALSE; } // AddMethodKey
#else
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 ) { UNREFERENCED_PARAMETER (FaxHandle); UNREFERENCED_PARAMETER (ExtensionName); UNREFERENCED_PARAMETER (FriendlyName); UNREFERENCED_PARAMETER (ImageName); UNREFERENCED_PARAMETER (CallBack); UNREFERENCED_PARAMETER (Context); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; }
#endif // #ifdef UNICODE
WINFAXAPI BOOL WINAPI FaxUnregisterRoutingExtensionA( IN HANDLE hFaxHandle, IN LPCSTR lpctstrExtensionName ) /*++
Routine name : FaxUnregisterRoutingExtensionA
Routine description:
Unregisters a routing extension - ANSI version
Author:
Eran Yariv (EranY), Dec, 1999
Arguments:
hFaxHandle [in] - Handle to fax server lpctstrExtensionName [in] - Extension unique name
Return Value:
TRUE - Success FALSE - Failure, call GetLastError() for more error information.
--*/ { DWORD dwRes; BOOL bRes; LPCWSTR lpcwstrExtensionName = NULL; DEBUG_FUNCTION_NAME(TEXT("FaxUnregisterRoutingExtensionA"));
if (lpctstrExtensionName) { if (NULL == (lpcwstrExtensionName = AnsiStringToUnicodeString(lpctstrExtensionName)) ) { dwRes = GetLastError (); DebugPrintEx( DEBUG_ERR, TEXT("Failed to convert Extension unique name to UNICODE (ec = %ld)"), dwRes); return dwRes; } } bRes = FaxUnregisterRoutingExtensionW (hFaxHandle, lpcwstrExtensionName); MemFree((PVOID)lpcwstrExtensionName); return bRes; } // FaxUnregisterRoutingExtensionA
WINFAXAPI BOOL WINAPI FaxUnregisterRoutingExtensionW( IN HANDLE hFaxHandle, IN LPCWSTR lpctstrExtensionName ) /*++
Routine name : FaxUnregisterRoutingExtensionW
Routine description:
Unregisters a routing extension - UNICODE version
Author:
Eran Yariv (EranY), Dec, 1999
Arguments:
hFaxHandle [in] - Handle to fax server lpctstrExtensionName [in] - Extension unique name
Return Value:
TRUE - Success FALSE - Failure, call GetLastError() for more error information.
--*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxUnregisterRoutingExtensionW"));
if (!ValidateFaxHandle(hFaxHandle, FHT_SERVICE)) { SetLastError (ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() failed.")); return FALSE; } if (!lpctstrExtensionName) { SetLastError (ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("lpctstrExtensionName is NULL.")); return FALSE; }
__try { ec = FAX_UnregisterRoutingExtension( FH_FAX_HANDLE(hFaxHandle), lpctstrExtensionName); } __except (EXCEPTION_EXECUTE_HANDLER) { //
// For some reason we got an exception.
//
ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_UnregisterRoutingExtension. (ec: %ld)"), ec); }
if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus (); SetLastError (ec); return FALSE; }
return TRUE; } // FaxUnregisterRoutingExtensionW
#ifndef UNICODE
WINFAXAPI BOOL WINAPI FaxUnregisterRoutingExtensionX( IN HANDLE hFaxHandle, IN LPCWSTR lpctstrExtensionName ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (lpctstrExtensionName); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } // FaxUnregisterRoutingExtensionX
#endif // #ifndef UNICODE
//********************************************
//* FSP registration
//********************************************
WINFAXAPI BOOL WINAPI FaxRegisterServiceProviderExA( IN HANDLE hFaxHandle, IN LPCSTR lpctstrGUID, IN LPCSTR lpctstrFriendlyName, IN LPCSTR lpctstrImageName, IN LPCSTR lpctstrTspName, IN DWORD dwFSPIVersion, IN DWORD dwCapabilities ) /*++
Routine name : FaxRegisterServiceProviderExA
Routine description:
Registers an FSP - ANSI version
Author:
Eran Yariv (EranY), Dec, 1999
Arguments:
hFaxHandle [in] - Handle to fax server lpctstrGUID [in] - GUID of FSP lpctstrFriendlyName [in] - Friendly name of FSP lpctstrImageName [in] - Image name of FSP. May contain environment variables lpctstrTspName [in] - TSP name of FSP. dwFSPIVersion [in] - FSP's API version. dwCapabilities [in] - FSP's extended capabilities.
Return Value:
TRUE - Success FALSE - Failure, call GetLastError() for more error information.
--*/ { DWORD dwRes = ERROR_SUCCESS; LPCWSTR lpcwstrGUID = NULL; LPCWSTR lpcwstrFriendlyName = NULL; LPCWSTR lpcwstrImageName = NULL; LPCWSTR lpcwstrTspName = NULL; BOOL bRes = FALSE; DEBUG_FUNCTION_NAME(TEXT("FaxRegisterServiceProviderExA"));
if (lpctstrGUID) { if (NULL == (lpcwstrGUID = AnsiStringToUnicodeString(lpctstrGUID)) ) { dwRes = GetLastError (); DebugPrintEx( DEBUG_ERR, TEXT("Failed to convert GUID to UNICODE (ec = %ld)"), dwRes); goto exit; } } if (lpctstrFriendlyName) { if (NULL == (lpcwstrFriendlyName = AnsiStringToUnicodeString(lpctstrFriendlyName)) ) { dwRes = GetLastError (); DebugPrintEx( DEBUG_ERR, TEXT("Failed to convert Friendly Name to UNICODE (ec = %ld)"), dwRes); goto exit; } } if (lpctstrImageName) { if (NULL == (lpcwstrImageName = AnsiStringToUnicodeString(lpctstrImageName)) ) { dwRes = GetLastError (); DebugPrintEx( DEBUG_ERR, TEXT("Failed to convert Image Name to UNICODE (ec = %ld)"), dwRes); goto exit; } } if (lpctstrTspName) { if (NULL == (lpcwstrTspName = AnsiStringToUnicodeString(lpctstrTspName)) ) { dwRes = GetLastError (); DebugPrintEx( DEBUG_ERR, TEXT("Failed to convert TSP name to UNICODE (ec = %ld)"), dwRes); goto exit; } }
Assert (ERROR_SUCCESS == dwRes);
bRes = FaxRegisterServiceProviderExW ( hFaxHandle, lpcwstrGUID, lpcwstrFriendlyName, lpcwstrImageName, lpcwstrTspName, dwFSPIVersion, dwCapabilities);
exit: MemFree((PVOID)lpcwstrGUID); MemFree((PVOID)lpcwstrFriendlyName); MemFree((PVOID)lpcwstrImageName); MemFree((PVOID)lpcwstrTspName);
return bRes; } // FaxRegisterServiceProviderExA
WINFAXAPI BOOL WINAPI FaxRegisterServiceProviderExW( IN HANDLE hFaxHandle, IN LPCWSTR lpctstrGUID, IN LPCWSTR lpctstrFriendlyName, IN LPCWSTR lpctstrImageName, IN LPCWSTR lpctstrTspName, IN DWORD dwFSPIVersion, IN DWORD dwCapabilities ) /*++
Routine name : FaxRegisterServiceProviderExW
Routine description:
Registers an FSP - UNICODE version
Author:
Eran Yariv (EranY), Dec, 1999
Arguments:
hFaxHandle [in] - Handle to fax server lpctstrGUID [in] - GUID of FSP lpctstrFriendlyName [in] - Friendly name of FSP lpctstrImageName [in] - Image name of FSP. May contain environment variables lpctstrTspName [in] - TSP name of FSP. dwFSPIVersion [in] - FSP's API version. dwCapabilities [in] - FSP's extended capabilities.
Return Value:
TRUE - Success FALSE - Failure, call GetLastError() for more error information.
--*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxRegisterServiceProviderExW"));
if (!ValidateFaxHandle(hFaxHandle, FHT_SERVICE)) { SetLastError (ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() failed.")); return FALSE; }
//
// Verify version field range
//
if (FSPI_API_VERSION_1 != dwFSPIVersion || dwCapabilities)
{ DebugPrintEx( DEBUG_ERR, TEXT("dwFSPIVersion invalid (0x%08x), or not valid capability (0x%08x)"), dwFSPIVersion, dwCapabilities); return ERROR_INVALID_PARAMETER; }
ec = IsValidGUID (lpctstrGUID); if (ERROR_SUCCESS != ec) { DebugPrintEx( DEBUG_ERR, TEXT("Invalid GUID (ec: %ld)"), ec); SetLastError (ec); return FALSE; }
__try { ec = FAX_RegisterServiceProviderEx( FH_FAX_HANDLE(hFaxHandle), lpctstrGUID, lpctstrFriendlyName, lpctstrImageName, lpctstrTspName ? lpctstrTspName : L"", dwFSPIVersion, dwCapabilities); } __except (EXCEPTION_EXECUTE_HANDLER) { //
// For some reason we got an exception.
//
ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_RegisterServiceProviderEx. (ec: %ld)"), ec); }
if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus (); SetLastError (ec); return FALSE; } else if (IsLocalFaxConnection(hFaxHandle)) { //
// Adding a local FSP.
// If we don't have a fax printer installed, this is the time to install one.
//
AddOrVerifyLocalFaxPrinter(); } return TRUE; } // FaxRegisterServiceProviderExW
#ifndef UNICODE
WINFAXAPI BOOL WINAPI FaxRegisterServiceProviderExX( IN HANDLE hFaxHandle, IN LPCWSTR lpctstrGUID, IN LPCWSTR lpctstrFriendlyName, IN LPCWSTR lpctstrImageName, IN LPCWSTR lpctstrTspName, IN DWORD dwFSPIVersion, IN DWORD dwCapabilities ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (lpctstrGUID); UNREFERENCED_PARAMETER (lpctstrFriendlyName); UNREFERENCED_PARAMETER (lpctstrImageName); UNREFERENCED_PARAMETER (lpctstrTspName); UNREFERENCED_PARAMETER (dwFSPIVersion); UNREFERENCED_PARAMETER (dwCapabilities); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } // FaxRegisterServiceProviderExX
#endif // #ifndef UNICODE
WINFAXAPI BOOL WINAPI FaxUnregisterServiceProviderExA( IN HANDLE hFaxHandle, IN LPCSTR lpctstrGUID ) /*++
Routine name : FaxUnregisterServiceProviderExA
Routine description:
Unregisters an FSP - ANSI version
Author:
Eran Yariv (EranY), Dec, 1999
Arguments:
hFaxHandle [in] - Handle to fax server lpctstrGUID [in] - GUID of FSP (or provider name for legacy FSPs registered through FaxRegisterServiceProvider)
Return Value:
TRUE - Success FALSE - Failure, call GetLastError() for more error information.
--*/ { DWORD dwRes; LPCWSTR lpcwstrGUID = NULL; BOOL bRes; DEBUG_FUNCTION_NAME(TEXT("FaxUnregisterServiceProviderExA"));
if (lpctstrGUID) { if (NULL == (lpcwstrGUID = AnsiStringToUnicodeString(lpctstrGUID)) ) { dwRes = GetLastError (); DebugPrintEx( DEBUG_ERR, TEXT("Failed to convert GUID to UNICODE (ec = %ld)"), dwRes); return dwRes; } } bRes = FaxUnregisterServiceProviderExW (hFaxHandle, lpcwstrGUID); MemFree((PVOID)lpcwstrGUID); return bRes; } // FaxUnregisterServiceProviderExA
WINFAXAPI BOOL WINAPI FaxUnregisterServiceProviderExW( IN HANDLE hFaxHandle, IN LPCWSTR lpctstrGUID ) /*++
Routine name : FaxUnregisterServiceProviderExW
Routine description:
Unregisters an FSP - UNICODE version
Author:
Eran Yariv (EranY), Dec, 1999
Arguments:
hFaxHandle [in] - Handle to fax server lpctstrGUID [in] - GUID of FSP (or provider name for legacy FSPs registered through FaxRegisterServiceProvider)
Return Value:
TRUE - Success FALSE - Failure, call GetLastError() for more error information.
--*/ { error_status_t ec; DEBUG_FUNCTION_NAME(TEXT("FaxUnregisterServiceProviderExW"));
if (!ValidateFaxHandle(hFaxHandle, FHT_SERVICE)) { SetLastError (ERROR_INVALID_HANDLE); DebugPrintEx(DEBUG_ERR, _T("ValidateFaxHandle() is failed.")); return FALSE; }
if (!lpctstrGUID) { SetLastError (ERROR_INVALID_PARAMETER); DebugPrintEx(DEBUG_ERR, _T("lpctstrGUID is NULL.")); return FALSE; }
__try { ec = FAX_UnregisterServiceProviderEx( FH_FAX_HANDLE(hFaxHandle), lpctstrGUID); } __except (EXCEPTION_EXECUTE_HANDLER) { //
// For some reason we got an exception.
//
ec = GetExceptionCode(); DebugPrintEx( DEBUG_ERR, TEXT("Exception on RPC call to FAX_UnregisterServiceProviderEx. (ec: %ld)"), ec); }
if (ERROR_SUCCESS != ec) { DumpRPCExtendedStatus (); SetLastError (ec); return FALSE; }
return TRUE; } // FaxUnregisterServiceProviderExW
#ifndef UNICODE
WINFAXAPI BOOL WINAPI FaxUnregisterServiceProviderExX( IN HANDLE hFaxHandle, IN LPCWSTR lpctstrGUID ) { UNREFERENCED_PARAMETER (hFaxHandle); UNREFERENCED_PARAMETER (lpctstrGUID); SetLastError (ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } // FaxUnregisterServiceProviderExX
#endif // #ifndef UNICODE
|