Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

353 lines
8.4 KiB

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
faxmodem.c
Abstract:
This module contains code to read the adaptive
answer modem list from the faxsetup.inf file.
Author:
Wesley Witt (wesw) 22-Sep-1997
Revision History:
--*/
#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <tapi.h>
#include "faxreg.h"
#include "faxutil.h"
#ifdef __cplusplus
extern "C" {
#endif
VOID
CALLBACK
lineCallbackFunc(
DWORD hDevice,
DWORD dwMsg,
DWORD_PTR dwCallbackInstance,
DWORD_PTR dwParam1,
DWORD_PTR dwParam2,
DWORD_PTR dwParam3
)
{
UNREFERENCED_PARAMETER (hDevice);
UNREFERENCED_PARAMETER (dwMsg);
UNREFERENCED_PARAMETER (dwCallbackInstance);
UNREFERENCED_PARAMETER (dwParam1);
UNREFERENCED_PARAMETER (dwParam2);
UNREFERENCED_PARAMETER (dwParam3);
} // lineCallbackFunc
LPLINEDEVCAPS
SmartLineGetDevCaps(
HLINEAPP hLineApp,
DWORD dwDeviceId,
DWORD dwAPIVersion
)
/*++
Routine name : SmartLineGetDevCaps
Routine description:
Gets the line capabilities for a TAPI line
Author:
Eran Yariv (EranY), Jul, 2000
Arguments:
hLineApp [in] - Handle to TAPI
dwDeviceId [in] - Line id
dwAPIVersion [in] - Negotiated TAPI API version
Return Value:
Pointer to allocated lide device capabilities data
--*/
{
DWORD dwLineDevCapsSize;
LPLINEDEVCAPS lpLineDevCaps = NULL;
DWORD dwRes = ERROR_SUCCESS;
DEBUG_FUNCTION_NAME(TEXT("SmartLineGetDevCaps"))
//
// Allocate the initial linedevcaps structure
//
dwLineDevCapsSize = sizeof(LINEDEVCAPS) + 4096;
lpLineDevCaps = (LPLINEDEVCAPS) MemAlloc( dwLineDevCapsSize );
if (!lpLineDevCaps)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Can't allocate %ld bytes for LINEDEVCAPS"),
dwLineDevCapsSize);
return NULL;
}
lpLineDevCaps->dwTotalSize = dwLineDevCapsSize;
dwRes = lineGetDevCaps(
hLineApp,
dwDeviceId,
dwAPIVersion,
0, // Always refer to address 0
lpLineDevCaps
);
if ((ERROR_SUCCESS != dwRes) && (LINEERR_STRUCTURETOOSMALL != dwRes))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("lineGetDevCaps failed with 0x%08x"),
dwRes);
goto exit;
}
if (lpLineDevCaps->dwNeededSize > lpLineDevCaps->dwTotalSize)
{
//
// Re-allocate the linedevcaps structure
//
dwLineDevCapsSize = lpLineDevCaps->dwNeededSize;
MemFree( lpLineDevCaps );
lpLineDevCaps = (LPLINEDEVCAPS) MemAlloc( dwLineDevCapsSize );
if (!lpLineDevCaps)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Can't allocate %ld bytes for LINEDEVCAPS"),
dwLineDevCapsSize);
return NULL;
}
lpLineDevCaps->dwTotalSize = dwLineDevCapsSize;
dwRes = lineGetDevCaps(
hLineApp,
dwDeviceId,
dwAPIVersion,
0, // Always refer to address 0
lpLineDevCaps
);
if (ERROR_SUCCESS != dwRes)
{
//
// lineGetDevCaps() can fail with error code 0x8000004b
// if a device has been deleted and tapi has not been
// cycled. this is caused by the fact that tapi leaves
// a phantom device in it's device list. the error is
// benign and the device can safely be ignored.
//
DebugPrintEx(
DEBUG_ERR,
TEXT("lineGetDevCaps failed with 0x%08x"),
dwRes);
goto exit;
}
}
exit:
if (dwRes != ERROR_SUCCESS)
{
MemFree( lpLineDevCaps );
lpLineDevCaps = NULL;
SetLastError(dwRes);
}
return lpLineDevCaps;
} // SmartLineGetDevCaps
BOOL
IsDeviceModem (
LPLINEDEVCAPS lpLineCaps,
LPCTSTR lpctstrUnimodemTspName
)
/*++
Routine name : IsDeviceModem
Routine description:
Is a TAPI line a modem?
Author:
Eran Yariv (EranY), Jul, 2000
Arguments:
lpLineCaps [in] - Line capabilities buffer
lpctstrUnimodemTspName [in] - Full name of the Unimodem TSP
Return Value:
TRUE if a TAPI line is a modem, FALSE otherwise.
--*/
{
LPTSTR lptstrDeviceClassList;
BOOL bRes = FALSE;
DEBUG_FUNCTION_NAME(TEXT("IsDeviceModem"))
if (lpLineCaps->dwDeviceClassesSize && lpLineCaps->dwDeviceClassesOffset)
{
//
// Scan multi-string for modem class
//
lptstrDeviceClassList = (LPTSTR)((LPBYTE) lpLineCaps + lpLineCaps->dwDeviceClassesOffset);
while (*lptstrDeviceClassList)
{
if (_tcscmp(lptstrDeviceClassList,TEXT("comm/datamodem")) == 0)
{
bRes = TRUE;
break;
}
lptstrDeviceClassList += (_tcslen(lptstrDeviceClassList) + 1);
}
}
if ((!(lpLineCaps->dwBearerModes & LINEBEARERMODE_VOICE)) ||
(!(lpLineCaps->dwBearerModes & LINEBEARERMODE_PASSTHROUGH)))
{
//
// Unacceptable modem device type
//
bRes = FALSE;
}
if (lpLineCaps->dwProviderInfoSize && lpLineCaps->dwProviderInfoOffset)
{
//
// Provider (TSP) name is there
//
if (_tcscmp((LPTSTR)((LPBYTE) lpLineCaps + lpLineCaps->dwProviderInfoOffset),
lpctstrUnimodemTspName) != 0)
{
//
// Our T30 modem FSP only works with Unimodem TSP
//
bRes = FALSE;
}
}
return bRes;
} // IsDeviceModem
DWORD
GetFaxCapableTapiLinesCount (
LPDWORD lpdwCount,
LPCTSTR lpctstrUnimodemTspName
)
/*++
Routine name : GetFaxCapableTapiLinesCount
Routine description:
Counter the number of Fax-capable TAPI lines in the system
Author:
Eran Yariv (EranY), Jul, 2000
Arguments:
lpdwCount [out] - Pointer to count of fax-capable Tapi lines
lpctstrUnimodemTspName [in] - Full name of the Unimodem TSP
Return Value:
Standard Win32 error code
--*/
{
DWORD dwRes;
LINEINITIALIZEEXPARAMS LineInitializeExParams = {sizeof (LINEINITIALIZEEXPARAMS), 0, 0, 0, 0, 0};
HLINEAPP hLineApp = NULL;
DWORD dwTapiDevices;
DWORD dwLocalTapiApiVersion = 0x00020000;
DWORD dwCount = 0;
DWORD dwIndex;
DEBUG_FUNCTION_NAME(TEXT("GetFaxCapableTapiLinesCount"))
dwRes = lineInitializeEx(
&hLineApp,
GetModuleHandle(NULL),
lineCallbackFunc,
FAX_SERVICE_DISPLAY_NAME,
&dwTapiDevices,
&dwLocalTapiApiVersion,
&LineInitializeExParams
);
if (ERROR_SUCCESS != dwRes)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("lineInitializeEx failed with %ld"),
dwRes);
goto exit;
}
for (dwIndex = 0; dwIndex < dwTapiDevices; dwIndex++)
{
//
// For each device, get it's caps
//
LPLINEDEVCAPS lpLineCaps = SmartLineGetDevCaps (hLineApp, dwIndex, dwLocalTapiApiVersion);
if (!lpLineCaps)
{
//
// Couldn't get the device capabilities
//
dwRes = GetLastError ();
DebugPrintEx(
DEBUG_ERR,
TEXT("SmartLineGetDevCaps failed with %ld"),
dwRes);
continue;
}
if ((
(lpLineCaps->dwMediaModes & LINEMEDIAMODE_DATAMODEM) &&
IsDeviceModem(lpLineCaps, lpctstrUnimodemTspName)
)
||
(lpLineCaps->dwMediaModes & LINEMEDIAMODE_G3FAX)
)
{
//
// This is a fax-capable device
//
dwCount++;
}
MemFree (lpLineCaps);
}
dwRes = ERROR_SUCCESS;
exit:
if (hLineApp)
{
lineShutdown (hLineApp);
}
if (ERROR_SUCCESS == dwRes)
{
*lpdwCount = dwCount;
}
return dwRes;
} // GetFaxCapableTapiLinesCount
#ifdef __cplusplus
}
#endif