951 lines
17 KiB
C
951 lines
17 KiB
C
/*++ BUILD Version: 0000 // Increment this if a change has global effects
|
|
|
|
Copyright (c) 1996-1998 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
tsec.c
|
|
|
|
Abstract:
|
|
|
|
A sample administration DLL
|
|
|
|
Author:
|
|
|
|
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include <windows.h>
|
|
#include <tapi.h>
|
|
#include <tapclntp.h> // private\inc\tapclntp.h
|
|
#include <tlnklist.h>
|
|
#include "tsec.h"
|
|
|
|
HINSTANCE ghInst;
|
|
LIST_ENTRY gClientListHead;
|
|
CRITICAL_SECTION gCritSec;
|
|
DEVICECHANGECALLBACK glpfnLineChangeCallback = NULL;
|
|
DEVICECHANGECALLBACK glpfnPhoneChangeCallback = NULL;
|
|
|
|
|
|
void
|
|
FreeClient(
|
|
PMYCLIENT pClient
|
|
);
|
|
|
|
BOOL
|
|
WINAPI
|
|
DllMain(
|
|
HANDLE hDLL,
|
|
DWORD dwReason,
|
|
LPVOID lpReserved
|
|
)
|
|
{
|
|
switch (dwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
{
|
|
#if DBG
|
|
gdwDebugLevel = 0;
|
|
#endif
|
|
|
|
DBGOUT((2, "DLL_PROCESS_ATTACH"));
|
|
|
|
ghInst = hDLL;
|
|
|
|
InitializeCriticalSection (&gCritSec);
|
|
|
|
InitializeListHead (&gClientListHead);
|
|
|
|
break;
|
|
}
|
|
case DLL_PROCESS_DETACH:
|
|
{
|
|
PMYCLIENT pClient;
|
|
|
|
|
|
//
|
|
// Clean up client list (no need to enter crit sec since
|
|
// process detaching)
|
|
//
|
|
|
|
while (!IsListEmpty (&gClientListHead))
|
|
{
|
|
LIST_ENTRY *pEntry = RemoveHeadList (&gClientListHead);
|
|
|
|
|
|
pClient = CONTAINING_RECORD (pEntry, MYCLIENT, ListEntry);
|
|
|
|
FreeClient(pClient);
|
|
}
|
|
|
|
DeleteCriticalSection (&gCritSec);
|
|
|
|
break;
|
|
}
|
|
case DLL_THREAD_ATTACH:
|
|
case DLL_THREAD_DETACH:
|
|
|
|
break;
|
|
|
|
} // switch
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void
|
|
FreeClient(
|
|
PMYCLIENT pClient
|
|
)
|
|
{
|
|
GlobalFree (pClient->pszUserName);
|
|
GlobalFree (pClient->pszDomainName);
|
|
GlobalFree (pClient->pLineDeviceMap);
|
|
GlobalFree (pClient->pPhoneDeviceMap);
|
|
|
|
GlobalFree (pClient);
|
|
|
|
}
|
|
|
|
|
|
LONG
|
|
GetAndParseAMapping(
|
|
LPCWSTR pszFullName,
|
|
LPCWSTR pszType,
|
|
LPTAPIPERMANENTID *ppDevices,
|
|
LPDWORD pdwDevices
|
|
)
|
|
{
|
|
LPWSTR pszDevices = NULL, pszHold1, pszHold2;
|
|
DWORD dwSize, dwReturn, dwDevices;
|
|
DWORD dwPermanentDeviceID;
|
|
BOOL bBreak = FALSE;
|
|
|
|
|
|
dwSize = MAXDEVICESTRINGLEN;
|
|
|
|
|
|
// get the string
|
|
|
|
do
|
|
{
|
|
if (pszDevices != NULL)
|
|
{
|
|
dwSize *= 2;
|
|
|
|
GlobalFree (pszDevices);
|
|
}
|
|
|
|
pszDevices = (LPWSTR) GlobalAlloc (GPTR, dwSize * sizeof(WCHAR));
|
|
|
|
if (!pszDevices)
|
|
{
|
|
return LINEERR_NOMEM;
|
|
}
|
|
|
|
dwReturn = GetPrivateProfileString(
|
|
pszFullName,
|
|
pszType,
|
|
SZEMPTYSTRING,
|
|
pszDevices,
|
|
dwSize,
|
|
SZINIFILE
|
|
);
|
|
|
|
if (dwReturn == 0)
|
|
{
|
|
// valid case. the user has no
|
|
// devices, so just return 0
|
|
|
|
GlobalFree(pszDevices);
|
|
|
|
*pdwDevices = 0;
|
|
*ppDevices = NULL;
|
|
|
|
return 0;
|
|
}
|
|
|
|
} while (dwReturn == (dwSize - 1));
|
|
|
|
|
|
// parse the string
|
|
//
|
|
// the string looks line px, x, py, y,pz, z where x,y and z are
|
|
// tapi permanent device IDs, and px, py, and pz are the
|
|
// permanent provider IDs for the corresponding devices.
|
|
|
|
pszHold1 = pszDevices;
|
|
dwDevices = 0;
|
|
|
|
// first, count the ,s so we know how many devices there are
|
|
|
|
while (*pszHold1 != L'\0')
|
|
{
|
|
if (*pszHold1 == L',')
|
|
{
|
|
dwDevices++;
|
|
}
|
|
pszHold1++;
|
|
}
|
|
|
|
dwDevices++;
|
|
|
|
dwDevices /= 2;
|
|
|
|
// alloc line mapping, this is freed later
|
|
|
|
*ppDevices = (LPTAPIPERMANENTID) GlobalAlloc(
|
|
GPTR,
|
|
dwDevices * sizeof ( TAPIPERMANENTID )
|
|
);
|
|
|
|
if (!*ppDevices)
|
|
{
|
|
GlobalFree (pszDevices);
|
|
return LINEERR_NOMEM;
|
|
}
|
|
|
|
|
|
pszHold1 = pszHold2 = pszDevices;
|
|
dwDevices = 0;
|
|
|
|
// go through string
|
|
|
|
while (TRUE)
|
|
{
|
|
|
|
// wait for ,
|
|
|
|
while ((*pszHold2 != L'\0') && *pszHold2 != L',')
|
|
{
|
|
pszHold2++;
|
|
}
|
|
|
|
if (*pszHold2 == L',')
|
|
*pszHold2 = L'\0';
|
|
else
|
|
{
|
|
bBreak = TRUE;
|
|
}
|
|
|
|
// save the id
|
|
|
|
(*ppDevices)[dwDevices].dwProviderID = _wtol(pszHold1);
|
|
|
|
// if we hit the end, break out
|
|
// note here that this is an unmatched provider id
|
|
// but we have inc'ed the dwdevices, so this element will be ignored
|
|
|
|
if (bBreak)
|
|
{
|
|
break;
|
|
}
|
|
|
|
pszHold2++;
|
|
pszHold1 = pszHold2;
|
|
|
|
// wait for ,
|
|
|
|
while ((*pszHold2 != L'\0') && *pszHold2 != L',')
|
|
{
|
|
pszHold2++;
|
|
}
|
|
|
|
if (*pszHold2 == L',')
|
|
{
|
|
*pszHold2 = L'\0';
|
|
}
|
|
else
|
|
{
|
|
bBreak = TRUE;
|
|
}
|
|
|
|
// save the id
|
|
|
|
(*ppDevices)[dwDevices].dwDeviceID = _wtol(pszHold1);
|
|
|
|
dwDevices++;
|
|
|
|
// if we hit the end, break out
|
|
|
|
if (bBreak)
|
|
{
|
|
break;
|
|
}
|
|
|
|
pszHold2++;
|
|
pszHold1 = pszHold2;
|
|
}
|
|
|
|
|
|
*pdwDevices = dwDevices;
|
|
|
|
GlobalFree(pszDevices);
|
|
|
|
return 0; // success
|
|
}
|
|
|
|
|
|
LONG
|
|
GetMappings(
|
|
LPCWSTR pszDomainName,
|
|
LPCWSTR pszUserName,
|
|
LPTAPIPERMANENTID *ppLineMapping,
|
|
LPDWORD pdwLines,
|
|
LPTAPIPERMANENTID *ppPhoneMapping,
|
|
LPDWORD pdwPhones
|
|
)
|
|
{
|
|
LPWSTR pszFullName;
|
|
DWORD dwSize;
|
|
LONG lResult;
|
|
|
|
|
|
// put the username and domain name together
|
|
// for a full name: domain\user
|
|
// in the " + 2" 1 is for \ and 1 is for null terminator
|
|
|
|
pszFullName = (LPWSTR)GlobalAlloc(
|
|
GPTR,
|
|
( lstrlen(pszDomainName) + lstrlen(pszUserName) + 2 ) * sizeof(WCHAR)
|
|
);
|
|
|
|
if (!pszFullName)
|
|
{
|
|
return LINEERR_NOMEM;
|
|
}
|
|
|
|
// put them together
|
|
|
|
wsprintf(
|
|
pszFullName,
|
|
L"%s\\%s",
|
|
pszDomainName,
|
|
pszUserName
|
|
);
|
|
|
|
if (lResult = GetAndParseAMapping(
|
|
pszFullName,
|
|
SZLINES,
|
|
ppLineMapping,
|
|
pdwLines
|
|
))
|
|
{
|
|
GlobalFree(pszFullName);
|
|
return lResult;
|
|
}
|
|
|
|
if (lResult = GetAndParseAMapping(
|
|
pszFullName,
|
|
SZPHONES,
|
|
ppPhoneMapping,
|
|
pdwPhones
|
|
))
|
|
{
|
|
GlobalFree (*ppLineMapping);
|
|
GlobalFree (pszFullName);
|
|
return lResult;
|
|
}
|
|
|
|
GlobalFree(pszFullName);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_Load(
|
|
LPDWORD pdwAPIVersion,
|
|
DEVICECHANGECALLBACK lpfnLineChangeCallback,
|
|
DEVICECHANGECALLBACK lpfnPhoneChangeCallback,
|
|
DWORD Reserved
|
|
)
|
|
{
|
|
if (*pdwAPIVersion > TAPI_CURRENT_VERSION)
|
|
{
|
|
*pdwAPIVersion = TAPI_CURRENT_VERSION;
|
|
}
|
|
|
|
glpfnLineChangeCallback = lpfnLineChangeCallback;
|
|
glpfnPhoneChangeCallback = lpfnPhoneChangeCallback;
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void
|
|
CLIENTAPI
|
|
TAPICLIENT_Free(
|
|
void
|
|
)
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_ClientInitialize(
|
|
LPCWSTR pszDomainName,
|
|
LPCWSTR pszUserName,
|
|
LPCWSTR pszMachineName,
|
|
LPHMANAGEMENTCLIENT phmClient
|
|
)
|
|
{
|
|
PMYCLIENT pNewClient;
|
|
LPTAPIPERMANENTID pLineMapping, pPhoneMapping;
|
|
DWORD dwNumLines, dwNumPhones;
|
|
LONG lResult;
|
|
|
|
|
|
// first, get the device mappings
|
|
// if this fails, most likely the user
|
|
// has access to no lines
|
|
|
|
if (lResult = GetMappings(
|
|
pszDomainName,
|
|
pszUserName,
|
|
&pLineMapping,
|
|
&dwNumLines,
|
|
&pPhoneMapping,
|
|
&dwNumPhones
|
|
))
|
|
{
|
|
return lResult;
|
|
}
|
|
|
|
// alloc a client structure
|
|
|
|
pNewClient = (PMYCLIENT) GlobalAlloc (GPTR, sizeof(MYCLIENT));
|
|
|
|
if (!pNewClient)
|
|
{
|
|
return LINEERR_NOMEM;
|
|
}
|
|
|
|
// alloc space for the name
|
|
|
|
pNewClient->pszUserName = (LPWSTR) GlobalAlloc(
|
|
GPTR,
|
|
(lstrlen(pszUserName) + 1) * sizeof(WCHAR)
|
|
);
|
|
if (!pNewClient->pszUserName)
|
|
{
|
|
GlobalFree(pNewClient);
|
|
return LINEERR_NOMEM;
|
|
}
|
|
|
|
pNewClient->pszDomainName = (LPWSTR) GlobalAlloc(
|
|
GPTR,
|
|
(lstrlen(pszDomainName) +1) * sizeof(WCHAR)
|
|
);
|
|
if (!pNewClient->pszDomainName)
|
|
{
|
|
GlobalFree(pNewClient->pszUserName);
|
|
GlobalFree(pNewClient);
|
|
return LINEERR_NOMEM;
|
|
}
|
|
|
|
// initialize stuff
|
|
|
|
lstrcpy (pNewClient->pszUserName, pszUserName);
|
|
|
|
lstrcpy (pNewClient->pszDomainName, pszDomainName);
|
|
|
|
pNewClient->pLineDeviceMap = pLineMapping;
|
|
pNewClient->pPhoneDeviceMap = pPhoneMapping;
|
|
pNewClient->dwNumLines = dwNumLines;
|
|
pNewClient->dwNumPhones = dwNumPhones;
|
|
pNewClient->dwKey = TSECCLIENT_KEY;
|
|
|
|
// insert into list of clients
|
|
|
|
EnterCriticalSection (&gCritSec);
|
|
|
|
InsertHeadList (&gClientListHead, &pNewClient->ListEntry);
|
|
|
|
LeaveCriticalSection (&gCritSec);
|
|
|
|
// give TAPI the hmClient
|
|
|
|
*phmClient = (HMANAGEMENTCLIENT)pNewClient;
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_ClientShutdown(
|
|
HMANAGEMENTCLIENT hmClient
|
|
)
|
|
{
|
|
PMYCLIENT pClient;
|
|
|
|
|
|
pClient = (PMYCLIENT) hmClient;
|
|
|
|
EnterCriticalSection (&gCritSec);
|
|
|
|
try
|
|
{
|
|
if (pClient->dwKey == TSECCLIENT_KEY)
|
|
{
|
|
pClient->dwKey = 0;
|
|
RemoveEntryList (&pClient->ListEntry);
|
|
}
|
|
else
|
|
{
|
|
pClient = NULL;
|
|
}
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
pClient = NULL;
|
|
}
|
|
|
|
LeaveCriticalSection (&gCritSec);
|
|
|
|
if (pClient)
|
|
{
|
|
FreeClient (pClient);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_GetDeviceAccess(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
HTAPICLIENT htClient,
|
|
LPTAPIPERMANENTID pLineDeviceMap,
|
|
PDWORD pdwLineDevices,
|
|
LPTAPIPERMANENTID pPhoneDeviceMap,
|
|
PDWORD pdwPhoneDevices
|
|
)
|
|
{
|
|
LONG lResult;
|
|
PMYCLIENT pClient = (PMYCLIENT) hmClient;
|
|
|
|
|
|
EnterCriticalSection (&gCritSec);
|
|
|
|
try
|
|
{
|
|
if (pClient->dwKey != TSECCLIENT_KEY)
|
|
{
|
|
pClient = NULL;
|
|
}
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
pClient = NULL;
|
|
}
|
|
|
|
if (pClient)
|
|
{
|
|
// would need to critical section this stuff
|
|
// if we added devices dynamically
|
|
|
|
if (*pdwLineDevices < pClient->dwNumLines)
|
|
{
|
|
*pdwLineDevices = pClient->dwNumLines;
|
|
|
|
lResult = LINEERR_STRUCTURETOOSMALL;
|
|
goto LeaveCritSec;
|
|
}
|
|
|
|
CopyMemory(
|
|
pLineDeviceMap,
|
|
pClient->pLineDeviceMap,
|
|
pClient->dwNumLines * sizeof( TAPIPERMANENTID )
|
|
);
|
|
|
|
*pdwLineDevices = pClient->dwNumLines;
|
|
|
|
if (*pdwPhoneDevices < pClient->dwNumPhones)
|
|
{
|
|
*pdwPhoneDevices = pClient->dwNumPhones;
|
|
|
|
lResult = LINEERR_STRUCTURETOOSMALL;
|
|
goto LeaveCritSec;
|
|
}
|
|
|
|
CopyMemory(
|
|
pPhoneDeviceMap,
|
|
pClient->pPhoneDeviceMap,
|
|
pClient->dwNumPhones * sizeof( TAPIPERMANENTID )
|
|
);
|
|
|
|
*pdwPhoneDevices = pClient->dwNumPhones;
|
|
|
|
pClient->htClient = htClient;
|
|
|
|
lResult = 0;
|
|
}
|
|
else
|
|
{
|
|
lResult = LINEERR_INVALPOINTER;
|
|
}
|
|
|
|
LeaveCritSec:
|
|
|
|
LeaveCriticalSection (&gCritSec);
|
|
|
|
return lResult;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineAddToConference(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
LPLINECALLINFO lpConsultCallCallInfo
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineBlindTransfer(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
LPWSTR lpszDestAddress,
|
|
LPDWORD lpdwSize,
|
|
LPDWORD pdwCountryCodeOut
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineConfigDialog(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
LPCWSTR lpszDeviceClass
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineDial(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
DWORD Reserved,
|
|
LPWSTR lpszDestAddressIn,
|
|
LPDWORD pdwSize,
|
|
LPDWORD pdwCountyCode
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineForward(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
LPLINEFORWARDLIST lpFowardListIn,
|
|
LPDWORD pdwSize,
|
|
LPLINECALLPARAMS lpCallParamsIn,
|
|
LPDWORD pdwParamsSize
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineGenerateDigits(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
DWORD Reserved,
|
|
LPCWSTR lpszDigits
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineMakeCall(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
DWORD dwReserved,
|
|
LPWSTR lpszDestAddress,
|
|
LPDWORD pdwSize,
|
|
LPDWORD pdwCountryCode,
|
|
LPLINECALLPARAMS lpCallParams,
|
|
LPDWORD pdwCallParamsSize
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineOpen(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
DWORD dwAPIVersion,
|
|
DWORD dwExtVersion,
|
|
DWORD dwPrivileges,
|
|
DWORD dwMediaModes,
|
|
LPLINECALLPARAMS lpCallParamsIn,
|
|
LPDWORD pdwParamsSize
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineRedirect(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
LPWSTR lpszDestAddress,
|
|
LPDWORD pdwSize,
|
|
LPDWORD pdwCountryCode
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineSetCallData(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
LPVOID lpCallData,
|
|
LPDWORD pdwSize
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineSetCallParams(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
DWORD dwBearerMode,
|
|
DWORD dwMinRate,
|
|
DWORD dwMaxRate,
|
|
LPLINEDIALPARAMS lpDialParams
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineSetCallPrivilege(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
DWORD dwCallPrivilege
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineSetCallTreatment(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
DWORD dwCallTreatment
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineSetCurrentLocation(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
LPDWORD dwLocation
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineSetDevConfig(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
LPVOID lpDevConfig,
|
|
LPDWORD pdwSize,
|
|
LPCWSTR lpszDeviceClass
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineSetLineDevStatus(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
DWORD dwStatusToChange,
|
|
DWORD fStatus
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineSetMediaControl(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
LPLINEMEDIACONTROLDIGIT const lpDigitList,
|
|
DWORD dwDigitNumEntries,
|
|
LPLINEMEDIACONTROLMEDIA const lpMediaList,
|
|
DWORD dwMediaNumEntries,
|
|
LPLINEMEDIACONTROLTONE const lpToneList,
|
|
DWORD dwToneNumEntries,
|
|
LPLINEMEDIACONTROLCALLSTATE const lpCallstateList,
|
|
DWORD dwCallstateNumEntries
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineSetMediaMode(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
DWORD dwMediaModes
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineSetTerminal(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
DWORD dwTerminalModes,
|
|
DWORD dwTerminalID,
|
|
BOOL bEnable
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_LineSetTollList(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
LPCWSTR lpszAddressIn,
|
|
DWORD dwTollListOption
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_PhoneConfigDialog(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
LPCWSTR lpszDeviceClass
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG
|
|
CLIENTAPI
|
|
TAPICLIENT_PhoneOpen(
|
|
HMANAGEMENTCLIENT hmClient,
|
|
LPTAPIPERMANENTID pID,
|
|
DWORD dwAPIVersion,
|
|
DWORD dwExtVersion,
|
|
DWORD dwPrivilege
|
|
)
|
|
{
|
|
return LINEERR_OPERATIONFAILED;
|
|
}
|
|
|
|
|
|
|
|
#if DBG
|
|
VOID
|
|
DbgPrt(
|
|
IN DWORD dwDbgLevel,
|
|
IN PUCHAR lpszFormat,
|
|
IN ...
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Formats the incoming debug message & calls DbgPrint
|
|
|
|
Arguments:
|
|
|
|
DbgLevel - level of message verboseness
|
|
|
|
DbgMessage - printf-style format string, followed by appropriate
|
|
list of arguments
|
|
|
|
Return Value:
|
|
|
|
|
|
--*/
|
|
{
|
|
if (dwDbgLevel <= gdwDebugLevel)
|
|
{
|
|
char buf[128] = "TSEC: ";
|
|
va_list ap;
|
|
|
|
|
|
va_start(ap, lpszFormat);
|
|
wvsprintfA (&buf[6], lpszFormat, ap);
|
|
lstrcatA (buf, "\n");
|
|
OutputDebugStringA (buf);
|
|
va_end(ap);
|
|
}
|
|
}
|
|
#endif
|