summaryrefslogtreecommitdiffstats
path: root/private/tapi/dev/thunk/thunk.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/tapi/dev/thunk/thunk.c3771
1 files changed, 3771 insertions, 0 deletions
diff --git a/private/tapi/dev/thunk/thunk.c b/private/tapi/dev/thunk/thunk.c
new file mode 100644
index 000000000..0e0a56434
--- /dev/null
+++ b/private/tapi/dev/thunk/thunk.c
@@ -0,0 +1,3771 @@
+/*++ BUILD Version: 0000 // Increment this if a change has global effects
+
+Copyright (c) 1995 Microsoft Corporation
+
+Module Name:
+
+ thunk.c
+
+Abstract:
+
+ This module contains
+
+Author:
+
+ Dan Knudson (DanKn) dd-Mmm-1995
+
+Revision History:
+
+--*/
+
+
+// BUGBUG? do we need a notifyregister proc in here to clean up after bad apps
+// BUGBUG how to clean up after apps that've closed w/o do a shutdown?
+
+
+#include <windows.h>
+
+#include <stdlib.h>
+//#include <malloc.h>
+
+#include <string.h>
+
+
+#define TAPI_CURRENT_VERSION 0x00010004
+
+//#include "..\inc\tapi.h"
+#include <tapi.h>
+
+#include "thunk.h"
+
+char gszWndClass[] = "TapiClient16Class";
+
+// BUGBUG
+
+//#define DBG
+
+#if DBG
+
+DWORD gdwDebugLevel;
+
+#define DBGOUT OutputDebugString
+#else
+
+#define DBGOUT //
+
+#endif
+
+int
+FAR
+PASCAL
+LibMain(
+ HINSTANCE hInst,
+ WORD wDataSeg,
+ WORD cbHeapSize,
+ LPSTR lpszCmdLine
+ )
+{
+ int i;
+ WNDCLASS wc;
+
+ DBGOUT ("Libmain entered\n");
+
+ //
+ //
+ //
+
+#if DBG
+
+ gdwDebugLevel = (DWORD) GetPrivateProfileInt(
+ "Debug",
+ "TapiDebugLevel",
+ 0x0,
+ "Telephon.ini"
+ );
+
+#endif
+
+
+ //
+ // Save the hInst in a global
+ //
+
+ ghInst = hInst;
+
+
+ //
+ // Register a window class for windows used for signaling async
+ // completions & unsolicited events
+ //
+
+ wc.style = 0;
+ wc.lpfnWndProc = (WNDPROC) Tapi16HiddenWndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 2 * sizeof(DWORD);
+ wc.hInstance = hInst;
+ wc.hIcon = NULL;
+ wc.hCursor = NULL;
+ wc.hbrBackground = NULL;
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = gszWndClass;
+
+ if (!RegisterClass (&wc))
+ {
+ DBGOUT ("RegisterClass() failed\n");
+ }
+
+
+ //
+ // Load tapi32.dll & Get all the proc pointers
+ //
+
+ ghLib = LoadLibraryEx32W ("tapi32.dll", NULL, 0);
+
+ for (i = 0; i < NUM_TAPI32_PROCS; i++)
+ {
+ gaProcs[i] = (MYPROC) GetProcAddress32W(
+ ghLib,
+ (LPCSTR)gaFuncNames[i]
+ );
+ }
+
+ // set the error mode.
+ // this has no effect on x86 platforms
+ // on RISC platforms, NT will fix
+ // alignment faults (at a cost of time)
+ {
+#define SEM_NOALIGNMENTFAULTEXCEPT 0x0004
+
+ DWORD dwModule;
+ DWORD dwFunc;
+
+ if ((dwModule = LoadLibraryEx32W("kernel32.dll",
+ NULL,
+ 0)) == NULL)
+ {
+ DBGOUT("LoadLibraryEx32W on kernel32.dll failed\n");
+ }
+ else
+ {
+ if ((dwFunc = GetProcAddress32W(dwModule,
+ "SetErrorMode")) == NULL)
+ {
+ DBGOUT("GetProcAddress32W on SetErrorMode failed\n");
+ }
+ else
+ {
+ DBGOUT("Calling CallProcEx32W\n");
+
+ CallProcEx32W(1,
+ 0,
+ dwFunc,
+ (DWORD)SEM_NOALIGNMENTFAULTEXCEPT);
+ }
+
+ FreeLibrary32W(dwModule);
+ }
+ }
+
+ return TRUE;
+}
+
+
+int
+FAR
+PASCAL
+WEP(
+ int nParam
+ )
+{
+ FreeLibrary32W (ghLib);
+
+ return TRUE;
+}
+
+
+LRESULT
+CALLBACK
+Tapi16HiddenWndProc(
+ HWND hwnd,
+ UINT msg,
+ WPARAM wParam,
+ LPARAM lParam
+ )
+{
+ switch (msg)
+ {
+ case WM_ASYNCEVENT:
+ {
+ //
+ // This msg gets posted to us by tapi32.dll to alert us that
+ // there's a new callback msg available for the app instance
+ // associated with this window. "lParam" is an app instance
+ // context tapi32.dll-space.
+ //
+
+ LPTAPI_APP_DATA pAppData = (LPTAPI_APP_DATA)
+ GetWindowLong (hwnd, GWL_APPDATA);
+ TAPI16_CALLBACKMSG msg;
+
+
+ pAppData->bPendingAsyncEventMsg = FALSE;
+
+ while ((*pfnCallProc2)(
+ (DWORD) lParam,
+ (DWORD) ((LPVOID)&msg),
+ (LPVOID)gaProcs[GetTapi16CallbkMsg],
+ 0x1,
+ 2
+ ))
+ {
+ if (pAppData->bPendingAsyncEventMsg == FALSE)
+ {
+ pAppData->bPendingAsyncEventMsg = TRUE;
+ PostMessage (hwnd, WM_ASYNCEVENT, wParam, lParam);
+
+// BUGBUG Tapi16HiddenWndProc: need to verify pAppData in case app calls
+// shutdown from callback?
+ }
+
+ (*(pAppData->lpfnCallback))(
+ msg.hDevice,
+ msg.dwMsg,
+ msg.dwCallbackInstance,
+ msg.dwParam1,
+ msg.dwParam2,
+ msg.dwParam3
+ );
+ }
+
+ break;
+ }
+ default:
+ {
+ return (DefWindowProc (hwnd, msg, wParam, lParam));
+ }
+ } // switch
+
+ return 0;
+}
+
+
+//
+// The following are the routines to thunk TAPI calls from 16-bit apps to
+// the 32-bit tapi32.dll. In general, this is done as follows:
+//
+// CallProc32W(
+// arg1, // TAPI proc args
+// ...,
+// argN,
+//
+// pfnTapi32, // Pointer to the function in tapi32.dll
+//
+// 0x???, // Bit mask indicating which args are pointers
+// // that need to be mapped from a 16:16 address
+// // to a 0:32 address. The least significant
+// // bit corresponds to argN, and the Nth bit
+// // corresponds to arg1.
+// //
+// // For example, if arg1 & arg2 are pointers, and
+// // arg3 is a DWORD, the the mask would be 0x6
+// // (110 in binary, indicating arg1 & arg2 need to
+// // be mapped)
+//
+// N // Number of TAPI proc args
+// );
+//
+//
+// Since callbacks to 16-bit procs cannot be done directly by a 32-bit
+// module, we create a hidden window for each successful call to
+// lineInitialize and phoneInitialize, and tapi32.dll posts msgs to this
+// window when LINE_XXX & PHONE_XXX msgs become available for the client
+// process. The window then retrieves all the msgs parameters and calls
+// the 16-bit proc's callback function.
+//
+// Note that we swap the hLineApp & hPhoneApp returned by tapi32.dll with
+// the hidden window handle on the client proc side, and substitute the
+// window handle for the pointer to the callback function on the tapi32.dll
+// side. The former is done to make it easier to reference which window
+// belongs to which hLine/PhoneApp, and the latter is done to provide
+// tapi32.dll with a means of alerting us of callback msgs. (Tapi32.dll
+// distinguishes whether the lpfnCallback it is passed in
+// line/phoneInitialize is a pointer to a function of a window handle by
+// checking the high WORD- if it is 0xffff then it assumes lpfnCallback
+// is really a 16-bit proc's window handle.
+//
+
+#if DBG
+
+void
+LineResult(
+ char *pszFuncName,
+ LONG lResult
+ )
+{
+ if (gdwDebugLevel > 3)
+ {
+ char buf[80];
+
+ wsprintf (buf, "TAPI: line%s result=x%lx\n", pszFuncName, lResult);
+ DBGOUT (buf);
+ }
+}
+
+void
+PhoneResult(
+ char *pszFuncName,
+ LONG lResult
+ )
+{
+ if (gdwDebugLevel > 3)
+ {
+ char buf[80];
+
+ wsprintf (buf, "TAPI: phone%s result=x%lx\n", pszFuncName, lResult);
+ DBGOUT (buf);
+ }
+}
+
+void
+TapiResult(
+ char *pszFuncName,
+ LONG lResult
+ )
+{
+ if (gdwDebugLevel > 3)
+ {
+ char buf[80];
+
+ wsprintf (buf, "TAPI: tapi%s result=x%lx\n", pszFuncName, lResult);
+ DBGOUT (buf);
+ }
+}
+
+#else
+
+#define LineResult(arg1,arg2)
+#define PhoneResult(arg1,arg2)
+#define TapiResult(arg1,arg2)
+
+#endif
+
+
+LONG
+WINAPI
+xxxInitialize(
+ BOOL bLine,
+ LPHLINEAPP lphXxxApp,
+ HINSTANCE hInstance,
+ LINECALLBACK lpfnCallback,
+ LPCSTR lpszAppName,
+ LPDWORD lpdwNumDevs
+ )
+{
+ HWND hwnd = NULL;
+ LONG lResult;
+ char far *lpszModuleNamePath = NULL;
+ char far *lpszModuleName;
+ char far *lpszFriendlyAndModuleName = NULL;
+ LPTAPI_APP_DATA pAppData = (LPTAPI_APP_DATA) NULL;
+
+#if DBG
+
+ if (bLine)
+ {
+ DBGOUT ("lineInitialize: enter\n");
+ }
+ else
+ {
+ DBGOUT ("phoneInitialize: enter\n");
+ }
+
+#endif
+
+ //
+ // Verify the ptrs
+ //
+
+ if (IsBadWritePtr (lphXxxApp, sizeof(HLINEAPP)) ||
+ IsBadCodePtr ((FARPROC) lpfnCallback) ||
+ (lpszAppName && IsBadStringPtr (lpszAppName,(UINT)TAPIMAXAPPNAMESIZE)))
+ {
+ lResult = (bLine ? LINEERR_INVALPOINTER : PHONEERR_INVALPOINTER);
+ goto xxxInitialize_showResult;
+ }
+
+
+ //
+ // Create a string that looks like: "<friendly name>\0<module name>\0"
+ // (because i don't know if i can work with a 16-bit hInstance in tapi32)
+ //
+
+ if ((lpszModuleNamePath = (char far *) malloc (260)))
+ {
+ if (GetModuleFileName (hInstance, lpszModuleNamePath, 260))
+ {
+ lpszModuleName = 1 + _fstrrchr (lpszModuleNamePath, '\\');
+
+ if ((lpszFriendlyAndModuleName = (char far *) malloc (260)))
+ {
+ int length;
+
+
+ strncpy(
+ lpszFriendlyAndModuleName,
+ (lpszAppName ? lpszAppName : lpszModuleName),
+ (UINT)TAPIMAXAPPNAMESIZE
+ );
+
+ lpszFriendlyAndModuleName[TAPIMAXAPPNAMESIZE] = 0;
+
+ length = strlen (lpszFriendlyAndModuleName);
+
+ strcpy(
+ lpszFriendlyAndModuleName + length + 1,
+ lpszModuleName
+ );
+ }
+ else
+ {
+ lResult = (bLine ? LINEERR_NOMEM : PHONEERR_NOMEM);
+ goto xxxInitialize_done;
+ }
+ }
+ else
+ {
+ DBGOUT ("GetModuleFileName() failed\n");
+
+ lResult =
+ (bLine ? LINEERR_OPERATIONFAILED : PHONEERR_OPERATIONFAILED);
+ goto xxxInitialize_done;
+ }
+ }
+ else
+ {
+ lResult = (bLine ? LINEERR_NOMEM : PHONEERR_NOMEM);
+ goto xxxInitialize_done;
+ }
+
+
+ //
+ // Create a window that we can use for signaling async completions
+ // & unsolicited events
+ //
+
+ if (!(hwnd = CreateWindow(
+ gszWndClass,
+ "",
+ WS_POPUP,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ NULL,
+ NULL,
+ ghInst,
+ NULL
+ )))
+ {
+ lResult = (bLine ? LINEERR_OPERATIONFAILED : PHONEERR_OPERATIONFAILED);
+
+ DBGOUT ("CreateWindow failed\n");
+
+ goto xxxInitialize_done;
+ }
+
+
+ //
+ //
+ //
+
+ if (!(pAppData = (LPTAPI_APP_DATA) malloc (sizeof (TAPI_APP_DATA))))
+ {
+ lResult = (bLine ? LINEERR_NOMEM : PHONEERR_NOMEM);
+
+ DBGOUT ("malloc failed\n");
+
+ goto xxxInitialize_done;
+ }
+
+ pAppData->dwKey = TAPI_APP_DATA_KEY;
+ pAppData->hwnd = hwnd;
+ pAppData->bPendingAsyncEventMsg = FALSE;
+ pAppData->lpfnCallback = lpfnCallback;
+
+ SetWindowLong (hwnd, GWL_APPDATA, (LONG) pAppData);
+
+
+ //
+ // Call tapi32.dll
+ //
+
+ lResult = (LONG) (*pfnCallProc5)(
+ (DWORD) ((LPVOID)&pAppData->hXxxApp),
+ (DWORD) hInstance,
+ (DWORD) (0xffff0000 | hwnd), // lpfnCallback
+ (DWORD) lpszFriendlyAndModuleName,
+ (DWORD) lpdwNumDevs,
+ (LPVOID)gaProcs[(bLine ? lInitialize : pInitialize)],
+ 0x13,
+ 5
+ );
+
+xxxInitialize_done:
+
+ if (lpszModuleNamePath)
+ {
+ free (lpszModuleNamePath);
+
+ if (lpszFriendlyAndModuleName)
+ {
+ free (lpszFriendlyAndModuleName);
+ }
+ }
+
+ if (lResult == 0)
+ {
+ //
+ // Set the app's hLineApp to be the hwnd rather than the real
+ // hLineApp, making it easier to locate the window
+ //
+
+ *lphXxxApp = (HLINEAPP) pAppData;
+ }
+ else if (hwnd)
+ {
+ DestroyWindow (hwnd);
+
+ if (pAppData)
+ {
+ free (pAppData);
+ }
+ }
+
+xxxInitialize_showResult:
+
+#if DBG
+
+ if (bLine)
+ {
+ LineResult ("Initialize", lResult);
+ }
+ else
+ {
+ PhoneResult ("Initialize", lResult);
+ }
+
+#endif
+
+ return lResult;
+}
+
+
+LPTAPI_APP_DATA
+FAR
+PASCAL
+IsValidXxxApp(
+ HLINEAPP hXxxApp
+ )
+{
+ if (IsBadReadPtr ((LPVOID) hXxxApp, sizeof (TAPI_APP_DATA)) ||
+ ((LPTAPI_APP_DATA) hXxxApp)->dwKey != TAPI_APP_DATA_KEY)
+ {
+ return (LPTAPI_APP_DATA) NULL;
+ }
+
+ return (LPTAPI_APP_DATA) hXxxApp;
+}
+
+
+LONG
+WINAPI
+lineAccept(
+ HCALL hCall,
+ LPCSTR lpsUserUserInfo,
+ DWORD dwSize
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hCall,
+ (DWORD) lpsUserUserInfo,
+ (DWORD) dwSize,
+ (LPVOID)gaProcs[lAccept],
+ 0x2,
+ 3
+ );
+
+ LineResult ("Accept", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineAddProvider(
+ LPCSTR lpszProviderFilename,
+ HWND hwndOwner,
+ LPDWORD lpdwPermanentProviderID
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) lpszProviderFilename,
+ (DWORD) (0xffff0000 | hwndOwner),
+ (DWORD) lpdwPermanentProviderID,
+ (LPVOID)gaProcs[lAddProvider],
+ 0x5,
+ 3
+ );
+
+ LineResult ("AddProvider", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineAddToConference(
+ HCALL hConfCall,
+ HCALL hConsultCall
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hConfCall,
+ (DWORD) hConsultCall,
+ (LPVOID)gaProcs[lAddToConference],
+ 0x0,
+ 2
+ );
+
+ LineResult ("AddToConference", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineAnswer(
+ HCALL hCall,
+ LPCSTR lpsUserUserInfo,
+ DWORD dwSize
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hCall,
+ (DWORD) lpsUserUserInfo,
+ (DWORD) dwSize,
+ (LPVOID)gaProcs[lAnswer],
+ 0x2,
+ 3
+ );
+
+ LineResult ("Answer", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineBlindTransfer(
+ HCALL hCall,
+ LPCSTR lpszDestAddress,
+ DWORD dwCountryCode
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hCall,
+ (DWORD) lpszDestAddress,
+ (DWORD) dwCountryCode,
+ (LPVOID)gaProcs[lBlindTransfer],
+ 0x2,
+ 3
+ );
+
+ LineResult ("BlindTransfer", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineClose(
+ HLINE hLine
+ )
+{
+ LONG lResult = (*pfnCallProc1)(
+ (DWORD) hLine,
+ (LPVOID)gaProcs[lClose],
+ 0x0,
+ 1
+ );
+
+ LineResult ("Close", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineCompleteCall(
+ HCALL hCall,
+ LPDWORD lpdwCompletionID,
+ DWORD dwCompletionMode,
+ DWORD dwMessageID
+ )
+{
+ LONG lResult;
+
+
+ if (IsBadWritePtr (lpdwCompletionID, sizeof (DWORD)))
+ {
+ lResult = LINEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc4)(
+ (DWORD) hCall,
+ (DWORD) lpdwCompletionID, // let tapi32.dll map this
+ (DWORD) dwCompletionMode,
+ (DWORD) dwMessageID,
+ (LPVOID)gaProcs[lCompleteCall],
+ 0x0,
+ 4
+ );
+ }
+ LineResult ("CompleteCall", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineCompleteTransfer(
+ HCALL hCall,
+ HCALL hConsultCall,
+ LPHCALL lphConfCall,
+ DWORD dwTransferMode
+ )
+{
+ //
+ // Tapi32.dll will take care of mapping lphConfCall if/when the
+ // request completes successfully, so we don't set the mapping
+ // bit down below; do check to see if pointer is valid though.
+ //
+
+ LONG lResult;
+
+
+ if (
+ ( dwTransferMode & LINETRANSFERMODE_CONFERENCE )
+ &&
+ IsBadWritePtr ((void FAR *) lphConfCall, sizeof(HCALL))
+ )
+ {
+ DBGOUT ("Bad lphConfCall with TRANSFERMODE_CONFERENCE");
+ lResult = LINEERR_INVALPOINTER;
+ goto CompleteTransfer_cleanup;
+ }
+
+ lResult = (*pfnCallProc4)(
+ (DWORD) hCall,
+ (DWORD) hConsultCall,
+ (DWORD) lphConfCall,
+ (DWORD) dwTransferMode,
+ (LPVOID)gaProcs[lCompleteTransfer],
+ 0x0,
+ 4
+ );
+
+CompleteTransfer_cleanup:
+ LineResult ("CompleteTransfer", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineConfigDialog(
+ DWORD dwDeviceID,
+ HWND hwndOwner,
+ LPCSTR lpszDeviceClass
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) dwDeviceID,
+ (DWORD) (0xffff0000 | hwndOwner),
+ (DWORD) lpszDeviceClass,
+ (LPVOID)gaProcs[lConfigDialog],
+ 0x1,
+ 3
+ );
+
+ LineResult ("ConfigDialog", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineConfigDialogEdit(
+ DWORD dwDeviceID,
+ HWND hwndOwner,
+ LPCSTR lpszDeviceClass,
+ LPVOID lpDeviceConfigIn,
+ DWORD dwSize,
+ LPVARSTRING lpDeviceConfigOut
+ )
+{
+ LONG lResult = (*pfnCallProc6)(
+ (DWORD) dwDeviceID,
+ (DWORD) (0xffff0000 | hwndOwner),
+ (DWORD) lpszDeviceClass,
+ (DWORD) lpDeviceConfigIn,
+ (DWORD) dwSize,
+ (DWORD) lpDeviceConfigOut,
+ (LPVOID)gaProcs[lConfigDialogEdit],
+ 0xd,
+ 6
+ );
+
+ LineResult ("ConfigDialogEdit", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineConfigProvider(
+ HWND hwndOwner,
+ DWORD dwPermanentProviderID
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) (0xffff0000 | hwndOwner),
+ (DWORD) dwPermanentProviderID,
+ (LPVOID)gaProcs[lConfigProvider],
+ 0x0,
+ 2
+ );
+
+ LineResult ("ConfigProvider", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineDeallocateCall(
+ HCALL hCall
+ )
+{
+ LONG lResult = (*pfnCallProc1)(
+ (DWORD) hCall,
+ (LPVOID)gaProcs[lDeallocateCall],
+ 0x0,
+ 1
+ );
+
+ LineResult ("DeallocateCall", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineDevSpecific(
+ HLINE hLine,
+ DWORD dwAddressID,
+ HCALL hCall,
+ LPVOID lpParams,
+ DWORD dwSize
+ )
+{
+ LONG lResult;
+
+
+ if (IsBadWritePtr (lpParams, (UINT) dwSize))
+ {
+ lResult = LINEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc5)(
+ (DWORD) hLine,
+ (DWORD) dwAddressID,
+ (DWORD) hCall,
+ (DWORD) lpParams, // let tapi32.dll map this
+ (DWORD) dwSize,
+ (LPVOID)gaProcs[lDevSpecific],
+ 0x0,
+ 5
+ );
+ }
+
+ LineResult ("DevSpecific", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineDevSpecificFeature(
+ HLINE hLine,
+ DWORD dwFeature,
+ LPVOID lpParams,
+ DWORD dwSize
+ )
+{
+ LONG lResult;
+
+
+ if (IsBadWritePtr (lpParams, (UINT) dwSize))
+ {
+ lResult = LINEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc4)(
+ (DWORD) hLine,
+ (DWORD) dwFeature,
+ (DWORD) lpParams, // let tapi32.dll map this
+ (DWORD) dwSize,
+ (LPVOID)gaProcs[lDevSpecificFeature],
+ 0x0,
+ 4
+ );
+ }
+
+ LineResult ("DevSpecificFeature", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineDial(
+ HCALL hCall,
+ LPCSTR lpszDestAddress,
+ DWORD dwCountryCode
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hCall,
+ (DWORD) lpszDestAddress,
+ (DWORD) dwCountryCode,
+ (LPVOID)gaProcs[lDial],
+ 0x2,
+ 3
+ );
+
+ LineResult ("Dial", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineDrop(
+ HCALL hCall,
+ LPCSTR lpsUserUserInfo,
+ DWORD dwSize
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hCall,
+ (DWORD) lpsUserUserInfo,
+ (DWORD) dwSize,
+ (LPVOID)gaProcs[lDrop],
+ 0x2,
+ 3
+ );
+
+ LineResult ("Drop", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineForward(
+ HLINE hLine,
+ DWORD bAllAddresses,
+ DWORD dwAddressID,
+ LPLINEFORWARDLIST const lpForwardList,
+ DWORD dwNumRingsNoAnswer,
+ LPHCALL lphConsultCall,
+ LPLINECALLPARAMS const lpCallParams
+ )
+{
+ //
+ // Tapi32.dll will take care of mapping lphConsultCall if/when the
+ // request completes successfully, so we don't set the mapping
+ // bit down below; do check to see if pointer is valid though.
+ //
+
+ LONG lResult;
+
+
+ if (IsBadWritePtr ((void FAR *) lphConsultCall, sizeof(HCALL)))
+ {
+ lResult = LINEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc7)(
+ (DWORD) hLine,
+ (DWORD) bAllAddresses,
+ (DWORD) dwAddressID,
+ (DWORD) lpForwardList,
+ (DWORD) dwNumRingsNoAnswer,
+ (DWORD) lphConsultCall,
+ (DWORD) lpCallParams,
+ (LPVOID)gaProcs[lForward],
+ 0x9,
+ 7
+ );
+ }
+
+ LineResult ("Forward", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGatherDigits(
+ HCALL hCall,
+ DWORD dwDigitModes,
+ LPSTR lpsDigits,
+ DWORD dwNumDigits,
+ LPCSTR lpszTerminationDigits,
+ DWORD dwFirstDigitTimeout,
+ DWORD dwInterDigitTimeout
+ )
+{
+ LONG lResult;
+
+
+ if (lpsDigits && IsBadWritePtr (lpsDigits, dwNumDigits))
+ {
+ lResult = LINEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc7)(
+ (DWORD) hCall,
+ (DWORD) dwDigitModes,
+ (DWORD) lpsDigits, // let tapi32.dll map this
+ (DWORD) dwNumDigits,
+ (DWORD) lpszTerminationDigits,
+ (DWORD) dwFirstDigitTimeout,
+ (DWORD) dwInterDigitTimeout,
+ (LPVOID)gaProcs[lGatherDigits],
+ 0x4,
+ 7
+ );
+ }
+
+ LineResult ("GatherDigits", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGenerateDigits(
+ HCALL hCall,
+ DWORD dwDigitMode,
+ LPCSTR lpsDigits,
+ DWORD dwDuration
+ )
+{
+ LONG lResult = (*pfnCallProc4)(
+ (DWORD) hCall,
+ (DWORD) dwDigitMode,
+ (DWORD) lpsDigits,
+ (DWORD) dwDuration,
+ (LPVOID)gaProcs[lGenerateDigits],
+ 0x2,
+ 4
+ );
+
+ LineResult ("GenerateDigits", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGenerateTone(
+ HCALL hCall,
+ DWORD dwToneMode,
+ DWORD dwDuration,
+ DWORD dwNumTones,
+ LPLINEGENERATETONE const lpTones
+ )
+{
+ LONG lResult = (*pfnCallProc5)(
+ (DWORD) hCall,
+ (DWORD) dwToneMode,
+ (DWORD) dwDuration,
+ (DWORD) dwNumTones,
+ (DWORD) lpTones,
+ (LPVOID)gaProcs[lGenerateTone],
+ 0x1,
+ 5
+ );
+
+ LineResult ("GenerateTone", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetAddressCaps(
+ HLINEAPP hLineApp,
+ DWORD dwDeviceID,
+ DWORD dwAddressID,
+ DWORD dwAPIVersion,
+ DWORD dwExtVersion,
+ LPLINEADDRESSCAPS lpAddressCaps
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc6)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) dwAddressID,
+ (DWORD) dwAPIVersion,
+ (DWORD) dwExtVersion,
+ (DWORD) lpAddressCaps,
+ (LPVOID)gaProcs[lGetAddressCaps],
+ 0x1,
+ 6
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("GetAddressCaps", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetAddressID(
+ HLINE hLine,
+ LPDWORD lpdwAddressID,
+ DWORD dwAddressMode,
+ LPCSTR lpsAddress,
+ DWORD dwSize
+ )
+{
+ LONG lResult = (*pfnCallProc5)(
+ (DWORD) hLine,
+ (DWORD) lpdwAddressID,
+ (DWORD) dwAddressMode,
+ (DWORD) lpsAddress,
+ (DWORD) dwSize,
+ (LPVOID)gaProcs[lGetAddressID],
+ 0xa,
+ 5
+ );
+
+ LineResult ("GetAddressID", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetAddressStatus(
+ HLINE hLine,
+ DWORD dwAddressID,
+ LPLINEADDRESSSTATUS lpAddressStatus
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hLine,
+ (DWORD) dwAddressID,
+ (DWORD) lpAddressStatus,
+ (LPVOID)gaProcs[lGetAddressStatus],
+ 0x1,
+ 3
+ );
+
+ LineResult ("GetAddressStatus", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetAppPriority(
+ LPCSTR lpszAppName,
+ DWORD dwMediaMode,
+ LPLINEEXTENSIONID lpExtensionID,
+ DWORD dwRequestMode,
+ LPVARSTRING lpExtensionName,
+ LPDWORD lpdwPriority
+ )
+{
+ LONG lResult = (*pfnCallProc6)(
+ (DWORD) lpszAppName,
+ (DWORD) dwMediaMode,
+ (DWORD) lpExtensionID,
+ (DWORD) dwRequestMode,
+ (DWORD) lpExtensionName,
+ (DWORD) lpdwPriority,
+ (LPVOID)gaProcs[lGetAppPriority],
+ 0x2b,
+ 6
+ );
+
+ LineResult ("GetAppPriority", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetCallInfo(
+ HCALL hCall,
+ LPLINECALLINFO lpCallInfo
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hCall,
+ (DWORD) lpCallInfo,
+ (LPVOID)gaProcs[lGetCallInfo],
+ 0x1,
+ 2
+ );
+
+ LineResult ("GetCallInfo", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetCallStatus(
+ HCALL hCall,
+ LPLINECALLSTATUS lpCallStatus
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hCall,
+ (DWORD) lpCallStatus,
+ (LPVOID)gaProcs[lGetCallStatus],
+ 0x1,
+ 2
+ );
+
+ LineResult ("GetCallStatus", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetConfRelatedCalls(
+ HCALL hCall,
+ LPLINECALLLIST lpCallList
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hCall,
+ (DWORD) lpCallList,
+ (LPVOID)gaProcs[lGetConfRelatedCalls],
+ 0x1,
+ 2
+ );
+
+ LineResult ("GetConfRelatedCalls", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetCountry(
+ DWORD dwCountryID,
+ DWORD dwAPIVersion,
+ LPLINECOUNTRYLIST lpLineCountryList
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ dwCountryID,
+ dwAPIVersion,
+ (DWORD) lpLineCountryList,
+ (LPVOID)gaProcs[lGetCountry],
+ 0x1,
+ 3
+ );
+
+ LineResult ("GetCountry", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetDevCaps(
+ HLINEAPP hLineApp,
+ DWORD dwDeviceID,
+ DWORD dwAPIVersion,
+ DWORD dwExtVersion,
+ LPLINEDEVCAPS lpLineDevCaps
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc5)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) dwAPIVersion,
+ (DWORD) dwExtVersion,
+ (DWORD) lpLineDevCaps,
+ (LPVOID)gaProcs[lGetDevCaps],
+ 0x1,
+ 5
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("GetDevCaps", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetDevConfig(
+ DWORD dwDeviceID,
+ LPVARSTRING lpDeviceConfig,
+ LPCSTR lpszDeviceClass
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) dwDeviceID,
+ (DWORD) lpDeviceConfig,
+ (DWORD) lpszDeviceClass,
+ (LPVOID)gaProcs[lGetDevConfig],
+ 0x3,
+ 3
+ );
+
+ LineResult ("GetDevConfig", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetIcon(
+ DWORD dwDeviceID,
+ LPCSTR lpszDeviceClass,
+ LPHICON lphIcon
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) dwDeviceID,
+ (DWORD) lpszDeviceClass,
+ (DWORD) lphIcon,
+ (LPVOID)gaProcs[lGetIcon],
+ 0x3,
+ 3
+ );
+
+ LineResult ("GetIcon", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetID(
+ HLINE hLine,
+ DWORD dwAddressID,
+ HCALL hCall,
+ DWORD dwSelect,
+ LPVARSTRING lpDeviceID,
+ LPCSTR lpszDeviceClass
+ )
+{
+ LONG lResult = (*pfnCallProc6)(
+ (DWORD) hLine,
+ (DWORD) dwAddressID,
+ (DWORD) hCall,
+ (DWORD) dwSelect,
+ (DWORD) lpDeviceID,
+ (DWORD) lpszDeviceClass,
+ (LPVOID)gaProcs[lGetID],
+ 0x3,
+ 6
+ );
+
+ LineResult ("GetID", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetLineDevStatus(
+ HLINE hLine,
+ LPLINEDEVSTATUS lpLineDevStatus
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hLine,
+ (DWORD) lpLineDevStatus,
+ (LPVOID)gaProcs[lGetLineDevStatus],
+ 0x1,
+ 2
+ );
+
+ LineResult ("GetLineDevStatus", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetNewCalls(
+ HLINE hLine,
+ DWORD dwAddressID,
+ DWORD dwSelect,
+ LPLINECALLLIST lpCallList
+ )
+{
+ LONG lResult = (*pfnCallProc4)(
+ (DWORD) hLine,
+ (DWORD) dwAddressID,
+ (DWORD) dwSelect,
+ (DWORD) lpCallList,
+ (LPVOID)gaProcs[lGetNewCalls],
+ 0x1,
+ 4
+ );
+
+ LineResult ("GetNewCalls", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetNumRings(
+ HLINE hLine,
+ DWORD dwAddressID,
+ LPDWORD lpdwNumRings
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hLine,
+ (DWORD) dwAddressID,
+ (DWORD) lpdwNumRings,
+ (LPVOID)gaProcs[lGetNumRings],
+ 0x1,
+ 3
+ );
+
+ LineResult ("GetNumRings", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetProviderList(
+ DWORD dwAPIVersion,
+ LPLINEPROVIDERLIST lpProviderList
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ dwAPIVersion,
+ (DWORD) lpProviderList,
+ (LPVOID)gaProcs[lGetProviderList],
+ 0x1,
+ 2
+ );
+
+ LineResult ("GetProviderList", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetRequest(
+ HLINEAPP hLineApp,
+ DWORD dwRequestMode,
+ LPVOID lpRequestBuffer
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc3)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwRequestMode,
+ (DWORD) lpRequestBuffer,
+ (LPVOID)gaProcs[lGetRequest],
+ 0x1,
+ 3
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("GetRequest", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetStatusMessages(
+ HLINE hLine,
+ LPDWORD lpdwLineStates,
+ LPDWORD lpdwAddressStates
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hLine,
+ (DWORD) lpdwLineStates,
+ (DWORD) lpdwAddressStates,
+ (LPVOID)gaProcs[lGetStatusMessages],
+ 0x3,
+ 3
+ );
+
+ LineResult ("GetStatusMessages", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineGetTranslateCaps(
+ HLINEAPP hLineApp,
+ DWORD dwAPIVersion,
+ LPLINETRANSLATECAPS lpTranslateCaps
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if (hLineApp == NULL || (pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc3)(
+ (hLineApp == NULL ? (DWORD) 0 : pAppData->hXxxApp),
+ (DWORD) dwAPIVersion,
+ (DWORD) lpTranslateCaps,
+ (LPVOID)gaProcs[lGetTranslateCaps],
+ 0x1,
+ 3
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("GetTranslateCaps", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineHandoff(
+ HCALL hCall,
+ LPCSTR lpszFileName,
+ DWORD dwMediaMode
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hCall,
+ (DWORD) lpszFileName,
+ (DWORD) dwMediaMode,
+ (LPVOID)gaProcs[lHandoff],
+ 0x2,
+ 3
+ );
+
+ LineResult ("Handoff", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineHold(
+ HCALL hCall
+ )
+{
+ LONG lResult = (*pfnCallProc1)(
+ (DWORD) hCall,
+ (LPVOID)gaProcs[lHold],
+ 0x0,
+ 1
+ );
+
+ LineResult ("Hold", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineInitialize(
+ LPHLINEAPP lphLineApp,
+ HINSTANCE hInstance,
+ LINECALLBACK lpfnCallback,
+ LPCSTR lpszAppName,
+ LPDWORD lpdwNumDevs
+ )
+{
+ return (xxxInitialize(
+ TRUE,
+ lphLineApp,
+ hInstance,
+ lpfnCallback,
+ lpszAppName,
+ lpdwNumDevs
+ ));
+}
+
+
+LONG
+WINAPI
+lineMakeCall(
+ HLINE hLine,
+ LPHCALL lphCall,
+ LPCSTR lpszDestAddress,
+ DWORD dwCountryCode,
+ LPLINECALLPARAMS const lpCallParams
+ )
+{
+ //
+ // Tapi32.dll will take care of mapping lphCall if/when the
+ // request completes successfully, so we don't set the mapping
+ // bit down below; do check to see if pointer is valid though.
+ //
+
+ LONG lResult;
+
+
+ if (IsBadWritePtr ((void FAR *) lphCall, sizeof(HCALL)))
+ {
+ lResult = LINEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc5)(
+ (DWORD) hLine,
+ (DWORD) lphCall,
+ (DWORD) lpszDestAddress,
+ (DWORD) dwCountryCode,
+ (DWORD) lpCallParams,
+ (LPVOID)gaProcs[lMakeCall],
+ 0x5,
+ 5
+ );
+ }
+
+ LineResult ("MakeCall", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineMonitorDigits(
+ HCALL hCall,
+ DWORD dwDigitModes
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hCall,
+ (DWORD) dwDigitModes,
+ (LPVOID)gaProcs[lMonitorDigits],
+ 0x0,
+ 2
+ );
+
+ LineResult ("MonitorDigits", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineMonitorMedia(
+ HCALL hCall,
+ DWORD dwMediaModes
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hCall,
+ (DWORD) dwMediaModes,
+ (LPVOID)gaProcs[lMonitorMedia],
+ 0x0,
+ 2
+ );
+
+ LineResult ("MonitorMedia", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineMonitorTones(
+ HCALL hCall,
+ LPLINEMONITORTONE const lpToneList,
+ DWORD dwNumEntries
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hCall,
+ (DWORD) lpToneList,
+ (DWORD) dwNumEntries,
+ (LPVOID)gaProcs[lMonitorTones],
+ 0x2,
+ 3
+ );
+
+ LineResult ("MonitorTones", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineNegotiateAPIVersion(
+ HLINEAPP hLineApp,
+ DWORD dwDeviceID,
+ DWORD dwAPILowVersion,
+ DWORD dwAPIHighVersion,
+ LPDWORD lpdwAPIVersion,
+ LPLINEEXTENSIONID lpExtensionID
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc6)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) dwAPILowVersion,
+ (DWORD) dwAPIHighVersion,
+ (DWORD) lpdwAPIVersion,
+ (DWORD) lpExtensionID,
+ (LPVOID)gaProcs[lNegotiateAPIVersion],
+ 0x3,
+ 6
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("NegotiateAPIVersion", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineNegotiateExtVersion(
+ HLINEAPP hLineApp,
+ DWORD dwDeviceID,
+ DWORD dwAPIVersion,
+ DWORD dwExtLowVersion,
+ DWORD dwExtHighVersion,
+ LPDWORD lpdwExtVersion
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc6)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) dwAPIVersion,
+ (DWORD) dwExtLowVersion,
+ (DWORD) dwExtHighVersion,
+ (DWORD) lpdwExtVersion,
+ (LPVOID)gaProcs[lNegotiateExtVersion],
+ 0x1,
+ 6
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("NegotiateExtVersion", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineOpen(
+ HLINEAPP hLineApp,
+ DWORD dwDeviceID,
+ LPHLINE lphLine,
+ DWORD dwAPIVersion,
+ DWORD dwExtVersion,
+ DWORD dwCallbackInstance,
+ DWORD dwPrivileges,
+ DWORD dwMediaModes,
+ LPLINECALLPARAMS const lpCallParams
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc9)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) lphLine,
+ (DWORD) dwAPIVersion,
+ (DWORD) dwExtVersion,
+ (DWORD) dwCallbackInstance,
+ (DWORD) dwPrivileges,
+ (DWORD) dwMediaModes,
+ (DWORD) lpCallParams,
+ (LPVOID)gaProcs[lOpen],
+ 0x41,
+ 9
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("Open", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+linePark(
+ HCALL hCall,
+ DWORD dwParkMode,
+ LPCSTR lpszDirAddress,
+ LPVARSTRING lpNonDirAddress
+ )
+{
+ LONG lResult = (*pfnCallProc4)(
+ (DWORD) hCall,
+ (DWORD) dwParkMode,
+ (DWORD) lpszDirAddress,
+ (DWORD) lpNonDirAddress, // let tapi32.dll map this
+ (LPVOID)gaProcs[lPark],
+ 0x2,
+ 4
+ );
+
+ LineResult ("Park", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+linePickup(
+ HLINE hLine,
+ DWORD dwAddressID,
+ LPHCALL lphCall,
+ LPCSTR lpszDestAddress,
+ LPCSTR lpszGroupID
+ )
+{
+ //
+ // Tapi32.dll will take care of mapping lphCall if/when the
+ // request completes successfully, so we don't set the mapping
+ // bit down below; do check to see if pointer is valid though.
+ //
+
+ LONG lResult;
+
+
+ if (IsBadWritePtr ((void FAR *) lphCall, sizeof(HCALL)))
+ {
+ lResult = LINEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc5)(
+ (DWORD) hLine,
+ (DWORD) dwAddressID,
+ (DWORD) lphCall,
+ (DWORD) lpszDestAddress,
+ (DWORD) lpszGroupID,
+ (LPVOID)gaProcs[lPickup],
+ 0x3,
+ 5
+ );
+ }
+
+ LineResult ("Pickup", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+linePrepareAddToConference(
+ HCALL hConfCall,
+ LPHCALL lphConsultCall,
+ LPLINECALLPARAMS const lpCallParams
+ )
+{
+ //
+ // Tapi32.dll will take care of mapping lphConsultCall if/when the
+ // request completes successfully, so we don't set the mapping
+ // bit down below; do check to see if pointer is valid though.
+ //
+
+ LONG lResult;
+
+
+ if (IsBadWritePtr ((void FAR *) lphConsultCall, sizeof(HCALL)))
+ {
+ lResult = LINEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc3)(
+ (DWORD) hConfCall,
+ (DWORD) lphConsultCall,
+ (DWORD) lpCallParams,
+ (LPVOID)gaProcs[lPrepareAddToConference],
+ 0x1,
+ 3
+ );
+ }
+
+ LineResult ("PrepareAddToConference", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineRedirect(
+ HCALL hCall,
+ LPCSTR lpszDestAddress,
+ DWORD dwCountryCode
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hCall,
+ (DWORD) lpszDestAddress,
+ (DWORD) dwCountryCode,
+ (LPVOID)gaProcs[lRedirect],
+ 0x2,
+ 3
+ );
+
+ LineResult ("Redirect", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineRegisterRequestRecipient(
+ HLINEAPP hLineApp,
+ DWORD dwRegistrationInstance,
+ DWORD dwRequestMode,
+ DWORD bEnable
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc4)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwRegistrationInstance,
+ (DWORD) dwRequestMode,
+ (DWORD) bEnable,
+ (LPVOID)gaProcs[lRegisterRequestRecipient],
+ 0x0,
+ 4
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("RegisterRequestRecipient", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineReleaseUserUserInfo(
+ HCALL hCall
+ )
+{
+ LONG lResult = (*pfnCallProc1)(
+ (DWORD) hCall,
+ (LPVOID)gaProcs[lReleaseUserUserInfo],
+ 0x0,
+ 1
+ );
+
+ LineResult ("ReleaseUserUserInfo", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineRemoveFromConference(
+ HCALL hCall
+ )
+{
+ LONG lResult = (*pfnCallProc1)(
+ (DWORD) hCall,
+ (LPVOID)gaProcs[lRemoveFromConference],
+ 0x0,
+ 1
+ );
+
+ LineResult ("RemoveFromConference", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineRemoveProvider(
+ DWORD dwPermanentProviderID,
+ HWND hwndOwner
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) dwPermanentProviderID,
+ (DWORD) (0xffff0000 | hwndOwner),
+ (LPVOID)gaProcs[lRemoveProvider],
+ 0x0,
+ 2
+ );
+
+ LineResult ("RemoveProvider", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSecureCall(
+ HCALL hCall
+ )
+{
+ LONG lResult = (*pfnCallProc1)(
+ (DWORD) hCall,
+ (LPVOID)gaProcs[lSecureCall],
+ 0x0,
+ 1
+ );
+
+ LineResult ("SecureCall", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSendUserUserInfo(
+ HCALL hCall,
+ LPCSTR lpsUserUserInfo,
+ DWORD dwSize
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hCall,
+ (DWORD) lpsUserUserInfo,
+ (DWORD) dwSize,
+ (LPVOID)gaProcs[lSendUserUserInfo],
+ 0x2,
+ 3
+ );
+
+ LineResult ("SendUserUserInfo", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetAppPriority(
+ LPCSTR lpszAppName,
+ DWORD dwMediaMode,
+ LPLINEEXTENSIONID lpExtensionID,
+ DWORD dwRequestMode,
+ LPCSTR lpszExtensionName,
+ DWORD dwPriority
+ )
+{
+ LONG lResult = (*pfnCallProc6)(
+ (DWORD) lpszAppName,
+ (DWORD) dwMediaMode,
+ (DWORD) lpExtensionID,
+ (DWORD) dwRequestMode,
+ (DWORD) lpszExtensionName,
+ (DWORD) dwPriority,
+ (LPVOID)gaProcs[lSetAppPriority],
+ 0x2a,
+ 6
+ );
+
+ LineResult ("SetAppPriority", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetAppSpecific(
+ HCALL hCall,
+ DWORD dwAppSpecific
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hCall,
+ (DWORD) dwAppSpecific,
+ (LPVOID)gaProcs[lSetAppSpecific],
+ 0x0,
+ 2
+ );
+
+ LineResult ("SetAppSpecific", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetCallParams(
+ HCALL hCall,
+ DWORD dwBearerMode,
+ DWORD dwMinRate,
+ DWORD dwMaxRate,
+ LPLINEDIALPARAMS const lpDialParams
+ )
+{
+ LONG lResult = (*pfnCallProc5)(
+ (DWORD) hCall,
+ (DWORD) dwBearerMode,
+ (DWORD) dwMinRate,
+ (DWORD) dwMaxRate,
+ (DWORD) lpDialParams,
+ (LPVOID)gaProcs[lSetCallParams],
+ 0x1,
+ 5
+ );
+
+ LineResult ("SetCallParams", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetCallPrivilege(
+ HCALL hCall,
+ DWORD dwCallPrivilege
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hCall,
+ (DWORD) dwCallPrivilege,
+ (LPVOID)gaProcs[lSetCallPrivilege],
+ 0x0,
+ 2
+ );
+
+ LineResult ("SetCallPrivilege", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetCurrentLocation(
+ HLINEAPP hLineApp,
+ DWORD dwLocation
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc2)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwLocation,
+ (LPVOID)gaProcs[lSetCurrentLocation],
+ 0x0,
+ 2
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("SetCurrentLocation", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetDevConfig(
+ DWORD dwDeviceID,
+ LPVOID const lpDeviceConfig,
+ DWORD dwSize,
+ LPCSTR lpszDeviceClass
+ )
+{
+ LONG lResult = (*pfnCallProc4)(
+ (DWORD) dwDeviceID,
+ (DWORD) lpDeviceConfig,
+ (DWORD) dwSize,
+ (DWORD) lpszDeviceClass,
+ (LPVOID)gaProcs[lSetDevConfig],
+ 0x5,
+ 4
+ );
+
+ LineResult ("SetDevConfig", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetMediaControl(
+ HLINE hLine,
+ DWORD dwAddressID,
+ HCALL hCall,
+ DWORD dwSelect,
+ LPLINEMEDIACONTROLDIGIT const lpDigitList,
+ DWORD dwDigitNumEntries,
+ LPLINEMEDIACONTROLMEDIA const lpMediaList,
+ DWORD dwMediaNumEntries,
+ LPLINEMEDIACONTROLTONE const lpToneList,
+ DWORD dwToneNumEntries,
+ LPLINEMEDIACONTROLCALLSTATE const lpCallStateList,
+ DWORD dwCallStateNumEntries
+ )
+{
+ LONG lResult = (*pfnCallProc12)(
+ (DWORD) hLine,
+ (DWORD) dwAddressID,
+ (DWORD) hCall,
+ (DWORD) dwSelect,
+ (DWORD) lpDigitList,
+ (DWORD) dwDigitNumEntries,
+ (DWORD) lpMediaList,
+ (DWORD) dwMediaNumEntries,
+ (DWORD) lpToneList,
+ (DWORD) dwToneNumEntries,
+ (DWORD) lpCallStateList,
+ (DWORD) dwCallStateNumEntries,
+ (LPVOID)gaProcs[lSetMediaControl],
+ 0xaa,
+ 12
+ );
+
+ LineResult ("SetMediaControl", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetMediaMode(
+ HCALL hCall,
+ DWORD dwMediaModes
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hCall,
+ (DWORD) dwMediaModes,
+ (LPVOID)gaProcs[lSetMediaMode],
+ 0x0,
+ 2
+ );
+
+ LineResult ("lineSetMediaMode", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetNumRings(
+ HLINE hLine,
+ DWORD dwAddressID,
+ DWORD dwNumRings
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hLine,
+ (DWORD) dwAddressID,
+ (DWORD) dwNumRings,
+ (LPVOID)gaProcs[lSetNumRings],
+ 0x0,
+ 3
+ );
+
+ LineResult ("SetNumRings", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetStatusMessages(
+ HLINE hLine,
+ DWORD dwLineStates,
+ DWORD dwAddressStates
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hLine,
+ (DWORD) dwLineStates,
+ (DWORD) dwAddressStates,
+ (LPVOID)gaProcs[lSetStatusMessages],
+ 0x0,
+ 3
+ );
+
+ LineResult ("SetStatusMessages", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetTerminal(
+ HLINE hLine,
+ DWORD dwAddressID,
+ HCALL hCall,
+ DWORD dwSelect,
+ DWORD dwTerminalModes,
+ DWORD dwTerminalID,
+ DWORD bEnable
+ )
+{
+ LONG lResult = (*pfnCallProc7)(
+ (DWORD) hLine,
+ (DWORD) dwAddressID,
+ (DWORD) hCall,
+ (DWORD) dwSelect,
+ (DWORD) dwTerminalModes,
+ (DWORD) dwTerminalID,
+ (DWORD) bEnable,
+ (LPVOID)gaProcs[lSetTerminal],
+ 0x0,
+ 7
+ );
+
+ LineResult ("SetTerminal", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetTollList(
+ HLINEAPP hLineApp,
+ DWORD dwDeviceID,
+ LPCSTR lpszAddressIn,
+ DWORD dwTollListOption
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc4)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) lpszAddressIn,
+ (DWORD) dwTollListOption,
+ (LPVOID)gaProcs[lSetTollList],
+ 0x2,
+ 4
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("SetTollList", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetupConference(
+ HCALL hCall,
+ HLINE hLine,
+ LPHCALL lphConfCall,
+ LPHCALL lphConsultCall,
+ DWORD dwNumParties,
+ LPLINECALLPARAMS const lpCallParams
+ )
+{
+ //
+ // Tapi32.dll will take care of mapping lphXxxCall's if/when the
+ // request completes successfully, so we don't set the mapping
+ // bit down below; do check to see if pointer is valid though.
+ //
+
+ LONG lResult;
+
+
+ if (IsBadWritePtr ((void FAR *) lphConfCall, sizeof(HCALL)) ||
+ IsBadWritePtr ((void FAR *) lphConsultCall, sizeof(HCALL)))
+ {
+ lResult = LINEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc6)(
+ (DWORD) hCall,
+ (DWORD) hLine,
+ (DWORD) lphConfCall,
+ (DWORD) lphConsultCall,
+ (DWORD) dwNumParties,
+ (DWORD) lpCallParams,
+ (LPVOID)gaProcs[lSetupConference],
+ 0x1,
+ 6
+ );
+ }
+
+ LineResult ("SetupConference", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSetupTransfer(
+ HCALL hCall,
+ LPHCALL lphConsultCall,
+ LPLINECALLPARAMS const lpCallParams
+ )
+{
+ //
+ // Tapi32.dll will take care of mapping lphConsultCall if/when the
+ // request completes successfully, so we don't set the mapping
+ // bit down below; do check to see if pointer is valid though.
+ //
+
+ LONG lResult;
+
+
+ if (IsBadWritePtr ((void FAR *) lphConsultCall, sizeof(HCALL)))
+ {
+ lResult = LINEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc3)(
+ (DWORD) hCall,
+ (DWORD) lphConsultCall,
+ (DWORD) lpCallParams,
+ (LPVOID)gaProcs[lSetupTransfer],
+ 0x1,
+ 3
+ );
+ }
+
+ LineResult ("SetupTransfer", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineShutdown(
+ HLINEAPP hLineApp
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ if ((lResult = (LONG) (*pfnCallProc1)(
+ (DWORD) pAppData->hXxxApp,
+ (LPVOID)gaProcs[lShutdown],
+ 0x0,
+ 1
+
+ )) == 0)
+ {
+ //
+ // Destroy the associated window & free the app data instance
+ //
+
+ DestroyWindow (pAppData->hwnd);
+ pAppData->dwKey = 0xefefefef;
+ free (pAppData);
+ }
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("Shutdown", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineSwapHold(
+ HCALL hActiveCall,
+ HCALL hHeldCall
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hActiveCall,
+ (DWORD) hHeldCall,
+ (LPVOID)gaProcs[lSwapHold],
+ 0x0,
+ 2
+ );
+
+ LineResult ("SwapHold", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineTranslateAddress(
+ HLINEAPP hLineApp,
+ DWORD dwDeviceID,
+ DWORD dwAPIVersion,
+ LPCSTR lpszAddressIn,
+ DWORD dwCard,
+ DWORD dwTranslateOptions,
+ LPLINETRANSLATEOUTPUT lpTranslateOutput
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc7)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) dwAPIVersion,
+ (DWORD) lpszAddressIn,
+ (DWORD) dwCard,
+ (DWORD) dwTranslateOptions,
+ (DWORD) lpTranslateOutput,
+ (LPVOID)gaProcs[lTranslateAddress],
+ 0x9,
+ 7
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("TranslateAddress", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineTranslateDialog(
+ HLINEAPP hLineApp,
+ DWORD dwDeviceID,
+ DWORD dwAPIVersion,
+ HWND hwndOwner,
+ LPCSTR lpszAddressIn
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp (hLineApp)))
+ {
+ lResult = (*pfnCallProc5)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) dwAPIVersion,
+ (DWORD) (0xffff0000 | hwndOwner),
+ (DWORD) lpszAddressIn,
+ (LPVOID)gaProcs[lTranslateDialog],
+ 0x1,
+ 5
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ LineResult ("TranslateDialog", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineUncompleteCall(
+ HLINE hLine,
+ DWORD dwCompletionID
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hLine,
+ (DWORD) dwCompletionID,
+ (LPVOID)gaProcs[lUncompleteCall],
+ 0x0,
+ 2
+ );
+
+ LineResult ("UncompleteCall", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineUnhold(
+ HCALL hCall
+ )
+{
+ LONG lResult = (*pfnCallProc1)(
+ (DWORD) hCall,
+ (LPVOID)gaProcs[lUnhold],
+ 0x0,
+ 1
+ );
+
+ LineResult ("Unhold", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+lineUnpark(
+ HLINE hLine,
+ DWORD dwAddressID,
+ LPHCALL lphCall,
+ LPCSTR lpszDestAddress
+ )
+{
+ //
+ // Tapi32.dll will take care of mapping lphCall if/when the
+ // request completes successfully, so we don't set the mapping
+ // bit down below; do check to see if pointer is valid though.
+ //
+
+ LONG lResult;
+
+
+ if (IsBadWritePtr ((void FAR *) lphCall, sizeof(HCALL)))
+ {
+ lResult = LINEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc4)(
+ (DWORD) hLine,
+ (DWORD) dwAddressID,
+ (DWORD) lphCall,
+ (DWORD) lpszDestAddress,
+ (LPVOID)gaProcs[lUnpark],
+ 0x1,
+ 4
+ );
+ }
+
+ LineResult ("Unpark", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneClose(
+ HPHONE hPhone
+ )
+{
+ LONG lResult = (*pfnCallProc1)(
+ (DWORD) hPhone,
+ (LPVOID)gaProcs[pClose],
+ 0x0,
+ 1
+ );
+
+ PhoneResult ("Close", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneConfigDialog(
+ DWORD dwDeviceID,
+ HWND hwndOwner,
+ LPCSTR lpszDeviceClass
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) dwDeviceID,
+ (DWORD) (0xffff0000 | hwndOwner),
+ (DWORD) lpszDeviceClass,
+ (LPVOID)gaProcs[pConfigDialog],
+ 0x1,
+ 3
+ );
+
+ PhoneResult ("ConfigDialog", lResult);
+
+ return lResult;
+}
+
+
+
+LONG
+WINAPI
+phoneDevSpecific(
+ HPHONE hPhone,
+ LPVOID lpParams,
+ DWORD dwSize
+ )
+{
+ LONG lResult;
+
+
+ if (IsBadWritePtr (lpParams, (UINT) dwSize))
+ {
+ lResult = PHONEERR_INVALPOINTER;
+ }
+ else
+ {
+ lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) lpParams, // let tapi32.dll map this
+ (DWORD) dwSize,
+ (LPVOID)gaProcs[pDevSpecific],
+ 0x0,
+ 3
+ );
+ }
+
+ PhoneResult ("DevSpecific", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetButtonInfo(
+ HPHONE hPhone,
+ DWORD dwButtonLampID,
+ LPPHONEBUTTONINFO lpButtonInfo
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) dwButtonLampID,
+ (DWORD) lpButtonInfo,
+ (LPVOID)gaProcs[pGetButtonInfo],
+ 0x1,
+ 3
+ );
+
+ PhoneResult ("GetButtonInfo", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetData(
+ HPHONE hPhone,
+ DWORD dwDataID,
+ LPVOID lpData,
+ DWORD dwSize
+ )
+{
+ LONG lResult = (*pfnCallProc4)(
+ (DWORD) hPhone,
+ (DWORD) dwDataID,
+ (DWORD) lpData,
+ (DWORD) dwSize,
+ (LPVOID)gaProcs[pGetData],
+ 0x2,
+ 4
+ );
+
+ PhoneResult ("GetData", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetDevCaps(
+ HPHONEAPP hPhoneApp,
+ DWORD dwDeviceID,
+ DWORD dwAPIVersion,
+ DWORD dwExtVersion,
+ LPPHONECAPS lpPhoneCaps
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp ((HLINEAPP) hPhoneApp)))
+ {
+ lResult = (*pfnCallProc5)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) dwAPIVersion,
+ (DWORD) dwExtVersion,
+ (DWORD) lpPhoneCaps,
+ (LPVOID)gaProcs[pGetDevCaps],
+ 0x1,
+ 5
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ PhoneResult ("GetDevCaps", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetDisplay(
+ HPHONE hPhone,
+ LPVARSTRING lpDisplay
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hPhone,
+ (DWORD) lpDisplay,
+ (LPVOID)gaProcs[pGetDisplay],
+ 0x1,
+ 2
+ );
+
+ PhoneResult ("GetDisplay", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetGain(
+ HPHONE hPhone,
+ DWORD dwHookSwitchDev,
+ LPDWORD lpdwGain
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) dwHookSwitchDev,
+ (DWORD) lpdwGain,
+ (LPVOID)gaProcs[pGetGain],
+ 0x1,
+ 3
+ );
+
+ PhoneResult ("GetGain", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetHookSwitch(
+ HPHONE hPhone,
+ LPDWORD lpdwHookSwitchDevs
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hPhone,
+ (DWORD) lpdwHookSwitchDevs,
+ (LPVOID)gaProcs[pGetHookSwitch],
+ 0x1,
+ 2
+ );
+
+ PhoneResult ("GetHookSwitch", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetIcon(
+ DWORD dwDeviceID,
+ LPCSTR lpszDeviceClass,
+ LPHICON lphIcon
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) dwDeviceID,
+ (DWORD) lpszDeviceClass,
+ (DWORD) lphIcon,
+ (LPVOID)gaProcs[pGetIcon],
+ 0x3,
+ 3
+ );
+
+ PhoneResult ("GetIcon", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetID(
+ HPHONE hPhone,
+ LPVARSTRING lpDeviceID,
+ LPCSTR lpszDeviceClass
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) lpDeviceID,
+ (DWORD) lpszDeviceClass,
+ (LPVOID)gaProcs[pGetID],
+ 0x3,
+ 3
+ );
+
+ PhoneResult ("GetID", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetLamp(
+ HPHONE hPhone,
+ DWORD dwButtonLampID,
+ LPDWORD lpdwLampMode
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) dwButtonLampID,
+ (DWORD) lpdwLampMode,
+ (LPVOID)gaProcs[pGetLamp],
+ 0x1,
+ 3
+ );
+
+ PhoneResult ("GetLamp", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetRing(
+ HPHONE hPhone,
+ LPDWORD lpdwRingMode,
+ LPDWORD lpdwVolume
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) lpdwRingMode,
+ (DWORD) lpdwVolume,
+ (LPVOID)gaProcs[pGetRing],
+ 0x3,
+ 3
+ );
+
+ PhoneResult ("GetRing", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetStatus(
+ HPHONE hPhone,
+ LPPHONESTATUS lpPhoneStatus
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hPhone,
+ (DWORD) lpPhoneStatus,
+ (LPVOID)gaProcs[pGetStatus],
+ 0x1,
+ 2
+ );
+
+ PhoneResult ("GetStatus", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetStatusMessages(
+ HPHONE hPhone,
+ LPDWORD lpdwPhoneStates,
+ LPDWORD lpdwButtonModes,
+ LPDWORD lpdwButtonStates
+ )
+{
+ LONG lResult = (*pfnCallProc4)(
+ (DWORD) hPhone,
+ (DWORD) lpdwPhoneStates,
+ (DWORD) lpdwButtonModes,
+ (DWORD) lpdwButtonStates,
+ (LPVOID)gaProcs[pGetStatusMessages],
+ 0x7,
+ 4
+ );
+
+ PhoneResult ("GetStatusMessages", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneGetVolume(
+ HPHONE hPhone,
+ DWORD dwHookSwitchDev,
+ LPDWORD lpdwVolume
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) dwHookSwitchDev,
+ (DWORD) lpdwVolume,
+ (LPVOID)gaProcs[pGetVolume],
+ 0x1,
+ 3
+ );
+
+ PhoneResult ("GetVolume", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneInitialize(
+ LPHPHONEAPP lphPhoneApp,
+ HINSTANCE hInstance,
+ PHONECALLBACK lpfnCallback,
+ LPCSTR lpszAppName,
+ LPDWORD lpdwNumDevs
+ )
+{
+ return (xxxInitialize(
+ FALSE,
+ (LPHLINEAPP) lphPhoneApp,
+ hInstance,
+ lpfnCallback,
+ lpszAppName,
+ lpdwNumDevs
+ ));
+}
+
+
+LONG
+WINAPI
+phoneNegotiateAPIVersion(
+ HPHONEAPP hPhoneApp,
+ DWORD dwDeviceID,
+ DWORD dwAPILowVersion,
+ DWORD dwAPIHighVersion,
+ LPDWORD lpdwAPIVersion,
+ LPPHONEEXTENSIONID lpExtensionID
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp ((HLINEAPP) hPhoneApp)))
+ {
+ lResult = (*pfnCallProc6)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) dwAPILowVersion,
+ (DWORD) dwAPIHighVersion,
+ (DWORD) lpdwAPIVersion,
+ (DWORD) lpExtensionID,
+ (LPVOID)gaProcs[pNegotiateAPIVersion],
+ 0x3,
+ 6
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ PhoneResult ("NegotiateAPIVersion", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneNegotiateExtVersion(
+ HPHONEAPP hPhoneApp,
+ DWORD dwDeviceID,
+ DWORD dwAPIVersion,
+ DWORD dwExtLowVersion,
+ DWORD dwExtHighVersion,
+ LPDWORD lpdwExtVersion
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp ((HLINEAPP) hPhoneApp)))
+ {
+ lResult = (*pfnCallProc6)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) dwAPIVersion,
+ (DWORD) dwExtLowVersion,
+ (DWORD) dwExtHighVersion,
+ (DWORD) lpdwExtVersion,
+ (LPVOID)gaProcs[pNegotiateExtVersion],
+ 0x1,
+ 6
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ PhoneResult ("NegotiateExtVersion", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneOpen(
+ HPHONEAPP hPhoneApp,
+ DWORD dwDeviceID,
+ LPHPHONE lphPhone,
+ DWORD dwAPIVersion,
+ DWORD dwExtVersion,
+ DWORD dwCallbackInstance,
+ DWORD dwPrivilege
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp ((HLINEAPP) hPhoneApp)))
+ {
+ lResult = (*pfnCallProc7)(
+ (DWORD) pAppData->hXxxApp,
+ (DWORD) dwDeviceID,
+ (DWORD) lphPhone,
+ (DWORD) dwAPIVersion,
+ (DWORD) dwExtVersion,
+ (DWORD) dwCallbackInstance,
+ (DWORD) dwPrivilege,
+ (LPVOID)gaProcs[pOpen],
+ 0x10,
+ 7
+ );
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ PhoneResult ("Open", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneSetButtonInfo(
+ HPHONE hPhone,
+ DWORD dwButtonLampID,
+ LPPHONEBUTTONINFO const lpButtonInfo
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) dwButtonLampID,
+ (DWORD) lpButtonInfo,
+ (LPVOID)gaProcs[pSetButtonInfo],
+ 0x1,
+ 3
+ );
+
+ PhoneResult ("SetButtonInfo", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneSetData(
+ HPHONE hPhone,
+ DWORD dwDataID,
+ LPVOID const lpData,
+ DWORD dwSize
+ )
+{
+ LONG lResult = (*pfnCallProc4)(
+ (DWORD) hPhone,
+ (DWORD) dwDataID,
+ (DWORD) lpData,
+ (DWORD) dwSize,
+ (LPVOID)gaProcs[pSetData],
+ 0x2,
+ 4
+ );
+
+ PhoneResult ("SetData", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneSetDisplay(
+ HPHONE hPhone,
+ DWORD dwRow,
+ DWORD dwColumn,
+ LPCSTR lpsDisplay,
+ DWORD dwSize
+ )
+{
+ LONG lResult = (*pfnCallProc5)(
+ (DWORD) hPhone,
+ (DWORD) dwRow,
+ (DWORD) dwColumn,
+ (DWORD) lpsDisplay,
+ (DWORD) dwSize,
+ (LPVOID)gaProcs[pSetDisplay],
+ 0x2,
+ 5
+ );
+
+ PhoneResult ("SetDisplay", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneSetGain(
+ HPHONE hPhone,
+ DWORD dwHookSwitchDev,
+ DWORD dwGain
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) dwHookSwitchDev,
+ (DWORD) dwGain,
+ (LPVOID)gaProcs[pSetGain],
+ 0x0,
+ 3
+ );
+
+ PhoneResult ("SetGain", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneSetHookSwitch(
+ HPHONE hPhone,
+ DWORD dwHookSwitchDevs,
+ DWORD dwHookSwitchMode
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) dwHookSwitchDevs,
+ (DWORD) dwHookSwitchMode,
+ (LPVOID)gaProcs[pSetHookSwitch],
+ 0x0,
+ 3
+ );
+
+ PhoneResult ("SetHookSwitch", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneSetLamp(
+ HPHONE hPhone,
+ DWORD dwButtonLampID,
+ DWORD dwLampMode
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) dwButtonLampID,
+ (DWORD) dwLampMode,
+ (LPVOID)gaProcs[pSetLamp],
+ 0x0,
+ 3
+ );
+
+ PhoneResult ("SetLamp", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneSetRing(
+ HPHONE hPhone,
+ DWORD dwRingMode,
+ DWORD dwVolume
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) dwRingMode,
+ (DWORD) dwVolume,
+ (LPVOID)gaProcs[pSetRing],
+ 0x0,
+ 3
+ );
+
+ PhoneResult ("SetRing", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneSetStatusMessages(
+ HPHONE hPhone,
+ DWORD dwPhoneStates,
+ DWORD dwButtonModes,
+ DWORD dwButtonStates
+ )
+{
+ LONG lResult = (*pfnCallProc4)(
+ (DWORD) hPhone,
+ (DWORD) dwPhoneStates,
+ (DWORD) dwButtonModes,
+ (DWORD) dwButtonStates,
+ (LPVOID)gaProcs[pSetStatusMessages],
+ 0x0,
+ 4
+ );
+
+ PhoneResult ("SetStatusMessages", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneSetVolume(
+ HPHONE hPhone,
+ DWORD dwHookSwitchDev,
+ DWORD dwVolume
+ )
+{
+ LONG lResult = (*pfnCallProc3)(
+ (DWORD) hPhone,
+ (DWORD) dwHookSwitchDev,
+ (DWORD) dwVolume,
+ (LPVOID)gaProcs[pSetVolume],
+ 0x0,
+ 3
+ );
+
+ PhoneResult ("SetVolume", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+phoneShutdown(
+ HPHONEAPP hPhoneApp
+ )
+{
+ LONG lResult;
+ LPTAPI_APP_DATA pAppData;
+
+
+ if ((pAppData = IsValidXxxApp ((HLINEAPP) hPhoneApp)))
+ {
+ if ((lResult = (*pfnCallProc1)(
+ (DWORD) pAppData->hXxxApp,
+ (LPVOID)gaProcs[pShutdown],
+ 0x0,
+ 1
+
+ )) == 0)
+ {
+ //
+ // Destroy the associated window & free the app data instance
+ //
+
+ DestroyWindow (pAppData->hwnd);
+ pAppData->dwKey = 0xefefefef;
+ free (pAppData);
+ }
+ }
+ else
+ {
+ lResult = LINEERR_INVALAPPHANDLE;
+ }
+
+ PhoneResult ("Shutdown", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+tapiRequestMakeCall(
+ LPCSTR lpszDestAddress,
+ LPCSTR lpszAppName,
+ LPCSTR lpszCalledParty,
+ LPCSTR lpszComment
+ )
+{
+ LONG lResult = (*pfnCallProc4)(
+ (DWORD) lpszDestAddress,
+ (DWORD) lpszAppName,
+ (DWORD) lpszCalledParty,
+ (DWORD) lpszComment,
+ (LPVOID)gaProcs[tRequestMakeCall],
+ 0xf,
+ 4
+ );
+
+ TapiResult ("RequestMakeCall", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+tapiRequestMediaCall(
+ HWND hWnd,
+ WPARAM wRequestID,
+ LPCSTR lpszDeviceClass,
+ LPCSTR lpDeviceID,
+ DWORD dwSize,
+ DWORD dwSecure,
+ LPCSTR lpszDestAddress,
+ LPCSTR lpszAppName,
+ LPCSTR lpszCalledParty,
+ LPCSTR lpszComment
+ )
+{
+ LONG lResult = (*pfnCallProc10)(
+ (DWORD) hWnd,
+ (DWORD) wRequestID,
+ (DWORD) lpszDeviceClass,
+ (DWORD) lpDeviceID,
+ (DWORD) dwSize,
+ (DWORD) dwSecure,
+ (DWORD) lpszDestAddress,
+ (DWORD) lpszAppName,
+ (DWORD) lpszCalledParty,
+ (DWORD) lpszComment,
+ (LPVOID)gaProcs[tRequestMediaCall],
+ 0xcf,
+ 10
+ );
+
+ TapiResult ("RequestMediaCall", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+tapiRequestDrop(
+ HWND hWnd,
+ WPARAM wRequestID
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) hWnd,
+ (DWORD) wRequestID,
+ (LPVOID)gaProcs[tRequestDrop],
+ 0x0,
+ 2
+ );
+
+ TapiResult ("Drop", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+tapiGetLocationInfo(
+ LPSTR lpszCountryCode,
+ LPSTR lpszCityCode
+ )
+{
+ LONG lResult = (*pfnCallProc2)(
+ (DWORD) lpszCountryCode,
+ (DWORD) lpszCityCode,
+ (LPVOID)gaProcs[tGetLocationInfo],
+ 0x3,
+ 2
+ );
+
+ TapiResult ("GetLocationInfo", lResult);
+
+ return lResult;
+}
+
+
+
+
+LONG
+WINAPI
+LAddrParamsInited(
+ LPDWORD lpdwInited
+ )
+{
+ LONG lResult = (*pfnCallProc1)(
+ (DWORD)lpdwInited,
+ (LPVOID)gaProcs[LAddrParamsInitedVAL],
+ 0x1,
+ 1
+ );
+
+ LineResult ("LAddrParamsInited", lResult);
+
+ return lResult;
+}
+
+
+LONG
+WINAPI
+LOpenDialAsst(
+ HWND hwnd,
+ LPCSTR lpszAddressIn,
+ BOOL fSimple,
+ BOOL fSilentInstall)
+{
+ LONG lResult = (*pfnCallProc4)(
+ hwnd,
+ (DWORD)lpszAddressIn,
+ fSimple,
+ fSilentInstall,
+ (LPVOID)gaProcs[LOpenDialAsstVAL],
+ 0x0,
+ 4
+ );
+
+ LineResult ("LOpenDialAsst", lResult);
+
+ return lResult;
+}