394 lines
8.8 KiB
C
394 lines
8.8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1997 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
faxrcv.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Window NT Fax Routing Extension. This routing method signals a named event.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Steven Kehrli (steveke) 11/15/1997
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <winfax.h>
|
||
|
#include <faxroute.h>
|
||
|
|
||
|
#include "faxrcv.h"
|
||
|
|
||
|
PFAXROUTEGETFILE g_pFaxRouteGetFile; // g_pFaxRouteGetFile is the pointer to callback to get file from fax file list
|
||
|
|
||
|
DWORD
|
||
|
DllEntry(
|
||
|
HINSTANCE hInstance,
|
||
|
DWORD dwReason,
|
||
|
LPVOID pContext
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
DLL entry point
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
hInstance - handle to the module
|
||
|
dwReason - indicates the reason for being called
|
||
|
pContext - context
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE on success
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
switch (dwReason) {
|
||
|
case DLL_PROCESS_ATTACH:
|
||
|
if (!g_hFaxRcvEvent) {
|
||
|
// Create FaxRcv named event
|
||
|
g_hFaxRcvEvent = CreateEvent(NULL, FALSE, FALSE, FAXRCV_EVENT);
|
||
|
}
|
||
|
|
||
|
if (!g_hFaxRcvMutex) {
|
||
|
// Create FaxRcv named mutex
|
||
|
g_hFaxRcvMutex = CreateMutex(NULL, FALSE, FAXRCV_MUTEX);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case DLL_PROCESS_DETACH:
|
||
|
if (g_hFaxRcvMutex) {
|
||
|
// Wait for access to the FaxRcv named mutex
|
||
|
WaitForSingleObject(g_hFaxRcvMutex, INFINITE);
|
||
|
|
||
|
// Reset FaxRcv named event
|
||
|
ResetEvent(g_hFaxRcvEvent);
|
||
|
|
||
|
// Close FaxRcv named event
|
||
|
CloseHandle(g_hFaxRcvEvent);
|
||
|
g_hFaxRcvEvent = NULL;
|
||
|
|
||
|
if (g_pFaxRcvView) {
|
||
|
// Delete szCopyTiffFile
|
||
|
DeleteFile((LPWSTR) g_pFaxRcvView);
|
||
|
// Close FaxRcv memory map view
|
||
|
UnmapViewOfFile(g_pFaxRcvView);
|
||
|
g_pFaxRcvView = NULL;
|
||
|
}
|
||
|
|
||
|
if (g_hFaxRcvMap) {
|
||
|
// Close FaxRcv memory map
|
||
|
CloseHandle(g_hFaxRcvMap);
|
||
|
g_hFaxRcvMap = NULL;
|
||
|
}
|
||
|
|
||
|
// Release access to the FaxRcv named mutex
|
||
|
ReleaseMutex(g_hFaxRcvMutex);
|
||
|
|
||
|
// Close FaxRcv named mutex
|
||
|
CloseHandle(g_hFaxRcvMutex);
|
||
|
g_hFaxRcvMutex = NULL;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL WINAPI
|
||
|
FaxRouteInitialize(
|
||
|
HANDLE hHeap,
|
||
|
PFAX_ROUTE_CALLBACKROUTINES pFaxRouteCallbackRoutines
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Initializes the routing extension
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
hHeap - handle to the heap
|
||
|
pFaxRouteCallbackRoutins - pointer to fax routing callback routines
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE on success
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
// Set g_pFaxRouteGetFile
|
||
|
g_pFaxRouteGetFile = pFaxRouteCallbackRoutines->FaxRouteGetFile;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL WINAPI
|
||
|
FaxRouteGetRoutingInfo(
|
||
|
LPCWSTR RoutingGuid,
|
||
|
DWORD dwDeviceId,
|
||
|
LPBYTE RoutingInfo,
|
||
|
LPDWORD pdwRoutingInfoSize
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Gets the routing info for a routing method
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
RoutingGuid - pointer to the GUID of the routing method
|
||
|
dwDeviceId - port id
|
||
|
RoutingInfo - pointer to the routing info
|
||
|
pdwRoutingInfoSize - pointer to the size of the routing info
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE on success
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL WINAPI
|
||
|
FaxRouteSetRoutingInfo(
|
||
|
LPCWSTR RoutingGuid,
|
||
|
DWORD dwDeviceId,
|
||
|
BYTE const *RoutingInfo,
|
||
|
DWORD dwRoutingInfoSize
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Sets the routing info for a routing method
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
RoutingGuid - pointer to the GUID of the routing method
|
||
|
dwDeviceId - port id
|
||
|
RoutingInfo - pointer to the routing info
|
||
|
dwRoutingInfoSize - size of the routing info
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE on success
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL WINAPI
|
||
|
FaxRouteDeviceEnable(
|
||
|
LPCWSTR RoutingGuid,
|
||
|
DWORD dwDeviceId,
|
||
|
LONG bEnable
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Enables a routing method
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
RoutingGuid - pointer to the GUID of the routing method
|
||
|
dwDeviceId - port id
|
||
|
bEnable - indicates whether the routing method is enabled or disabled
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE on success
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL WINAPI
|
||
|
FaxRouteDeviceChangeNotification(
|
||
|
DWORD dwDeviceId,
|
||
|
BOOL bNewDevice
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Handles a device change
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
dwDeviceId - port id
|
||
|
bNewDevice - indicates whether the device is new
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE on success
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL WINAPI
|
||
|
FaxRcv(
|
||
|
PFAX_ROUTE pFaxRoute,
|
||
|
PVOID *FailureData,
|
||
|
LPDWORD pdwFailureDataSize
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Routing method. This routing method signals a named event.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
pFaxRoute - pointer to the fax routing structure
|
||
|
FailureData - pointer to the failure data
|
||
|
pdwFailureDataSize - size of the failure data
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE on success
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
// hFaxRcvExtKey is the handle to the FaxRcv Extension Registry key
|
||
|
HKEY hFaxRcvExtKey;
|
||
|
// bEnable indicates whether the Routing method is enabled
|
||
|
BOOL bEnable;
|
||
|
|
||
|
// szTiffFile is the name of the received fax
|
||
|
WCHAR szTiffFile[_MAX_PATH];
|
||
|
// szCopyTiffFile is the name of the copy of the received fax
|
||
|
WCHAR szCopyTiffFile[_MAX_PATH];
|
||
|
|
||
|
// szDrive is the drive of the received fax
|
||
|
WCHAR szDrive[_MAX_DRIVE];
|
||
|
// szDir is the dir of the received fax
|
||
|
WCHAR szDir[_MAX_DIR];
|
||
|
// szFile is the name of the received fax
|
||
|
WCHAR szFile[_MAX_FNAME];
|
||
|
// szExt is the extension of the received fax
|
||
|
WCHAR szExt[_MAX_EXT];
|
||
|
|
||
|
UINT_PTR upOffset;
|
||
|
DWORD cb;
|
||
|
|
||
|
// Wait for access to the FaxRcv named mutex
|
||
|
WaitForSingleObject(g_hFaxRcvMutex, INFINITE);
|
||
|
|
||
|
// Open the FaxRcv Extension Registry key
|
||
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, FAXRCV_EXT_REGKEY, 0, KEY_ALL_ACCESS, &hFaxRcvExtKey) != ERROR_SUCCESS) {
|
||
|
// Release access to the FaxRcv named mutex
|
||
|
ReleaseMutex(g_hFaxRcvMutex);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
// Set cb
|
||
|
cb = sizeof(BOOL);
|
||
|
// Query the FaxRcv Extension bEnable Registry value
|
||
|
if (RegQueryValueEx(hFaxRcvExtKey, BENABLE_EXT_REGVAL, NULL, NULL, (LPBYTE) &bEnable, &cb) != ERROR_SUCCESS) {
|
||
|
// Close the FaxRcv Extension Registry key
|
||
|
RegCloseKey(hFaxRcvExtKey);
|
||
|
// Release access to the FaxRcv named mutex
|
||
|
ReleaseMutex(g_hFaxRcvMutex);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
// Close the FaxRcv Extension Registry key
|
||
|
RegCloseKey(hFaxRcvExtKey);
|
||
|
|
||
|
if (!bEnable) {
|
||
|
// Release access to the FaxRcv named mutex
|
||
|
ReleaseMutex(g_hFaxRcvMutex);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
// Set cb
|
||
|
cb = sizeof(szTiffFile);
|
||
|
// Initialize szTiffFile
|
||
|
ZeroMemory(szTiffFile, cb);
|
||
|
|
||
|
// Get the file
|
||
|
if (!g_pFaxRouteGetFile(pFaxRoute->JobId, 1, szTiffFile, &cb)) {
|
||
|
// Release access to the FaxRcv named mutex
|
||
|
ReleaseMutex(g_hFaxRcvMutex);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// Initialize szDrive
|
||
|
ZeroMemory(szDrive, sizeof(szDrive));
|
||
|
// Initialize szDir
|
||
|
ZeroMemory(szDir, sizeof(szDir));
|
||
|
// Initialize szFile
|
||
|
ZeroMemory(szFile, sizeof(szFile));
|
||
|
// Initialize szExt
|
||
|
ZeroMemory(szExt, sizeof(szExt));
|
||
|
|
||
|
_wsplitpath(szTiffFile, szDrive, szDir, szFile, szExt);
|
||
|
|
||
|
// Initialize szCopyTiffFile
|
||
|
ZeroMemory(szCopyTiffFile, sizeof(szCopyTiffFile));
|
||
|
// Set szCopyTiffFile
|
||
|
wsprintf(szCopyTiffFile, L"%s%s%s%s%s", szDrive, szDir, L"Copy of ", szFile, szExt);
|
||
|
|
||
|
// Copy szTiffFile to szCopyTiffFile
|
||
|
CopyFile(szTiffFile, szCopyTiffFile, FALSE);
|
||
|
|
||
|
// Determine the memory required by FaxRcv memory map
|
||
|
cb = (lstrlen(szCopyTiffFile) + 1) * sizeof(WCHAR);
|
||
|
cb += (lstrlen(pFaxRoute->Tsid) + 1) * sizeof(WCHAR);
|
||
|
cb += sizeof(DWORD);
|
||
|
|
||
|
if (g_pFaxRcvView) {
|
||
|
// Delete szCopyTiffFile
|
||
|
DeleteFile((LPWSTR) g_pFaxRcvView);
|
||
|
// Close FaxRcv memory map view
|
||
|
UnmapViewOfFile(g_pFaxRcvView);
|
||
|
}
|
||
|
if (g_hFaxRcvMap) {
|
||
|
// Close FaxRcv memory map
|
||
|
CloseHandle(g_hFaxRcvMap);
|
||
|
}
|
||
|
|
||
|
// Create FaxRcv memory map
|
||
|
g_hFaxRcvMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, cb, FAXRCV_MAP);
|
||
|
// Create FaxRcv memory map view
|
||
|
g_pFaxRcvView = (LPBYTE) MapViewOfFile(g_hFaxRcvMap, FILE_MAP_WRITE, 0, 0, 0);
|
||
|
|
||
|
// Set upOffset
|
||
|
upOffset = 0;
|
||
|
|
||
|
// Set szCopyTiffFile
|
||
|
lstrcpy((LPWSTR) ((UINT_PTR) g_pFaxRcvView + upOffset), szCopyTiffFile);
|
||
|
upOffset += (lstrlen(szCopyTiffFile) + 1) * sizeof(WCHAR);
|
||
|
|
||
|
// Set Tsid
|
||
|
lstrcpy((LPWSTR) ((UINT_PTR) g_pFaxRcvView + upOffset), pFaxRoute->Tsid);
|
||
|
upOffset += (lstrlen(pFaxRoute->Tsid) + 1) * sizeof(WCHAR);
|
||
|
|
||
|
// Set DeviceId
|
||
|
CopyMemory((LPDWORD) ((UINT_PTR) g_pFaxRcvView + upOffset), &pFaxRoute->DeviceId, sizeof(DWORD));
|
||
|
|
||
|
// Signal FaxRcv named event
|
||
|
SetEvent(g_hFaxRcvEvent);
|
||
|
|
||
|
// Release access to the FaxRcv named mutex
|
||
|
ReleaseMutex(g_hFaxRcvMutex);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|