#include "faxrtp.h" #pragma hdrstop HINSTANCE MyhInstance; BOOL ServiceDebug; WCHAR FaxReceiveDir[MAX_PATH]; PSID ServiceSid; PFAXROUTEADDFILE FaxRouteAddFile; PFAXROUTEDELETEFILE FaxRouteDeleteFile; PFAXROUTEGETFILE FaxRouteGetFile; PFAXROUTEENUMFILES FaxRouteEnumFiles; BOOL MakeServiceSid( VOID ) { SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; BOOL Result; // // Output allocated via RtlAllocateHeap, free with FreeHeap? // Result = AllocateAndInitializeSid( &NtAuthority, 1, SECURITY_SERVICE_RID, 0, 0, 0, 0, 0, 0, 0, &ServiceSid ); if (!Result) { ServiceSid = NULL; } return Result; } extern "C" DWORD FaxRouteDllInit( HINSTANCE hInstance, DWORD Reason, LPVOID Context ) { if (Reason == DLL_PROCESS_ATTACH) { MyhInstance = hInstance; DisableThreadLibraryCalls( hInstance ); MakeServiceSid(); } return TRUE; } BOOL IsUserService( VOID ) { BOOL Result,UserService = FALSE; Result = CheckTokenMembership( NULL, ServiceSid, &UserService ); if (!Result) { DebugPrint(( TEXT("Couldn't CheckTokenMembership, ec = %d\n"), GetLastError() )); } return UserService; } BOOL WINAPI FaxRouteInitialize( IN HANDLE HeapHandle, IN PFAX_ROUTE_CALLBACKROUTINES FaxRouteCallbackRoutines ) { HeapInitialize(HeapHandle,NULL,NULL,0); FaxRouteAddFile = FaxRouteCallbackRoutines->FaxRouteAddFile; FaxRouteDeleteFile = FaxRouteCallbackRoutines->FaxRouteDeleteFile; FaxRouteGetFile = FaxRouteCallbackRoutines->FaxRouteGetFile; FaxRouteEnumFiles = FaxRouteCallbackRoutines->FaxRouteEnumFiles; ServiceDebug = !IsUserService(); if (!GetSpecialPath(CSIDL_COMMON_APPDATA, FaxReceiveDir)) { DebugPrint(( TEXT("Couldn't GetSpecialPath, ec = %d\n"), GetLastError() )); return FALSE; } ConcatenatePaths( FaxReceiveDir, FAX_RECEIVE_DIR ); InitializeStringTable(); InitializeRoutingTable(); InitializeEmailRouting(); return TRUE; } BOOL WINAPI FaxRouteGetRoutingInfo( IN LPCWSTR RoutingGuid, IN DWORD DeviceId, IN LPBYTE RoutingInfo, OUT LPDWORD RoutingInfoSize ) { if (RoutingInfoSize == NULL) { return FALSE; } PROUTING_TABLE RoutingEntry = GetRoutingEntry( DeviceId ); if (!RoutingEntry) { return FALSE; } DWORD Size; switch( GetMaskBit( RoutingGuid )) { case 0: return FALSE; case LR_PRINT: Size = sizeof(DWORD) + StringSize( RoutingEntry->PrinterName ); if (RoutingInfo == NULL) { *RoutingInfoSize = Size; return TRUE; } if (Size > *RoutingInfoSize) { return FALSE; } *((LPDWORD)RoutingInfo) = (RoutingEntry->Mask & LR_PRINT) > 0; RoutingInfo += sizeof(DWORD); wcscpy( (LPWSTR)RoutingInfo, RoutingEntry->PrinterName ); return TRUE; case LR_STORE: Size = sizeof(DWORD) + StringSize( RoutingEntry->StoreDir ); if (RoutingInfo == NULL) { *RoutingInfoSize = Size; return TRUE; } if (Size > *RoutingInfoSize) { return FALSE; } *((LPDWORD)RoutingInfo) = (RoutingEntry->Mask & LR_STORE) > 0; RoutingInfo += sizeof(DWORD); wcscpy( (LPWSTR)RoutingInfo, RoutingEntry->StoreDir ); return TRUE; case LR_INBOX: Size = sizeof(DWORD) + StringSize( RoutingEntry->ProfileName ); if (RoutingInfo == NULL) { *RoutingInfoSize = Size; return TRUE; } if (Size > *RoutingInfoSize) { return FALSE; } *((LPDWORD)RoutingInfo) = (RoutingEntry->Mask & LR_INBOX) > 0; RoutingInfo += sizeof(DWORD); wcscpy( (LPWSTR)RoutingInfo, RoutingEntry->ProfileName ); return TRUE; case LR_EMAIL: Size = sizeof(DWORD) + StringSize( RoutingEntry->ProfileName ); if (RoutingInfo == NULL) { *RoutingInfoSize = Size; return TRUE; } if (Size > *RoutingInfoSize) { return FALSE; } *((LPDWORD)RoutingInfo) = (RoutingEntry->Mask & LR_EMAIL) > 0; RoutingInfo += sizeof(DWORD); wcscpy( (LPWSTR)RoutingInfo, RoutingEntry->ProfileName ); return TRUE; } return FALSE; } BOOL WINAPI FaxRouteSetRoutingInfo( IN LPCWSTR RoutingGuid, IN DWORD DeviceId, IN const BYTE *RoutingInfo, IN DWORD RoutingInfoSize ) { if (RoutingInfoSize == 0 || RoutingInfo == NULL) { return FALSE; } PROUTING_TABLE RoutingEntry = GetRoutingEntry( DeviceId ); if (!RoutingEntry) { return FALSE; } switch( GetMaskBit( RoutingGuid ) ) { case 0: return FALSE; case LR_PRINT: if (*((LPDWORD)RoutingInfo)) { RoutingEntry->Mask |= LR_PRINT; MemFree( (LPBYTE) RoutingEntry->PrinterName ); RoutingInfo += sizeof(DWORD); RoutingEntry->PrinterName = StringDup( (LPWSTR)RoutingInfo ); } else { RoutingEntry->Mask &= ~LR_PRINT; } UpdateRoutingInfoRegistry( RoutingEntry ); return TRUE; case LR_STORE: if (*((LPDWORD)RoutingInfo)) { RoutingEntry->Mask |= LR_STORE; MemFree( (LPBYTE) RoutingEntry->StoreDir ); RoutingInfo += sizeof(DWORD); RoutingEntry->StoreDir = StringDup( (LPWSTR)RoutingInfo ); } else { RoutingEntry->Mask &= ~LR_STORE; } UpdateRoutingInfoRegistry( RoutingEntry ); return TRUE; case LR_INBOX: if (*((LPDWORD)RoutingInfo)) { RoutingEntry->Mask |= LR_INBOX; MemFree( (LPBYTE) RoutingEntry->ProfileName ); RoutingInfo += sizeof(DWORD); RoutingEntry->ProfileName = StringDup( (LPWSTR)RoutingInfo ); RoutingEntry->ProfileInfo = AddNewMapiProfile( RoutingEntry->ProfileName, FALSE, TRUE ); } else { RoutingEntry->Mask &= ~LR_INBOX; } UpdateRoutingInfoRegistry( RoutingEntry ); return TRUE; case LR_EMAIL: if (*((LPDWORD)RoutingInfo)) { RoutingEntry->Mask |= LR_EMAIL; MemFree( (LPBYTE) RoutingEntry->ProfileName ); RoutingInfo += sizeof(DWORD); RoutingEntry->ProfileName = StringDup( (LPWSTR)RoutingInfo ); } else { RoutingEntry->Mask &= ~LR_EMAIL; } UpdateRoutingInfoRegistry( RoutingEntry ); return TRUE; } return FALSE; } BOOL WINAPI FaxRoutePrint( const FAX_ROUTE *FaxRoute, PVOID *FailureData, LPDWORD FailureDataSize ) { PROUTING_TABLE RoutingEntry; WCHAR NameBuffer[MAX_PATH]; LPCWSTR FBaseName; WCHAR TiffFileName[MAX_PATH]; DWORD Size; RoutingEntry = GetRoutingEntry( FaxRoute->DeviceId ); if (!RoutingEntry) { return FALSE; } if (!(RoutingEntry->Mask & LR_PRINT)) { return TRUE; } Size = sizeof(TiffFileName); if (!FaxRouteGetFile( FaxRoute->JobId, 1, TiffFileName, &Size)) { return FALSE; } // // print the fax in requested to do so // if (!RoutingEntry->PrinterName[0]) { GetProfileString( L"windows", L"device", L",,,", (LPWSTR) &NameBuffer, MAX_PATH ); FBaseName = NameBuffer; } else { FBaseName = RoutingEntry->PrinterName; } return TiffPrint( TiffFileName, (LPTSTR)FBaseName ); } BOOL WINAPI FaxRouteStore( const FAX_ROUTE *FaxRoute, PVOID *FailureData, LPDWORD FailureDataSize ) { PROUTING_TABLE RoutingEntry; WCHAR TiffFileName[MAX_PATH]; DWORD Size; LPTSTR FullPath = NULL; DWORD StrCount; RoutingEntry = GetRoutingEntry( FaxRoute->DeviceId ); if (!RoutingEntry) { return FALSE; } if (((RoutingEntry->Mask & LR_STORE) == 0) || (RoutingEntry->StoreDir[0] == 0)) { return TRUE; } Size = sizeof(TiffFileName); if (!FaxRouteGetFile( FaxRoute->JobId, 1, TiffFileName, &Size)) { return FALSE; } StrCount = ExpandEnvironmentStrings( RoutingEntry->StoreDir, FullPath, 0 ); FullPath = (LPWSTR) MemAlloc( StrCount * sizeof(WCHAR) ); if (!FullPath) { return FALSE; } ExpandEnvironmentStrings( RoutingEntry->StoreDir, FullPath, StrCount ); // if we are moving the fax to the directory that is was received into, do nothing to the file if (_wcsicmp( FullPath, FaxReceiveDir ) == 0) { FaxLog( FAXLOG_CATEGORY_INBOUND, FAXLOG_LEVEL_MAX, 2, MSG_FAX_SAVE_SUCCESS, TiffFileName, TiffFileName ); } else if (!FaxMoveFile ( TiffFileName, FullPath )) { MemFree( FullPath ); return FALSE; } MemFree( FullPath ); return TRUE; } BOOL WINAPI FaxRouteInBox( const FAX_ROUTE *FaxRoute, PVOID *FailureData, LPDWORD FailureDataSize ) { PROUTING_TABLE RoutingEntry; WCHAR TiffFileName[MAX_PATH]; DWORD Size; LPTSTR FullPath = NULL; RoutingEntry = GetRoutingEntry( FaxRoute->DeviceId ); if (!RoutingEntry) { return FALSE; } if (((RoutingEntry->Mask & LR_INBOX) == 0) || (RoutingEntry->ProfileName[0] == 0)) { return TRUE; } Size = sizeof(TiffFileName); if (!FaxRouteGetFile( FaxRoute->JobId, 1, TiffFileName, &Size)) { return FALSE; } if (TiffMailDefault( FaxRoute, RoutingEntry, TiffFileName )) { FaxLog( FAXLOG_CATEGORY_INBOUND, FAXLOG_LEVEL_MAX, 2, MSG_FAX_INBOX_SUCCESS, TiffFileName, GetProfileName( RoutingEntry->ProfileInfo ) ); } else { FaxLog( FAXLOG_CATEGORY_INBOUND, FAXLOG_LEVEL_MIN, 2, MSG_FAX_INBOX_FAILED, TiffFileName, GetProfileName( RoutingEntry->ProfileInfo ) ); return FALSE; } return TRUE; } BOOL WINAPI FaxRouteEmail( const FAX_ROUTE *FaxRoute, PVOID *FailureData, LPDWORD FailureDataSize ) { PROUTING_TABLE RoutingEntry; WCHAR TiffFileName[MAX_PATH]; DWORD Size; LPTSTR FullPath = NULL; RoutingEntry = GetRoutingEntry( FaxRoute->DeviceId ); if (!RoutingEntry) { return FALSE; } if (((RoutingEntry->Mask & LR_EMAIL) == 0) || (RoutingEntry->ProfileName[0] == 0)) { return TRUE; } Size = sizeof(TiffFileName); if (!FaxRouteGetFile( FaxRoute->JobId, 1, TiffFileName, &Size)) { return FALSE; } if (TiffRouteEMail( FaxRoute, RoutingEntry, TiffFileName )) { FaxLog( FAXLOG_CATEGORY_INBOUND, FAXLOG_LEVEL_MAX, 2, MSG_FAX_INBOX_SUCCESS, TiffFileName, GetProfileName( InboundProfileInfo ) ); } else { FaxLog( FAXLOG_CATEGORY_INBOUND, FAXLOG_LEVEL_MIN, 2, MSG_FAX_INBOX_FAILED, TiffFileName, GetProfileName( InboundProfileInfo ) ); return FALSE; } return TRUE; } BOOL WINAPI FaxRouteConfigure( OUT HPROPSHEETPAGE *PropSheetPage ) { return TRUE; } BOOL WINAPI FaxRouteDeviceEnable( IN LPCWSTR RoutingGuid, IN DWORD DeviceId, IN LONG Enabled ) { PROUTING_TABLE RoutingEntry = GetRoutingEntry( DeviceId ); if (!RoutingEntry) { return FALSE; } DWORD MaskBit = GetMaskBit( RoutingGuid ); if (MaskBit == 0) { return FALSE; } BOOL DeviceEnabled = (RoutingEntry->Mask & MaskBit) > 0; if (Enabled == -1) { return DeviceEnabled; } RoutingEntry->Mask &= ~MaskBit; if (Enabled) { RoutingEntry->Mask |= MaskBit; } UpdateRoutingInfoRegistry( RoutingEntry ); return TRUE; } BOOL WINAPI FaxRouteDeviceChangeNotification( IN DWORD DeviceId, IN BOOL NewDevice ) { HKEY hKey; HKEY hKeyRouting; WCHAR SubKeyName[128]; if (!NewDevice) { return TRUE; } PROUTING_TABLE RoutingEntry = GetRoutingEntry( DeviceId ); if (RoutingEntry) { return TRUE; } wsprintf( SubKeyName, L"%s\\%08d", REGKEY_FAX_DEVICES, DeviceId ); hKey = OpenRegistryKey( HKEY_LOCAL_MACHINE, SubKeyName, FALSE, KEY_READ ); if (!hKey) { return FALSE; } hKeyRouting = OpenRegistryKey( hKey, REGKEY_ROUTING, FALSE, KEY_READ ); if (!hKeyRouting) { RegCloseKey( hKey ); return FALSE; } AddNewDeviceToRoutingTable( GetRegistryDword ( hKey, REGVAL_PERMANENT_LINEID ), GetRegistryString( hKey, REGVAL_DEVICE_NAME, EMPTY_STRING ), GetRegistryString( hKey, REGVAL_ROUTING_CSID, EMPTY_STRING ), GetRegistryString( hKey, REGVAL_ROUTING_TSID, EMPTY_STRING ), GetRegistryString( hKeyRouting, REGVAL_ROUTING_PRINTER, EMPTY_STRING ), GetRegistryString( hKeyRouting, REGVAL_ROUTING_DIR, EMPTY_STRING ), GetRegistryString( hKeyRouting, REGVAL_ROUTING_PROFILE, EMPTY_STRING ), GetRegistryDword ( hKeyRouting, REGVAL_ROUTING_MASK ) ); RegCloseKey( hKeyRouting ); RegCloseKey( hKey ); return TRUE; }