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.

4140 lines
82 KiB

  1. /*++ BUILD Version: 0000 // Increment this if a change has global effects
  2. Copyright (c) 1995-1997 Microsoft Corporation
  3. Module Name:
  4. thunk.c
  5. Abstract:
  6. This module contains
  7. Author:
  8. Dan Knudson (DanKn) dd-Mmm-1995
  9. Revision History:
  10. --*/
  11. #define NOGDI GDI APIs and definitions
  12. #define NOSOUND Sound APIs and definitions
  13. #define NODRIVERS Installable driver APIs and definitions
  14. #define NOIMT Installable messge thunk APIs and definitions
  15. #define NOMINMAX min() and max() macros
  16. #define NOLOGERROR LogError() and related definitions
  17. #define NOPROFILER Profiler APIs
  18. #define NOLFILEIO _l* file I/O routines
  19. #define NOOPENFILE OpenFile and related definitions
  20. #define NORESOURCE Resource management
  21. #define NOATOM Atom management
  22. #define NOLANGUAGE Character test routines
  23. #define NOLSTRING lstr* string management routines
  24. #define NODBCS Double-byte character set routines
  25. #define NOKEYBOARDINFO Keyboard driver routines
  26. #define NOGDICAPMASKS GDI device capability constants
  27. #define NOCOLOR COLOR_* color values
  28. #define NOGDIOBJ GDI pens, brushes, fonts
  29. #define NODRAWTEXT DrawText() and related definitions
  30. #define NOTEXTMETRIC TEXTMETRIC and related APIs
  31. #define NOSCALABLEFONT Truetype scalable font support
  32. #define NOBITMAP Bitmap support
  33. #define NORASTEROPS GDI Raster operation definitions
  34. #define NOMETAFILE Metafile support
  35. #define NOSYSTEMPARAMSINFO SystemParametersInfo() and SPI_* definitions
  36. #define NOSHOWWINDOW ShowWindow and related definitions
  37. #define NODEFERWINDOWPOS DeferWindowPos and related definitions
  38. #define NOVIRTUALKEYCODES VK_* virtual key codes
  39. #define NOKEYSTATES MK_* message key state flags
  40. #define NOWH SetWindowsHook and related WH_* definitions
  41. #define NOMENUS Menu APIs
  42. #define NOSCROLL Scrolling APIs and scroll bar control
  43. #define NOCLIPBOARD Clipboard APIs and definitions
  44. #define NOICONS IDI_* icon IDs
  45. #define NOMB MessageBox and related definitions
  46. #define NOSYSCOMMANDS WM_SYSCOMMAND SC_* definitions
  47. #define NOMDI MDI support
  48. //#define NOCTLMGR Control management and controls
  49. #define NOWINMESSAGES WM_* window messages
  50. #include "windows.h"
  51. #include <stdlib.h>
  52. //#include <malloc.h>
  53. #include <string.h>
  54. #define TAPI_CURRENT_VERSION 0x00010004
  55. #ifndef ULONG_PTR
  56. #define ULONG_PTR DWORD
  57. #endif
  58. #ifndef DWORD_PTR
  59. #define DWORD_PTR DWORD
  60. #endif
  61. //#include "..\inc\tapi.h"
  62. #include <tapi.h>
  63. #include "thunk.h"
  64. DWORD FAR CDECL CallProcEx32W( DWORD, DWORD, DWORD, ... );
  65. const char gszWndClass[] = "TapiClient16Class";
  66. const char gszTapi32[] = "TAPI32.DLL";
  67. BOOL gfShutdownDone = FALSE;
  68. BOOL gfOpenDone = FALSE;
  69. HLINE ghLine = NULL;
  70. HICON ghIcon = NULL;
  71. #if DBG
  72. DWORD gdwDebugLevel;
  73. #define DBGOUT OutputDebugString
  74. #else
  75. #define DBGOUT //
  76. #endif
  77. //*******************************************************************************
  78. //*******************************************************************************
  79. //*******************************************************************************
  80. void DoFullLoad( void )
  81. {
  82. int i;
  83. //
  84. // Only do it once
  85. //
  86. // if ( 0 == ghLib )
  87. {
  88. //
  89. // Load tapi32.dll & Get all the proc pointers
  90. //
  91. ghLib = LoadLibraryEx32W (gszTapi32, NULL, 0);
  92. for (i = 0; i < NUM_TAPI32_PROCS; i++)
  93. {
  94. gaProcs[i] = (MYPROC) GetProcAddress32W(
  95. ghLib,
  96. (LPCSTR)gaFuncNames[i]
  97. );
  98. }
  99. // set the error mode.
  100. // this has no effect on x86 platforms
  101. // on RISC platforms, NT will fix
  102. // alignment faults (at a cost of time)
  103. {
  104. #define SEM_NOALIGNMENTFAULTEXCEPT 0x0004
  105. DWORD dwModule;
  106. DWORD dwFunc;
  107. if ((dwModule = LoadLibraryEx32W ("kernel32.dll", NULL,0)) == NULL)
  108. {
  109. DBGOUT("LoadLibraryEx32W on kernel32.dll failed\n");
  110. }
  111. else
  112. {
  113. if ((dwFunc = GetProcAddress32W(dwModule,
  114. "SetErrorMode")) == NULL)
  115. {
  116. DBGOUT("GetProcAddress32W on SetErrorMode failed\n");
  117. }
  118. else
  119. {
  120. DBGOUT("Calling CallProcEx32W\n");
  121. CallProcEx32W(
  122. 1,
  123. 0,
  124. dwFunc,
  125. (DWORD) SEM_NOALIGNMENTFAULTEXCEPT
  126. );
  127. }
  128. FreeLibrary32W(dwModule);
  129. }
  130. }
  131. }
  132. }
  133. //*******************************************************************************
  134. //*******************************************************************************
  135. //*******************************************************************************
  136. int
  137. FAR
  138. PASCAL
  139. LibMain(
  140. HINSTANCE hInst,
  141. WORD wDataSeg,
  142. WORD cbHeapSize,
  143. LPSTR lpszCmdLine
  144. )
  145. {
  146. WNDCLASS wc;
  147. DBGOUT ("TAPI.DLL: Libmain entered\n");
  148. //
  149. //
  150. //
  151. #if DBG
  152. gdwDebugLevel = (DWORD) GetPrivateProfileInt(
  153. "Debug",
  154. "TapiDebugLevel",
  155. 0x0,
  156. "Telephon.ini"
  157. );
  158. #endif
  159. //
  160. // Save the hInst in a global
  161. //
  162. ghInst = hInst;
  163. //
  164. // Register a window class for windows used for signaling async
  165. // completions & unsolicited events
  166. //
  167. wc.style = 0;
  168. wc.lpfnWndProc = Tapi16HiddenWndProc;
  169. wc.cbClsExtra = 0;
  170. wc.cbWndExtra = 2 * sizeof(DWORD);
  171. wc.hInstance = hInst;
  172. wc.hIcon = NULL;
  173. wc.hCursor = NULL;
  174. wc.hbrBackground = NULL;
  175. wc.lpszMenuName = NULL;
  176. wc.lpszClassName = gszWndClass;
  177. if (!RegisterClass (&wc))
  178. {
  179. DBGOUT ("RegisterClass() failed\n");
  180. }
  181. DoFullLoad();
  182. return TRUE;
  183. }
  184. int
  185. FAR
  186. PASCAL
  187. WEP(
  188. int nParam
  189. )
  190. {
  191. if ( ghLib )
  192. FreeLibrary32W (ghLib);
  193. return TRUE;
  194. }
  195. LRESULT
  196. CALLBACK
  197. Tapi16HiddenWndProc(
  198. HWND hwnd,
  199. UINT msg,
  200. WPARAM wParam,
  201. LPARAM lParam
  202. )
  203. {
  204. switch (msg)
  205. {
  206. #ifdef B16APPS_CANT_SPIN_THREADS
  207. case WM_USER:
  208. {
  209. //
  210. // Check the magic cookies for KC and me
  211. //
  212. if ( (0x4b43 == wParam) && (lParam == 0x00424a4d) )
  213. {
  214. DWORD pfn;
  215. DBGOUT ("TAPI.DLL: Got Event!!\r\n");
  216. pfn = (DWORD)GetProcAddress32W(
  217. ghLib,
  218. "NonAsyncEventThread"
  219. );
  220. if ( pfn )
  221. {
  222. CallProcEx32W( 0,
  223. 0,
  224. pfn
  225. );
  226. }
  227. }
  228. }
  229. break;
  230. #endif
  231. case WM_ASYNCEVENT:
  232. {
  233. //
  234. // This msg gets posted to us by tapi32.dll to alert us that
  235. // there's a new callback msg available for the app instance
  236. // associated with this window. "lParam" is an app instance
  237. // context tapi32.dll-space.
  238. //
  239. LPTAPI_APP_DATA pAppData = (LPTAPI_APP_DATA)
  240. GetWindowLong (hwnd, GWL_APPDATA);
  241. TAPI16_CALLBACKMSG msg;
  242. pAppData->bPendingAsyncEventMsg = FALSE;
  243. while ((*pfnCallProc2)(
  244. (DWORD) lParam,
  245. (DWORD) ((LPVOID)&msg),
  246. (LPVOID)gaProcs[GetTapi16CallbkMsg],
  247. 0x1,
  248. 2
  249. ))
  250. {
  251. if (pAppData->bPendingAsyncEventMsg == FALSE)
  252. {
  253. pAppData->bPendingAsyncEventMsg = TRUE;
  254. PostMessage (hwnd, WM_ASYNCEVENT, wParam, lParam);
  255. // NOTE: Tapi16HiddenWndProc: need to verify pAppData in case app calls
  256. // shutdown from callback?
  257. }
  258. (*(pAppData->lpfnCallback))(
  259. msg.hDevice,
  260. msg.dwMsg,
  261. msg.dwCallbackInstance,
  262. msg.dwParam1,
  263. msg.dwParam2,
  264. msg.dwParam3
  265. );
  266. }
  267. break;
  268. }
  269. default:
  270. {
  271. return (DefWindowProc (hwnd, msg, wParam, lParam));
  272. }
  273. } // switch
  274. return 0;
  275. }
  276. //
  277. // The following are the routines to thunk TAPI calls from 16-bit apps to
  278. // the 32-bit tapi32.dll. In general, this is done as follows:
  279. //
  280. // CallProc32W(
  281. // arg1, // TAPI proc args
  282. // ...,
  283. // argN,
  284. //
  285. // pfnTapi32, // Pointer to the function in tapi32.dll
  286. //
  287. // 0x???, // Bit mask indicating which args are pointers
  288. // // that need to be mapped from a 16:16 address
  289. // // to a 0:32 address. The least significant
  290. // // bit corresponds to argN, and the Nth bit
  291. // // corresponds to arg1.
  292. // //
  293. // // For example, if arg1 & arg2 are pointers, and
  294. // // arg3 is a DWORD, the the mask would be 0x6
  295. // // (110 in binary, indicating arg1 & arg2 need to
  296. // // be mapped)
  297. //
  298. // N // Number of TAPI proc args
  299. // );
  300. //
  301. //
  302. // Since callbacks to 16-bit procs cannot be done directly by a 32-bit
  303. // module, we create a hidden window for each successful call to
  304. // lineInitialize and phoneInitialize, and tapi32.dll posts msgs to this
  305. // window when LINE_XXX & PHONE_XXX msgs become available for the client
  306. // process. The window then retrieves all the msgs parameters and calls
  307. // the 16-bit proc's callback function.
  308. //
  309. // Note that we swap the hLineApp & hPhoneApp returned by tapi32.dll with
  310. // the hidden window handle on the client proc side, and substitute the
  311. // window handle for the pointer to the callback function on the tapi32.dll
  312. // side. The former is done to make it easier to reference which window
  313. // belongs to which hLine/PhoneApp, and the latter is done to provide
  314. // tapi32.dll with a means of alerting us of callback msgs. (Tapi32.dll
  315. // distinguishes whether the lpfnCallback it is passed in
  316. // line/phoneInitialize is a pointer to a function of a window handle by
  317. // checking the high WORD- if it is 0xffff then it assumes lpfnCallback
  318. // is really a 16-bit proc's window handle.
  319. //
  320. #if DBG
  321. void
  322. LineResult(
  323. char *pszFuncName,
  324. LONG lResult
  325. )
  326. {
  327. #if DBG
  328. if (gdwDebugLevel > 3)
  329. {
  330. char buf[100];
  331. wsprintf (buf, "TAPI: line%s result=x%lx\n", pszFuncName, lResult);
  332. DBGOUT (buf);
  333. }
  334. #endif
  335. }
  336. void
  337. PhoneResult(
  338. char *pszFuncName,
  339. LONG lResult
  340. )
  341. {
  342. #if DBG
  343. if (gdwDebugLevel > 3)
  344. {
  345. char buf[100];
  346. wsprintf (buf, "TAPI: phone%s result=x%lx\n", pszFuncName, lResult);
  347. DBGOUT (buf);
  348. }
  349. #endif
  350. }
  351. void
  352. TapiResult(
  353. char *pszFuncName,
  354. LONG lResult
  355. )
  356. {
  357. #if DBG
  358. if (gdwDebugLevel > 3)
  359. {
  360. char buf[100];
  361. wsprintf (buf, "TAPI: tapi%s result=x%lx\n", pszFuncName, lResult);
  362. DBGOUT (buf);
  363. }
  364. #endif
  365. }
  366. #else
  367. #define LineResult(arg1,arg2)
  368. #define PhoneResult(arg1,arg2)
  369. #define TapiResult(arg1,arg2)
  370. #endif
  371. VOID
  372. MyCreateIcon(
  373. )
  374. {
  375. BYTE FAR *pBlank;
  376. int xSize, ySize ;
  377. xSize = GetSystemMetrics( SM_CXICON );
  378. ySize = GetSystemMetrics( SM_CYICON );
  379. pBlank = (BYTE FAR *) GlobalAllocPtr (GPTR, ((xSize * ySize) + 7 )/ 8);
  380. ghIcon = CreateIcon (ghInst, xSize, ySize, 1, 1, pBlank, pBlank);
  381. GlobalFreePtr (pBlank);
  382. }
  383. LONG
  384. WINAPI
  385. xxxInitialize(
  386. BOOL bLine,
  387. LPHLINEAPP lphXxxApp,
  388. HINSTANCE hInstance,
  389. LINECALLBACK lpfnCallback,
  390. LPCSTR lpszAppName,
  391. LPDWORD lpdwNumDevs
  392. )
  393. {
  394. HWND hwnd = NULL;
  395. LONG lResult;
  396. DWORD dwAppNameLen;
  397. char far *lpszModuleNamePath = NULL;
  398. char far *lpszModuleName;
  399. char far *lpszFriendlyAndModuleName = NULL;
  400. LPTAPI_APP_DATA pAppData = (LPTAPI_APP_DATA) NULL;
  401. #if DBG
  402. if (bLine)
  403. {
  404. DBGOUT ("lineInitialize: enter\n");
  405. }
  406. else
  407. {
  408. DBGOUT ("phoneInitialize: enter\n");
  409. }
  410. #endif
  411. //
  412. // Verify the ptrs
  413. //
  414. if (IsBadWritePtr ((LPVOID)lphXxxApp, sizeof(HLINEAPP)) ||
  415. IsBadCodePtr ((FARPROC) lpfnCallback) ||
  416. (lpszAppName && IsBadStringPtr (lpszAppName, (UINT) -1)))
  417. {
  418. lResult = (bLine ? LINEERR_INVALPOINTER : PHONEERR_INVALPOINTER);
  419. goto xxxInitialize_showResult;
  420. }
  421. //
  422. // Verify hInstance
  423. //
  424. if ((HINSTANCE)-1 == hInstance)
  425. {
  426. lResult = (bLine ? LINEERR_OPERATIONFAILED : PHONEERR_OPERATIONFAILED);
  427. goto xxxInitialize_showResult;
  428. }
  429. dwAppNameLen = (lpszAppName ? strlen (lpszAppName) + 1 : 0);
  430. //
  431. // Create a string that looks like: "<friendly name>\0<module name>\0"
  432. // (because i don't know if i can work with a 16-bit hInstance in tapi32)
  433. //
  434. if ((lpszModuleNamePath = (char far *) malloc (260)))
  435. {
  436. if (GetModuleFileName (hInstance, lpszModuleNamePath, 260))
  437. {
  438. lpszModuleName = 1 + _fstrrchr (lpszModuleNamePath, '\\');
  439. if ((lpszFriendlyAndModuleName = (char far *) malloc((unsigned)
  440. (260 + (dwAppNameLen ? dwAppNameLen : 32))
  441. )))
  442. {
  443. int length;
  444. strcpy(
  445. lpszFriendlyAndModuleName,
  446. (lpszAppName ? lpszAppName : lpszModuleName)
  447. );
  448. length = strlen (lpszFriendlyAndModuleName);
  449. strcpy(
  450. lpszFriendlyAndModuleName + length + 1,
  451. lpszModuleName
  452. );
  453. }
  454. else
  455. {
  456. lResult = (bLine ? LINEERR_NOMEM : PHONEERR_NOMEM);
  457. goto xxxInitialize_done;
  458. }
  459. }
  460. else
  461. {
  462. DBGOUT ("GetModuleFileName() failed\n");
  463. lResult =
  464. (bLine ? LINEERR_OPERATIONFAILED : PHONEERR_OPERATIONFAILED);
  465. goto xxxInitialize_done;
  466. }
  467. }
  468. else
  469. {
  470. lResult = (bLine ? LINEERR_NOMEM : PHONEERR_NOMEM);
  471. goto xxxInitialize_done;
  472. }
  473. //
  474. // Create a window that we can use for signaling async completions
  475. // & unsolicited events
  476. //
  477. if (!(hwnd = CreateWindow(
  478. gszWndClass,
  479. "",
  480. WS_POPUP,
  481. CW_USEDEFAULT,
  482. CW_USEDEFAULT,
  483. CW_USEDEFAULT,
  484. CW_USEDEFAULT,
  485. NULL,
  486. NULL,
  487. ghInst,
  488. NULL
  489. )))
  490. {
  491. lResult = (bLine ? LINEERR_OPERATIONFAILED : PHONEERR_OPERATIONFAILED);
  492. DBGOUT ("CreateWindow failed\n");
  493. goto xxxInitialize_done;
  494. }
  495. //
  496. //
  497. //
  498. if (!(pAppData = (LPTAPI_APP_DATA) malloc (sizeof (TAPI_APP_DATA))))
  499. {
  500. lResult = (bLine ? LINEERR_NOMEM : PHONEERR_NOMEM);
  501. DBGOUT ("malloc failed\n");
  502. goto xxxInitialize_done;
  503. }
  504. pAppData->dwKey = TAPI_APP_DATA_KEY;
  505. pAppData->hwnd = hwnd;
  506. pAppData->bPendingAsyncEventMsg = FALSE;
  507. pAppData->lpfnCallback = lpfnCallback;
  508. SetWindowLong (hwnd, GWL_APPDATA, (LONG) pAppData);
  509. //
  510. // Call tapi32.dll
  511. //
  512. // GlobalWire( GlobalHandle(HIWORD(lpdwNumDevs)));
  513. // GlobalWire( GlobalHandle(HIWORD(lpszFriendlyAndModuleName)));
  514. lResult = (LONG) (*pfnCallProc5)(
  515. (DWORD) ((LPVOID)&pAppData->hXxxApp),
  516. (DWORD) hInstance,
  517. (DWORD) (0xffff0000 | hwnd), // lpfnCallback
  518. (DWORD) lpszFriendlyAndModuleName,
  519. (DWORD) lpdwNumDevs,
  520. (LPVOID)gaProcs[(bLine ? lInitialize : pInitialize)],
  521. 0x13,
  522. 5
  523. );
  524. // GlobalUnWire( GlobalHandle(HIWORD(lpdwNumDevs)));
  525. // GlobalUnWire( GlobalHandle(HIWORD(lpszFriendlyAndModuleName)));
  526. xxxInitialize_done:
  527. if (lpszModuleNamePath)
  528. {
  529. free (lpszModuleNamePath);
  530. if (lpszFriendlyAndModuleName)
  531. {
  532. free (lpszFriendlyAndModuleName);
  533. }
  534. }
  535. if (lResult == 0)
  536. {
  537. //
  538. // Set the app's hLineApp to be the hwnd rather than the real
  539. // hLineApp, making it easier to locate the window
  540. //
  541. *lphXxxApp = (HLINEAPP) pAppData;
  542. }
  543. else if (hwnd)
  544. {
  545. DestroyWindow (hwnd);
  546. if (pAppData)
  547. {
  548. free (pAppData);
  549. }
  550. }
  551. xxxInitialize_showResult:
  552. #if DBG
  553. if (bLine)
  554. {
  555. LineResult ("Initialize", lResult);
  556. }
  557. else
  558. {
  559. PhoneResult ("Initialize", lResult);
  560. }
  561. #endif
  562. return lResult;
  563. }
  564. LPTAPI_APP_DATA
  565. FAR
  566. PASCAL
  567. IsValidXxxApp(
  568. HLINEAPP hXxxApp
  569. )
  570. {
  571. if (IsBadReadPtr ((LPVOID) hXxxApp, sizeof (TAPI_APP_DATA)) ||
  572. ((LPTAPI_APP_DATA) hXxxApp)->dwKey != TAPI_APP_DATA_KEY)
  573. {
  574. return (LPTAPI_APP_DATA) NULL;
  575. }
  576. return (LPTAPI_APP_DATA) hXxxApp;
  577. }
  578. LONG
  579. WINAPI
  580. lineAccept(
  581. HCALL hCall,
  582. LPCSTR lpsUserUserInfo,
  583. DWORD dwSize
  584. )
  585. {
  586. LONG lResult = (*pfnCallProc3)(
  587. (DWORD) hCall,
  588. (DWORD) lpsUserUserInfo,
  589. (DWORD) dwSize,
  590. (LPVOID)gaProcs[lAccept],
  591. 0x2,
  592. 3
  593. );
  594. LineResult ("Accept", lResult);
  595. return lResult;
  596. }
  597. LONG
  598. WINAPI
  599. lineAddProvider(
  600. LPCSTR lpszProviderFilename,
  601. HWND hwndOwner,
  602. LPDWORD lpdwPermanentProviderID
  603. )
  604. {
  605. LONG lResult;
  606. lResult = (*pfnCallProc3)(
  607. (DWORD) lpszProviderFilename,
  608. (DWORD) (0xffff0000 | hwndOwner),
  609. (DWORD) lpdwPermanentProviderID,
  610. (LPVOID)gaProcs[lAddProvider],
  611. 0x5,
  612. 3
  613. );
  614. LineResult ("AddProvider", lResult);
  615. return lResult;
  616. }
  617. LONG
  618. WINAPI
  619. lineAddToConference(
  620. HCALL hConfCall,
  621. HCALL hConsultCall
  622. )
  623. {
  624. LONG lResult = (*pfnCallProc2)(
  625. (DWORD) hConfCall,
  626. (DWORD) hConsultCall,
  627. (LPVOID)gaProcs[lAddToConference],
  628. 0x0,
  629. 2
  630. );
  631. LineResult ("AddToConference", lResult);
  632. return lResult;
  633. }
  634. LONG
  635. WINAPI
  636. lineAnswer(
  637. HCALL hCall,
  638. LPCSTR lpsUserUserInfo,
  639. DWORD dwSize
  640. )
  641. {
  642. LONG lResult = (*pfnCallProc3)(
  643. (DWORD) hCall,
  644. (DWORD) lpsUserUserInfo,
  645. (DWORD) dwSize,
  646. (LPVOID)gaProcs[lAnswer],
  647. 0x2,
  648. 3
  649. );
  650. LineResult ("Answer", lResult);
  651. return lResult;
  652. }
  653. LONG
  654. WINAPI
  655. lineBlindTransfer(
  656. HCALL hCall,
  657. LPCSTR lpszDestAddress,
  658. DWORD dwCountryCode
  659. )
  660. {
  661. LONG lResult = (*pfnCallProc3)(
  662. (DWORD) hCall,
  663. (DWORD) lpszDestAddress,
  664. (DWORD) dwCountryCode,
  665. (LPVOID)gaProcs[lBlindTransfer],
  666. 0x2,
  667. 3
  668. );
  669. LineResult ("BlindTransfer", lResult);
  670. return lResult;
  671. }
  672. LONG
  673. WINAPI
  674. lineClose(
  675. HLINE hLine
  676. )
  677. {
  678. LONG lResult = (*pfnCallProc1)(
  679. (DWORD) hLine,
  680. (LPVOID)gaProcs[lClose],
  681. 0x0,
  682. 1
  683. );
  684. LineResult ("Close", lResult);
  685. return lResult;
  686. }
  687. LONG
  688. WINAPI
  689. lineCompleteCall(
  690. HCALL hCall,
  691. LPDWORD lpdwCompletionID,
  692. DWORD dwCompletionMode,
  693. DWORD dwMessageID
  694. )
  695. {
  696. LONG lResult;
  697. if (IsBadWritePtr (lpdwCompletionID, sizeof (DWORD)))
  698. {
  699. lResult = LINEERR_INVALPOINTER;
  700. }
  701. else
  702. {
  703. lResult = (*pfnCallProc4)(
  704. (DWORD) hCall,
  705. (DWORD) lpdwCompletionID, // let tapi32.dll map this
  706. (DWORD) dwCompletionMode,
  707. (DWORD) dwMessageID,
  708. (LPVOID)gaProcs[lCompleteCall],
  709. 0x0,
  710. 4
  711. );
  712. }
  713. LineResult ("CompleteCall", lResult);
  714. return lResult;
  715. }
  716. LONG
  717. WINAPI
  718. lineCompleteTransfer(
  719. HCALL hCall,
  720. HCALL hConsultCall,
  721. LPHCALL lphConfCall,
  722. DWORD dwTransferMode
  723. )
  724. {
  725. //
  726. // Tapi32.dll will take care of mapping lphConfCall if/when the
  727. // request completes successfully, so we don't set the mapping
  728. // bit down below; do check to see if pointer is valid though.
  729. //
  730. LONG lResult;
  731. if (
  732. ( dwTransferMode & LINETRANSFERMODE_CONFERENCE )
  733. &&
  734. IsBadWritePtr ((void FAR *) lphConfCall, sizeof(HCALL))
  735. )
  736. {
  737. DBGOUT ("Bad lphConfCall with TRANSFERMODE_CONFERENCE\n");
  738. lResult = LINEERR_INVALPOINTER;
  739. goto CompleteTransfer_cleanup;
  740. }
  741. lResult = (*pfnCallProc4)(
  742. (DWORD) hCall,
  743. (DWORD) hConsultCall,
  744. (DWORD) lphConfCall,
  745. (DWORD) dwTransferMode,
  746. (LPVOID)gaProcs[lCompleteTransfer],
  747. 0x0,
  748. 4
  749. );
  750. CompleteTransfer_cleanup:
  751. LineResult ("CompleteTransfer", lResult);
  752. return lResult;
  753. }
  754. LONG
  755. WINAPI
  756. lineConfigDialog(
  757. DWORD dwDeviceID,
  758. HWND hwndOwner,
  759. LPCSTR lpszDeviceClass
  760. )
  761. {
  762. LONG lResult;
  763. lResult = (*pfnCallProc3)(
  764. (DWORD) dwDeviceID,
  765. (DWORD) (0xffff0000 | hwndOwner),
  766. (DWORD) lpszDeviceClass,
  767. (LPVOID)gaProcs[lConfigDialog],
  768. 0x1,
  769. 3
  770. );
  771. LineResult ("ConfigDialog", lResult);
  772. return lResult;
  773. }
  774. LONG
  775. WINAPI
  776. lineConfigDialogEdit(
  777. DWORD dwDeviceID,
  778. HWND hwndOwner,
  779. LPCSTR lpszDeviceClass,
  780. LPVOID lpDeviceConfigIn,
  781. DWORD dwSize,
  782. LPVARSTRING lpDeviceConfigOut
  783. )
  784. {
  785. LONG lResult;
  786. lResult = (*pfnCallProc6)(
  787. (DWORD) dwDeviceID,
  788. (DWORD) (0xffff0000 | hwndOwner),
  789. (DWORD) lpszDeviceClass,
  790. (DWORD) lpDeviceConfigIn,
  791. (DWORD) dwSize,
  792. (DWORD) lpDeviceConfigOut,
  793. (LPVOID)gaProcs[lConfigDialogEdit],
  794. 0xd,
  795. 6
  796. );
  797. LineResult ("ConfigDialogEdit", lResult);
  798. return lResult;
  799. }
  800. LONG
  801. WINAPI
  802. lineConfigProvider(
  803. HWND hwndOwner,
  804. DWORD dwPermanentProviderID
  805. )
  806. {
  807. LONG lResult;
  808. lResult = (*pfnCallProc2)(
  809. (DWORD) (0xffff0000 | hwndOwner),
  810. (DWORD) dwPermanentProviderID,
  811. (LPVOID)gaProcs[lConfigProvider],
  812. 0x0,
  813. 2
  814. );
  815. LineResult ("ConfigProvider", lResult);
  816. return lResult;
  817. }
  818. LONG
  819. WINAPI
  820. lineDeallocateCall(
  821. HCALL hCall
  822. )
  823. {
  824. LONG lResult = (*pfnCallProc1)(
  825. (DWORD) hCall,
  826. (LPVOID)gaProcs[lDeallocateCall],
  827. 0x0,
  828. 1
  829. );
  830. LineResult ("DeallocateCall", lResult);
  831. return lResult;
  832. }
  833. LONG
  834. WINAPI
  835. lineDevSpecific(
  836. HLINE hLine,
  837. DWORD dwAddressID,
  838. HCALL hCall,
  839. LPVOID lpParams,
  840. DWORD dwSize
  841. )
  842. {
  843. LONG lResult;
  844. if (IsBadWritePtr (lpParams, (UINT) dwSize))
  845. {
  846. lResult = LINEERR_INVALPOINTER;
  847. }
  848. else
  849. {
  850. lResult = (*pfnCallProc5)(
  851. (DWORD) hLine,
  852. (DWORD) dwAddressID,
  853. (DWORD) hCall,
  854. (DWORD) lpParams, // let tapi32.dll map this
  855. (DWORD) dwSize,
  856. (LPVOID)gaProcs[lDevSpecific],
  857. 0x0,
  858. 5
  859. );
  860. }
  861. LineResult ("DevSpecific", lResult);
  862. return lResult;
  863. }
  864. LONG
  865. WINAPI
  866. lineDevSpecificFeature(
  867. HLINE hLine,
  868. DWORD dwFeature,
  869. LPVOID lpParams,
  870. DWORD dwSize
  871. )
  872. {
  873. LONG lResult;
  874. if (IsBadWritePtr (lpParams, (UINT) dwSize))
  875. {
  876. lResult = LINEERR_INVALPOINTER;
  877. }
  878. else
  879. {
  880. lResult = (*pfnCallProc4)(
  881. (DWORD) hLine,
  882. (DWORD) dwFeature,
  883. (DWORD) lpParams, // let tapi32.dll map this
  884. (DWORD) dwSize,
  885. (LPVOID)gaProcs[lDevSpecificFeature],
  886. 0x0,
  887. 4
  888. );
  889. }
  890. LineResult ("DevSpecificFeature", lResult);
  891. return lResult;
  892. }
  893. LONG
  894. WINAPI
  895. lineDial(
  896. HCALL hCall,
  897. LPCSTR lpszDestAddress,
  898. DWORD dwCountryCode
  899. )
  900. {
  901. LONG lResult = (*pfnCallProc3)(
  902. (DWORD) hCall,
  903. (DWORD) lpszDestAddress,
  904. (DWORD) dwCountryCode,
  905. (LPVOID)gaProcs[lDial],
  906. 0x2,
  907. 3
  908. );
  909. LineResult ("Dial", lResult);
  910. return lResult;
  911. }
  912. LONG
  913. WINAPI
  914. lineDrop(
  915. HCALL hCall,
  916. LPCSTR lpsUserUserInfo,
  917. DWORD dwSize
  918. )
  919. {
  920. LONG lResult = (*pfnCallProc3)(
  921. (DWORD) hCall,
  922. (DWORD) lpsUserUserInfo,
  923. (DWORD) dwSize,
  924. (LPVOID)gaProcs[lDrop],
  925. 0x2,
  926. 3
  927. );
  928. LineResult ("Drop", lResult);
  929. return lResult;
  930. }
  931. LONG
  932. WINAPI
  933. lineForward(
  934. HLINE hLine,
  935. DWORD bAllAddresses,
  936. DWORD dwAddressID,
  937. LPLINEFORWARDLIST const lpForwardList,
  938. DWORD dwNumRingsNoAnswer,
  939. LPHCALL lphConsultCall,
  940. LPLINECALLPARAMS const lpCallParams
  941. )
  942. {
  943. //
  944. // Tapi32.dll will take care of mapping lphConsultCall if/when the
  945. // request completes successfully, so we don't set the mapping
  946. // bit down below; do check to see if pointer is valid though.
  947. //
  948. LONG lResult;
  949. if (IsBadWritePtr ((void FAR *) lphConsultCall, sizeof(HCALL)))
  950. {
  951. lResult = LINEERR_INVALPOINTER;
  952. }
  953. else
  954. {
  955. lResult = (*pfnCallProc7)(
  956. (DWORD) hLine,
  957. (DWORD) bAllAddresses,
  958. (DWORD) dwAddressID,
  959. (DWORD) lpForwardList,
  960. (DWORD) dwNumRingsNoAnswer,
  961. (DWORD) lphConsultCall,
  962. (DWORD) lpCallParams,
  963. (LPVOID)gaProcs[lForward],
  964. 0x9,
  965. 7
  966. );
  967. }
  968. LineResult ("Forward", lResult);
  969. return lResult;
  970. }
  971. LONG
  972. WINAPI
  973. lineGatherDigits(
  974. HCALL hCall,
  975. DWORD dwDigitModes,
  976. LPSTR lpsDigits,
  977. DWORD dwNumDigits,
  978. LPCSTR lpszTerminationDigits,
  979. DWORD dwFirstDigitTimeout,
  980. DWORD dwInterDigitTimeout
  981. )
  982. {
  983. LONG lResult;
  984. if (lpsDigits && IsBadWritePtr (lpsDigits, (UINT)dwNumDigits))
  985. {
  986. lResult = LINEERR_INVALPOINTER;
  987. }
  988. else
  989. {
  990. lResult = (*pfnCallProc7)(
  991. (DWORD) hCall,
  992. (DWORD) dwDigitModes,
  993. (DWORD) lpsDigits, // let tapi32.dll map this
  994. (DWORD) dwNumDigits,
  995. (DWORD) lpszTerminationDigits,
  996. (DWORD) dwFirstDigitTimeout,
  997. (DWORD) dwInterDigitTimeout,
  998. (LPVOID)gaProcs[lGatherDigits],
  999. 0x4,
  1000. 7
  1001. );
  1002. }
  1003. LineResult ("GatherDigits", lResult);
  1004. return lResult;
  1005. }
  1006. LONG
  1007. WINAPI
  1008. lineGenerateDigits(
  1009. HCALL hCall,
  1010. DWORD dwDigitMode,
  1011. LPCSTR lpsDigits,
  1012. DWORD dwDuration
  1013. )
  1014. {
  1015. LONG lResult = (*pfnCallProc4)(
  1016. (DWORD) hCall,
  1017. (DWORD) dwDigitMode,
  1018. (DWORD) lpsDigits,
  1019. (DWORD) dwDuration,
  1020. (LPVOID)gaProcs[lGenerateDigits],
  1021. 0x2,
  1022. 4
  1023. );
  1024. LineResult ("GenerateDigits", lResult);
  1025. return lResult;
  1026. }
  1027. LONG
  1028. WINAPI
  1029. lineGenerateTone(
  1030. HCALL hCall,
  1031. DWORD dwToneMode,
  1032. DWORD dwDuration,
  1033. DWORD dwNumTones,
  1034. LPLINEGENERATETONE const lpTones
  1035. )
  1036. {
  1037. LONG lResult = (*pfnCallProc5)(
  1038. (DWORD) hCall,
  1039. (DWORD) dwToneMode,
  1040. (DWORD) dwDuration,
  1041. (DWORD) dwNumTones,
  1042. (DWORD) lpTones,
  1043. (LPVOID)gaProcs[lGenerateTone],
  1044. 0x1,
  1045. 5
  1046. );
  1047. LineResult ("GenerateTone", lResult);
  1048. return lResult;
  1049. }
  1050. LONG
  1051. WINAPI
  1052. lineGetAddressCaps(
  1053. HLINEAPP hLineApp,
  1054. DWORD dwDeviceID,
  1055. DWORD dwAddressID,
  1056. DWORD dwAPIVersion,
  1057. DWORD dwExtVersion,
  1058. LPLINEADDRESSCAPS lpAddressCaps
  1059. )
  1060. {
  1061. LONG lResult;
  1062. LPTAPI_APP_DATA pAppData;
  1063. if ((pAppData = IsValidXxxApp (hLineApp)))
  1064. {
  1065. lResult = (*pfnCallProc6)(
  1066. (DWORD) pAppData->hXxxApp,
  1067. (DWORD) dwDeviceID,
  1068. (DWORD) dwAddressID,
  1069. (DWORD) dwAPIVersion,
  1070. (DWORD) dwExtVersion,
  1071. (DWORD) lpAddressCaps,
  1072. (LPVOID)gaProcs[lGetAddressCaps],
  1073. 0x1,
  1074. 6
  1075. );
  1076. }
  1077. else
  1078. {
  1079. lResult = LINEERR_INVALAPPHANDLE;
  1080. }
  1081. LineResult ("GetAddressCaps", lResult);
  1082. return lResult;
  1083. }
  1084. LONG
  1085. WINAPI
  1086. lineGetAddressID(
  1087. HLINE hLine,
  1088. LPDWORD lpdwAddressID,
  1089. DWORD dwAddressMode,
  1090. LPCSTR lpsAddress,
  1091. DWORD dwSize
  1092. )
  1093. {
  1094. LONG lResult = (*pfnCallProc5)(
  1095. (DWORD) hLine,
  1096. (DWORD) lpdwAddressID,
  1097. (DWORD) dwAddressMode,
  1098. (DWORD) lpsAddress,
  1099. (DWORD) dwSize,
  1100. (LPVOID)gaProcs[lGetAddressID],
  1101. 0xa,
  1102. 5
  1103. );
  1104. LineResult ("GetAddressID", lResult);
  1105. return lResult;
  1106. }
  1107. LONG
  1108. WINAPI
  1109. lineGetAddressStatus(
  1110. HLINE hLine,
  1111. DWORD dwAddressID,
  1112. LPLINEADDRESSSTATUS lpAddressStatus
  1113. )
  1114. {
  1115. LONG lResult = (*pfnCallProc3)(
  1116. (DWORD) hLine,
  1117. (DWORD) dwAddressID,
  1118. (DWORD) lpAddressStatus,
  1119. (LPVOID)gaProcs[lGetAddressStatus],
  1120. 0x1,
  1121. 3
  1122. );
  1123. LineResult ("GetAddressStatus", lResult);
  1124. return lResult;
  1125. }
  1126. LONG
  1127. WINAPI
  1128. lineGetAppPriority(
  1129. LPCSTR lpszAppName,
  1130. DWORD dwMediaMode,
  1131. LPLINEEXTENSIONID lpExtensionID,
  1132. DWORD dwRequestMode,
  1133. LPVARSTRING lpExtensionName,
  1134. LPDWORD lpdwPriority
  1135. )
  1136. {
  1137. LONG lResult;
  1138. // GlobalWire( GlobalHandle(HIWORD(lpExtensionName)) );
  1139. // GlobalWire( GlobalHandle(HIWORD(lpdwPriority)) );
  1140. // GlobalWire( GlobalHandle(HIWORD(lpExtensionID)) );
  1141. // GlobalWire( GlobalHandle(HIWORD(lpszAppName)) );
  1142. lResult = (*pfnCallProc6)(
  1143. (DWORD) lpszAppName,
  1144. (DWORD) dwMediaMode,
  1145. (DWORD) lpExtensionID,
  1146. (DWORD) dwRequestMode,
  1147. (DWORD) lpExtensionName,
  1148. (DWORD) lpdwPriority,
  1149. (LPVOID)gaProcs[lGetAppPriority],
  1150. 0x2b,
  1151. 6
  1152. );
  1153. // GlobalUnWire( GlobalHandle(HIWORD(lpExtensionName)) );
  1154. // GlobalUnWire( GlobalHandle(HIWORD(lpdwPriority)) );
  1155. // GlobalUnWire( GlobalHandle(HIWORD(lpExtensionID)) );
  1156. // GlobalUnWire( GlobalHandle(HIWORD(lpszAppName)) );
  1157. LineResult ("GetAppPriority", lResult);
  1158. return lResult;
  1159. }
  1160. LONG
  1161. WINAPI
  1162. lineGetCallInfo(
  1163. HCALL hCall,
  1164. LPLINECALLINFO lpCallInfo
  1165. )
  1166. {
  1167. LONG lResult;
  1168. // GlobalWire( GlobalHandle(HIWORD(lpCallInfo)) );
  1169. lResult = (*pfnCallProc2)(
  1170. (DWORD) hCall,
  1171. (DWORD) lpCallInfo,
  1172. (LPVOID)gaProcs[lGetCallInfo],
  1173. 0x1,
  1174. 2
  1175. );
  1176. // GlobalUnWire( GlobalHandle(HIWORD(lpCallInfo)) );
  1177. LineResult ("GetCallInfo", lResult);
  1178. return lResult;
  1179. }
  1180. LONG
  1181. WINAPI
  1182. lineGetCallStatus(
  1183. HCALL hCall,
  1184. LPLINECALLSTATUS lpCallStatus
  1185. )
  1186. {
  1187. LONG lResult = (*pfnCallProc2)(
  1188. (DWORD) hCall,
  1189. (DWORD) lpCallStatus,
  1190. (LPVOID)gaProcs[lGetCallStatus],
  1191. 0x1,
  1192. 2
  1193. );
  1194. LineResult ("GetCallStatus", lResult);
  1195. return lResult;
  1196. }
  1197. LONG
  1198. WINAPI
  1199. lineGetConfRelatedCalls(
  1200. HCALL hCall,
  1201. LPLINECALLLIST lpCallList
  1202. )
  1203. {
  1204. LONG lResult = (*pfnCallProc2)(
  1205. (DWORD) hCall,
  1206. (DWORD) lpCallList,
  1207. (LPVOID)gaProcs[lGetConfRelatedCalls],
  1208. 0x1,
  1209. 2
  1210. );
  1211. LineResult ("GetConfRelatedCalls", lResult);
  1212. return lResult;
  1213. }
  1214. LONG
  1215. WINAPI
  1216. lineGetCountry(
  1217. DWORD dwCountryID,
  1218. DWORD dwAPIVersion,
  1219. LPLINECOUNTRYLIST lpLineCountryList
  1220. )
  1221. {
  1222. LONG lResult;
  1223. lResult = (*pfnCallProc3)(
  1224. dwCountryID,
  1225. dwAPIVersion,
  1226. (DWORD) lpLineCountryList,
  1227. (LPVOID)gaProcs[lGetCountry],
  1228. 0x1,
  1229. 3
  1230. );
  1231. LineResult ("GetCountry", lResult);
  1232. return lResult;
  1233. }
  1234. LONG
  1235. WINAPI
  1236. lineGetDevCaps(
  1237. HLINEAPP hLineApp,
  1238. DWORD dwDeviceID,
  1239. DWORD dwAPIVersion,
  1240. DWORD dwExtVersion,
  1241. LPLINEDEVCAPS lpLineDevCaps
  1242. )
  1243. {
  1244. LONG lResult;
  1245. LPTAPI_APP_DATA pAppData;
  1246. if ((pAppData = IsValidXxxApp (hLineApp)))
  1247. {
  1248. lResult = (*pfnCallProc5)(
  1249. (DWORD) pAppData->hXxxApp,
  1250. (DWORD) dwDeviceID,
  1251. (DWORD) dwAPIVersion,
  1252. (DWORD) dwExtVersion,
  1253. (DWORD) lpLineDevCaps,
  1254. (LPVOID)gaProcs[lGetDevCaps],
  1255. 0x1,
  1256. 5
  1257. );
  1258. }
  1259. else
  1260. {
  1261. lResult = LINEERR_INVALAPPHANDLE;
  1262. }
  1263. LineResult ("GetDevCaps", lResult);
  1264. return lResult;
  1265. }
  1266. LONG
  1267. WINAPI
  1268. lineGetDevConfig(
  1269. DWORD dwDeviceID,
  1270. LPVARSTRING lpDeviceConfig,
  1271. LPCSTR lpszDeviceClass
  1272. )
  1273. {
  1274. LONG lResult;
  1275. lResult = (*pfnCallProc3)(
  1276. (DWORD) dwDeviceID,
  1277. (DWORD) lpDeviceConfig,
  1278. (DWORD) lpszDeviceClass,
  1279. (LPVOID)gaProcs[lGetDevConfig],
  1280. 0x3,
  1281. 3
  1282. );
  1283. LineResult ("GetDevConfig", lResult);
  1284. return lResult;
  1285. }
  1286. LONG
  1287. WINAPI
  1288. lineGetIcon(
  1289. DWORD dwDeviceID,
  1290. LPCSTR lpszDeviceClass,
  1291. LPHICON lphIcon
  1292. )
  1293. {
  1294. LONG lResult;
  1295. DWORD hIcon32;
  1296. if (!IsBadWritePtr (lphIcon, sizeof (*lphIcon)))
  1297. {
  1298. lResult = (*pfnCallProc3)(
  1299. (DWORD) dwDeviceID,
  1300. (DWORD) lpszDeviceClass,
  1301. (DWORD) &hIcon32,
  1302. (LPVOID) gaProcs[lGetIcon],
  1303. 0x3,
  1304. 3
  1305. );
  1306. if (lResult == 0)
  1307. {
  1308. if (!ghIcon)
  1309. {
  1310. MyCreateIcon ();
  1311. }
  1312. *lphIcon = ghIcon;
  1313. }
  1314. }
  1315. else
  1316. {
  1317. lResult = LINEERR_INVALPOINTER;
  1318. }
  1319. LineResult ("GetIcon", lResult);
  1320. return lResult;
  1321. }
  1322. LONG
  1323. WINAPI
  1324. lineGetID(
  1325. HLINE hLine,
  1326. DWORD dwAddressID,
  1327. HCALL hCall,
  1328. DWORD dwSelect,
  1329. LPVARSTRING lpDeviceID,
  1330. LPCSTR lpszDeviceClass
  1331. )
  1332. {
  1333. LONG lResult;
  1334. // GlobalWire( GlobalHandle(HIWORD(lpszDeviceClass)) );
  1335. // GlobalWire( GlobalHandle(HIWORD(lpDeviceID)) );
  1336. lResult = (*pfnCallProc6)(
  1337. (DWORD) hLine,
  1338. (DWORD) dwAddressID,
  1339. (DWORD) hCall,
  1340. (DWORD) dwSelect,
  1341. (DWORD) lpDeviceID,
  1342. (DWORD) lpszDeviceClass,
  1343. (LPVOID)gaProcs[lGetID],
  1344. 0x3,
  1345. 6
  1346. );
  1347. LineResult ("GetID", lResult);
  1348. // GlobalUnWire( GlobalHandle(HIWORD(lpszDeviceClass)) );
  1349. // GlobalUnWire( GlobalHandle(HIWORD(lpDeviceID)) );
  1350. return lResult;
  1351. }
  1352. LONG
  1353. WINAPI
  1354. lineGetLineDevStatus(
  1355. HLINE hLine,
  1356. LPLINEDEVSTATUS lpLineDevStatus
  1357. )
  1358. {
  1359. LONG lResult = (*pfnCallProc2)(
  1360. (DWORD) hLine,
  1361. (DWORD) lpLineDevStatus,
  1362. (LPVOID)gaProcs[lGetLineDevStatus],
  1363. 0x1,
  1364. 2
  1365. );
  1366. LineResult ("GetLineDevStatus", lResult);
  1367. return lResult;
  1368. }
  1369. LONG
  1370. WINAPI
  1371. lineGetNewCalls(
  1372. HLINE hLine,
  1373. DWORD dwAddressID,
  1374. DWORD dwSelect,
  1375. LPLINECALLLIST lpCallList
  1376. )
  1377. {
  1378. LONG lResult = (*pfnCallProc4)(
  1379. (DWORD) hLine,
  1380. (DWORD) dwAddressID,
  1381. (DWORD) dwSelect,
  1382. (DWORD) lpCallList,
  1383. (LPVOID)gaProcs[lGetNewCalls],
  1384. 0x1,
  1385. 4
  1386. );
  1387. LineResult ("GetNewCalls", lResult);
  1388. return lResult;
  1389. }
  1390. LONG
  1391. WINAPI
  1392. lineGetNumRings(
  1393. HLINE hLine,
  1394. DWORD dwAddressID,
  1395. LPDWORD lpdwNumRings
  1396. )
  1397. {
  1398. LONG lResult = (*pfnCallProc3)(
  1399. (DWORD) hLine,
  1400. (DWORD) dwAddressID,
  1401. (DWORD) lpdwNumRings,
  1402. (LPVOID)gaProcs[lGetNumRings],
  1403. 0x1,
  1404. 3
  1405. );
  1406. LineResult ("GetNumRings", lResult);
  1407. return lResult;
  1408. }
  1409. LONG
  1410. WINAPI
  1411. lineGetProviderList(
  1412. DWORD dwAPIVersion,
  1413. LPLINEPROVIDERLIST lpProviderList
  1414. )
  1415. {
  1416. LONG lResult;
  1417. lResult = (*pfnCallProc2)(
  1418. dwAPIVersion,
  1419. (DWORD) lpProviderList,
  1420. (LPVOID)gaProcs[lGetProviderList],
  1421. 0x1,
  1422. 2
  1423. );
  1424. LineResult ("GetProviderList", lResult);
  1425. return lResult;
  1426. }
  1427. LONG
  1428. WINAPI
  1429. lineGetRequest(
  1430. HLINEAPP hLineApp,
  1431. DWORD dwRequestMode,
  1432. LPVOID lpRequestBuffer
  1433. )
  1434. {
  1435. LONG lResult;
  1436. LPTAPI_APP_DATA pAppData;
  1437. if ((pAppData = IsValidXxxApp (hLineApp)))
  1438. {
  1439. lResult = (*pfnCallProc3)(
  1440. (DWORD) pAppData->hXxxApp,
  1441. (DWORD) dwRequestMode,
  1442. (DWORD) lpRequestBuffer,
  1443. (LPVOID)gaProcs[lGetRequest],
  1444. 0x1,
  1445. 3
  1446. );
  1447. }
  1448. else
  1449. {
  1450. lResult = LINEERR_INVALAPPHANDLE;
  1451. }
  1452. LineResult ("GetRequest", lResult);
  1453. return lResult;
  1454. }
  1455. LONG
  1456. WINAPI
  1457. lineGetStatusMessages(
  1458. HLINE hLine,
  1459. LPDWORD lpdwLineStates,
  1460. LPDWORD lpdwAddressStates
  1461. )
  1462. {
  1463. LONG lResult = (*pfnCallProc3)(
  1464. (DWORD) hLine,
  1465. (DWORD) lpdwLineStates,
  1466. (DWORD) lpdwAddressStates,
  1467. (LPVOID)gaProcs[lGetStatusMessages],
  1468. 0x3,
  1469. 3
  1470. );
  1471. LineResult ("GetStatusMessages", lResult);
  1472. return lResult;
  1473. }
  1474. LONG
  1475. WINAPI
  1476. lineGetTranslateCaps(
  1477. HLINEAPP hLineApp,
  1478. DWORD dwAPIVersion,
  1479. LPLINETRANSLATECAPS lpTranslateCaps
  1480. )
  1481. {
  1482. LPTAPI_APP_DATA pAppData;
  1483. LONG lResult;
  1484. if (hLineApp == NULL || (pAppData = IsValidXxxApp (hLineApp)))
  1485. {
  1486. // GlobalWire( GlobalHandle(HIWORD(lpTranslateCaps)) );
  1487. lResult = (*pfnCallProc3)(
  1488. (hLineApp == NULL ? (DWORD) 0 : pAppData->hXxxApp),
  1489. (DWORD) dwAPIVersion,
  1490. (DWORD) lpTranslateCaps,
  1491. (LPVOID)gaProcs[lGetTranslateCaps],
  1492. 0x1,
  1493. 3
  1494. );
  1495. // GlobalUnWire( GlobalHandle(HIWORD(lpTranslateCaps)) );
  1496. }
  1497. else
  1498. {
  1499. lResult = LINEERR_INVALAPPHANDLE;
  1500. }
  1501. LineResult ("GetTranslateCaps", lResult);
  1502. return lResult;
  1503. }
  1504. LONG
  1505. WINAPI
  1506. lineHandoff(
  1507. HCALL hCall,
  1508. LPCSTR lpszFileName,
  1509. DWORD dwMediaMode
  1510. )
  1511. {
  1512. LONG lResult;
  1513. // GlobalWire( GlobalHandle(HIWORD(lpszFileName)) );
  1514. lResult = (*pfnCallProc3)(
  1515. (DWORD) hCall,
  1516. (DWORD) lpszFileName,
  1517. (DWORD) dwMediaMode,
  1518. (LPVOID)gaProcs[lHandoff],
  1519. 0x2,
  1520. 3
  1521. );
  1522. LineResult ("Handoff", lResult);
  1523. // GlobalUnWire( GlobalHandle(HIWORD(lpszFileName)) );
  1524. return lResult;
  1525. }
  1526. LONG
  1527. WINAPI
  1528. lineHold(
  1529. HCALL hCall
  1530. )
  1531. {
  1532. LONG lResult = (*pfnCallProc1)(
  1533. (DWORD) hCall,
  1534. (LPVOID)gaProcs[lHold],
  1535. 0x0,
  1536. 1
  1537. );
  1538. LineResult ("Hold", lResult);
  1539. return lResult;
  1540. }
  1541. LONG
  1542. WINAPI
  1543. lineInitialize(
  1544. LPHLINEAPP lphLineApp,
  1545. HINSTANCE hInstance,
  1546. LINECALLBACK lpfnCallback,
  1547. LPCSTR lpszAppName,
  1548. LPDWORD lpdwNumDevs
  1549. )
  1550. {
  1551. return (xxxInitialize(
  1552. TRUE,
  1553. lphLineApp,
  1554. hInstance,
  1555. lpfnCallback,
  1556. lpszAppName,
  1557. lpdwNumDevs
  1558. ));
  1559. }
  1560. LONG
  1561. WINAPI
  1562. lineMakeCall(
  1563. HLINE hLine,
  1564. LPHCALL lphCall,
  1565. LPCSTR lpszDestAddress,
  1566. DWORD dwCountryCode,
  1567. LPLINECALLPARAMS const lpCallParams
  1568. )
  1569. {
  1570. //
  1571. // Tapi32.dll will take care of mapping lphCall if/when the
  1572. // request completes successfully, so we don't set the mapping
  1573. // bit down below; do check to see if pointer is valid though.
  1574. //
  1575. LONG lResult;
  1576. if (IsBadWritePtr ((void FAR *) lphCall, sizeof(HCALL)))
  1577. {
  1578. lResult = LINEERR_INVALPOINTER;
  1579. }
  1580. else
  1581. {
  1582. // GlobalWire( GlobalHandle(HIWORD(lpCallParams)) );
  1583. // GlobalWire( GlobalHandle(HIWORD(lpszDestAddress)) );
  1584. lResult = (*pfnCallProc5)(
  1585. (DWORD) hLine,
  1586. (DWORD) lphCall,
  1587. (DWORD) lpszDestAddress,
  1588. (DWORD) dwCountryCode,
  1589. (DWORD) lpCallParams,
  1590. (LPVOID)gaProcs[lMakeCall],
  1591. 0x5,
  1592. 5
  1593. );
  1594. // GlobalUnWire( GlobalHandle(HIWORD(lpCallParams)) );
  1595. // GlobalUnWire( GlobalHandle(HIWORD(lpszDestAddress)) );
  1596. }
  1597. LineResult ("MakeCall", lResult);
  1598. return lResult;
  1599. }
  1600. LONG
  1601. WINAPI
  1602. lineMonitorDigits(
  1603. HCALL hCall,
  1604. DWORD dwDigitModes
  1605. )
  1606. {
  1607. LONG lResult = (*pfnCallProc2)(
  1608. (DWORD) hCall,
  1609. (DWORD) dwDigitModes,
  1610. (LPVOID)gaProcs[lMonitorDigits],
  1611. 0x0,
  1612. 2
  1613. );
  1614. LineResult ("MonitorDigits", lResult);
  1615. return lResult;
  1616. }
  1617. LONG
  1618. WINAPI
  1619. lineMonitorMedia(
  1620. HCALL hCall,
  1621. DWORD dwMediaModes
  1622. )
  1623. {
  1624. LONG lResult = (*pfnCallProc2)(
  1625. (DWORD) hCall,
  1626. (DWORD) dwMediaModes,
  1627. (LPVOID)gaProcs[lMonitorMedia],
  1628. 0x0,
  1629. 2
  1630. );
  1631. LineResult ("MonitorMedia", lResult);
  1632. return lResult;
  1633. }
  1634. LONG
  1635. WINAPI
  1636. lineMonitorTones(
  1637. HCALL hCall,
  1638. LPLINEMONITORTONE const lpToneList,
  1639. DWORD dwNumEntries
  1640. )
  1641. {
  1642. LONG lResult = (*pfnCallProc3)(
  1643. (DWORD) hCall,
  1644. (DWORD) lpToneList,
  1645. (DWORD) dwNumEntries,
  1646. (LPVOID)gaProcs[lMonitorTones],
  1647. 0x2,
  1648. 3
  1649. );
  1650. LineResult ("MonitorTones", lResult);
  1651. return lResult;
  1652. }
  1653. LONG
  1654. WINAPI
  1655. lineNegotiateAPIVersion(
  1656. HLINEAPP hLineApp,
  1657. DWORD dwDeviceID,
  1658. DWORD dwAPILowVersion,
  1659. DWORD dwAPIHighVersion,
  1660. LPDWORD lpdwAPIVersion,
  1661. LPLINEEXTENSIONID lpExtensionID
  1662. )
  1663. {
  1664. LONG lResult;
  1665. LPTAPI_APP_DATA pAppData;
  1666. if ((pAppData = IsValidXxxApp (hLineApp)))
  1667. {
  1668. lResult = (*pfnCallProc6)(
  1669. (DWORD) pAppData->hXxxApp,
  1670. (DWORD) dwDeviceID,
  1671. (DWORD) dwAPILowVersion,
  1672. (DWORD) dwAPIHighVersion,
  1673. (DWORD) lpdwAPIVersion,
  1674. (DWORD) lpExtensionID,
  1675. (LPVOID)gaProcs[lNegotiateAPIVersion],
  1676. 0x3,
  1677. 6
  1678. );
  1679. }
  1680. else
  1681. {
  1682. lResult = LINEERR_INVALAPPHANDLE;
  1683. }
  1684. LineResult ("NegotiateAPIVersion", lResult);
  1685. return lResult;
  1686. }
  1687. LONG
  1688. WINAPI
  1689. lineNegotiateExtVersion(
  1690. HLINEAPP hLineApp,
  1691. DWORD dwDeviceID,
  1692. DWORD dwAPIVersion,
  1693. DWORD dwExtLowVersion,
  1694. DWORD dwExtHighVersion,
  1695. LPDWORD lpdwExtVersion
  1696. )
  1697. {
  1698. LONG lResult;
  1699. LPTAPI_APP_DATA pAppData;
  1700. if ((pAppData = IsValidXxxApp (hLineApp)))
  1701. {
  1702. lResult = (*pfnCallProc6)(
  1703. (DWORD) pAppData->hXxxApp,
  1704. (DWORD) dwDeviceID,
  1705. (DWORD) dwAPIVersion,
  1706. (DWORD) dwExtLowVersion,
  1707. (DWORD) dwExtHighVersion,
  1708. (DWORD) lpdwExtVersion,
  1709. (LPVOID)gaProcs[lNegotiateExtVersion],
  1710. 0x1,
  1711. 6
  1712. );
  1713. }
  1714. else
  1715. {
  1716. lResult = LINEERR_INVALAPPHANDLE;
  1717. }
  1718. LineResult ("NegotiateExtVersion", lResult);
  1719. return lResult;
  1720. }
  1721. LONG
  1722. WINAPI
  1723. lineOpen(
  1724. HLINEAPP hLineApp,
  1725. DWORD dwDeviceID,
  1726. LPHLINE lphLine,
  1727. DWORD dwAPIVersion,
  1728. DWORD dwExtVersion,
  1729. DWORD dwCallbackInstance,
  1730. DWORD dwPrivileges,
  1731. DWORD dwMediaModes,
  1732. LPLINECALLPARAMS const lpCallParams
  1733. )
  1734. {
  1735. LONG lResult;
  1736. LPTAPI_APP_DATA pAppData;
  1737. //OutputDebugString("open16");
  1738. //DebugBreak();
  1739. if ((pAppData = IsValidXxxApp (hLineApp)))
  1740. {
  1741. lResult = (*pfnCallProc9)(
  1742. (DWORD) pAppData->hXxxApp,
  1743. (DWORD) dwDeviceID,
  1744. (DWORD) lphLine,
  1745. (DWORD) dwAPIVersion,
  1746. (DWORD) dwExtVersion,
  1747. (DWORD) dwCallbackInstance,
  1748. (DWORD) dwPrivileges,
  1749. (DWORD) dwMediaModes,
  1750. (DWORD) lpCallParams,
  1751. (LPVOID)gaProcs[lOpen],
  1752. 0x41,
  1753. 9
  1754. );
  1755. }
  1756. else
  1757. {
  1758. lResult = LINEERR_INVALAPPHANDLE;
  1759. }
  1760. LineResult ("Open", lResult);
  1761. return lResult;
  1762. }
  1763. LONG
  1764. WINAPI
  1765. linePark(
  1766. HCALL hCall,
  1767. DWORD dwParkMode,
  1768. LPCSTR lpszDirAddress,
  1769. LPVARSTRING lpNonDirAddress
  1770. )
  1771. {
  1772. LONG lResult;
  1773. // GlobalWire( GlobalHandle(HIWORD(lpszDirAddress)) );
  1774. lResult = (*pfnCallProc4)(
  1775. (DWORD) hCall,
  1776. (DWORD) dwParkMode,
  1777. (DWORD) lpszDirAddress,
  1778. (DWORD) lpNonDirAddress, // let tapi32.dll map this
  1779. (LPVOID)gaProcs[lPark],
  1780. 0x2,
  1781. 4
  1782. );
  1783. LineResult ("Park", lResult);
  1784. // GlobalUnWire( GlobalHandle(HIWORD(lpszDirAddress)) );
  1785. return lResult;
  1786. }
  1787. LONG
  1788. WINAPI
  1789. linePickup(
  1790. HLINE hLine,
  1791. DWORD dwAddressID,
  1792. LPHCALL lphCall,
  1793. LPCSTR lpszDestAddress,
  1794. LPCSTR lpszGroupID
  1795. )
  1796. {
  1797. //
  1798. // Tapi32.dll will take care of mapping lphCall if/when the
  1799. // request completes successfully, so we don't set the mapping
  1800. // bit down below; do check to see if pointer is valid though.
  1801. //
  1802. LONG lResult;
  1803. if (IsBadWritePtr ((void FAR *) lphCall, sizeof(HCALL)))
  1804. {
  1805. lResult = LINEERR_INVALPOINTER;
  1806. }
  1807. else
  1808. {
  1809. lResult = (*pfnCallProc5)(
  1810. (DWORD) hLine,
  1811. (DWORD) dwAddressID,
  1812. (DWORD) lphCall,
  1813. (DWORD) lpszDestAddress,
  1814. (DWORD) lpszGroupID,
  1815. (LPVOID)gaProcs[lPickup],
  1816. 0x3,
  1817. 5
  1818. );
  1819. }
  1820. LineResult ("Pickup", lResult);
  1821. return lResult;
  1822. }
  1823. LONG
  1824. WINAPI
  1825. linePrepareAddToConference(
  1826. HCALL hConfCall,
  1827. LPHCALL lphConsultCall,
  1828. LPLINECALLPARAMS const lpCallParams
  1829. )
  1830. {
  1831. //
  1832. // Tapi32.dll will take care of mapping lphConsultCall if/when the
  1833. // request completes successfully, so we don't set the mapping
  1834. // bit down below; do check to see if pointer is valid though.
  1835. //
  1836. LONG lResult;
  1837. if (IsBadWritePtr ((void FAR *) lphConsultCall, sizeof(HCALL)))
  1838. {
  1839. lResult = LINEERR_INVALPOINTER;
  1840. }
  1841. else
  1842. {
  1843. lResult = (*pfnCallProc3)(
  1844. (DWORD) hConfCall,
  1845. (DWORD) lphConsultCall,
  1846. (DWORD) lpCallParams,
  1847. (LPVOID)gaProcs[lPrepareAddToConference],
  1848. 0x1,
  1849. 3
  1850. );
  1851. }
  1852. LineResult ("PrepareAddToConference", lResult);
  1853. return lResult;
  1854. }
  1855. LONG
  1856. WINAPI
  1857. lineRedirect(
  1858. HCALL hCall,
  1859. LPCSTR lpszDestAddress,
  1860. DWORD dwCountryCode
  1861. )
  1862. {
  1863. LONG lResult = (*pfnCallProc3)(
  1864. (DWORD) hCall,
  1865. (DWORD) lpszDestAddress,
  1866. (DWORD) dwCountryCode,
  1867. (LPVOID)gaProcs[lRedirect],
  1868. 0x2,
  1869. 3
  1870. );
  1871. LineResult ("Redirect", lResult);
  1872. return lResult;
  1873. }
  1874. LONG
  1875. WINAPI
  1876. lineRegisterRequestRecipient(
  1877. HLINEAPP hLineApp,
  1878. DWORD dwRegistrationInstance,
  1879. DWORD dwRequestMode,
  1880. DWORD bEnable
  1881. )
  1882. {
  1883. LPTAPI_APP_DATA pAppData;
  1884. LONG lResult;
  1885. if ((pAppData = IsValidXxxApp (hLineApp)))
  1886. {
  1887. lResult = (*pfnCallProc4)(
  1888. (DWORD) pAppData->hXxxApp,
  1889. (DWORD) dwRegistrationInstance,
  1890. (DWORD) dwRequestMode,
  1891. (DWORD) bEnable,
  1892. (LPVOID)gaProcs[lRegisterRequestRecipient],
  1893. 0x0,
  1894. 4
  1895. );
  1896. }
  1897. else
  1898. {
  1899. lResult = LINEERR_INVALAPPHANDLE;
  1900. }
  1901. LineResult ("RegisterRequestRecipient", lResult);
  1902. return lResult;
  1903. }
  1904. LONG
  1905. WINAPI
  1906. lineReleaseUserUserInfo(
  1907. HCALL hCall
  1908. )
  1909. {
  1910. LONG lResult = (*pfnCallProc1)(
  1911. (DWORD) hCall,
  1912. (LPVOID)gaProcs[lReleaseUserUserInfo],
  1913. 0x0,
  1914. 1
  1915. );
  1916. LineResult ("ReleaseUserUserInfo", lResult);
  1917. return lResult;
  1918. }
  1919. LONG
  1920. WINAPI
  1921. lineRemoveFromConference(
  1922. HCALL hCall
  1923. )
  1924. {
  1925. LONG lResult = (*pfnCallProc1)(
  1926. (DWORD) hCall,
  1927. (LPVOID)gaProcs[lRemoveFromConference],
  1928. 0x0,
  1929. 1
  1930. );
  1931. LineResult ("RemoveFromConference", lResult);
  1932. return lResult;
  1933. }
  1934. LONG
  1935. WINAPI
  1936. lineRemoveProvider(
  1937. DWORD dwPermanentProviderID,
  1938. HWND hwndOwner
  1939. )
  1940. {
  1941. LONG lResult;
  1942. lResult = (*pfnCallProc2)(
  1943. (DWORD) dwPermanentProviderID,
  1944. (DWORD) (0xffff0000 | hwndOwner),
  1945. (LPVOID)gaProcs[lRemoveProvider],
  1946. 0x0,
  1947. 2
  1948. );
  1949. LineResult ("RemoveProvider", lResult);
  1950. return lResult;
  1951. }
  1952. LONG
  1953. WINAPI
  1954. lineSecureCall(
  1955. HCALL hCall
  1956. )
  1957. {
  1958. LONG lResult = (*pfnCallProc1)(
  1959. (DWORD) hCall,
  1960. (LPVOID)gaProcs[lSecureCall],
  1961. 0x0,
  1962. 1
  1963. );
  1964. LineResult ("SecureCall", lResult);
  1965. return lResult;
  1966. }
  1967. LONG
  1968. WINAPI
  1969. lineSendUserUserInfo(
  1970. HCALL hCall,
  1971. LPCSTR lpsUserUserInfo,
  1972. DWORD dwSize
  1973. )
  1974. {
  1975. LONG lResult = (*pfnCallProc3)(
  1976. (DWORD) hCall,
  1977. (DWORD) lpsUserUserInfo,
  1978. (DWORD) dwSize,
  1979. (LPVOID)gaProcs[lSendUserUserInfo],
  1980. 0x2,
  1981. 3
  1982. );
  1983. LineResult ("SendUserUserInfo", lResult);
  1984. return lResult;
  1985. }
  1986. LONG
  1987. WINAPI
  1988. lineSetAppPriority(
  1989. LPCSTR lpszAppName,
  1990. DWORD dwMediaMode,
  1991. LPLINEEXTENSIONID lpExtensionID,
  1992. DWORD dwRequestMode,
  1993. LPCSTR lpszExtensionName,
  1994. DWORD dwPriority
  1995. )
  1996. {
  1997. LONG lResult;
  1998. // GlobalWire( GlobalHandle(HIWORD(lpszExtensionName)) );
  1999. // GlobalWire( GlobalHandle(HIWORD(lpExtensionID)) );
  2000. // GlobalWire( GlobalHandle(HIWORD(lpszAppName)) );
  2001. lResult = (*pfnCallProc6)(
  2002. (DWORD) lpszAppName,
  2003. (DWORD) dwMediaMode,
  2004. (DWORD) lpExtensionID,
  2005. (DWORD) dwRequestMode,
  2006. (DWORD) lpszExtensionName,
  2007. (DWORD) dwPriority,
  2008. (LPVOID)gaProcs[lSetAppPriority],
  2009. 0x2a,
  2010. 6
  2011. );
  2012. // GlobalUnWire( GlobalHandle(HIWORD(lpszExtensionName)) );
  2013. // GlobalUnWire( GlobalHandle(HIWORD(lpExtensionID)) );
  2014. // GlobalUnWire( GlobalHandle(HIWORD(lpszAppName)) );
  2015. LineResult ("SetAppPriority", lResult);
  2016. return lResult;
  2017. }
  2018. LONG
  2019. WINAPI
  2020. lineSetAppSpecific(
  2021. HCALL hCall,
  2022. DWORD dwAppSpecific
  2023. )
  2024. {
  2025. LONG lResult = (*pfnCallProc2)(
  2026. (DWORD) hCall,
  2027. (DWORD) dwAppSpecific,
  2028. (LPVOID)gaProcs[lSetAppSpecific],
  2029. 0x0,
  2030. 2
  2031. );
  2032. LineResult ("SetAppSpecific", lResult);
  2033. return lResult;
  2034. }
  2035. LONG
  2036. WINAPI
  2037. lineSetCallParams(
  2038. HCALL hCall,
  2039. DWORD dwBearerMode,
  2040. DWORD dwMinRate,
  2041. DWORD dwMaxRate,
  2042. LPLINEDIALPARAMS const lpDialParams
  2043. )
  2044. {
  2045. LONG lResult = (*pfnCallProc5)(
  2046. (DWORD) hCall,
  2047. (DWORD) dwBearerMode,
  2048. (DWORD) dwMinRate,
  2049. (DWORD) dwMaxRate,
  2050. (DWORD) lpDialParams,
  2051. (LPVOID)gaProcs[lSetCallParams],
  2052. 0x1,
  2053. 5
  2054. );
  2055. LineResult ("SetCallParams", lResult);
  2056. return lResult;
  2057. }
  2058. LONG
  2059. WINAPI
  2060. lineSetCallPrivilege(
  2061. HCALL hCall,
  2062. DWORD dwCallPrivilege
  2063. )
  2064. {
  2065. LONG lResult = (*pfnCallProc2)(
  2066. (DWORD) hCall,
  2067. (DWORD) dwCallPrivilege,
  2068. (LPVOID)gaProcs[lSetCallPrivilege],
  2069. 0x0,
  2070. 2
  2071. );
  2072. LineResult ("SetCallPrivilege", lResult);
  2073. return lResult;
  2074. }
  2075. LONG
  2076. WINAPI
  2077. lineSetCurrentLocation(
  2078. HLINEAPP hLineApp,
  2079. DWORD dwLocation
  2080. )
  2081. {
  2082. LPTAPI_APP_DATA pAppData;
  2083. LONG lResult;
  2084. if ((pAppData = IsValidXxxApp (hLineApp)))
  2085. {
  2086. lResult = (*pfnCallProc2)(
  2087. (DWORD) pAppData->hXxxApp,
  2088. (DWORD) dwLocation,
  2089. (LPVOID)gaProcs[lSetCurrentLocation],
  2090. 0x0,
  2091. 2
  2092. );
  2093. }
  2094. else
  2095. {
  2096. lResult = LINEERR_INVALAPPHANDLE;
  2097. }
  2098. LineResult ("SetCurrentLocation", lResult);
  2099. return lResult;
  2100. }
  2101. LONG
  2102. WINAPI
  2103. lineSetDevConfig(
  2104. DWORD dwDeviceID,
  2105. LPVOID const lpDeviceConfig,
  2106. DWORD dwSize,
  2107. LPCSTR lpszDeviceClass
  2108. )
  2109. {
  2110. LONG lResult;
  2111. lResult = (*pfnCallProc4)(
  2112. (DWORD) dwDeviceID,
  2113. (DWORD) lpDeviceConfig,
  2114. (DWORD) dwSize,
  2115. (DWORD) lpszDeviceClass,
  2116. (LPVOID)gaProcs[lSetDevConfig],
  2117. 0x5,
  2118. 4
  2119. );
  2120. LineResult ("SetDevConfig", lResult);
  2121. return lResult;
  2122. }
  2123. LONG
  2124. WINAPI
  2125. lineSetMediaControl(
  2126. HLINE hLine,
  2127. DWORD dwAddressID,
  2128. HCALL hCall,
  2129. DWORD dwSelect,
  2130. LPLINEMEDIACONTROLDIGIT const lpDigitList,
  2131. DWORD dwDigitNumEntries,
  2132. LPLINEMEDIACONTROLMEDIA const lpMediaList,
  2133. DWORD dwMediaNumEntries,
  2134. LPLINEMEDIACONTROLTONE const lpToneList,
  2135. DWORD dwToneNumEntries,
  2136. LPLINEMEDIACONTROLCALLSTATE const lpCallStateList,
  2137. DWORD dwCallStateNumEntries
  2138. )
  2139. {
  2140. LONG lResult = (*pfnCallProc12)(
  2141. (DWORD) hLine,
  2142. (DWORD) dwAddressID,
  2143. (DWORD) hCall,
  2144. (DWORD) dwSelect,
  2145. (DWORD) lpDigitList,
  2146. (DWORD) dwDigitNumEntries,
  2147. (DWORD) lpMediaList,
  2148. (DWORD) dwMediaNumEntries,
  2149. (DWORD) lpToneList,
  2150. (DWORD) dwToneNumEntries,
  2151. (DWORD) lpCallStateList,
  2152. (DWORD) dwCallStateNumEntries,
  2153. (LPVOID)gaProcs[lSetMediaControl],
  2154. 0xaa,
  2155. 12
  2156. );
  2157. LineResult ("SetMediaControl", lResult);
  2158. return lResult;
  2159. }
  2160. LONG
  2161. WINAPI
  2162. lineSetMediaMode(
  2163. HCALL hCall,
  2164. DWORD dwMediaModes
  2165. )
  2166. {
  2167. LONG lResult = (*pfnCallProc2)(
  2168. (DWORD) hCall,
  2169. (DWORD) dwMediaModes,
  2170. (LPVOID)gaProcs[lSetMediaMode],
  2171. 0x0,
  2172. 2
  2173. );
  2174. LineResult ("lineSetMediaMode", lResult);
  2175. return lResult;
  2176. }
  2177. LONG
  2178. WINAPI
  2179. lineSetNumRings(
  2180. HLINE hLine,
  2181. DWORD dwAddressID,
  2182. DWORD dwNumRings
  2183. )
  2184. {
  2185. LONG lResult = (*pfnCallProc3)(
  2186. (DWORD) hLine,
  2187. (DWORD) dwAddressID,
  2188. (DWORD) dwNumRings,
  2189. (LPVOID)gaProcs[lSetNumRings],
  2190. 0x0,
  2191. 3
  2192. );
  2193. LineResult ("SetNumRings", lResult);
  2194. return lResult;
  2195. }
  2196. LONG
  2197. WINAPI
  2198. lineSetStatusMessages(
  2199. HLINE hLine,
  2200. DWORD dwLineStates,
  2201. DWORD dwAddressStates
  2202. )
  2203. {
  2204. LONG lResult = (*pfnCallProc3)(
  2205. (DWORD) hLine,
  2206. (DWORD) dwLineStates,
  2207. (DWORD) dwAddressStates,
  2208. (LPVOID)gaProcs[lSetStatusMessages],
  2209. 0x0,
  2210. 3
  2211. );
  2212. LineResult ("SetStatusMessages", lResult);
  2213. return lResult;
  2214. }
  2215. LONG
  2216. WINAPI
  2217. lineSetTerminal(
  2218. HLINE hLine,
  2219. DWORD dwAddressID,
  2220. HCALL hCall,
  2221. DWORD dwSelect,
  2222. DWORD dwTerminalModes,
  2223. DWORD dwTerminalID,
  2224. DWORD bEnable
  2225. )
  2226. {
  2227. LONG lResult = (*pfnCallProc7)(
  2228. (DWORD) hLine,
  2229. (DWORD) dwAddressID,
  2230. (DWORD) hCall,
  2231. (DWORD) dwSelect,
  2232. (DWORD) dwTerminalModes,
  2233. (DWORD) dwTerminalID,
  2234. (DWORD) bEnable,
  2235. (LPVOID)gaProcs[lSetTerminal],
  2236. 0x0,
  2237. 7
  2238. );
  2239. LineResult ("SetTerminal", lResult);
  2240. return lResult;
  2241. }
  2242. LONG
  2243. WINAPI
  2244. lineSetTollList(
  2245. HLINEAPP hLineApp,
  2246. DWORD dwDeviceID,
  2247. LPCSTR lpszAddressIn,
  2248. DWORD dwTollListOption
  2249. )
  2250. {
  2251. LPTAPI_APP_DATA pAppData;
  2252. LONG lResult;
  2253. if ((pAppData = IsValidXxxApp (hLineApp)))
  2254. {
  2255. lResult = (*pfnCallProc4)(
  2256. (DWORD) pAppData->hXxxApp,
  2257. (DWORD) dwDeviceID,
  2258. (DWORD) lpszAddressIn,
  2259. (DWORD) dwTollListOption,
  2260. (LPVOID)gaProcs[lSetTollList],
  2261. 0x2,
  2262. 4
  2263. );
  2264. }
  2265. else
  2266. {
  2267. lResult = LINEERR_INVALAPPHANDLE;
  2268. }
  2269. LineResult ("SetTollList", lResult);
  2270. return lResult;
  2271. }
  2272. LONG
  2273. WINAPI
  2274. lineSetupConference(
  2275. HCALL hCall,
  2276. HLINE hLine,
  2277. LPHCALL lphConfCall,
  2278. LPHCALL lphConsultCall,
  2279. DWORD dwNumParties,
  2280. LPLINECALLPARAMS const lpCallParams
  2281. )
  2282. {
  2283. //
  2284. // Tapi32.dll will take care of mapping lphXxxCall's if/when the
  2285. // request completes successfully, so we don't set the mapping
  2286. // bit down below; do check to see if pointer is valid though.
  2287. //
  2288. LONG lResult;
  2289. if (IsBadWritePtr ((void FAR *) lphConfCall, sizeof(HCALL)) ||
  2290. IsBadWritePtr ((void FAR *) lphConsultCall, sizeof(HCALL)))
  2291. {
  2292. lResult = LINEERR_INVALPOINTER;
  2293. }
  2294. else
  2295. {
  2296. lResult = (*pfnCallProc6)(
  2297. (DWORD) hCall,
  2298. (DWORD) hLine,
  2299. (DWORD) lphConfCall,
  2300. (DWORD) lphConsultCall,
  2301. (DWORD) dwNumParties,
  2302. (DWORD) lpCallParams,
  2303. (LPVOID)gaProcs[lSetupConference],
  2304. 0x1,
  2305. 6
  2306. );
  2307. }
  2308. LineResult ("SetupConference", lResult);
  2309. return lResult;
  2310. }
  2311. LONG
  2312. WINAPI
  2313. lineSetupTransfer(
  2314. HCALL hCall,
  2315. LPHCALL lphConsultCall,
  2316. LPLINECALLPARAMS const lpCallParams
  2317. )
  2318. {
  2319. //
  2320. // Tapi32.dll will take care of mapping lphConsultCall if/when the
  2321. // request completes successfully, so we don't set the mapping
  2322. // bit down below; do check to see if pointer is valid though.
  2323. //
  2324. LONG lResult;
  2325. if (IsBadWritePtr ((void FAR *) lphConsultCall, sizeof(HCALL)))
  2326. {
  2327. lResult = LINEERR_INVALPOINTER;
  2328. }
  2329. else
  2330. {
  2331. lResult = (*pfnCallProc3)(
  2332. (DWORD) hCall,
  2333. (DWORD) lphConsultCall,
  2334. (DWORD) lpCallParams,
  2335. (LPVOID)gaProcs[lSetupTransfer],
  2336. 0x1,
  2337. 3
  2338. );
  2339. }
  2340. LineResult ("SetupTransfer", lResult);
  2341. return lResult;
  2342. }
  2343. LONG
  2344. WINAPI
  2345. lineShutdown(
  2346. HLINEAPP hLineApp
  2347. )
  2348. {
  2349. LONG lResult;
  2350. LPTAPI_APP_DATA pAppData;
  2351. if ((pAppData = IsValidXxxApp (hLineApp)))
  2352. {
  2353. lResult = (LONG) (*pfnCallProc1)(
  2354. (DWORD) pAppData->hXxxApp,
  2355. (LPVOID)gaProcs[lShutdown],
  2356. 0x0,
  2357. 1
  2358. );
  2359. if ( lResult == 0 )
  2360. {
  2361. //
  2362. // Destroy the associated window & free the app data instance
  2363. //
  2364. DestroyWindow (pAppData->hwnd);
  2365. pAppData->dwKey = 0xefefefef;
  2366. free (pAppData);
  2367. }
  2368. }
  2369. else
  2370. {
  2371. lResult = LINEERR_INVALAPPHANDLE;
  2372. }
  2373. LineResult ("Shutdown", lResult);
  2374. return lResult;
  2375. }
  2376. LONG
  2377. WINAPI
  2378. lineSwapHold(
  2379. HCALL hActiveCall,
  2380. HCALL hHeldCall
  2381. )
  2382. {
  2383. LONG lResult = (*pfnCallProc2)(
  2384. (DWORD) hActiveCall,
  2385. (DWORD) hHeldCall,
  2386. (LPVOID)gaProcs[lSwapHold],
  2387. 0x0,
  2388. 2
  2389. );
  2390. LineResult ("SwapHold", lResult);
  2391. return lResult;
  2392. }
  2393. LONG
  2394. WINAPI
  2395. lineTranslateAddress(
  2396. HLINEAPP hLineApp,
  2397. DWORD dwDeviceID,
  2398. DWORD dwAPIVersion,
  2399. LPCSTR lpszAddressIn,
  2400. DWORD dwCard,
  2401. DWORD dwTranslateOptions,
  2402. LPLINETRANSLATEOUTPUT lpTranslateOutput
  2403. )
  2404. {
  2405. LPTAPI_APP_DATA pAppData;
  2406. LONG lResult;
  2407. if ((pAppData = IsValidXxxApp (hLineApp)))
  2408. {
  2409. lResult = (*pfnCallProc7)(
  2410. (DWORD) pAppData->hXxxApp,
  2411. (DWORD) dwDeviceID,
  2412. (DWORD) dwAPIVersion,
  2413. (DWORD) lpszAddressIn,
  2414. (DWORD) dwCard,
  2415. (DWORD) dwTranslateOptions,
  2416. (DWORD) lpTranslateOutput,
  2417. (LPVOID)gaProcs[lTranslateAddress],
  2418. 0x9,
  2419. 7
  2420. );
  2421. }
  2422. else
  2423. {
  2424. lResult = LINEERR_INVALAPPHANDLE;
  2425. }
  2426. LineResult ("TranslateAddress", lResult);
  2427. return lResult;
  2428. }
  2429. LONG
  2430. WINAPI
  2431. lineTranslateDialog(
  2432. HLINEAPP hLineApp,
  2433. DWORD dwDeviceID,
  2434. DWORD dwAPIVersion,
  2435. HWND hwndOwner,
  2436. LPCSTR lpszAddressIn
  2437. )
  2438. {
  2439. LPTAPI_APP_DATA pAppData;
  2440. LONG lResult;
  2441. if ((pAppData = IsValidXxxApp (hLineApp)))
  2442. {
  2443. lResult = (*pfnCallProc5)(
  2444. (DWORD) pAppData->hXxxApp,
  2445. (DWORD) dwDeviceID,
  2446. (DWORD) dwAPIVersion,
  2447. (DWORD) (0xffff0000 | hwndOwner),
  2448. (DWORD) lpszAddressIn,
  2449. (LPVOID)gaProcs[lTranslateDialog],
  2450. 0x1,
  2451. 5
  2452. );
  2453. }
  2454. else
  2455. {
  2456. lResult = LINEERR_INVALAPPHANDLE;
  2457. }
  2458. LineResult ("TranslateDialog", lResult);
  2459. return lResult;
  2460. }
  2461. LONG
  2462. WINAPI
  2463. lineUncompleteCall(
  2464. HLINE hLine,
  2465. DWORD dwCompletionID
  2466. )
  2467. {
  2468. LONG lResult = (*pfnCallProc2)(
  2469. (DWORD) hLine,
  2470. (DWORD) dwCompletionID,
  2471. (LPVOID)gaProcs[lUncompleteCall],
  2472. 0x0,
  2473. 2
  2474. );
  2475. LineResult ("UncompleteCall", lResult);
  2476. return lResult;
  2477. }
  2478. LONG
  2479. WINAPI
  2480. lineUnhold(
  2481. HCALL hCall
  2482. )
  2483. {
  2484. LONG lResult = (*pfnCallProc1)(
  2485. (DWORD) hCall,
  2486. (LPVOID)gaProcs[lUnhold],
  2487. 0x0,
  2488. 1
  2489. );
  2490. LineResult ("Unhold", lResult);
  2491. return lResult;
  2492. }
  2493. LONG
  2494. WINAPI
  2495. lineUnpark(
  2496. HLINE hLine,
  2497. DWORD dwAddressID,
  2498. LPHCALL lphCall,
  2499. LPCSTR lpszDestAddress
  2500. )
  2501. {
  2502. //
  2503. // Tapi32.dll will take care of mapping lphCall if/when the
  2504. // request completes successfully, so we don't set the mapping
  2505. // bit down below; do check to see if pointer is valid though.
  2506. //
  2507. LONG lResult;
  2508. if (IsBadWritePtr ((void FAR *) lphCall, sizeof(HCALL)))
  2509. {
  2510. lResult = LINEERR_INVALPOINTER;
  2511. }
  2512. else
  2513. {
  2514. lResult = (*pfnCallProc4)(
  2515. (DWORD) hLine,
  2516. (DWORD) dwAddressID,
  2517. (DWORD) lphCall,
  2518. (DWORD) lpszDestAddress,
  2519. (LPVOID)gaProcs[lUnpark],
  2520. 0x1,
  2521. 4
  2522. );
  2523. }
  2524. LineResult ("Unpark", lResult);
  2525. return lResult;
  2526. }
  2527. LONG
  2528. WINAPI
  2529. phoneClose(
  2530. HPHONE hPhone
  2531. )
  2532. {
  2533. LONG lResult = (*pfnCallProc1)(
  2534. (DWORD) hPhone,
  2535. (LPVOID)gaProcs[pClose],
  2536. 0x0,
  2537. 1
  2538. );
  2539. PhoneResult ("Close", lResult);
  2540. return lResult;
  2541. }
  2542. LONG
  2543. WINAPI
  2544. phoneConfigDialog(
  2545. DWORD dwDeviceID,
  2546. HWND hwndOwner,
  2547. LPCSTR lpszDeviceClass
  2548. )
  2549. {
  2550. LONG lResult;
  2551. lResult = (*pfnCallProc3)(
  2552. (DWORD) dwDeviceID,
  2553. (DWORD) (0xffff0000 | hwndOwner),
  2554. (DWORD) lpszDeviceClass,
  2555. (LPVOID)gaProcs[pConfigDialog],
  2556. 0x1,
  2557. 3
  2558. );
  2559. PhoneResult ("ConfigDialog", lResult);
  2560. return lResult;
  2561. }
  2562. LONG
  2563. WINAPI
  2564. phoneDevSpecific(
  2565. HPHONE hPhone,
  2566. LPVOID lpParams,
  2567. DWORD dwSize
  2568. )
  2569. {
  2570. LONG lResult;
  2571. if (IsBadWritePtr (lpParams, (UINT) dwSize))
  2572. {
  2573. lResult = PHONEERR_INVALPOINTER;
  2574. }
  2575. else
  2576. {
  2577. lResult = (*pfnCallProc3)(
  2578. (DWORD) hPhone,
  2579. (DWORD) lpParams, // let tapi32.dll map this
  2580. (DWORD) dwSize,
  2581. (LPVOID)gaProcs[pDevSpecific],
  2582. 0x0,
  2583. 3
  2584. );
  2585. }
  2586. PhoneResult ("DevSpecific", lResult);
  2587. return lResult;
  2588. }
  2589. LONG
  2590. WINAPI
  2591. phoneGetButtonInfo(
  2592. HPHONE hPhone,
  2593. DWORD dwButtonLampID,
  2594. LPPHONEBUTTONINFO lpButtonInfo
  2595. )
  2596. {
  2597. LONG lResult = (*pfnCallProc3)(
  2598. (DWORD) hPhone,
  2599. (DWORD) dwButtonLampID,
  2600. (DWORD) lpButtonInfo,
  2601. (LPVOID)gaProcs[pGetButtonInfo],
  2602. 0x1,
  2603. 3
  2604. );
  2605. PhoneResult ("GetButtonInfo", lResult);
  2606. return lResult;
  2607. }
  2608. LONG
  2609. WINAPI
  2610. phoneGetData(
  2611. HPHONE hPhone,
  2612. DWORD dwDataID,
  2613. LPVOID lpData,
  2614. DWORD dwSize
  2615. )
  2616. {
  2617. LONG lResult = (*pfnCallProc4)(
  2618. (DWORD) hPhone,
  2619. (DWORD) dwDataID,
  2620. (DWORD) lpData,
  2621. (DWORD) dwSize,
  2622. (LPVOID)gaProcs[pGetData],
  2623. 0x2,
  2624. 4
  2625. );
  2626. PhoneResult ("GetData", lResult);
  2627. return lResult;
  2628. }
  2629. LONG
  2630. WINAPI
  2631. phoneGetDevCaps(
  2632. HPHONEAPP hPhoneApp,
  2633. DWORD dwDeviceID,
  2634. DWORD dwAPIVersion,
  2635. DWORD dwExtVersion,
  2636. LPPHONECAPS lpPhoneCaps
  2637. )
  2638. {
  2639. LONG lResult;
  2640. LPTAPI_APP_DATA pAppData;
  2641. if ((pAppData = IsValidXxxApp ((HLINEAPP) hPhoneApp)))
  2642. {
  2643. lResult = (*pfnCallProc5)(
  2644. (DWORD) pAppData->hXxxApp,
  2645. (DWORD) dwDeviceID,
  2646. (DWORD) dwAPIVersion,
  2647. (DWORD) dwExtVersion,
  2648. (DWORD) lpPhoneCaps,
  2649. (LPVOID)gaProcs[pGetDevCaps],
  2650. 0x1,
  2651. 5
  2652. );
  2653. }
  2654. else
  2655. {
  2656. lResult = PHONEERR_INVALAPPHANDLE;
  2657. }
  2658. PhoneResult ("GetDevCaps", lResult);
  2659. return lResult;
  2660. }
  2661. LONG
  2662. WINAPI
  2663. phoneGetDisplay(
  2664. HPHONE hPhone,
  2665. LPVARSTRING lpDisplay
  2666. )
  2667. {
  2668. LONG lResult = (*pfnCallProc2)(
  2669. (DWORD) hPhone,
  2670. (DWORD) lpDisplay,
  2671. (LPVOID)gaProcs[pGetDisplay],
  2672. 0x1,
  2673. 2
  2674. );
  2675. PhoneResult ("GetDisplay", lResult);
  2676. return lResult;
  2677. }
  2678. LONG
  2679. WINAPI
  2680. phoneGetGain(
  2681. HPHONE hPhone,
  2682. DWORD dwHookSwitchDev,
  2683. LPDWORD lpdwGain
  2684. )
  2685. {
  2686. LONG lResult = (*pfnCallProc3)(
  2687. (DWORD) hPhone,
  2688. (DWORD) dwHookSwitchDev,
  2689. (DWORD) lpdwGain,
  2690. (LPVOID)gaProcs[pGetGain],
  2691. 0x1,
  2692. 3
  2693. );
  2694. PhoneResult ("GetGain", lResult);
  2695. return lResult;
  2696. }
  2697. LONG
  2698. WINAPI
  2699. phoneGetHookSwitch(
  2700. HPHONE hPhone,
  2701. LPDWORD lpdwHookSwitchDevs
  2702. )
  2703. {
  2704. LONG lResult = (*pfnCallProc2)(
  2705. (DWORD) hPhone,
  2706. (DWORD) lpdwHookSwitchDevs,
  2707. (LPVOID)gaProcs[pGetHookSwitch],
  2708. 0x1,
  2709. 2
  2710. );
  2711. PhoneResult ("GetHookSwitch", lResult);
  2712. return lResult;
  2713. }
  2714. LONG
  2715. WINAPI
  2716. phoneGetIcon(
  2717. DWORD dwDeviceID,
  2718. LPCSTR lpszDeviceClass,
  2719. LPHICON lphIcon
  2720. )
  2721. {
  2722. LONG lResult;
  2723. DWORD hIcon32;
  2724. if (!IsBadWritePtr (lphIcon, sizeof (*lphIcon)))
  2725. {
  2726. lResult = (*pfnCallProc3)(
  2727. (DWORD) dwDeviceID,
  2728. (DWORD) lpszDeviceClass,
  2729. (DWORD) &hIcon32,
  2730. (LPVOID) gaProcs[pGetIcon],
  2731. 0x3,
  2732. 3
  2733. );
  2734. if (lResult == 0)
  2735. {
  2736. if (!ghIcon)
  2737. {
  2738. MyCreateIcon ();
  2739. }
  2740. *lphIcon = ghIcon;
  2741. }
  2742. }
  2743. else
  2744. {
  2745. lResult = PHONEERR_INVALPOINTER;
  2746. }
  2747. PhoneResult ("GetIcon", lResult);
  2748. return lResult;
  2749. }
  2750. LONG
  2751. WINAPI
  2752. phoneGetID(
  2753. HPHONE hPhone,
  2754. LPVARSTRING lpDeviceID,
  2755. LPCSTR lpszDeviceClass
  2756. )
  2757. {
  2758. LONG lResult = (*pfnCallProc3)(
  2759. (DWORD) hPhone,
  2760. (DWORD) lpDeviceID,
  2761. (DWORD) lpszDeviceClass,
  2762. (LPVOID)gaProcs[pGetID],
  2763. 0x3,
  2764. 3
  2765. );
  2766. PhoneResult ("GetID", lResult);
  2767. return lResult;
  2768. }
  2769. LONG
  2770. WINAPI
  2771. phoneGetLamp(
  2772. HPHONE hPhone,
  2773. DWORD dwButtonLampID,
  2774. LPDWORD lpdwLampMode
  2775. )
  2776. {
  2777. LONG lResult = (*pfnCallProc3)(
  2778. (DWORD) hPhone,
  2779. (DWORD) dwButtonLampID,
  2780. (DWORD) lpdwLampMode,
  2781. (LPVOID)gaProcs[pGetLamp],
  2782. 0x1,
  2783. 3
  2784. );
  2785. PhoneResult ("GetLamp", lResult);
  2786. return lResult;
  2787. }
  2788. LONG
  2789. WINAPI
  2790. phoneGetRing(
  2791. HPHONE hPhone,
  2792. LPDWORD lpdwRingMode,
  2793. LPDWORD lpdwVolume
  2794. )
  2795. {
  2796. LONG lResult = (*pfnCallProc3)(
  2797. (DWORD) hPhone,
  2798. (DWORD) lpdwRingMode,
  2799. (DWORD) lpdwVolume,
  2800. (LPVOID)gaProcs[pGetRing],
  2801. 0x3,
  2802. 3
  2803. );
  2804. PhoneResult ("GetRing", lResult);
  2805. return lResult;
  2806. }
  2807. LONG
  2808. WINAPI
  2809. phoneGetStatus(
  2810. HPHONE hPhone,
  2811. LPPHONESTATUS lpPhoneStatus
  2812. )
  2813. {
  2814. LONG lResult = (*pfnCallProc2)(
  2815. (DWORD) hPhone,
  2816. (DWORD) lpPhoneStatus,
  2817. (LPVOID)gaProcs[pGetStatus],
  2818. 0x1,
  2819. 2
  2820. );
  2821. PhoneResult ("GetStatus", lResult);
  2822. return lResult;
  2823. }
  2824. LONG
  2825. WINAPI
  2826. phoneGetStatusMessages(
  2827. HPHONE hPhone,
  2828. LPDWORD lpdwPhoneStates,
  2829. LPDWORD lpdwButtonModes,
  2830. LPDWORD lpdwButtonStates
  2831. )
  2832. {
  2833. LONG lResult = (*pfnCallProc4)(
  2834. (DWORD) hPhone,
  2835. (DWORD) lpdwPhoneStates,
  2836. (DWORD) lpdwButtonModes,
  2837. (DWORD) lpdwButtonStates,
  2838. (LPVOID)gaProcs[pGetStatusMessages],
  2839. 0x7,
  2840. 4
  2841. );
  2842. PhoneResult ("GetStatusMessages", lResult);
  2843. return lResult;
  2844. }
  2845. LONG
  2846. WINAPI
  2847. phoneGetVolume(
  2848. HPHONE hPhone,
  2849. DWORD dwHookSwitchDev,
  2850. LPDWORD lpdwVolume
  2851. )
  2852. {
  2853. LONG lResult = (*pfnCallProc3)(
  2854. (DWORD) hPhone,
  2855. (DWORD) dwHookSwitchDev,
  2856. (DWORD) lpdwVolume,
  2857. (LPVOID)gaProcs[pGetVolume],
  2858. 0x1,
  2859. 3
  2860. );
  2861. PhoneResult ("GetVolume", lResult);
  2862. return lResult;
  2863. }
  2864. LONG
  2865. WINAPI
  2866. phoneInitialize(
  2867. LPHPHONEAPP lphPhoneApp,
  2868. HINSTANCE hInstance,
  2869. PHONECALLBACK lpfnCallback,
  2870. LPCSTR lpszAppName,
  2871. LPDWORD lpdwNumDevs
  2872. )
  2873. {
  2874. return (xxxInitialize(
  2875. FALSE,
  2876. (LPHLINEAPP) lphPhoneApp,
  2877. hInstance,
  2878. lpfnCallback,
  2879. lpszAppName,
  2880. lpdwNumDevs
  2881. ));
  2882. }
  2883. LONG
  2884. WINAPI
  2885. phoneNegotiateAPIVersion(
  2886. HPHONEAPP hPhoneApp,
  2887. DWORD dwDeviceID,
  2888. DWORD dwAPILowVersion,
  2889. DWORD dwAPIHighVersion,
  2890. LPDWORD lpdwAPIVersion,
  2891. LPPHONEEXTENSIONID lpExtensionID
  2892. )
  2893. {
  2894. LONG lResult;
  2895. LPTAPI_APP_DATA pAppData;
  2896. if ((pAppData = IsValidXxxApp ((HLINEAPP) hPhoneApp)))
  2897. {
  2898. lResult = (*pfnCallProc6)(
  2899. (DWORD) pAppData->hXxxApp,
  2900. (DWORD) dwDeviceID,
  2901. (DWORD) dwAPILowVersion,
  2902. (DWORD) dwAPIHighVersion,
  2903. (DWORD) lpdwAPIVersion,
  2904. (DWORD) lpExtensionID,
  2905. (LPVOID)gaProcs[pNegotiateAPIVersion],
  2906. 0x3,
  2907. 6
  2908. );
  2909. }
  2910. else
  2911. {
  2912. lResult = PHONEERR_INVALAPPHANDLE;
  2913. }
  2914. PhoneResult ("NegotiateAPIVersion", lResult);
  2915. return lResult;
  2916. }
  2917. LONG
  2918. WINAPI
  2919. phoneNegotiateExtVersion(
  2920. HPHONEAPP hPhoneApp,
  2921. DWORD dwDeviceID,
  2922. DWORD dwAPIVersion,
  2923. DWORD dwExtLowVersion,
  2924. DWORD dwExtHighVersion,
  2925. LPDWORD lpdwExtVersion
  2926. )
  2927. {
  2928. LONG lResult;
  2929. LPTAPI_APP_DATA pAppData;
  2930. if ((pAppData = IsValidXxxApp ((HLINEAPP) hPhoneApp)))
  2931. {
  2932. lResult = (*pfnCallProc6)(
  2933. (DWORD) pAppData->hXxxApp,
  2934. (DWORD) dwDeviceID,
  2935. (DWORD) dwAPIVersion,
  2936. (DWORD) dwExtLowVersion,
  2937. (DWORD) dwExtHighVersion,
  2938. (DWORD) lpdwExtVersion,
  2939. (LPVOID)gaProcs[pNegotiateExtVersion],
  2940. 0x1,
  2941. 6
  2942. );
  2943. }
  2944. else
  2945. {
  2946. lResult = PHONEERR_INVALAPPHANDLE;
  2947. }
  2948. PhoneResult ("NegotiateExtVersion", lResult);
  2949. return lResult;
  2950. }
  2951. LONG
  2952. WINAPI
  2953. phoneOpen(
  2954. HPHONEAPP hPhoneApp,
  2955. DWORD dwDeviceID,
  2956. LPHPHONE lphPhone,
  2957. DWORD dwAPIVersion,
  2958. DWORD dwExtVersion,
  2959. DWORD dwCallbackInstance,
  2960. DWORD dwPrivilege
  2961. )
  2962. {
  2963. LONG lResult;
  2964. LPTAPI_APP_DATA pAppData;
  2965. if ((pAppData = IsValidXxxApp ((HLINEAPP) hPhoneApp)))
  2966. {
  2967. lResult = (*pfnCallProc7)(
  2968. (DWORD) pAppData->hXxxApp,
  2969. (DWORD) dwDeviceID,
  2970. (DWORD) lphPhone,
  2971. (DWORD) dwAPIVersion,
  2972. (DWORD) dwExtVersion,
  2973. (DWORD) dwCallbackInstance,
  2974. (DWORD) dwPrivilege,
  2975. (LPVOID)gaProcs[pOpen],
  2976. 0x10,
  2977. 7
  2978. );
  2979. }
  2980. else
  2981. {
  2982. lResult = PHONEERR_INVALAPPHANDLE;
  2983. }
  2984. PhoneResult ("Open", lResult);
  2985. return lResult;
  2986. }
  2987. LONG
  2988. WINAPI
  2989. phoneSetButtonInfo(
  2990. HPHONE hPhone,
  2991. DWORD dwButtonLampID,
  2992. LPPHONEBUTTONINFO const lpButtonInfo
  2993. )
  2994. {
  2995. LONG lResult = (*pfnCallProc3)(
  2996. (DWORD) hPhone,
  2997. (DWORD) dwButtonLampID,
  2998. (DWORD) lpButtonInfo,
  2999. (LPVOID)gaProcs[pSetButtonInfo],
  3000. 0x1,
  3001. 3
  3002. );
  3003. PhoneResult ("SetButtonInfo", lResult);
  3004. return lResult;
  3005. }
  3006. LONG
  3007. WINAPI
  3008. phoneSetData(
  3009. HPHONE hPhone,
  3010. DWORD dwDataID,
  3011. LPVOID const lpData,
  3012. DWORD dwSize
  3013. )
  3014. {
  3015. LONG lResult = (*pfnCallProc4)(
  3016. (DWORD) hPhone,
  3017. (DWORD) dwDataID,
  3018. (DWORD) lpData,
  3019. (DWORD) dwSize,
  3020. (LPVOID)gaProcs[pSetData],
  3021. 0x2,
  3022. 4
  3023. );
  3024. PhoneResult ("SetData", lResult);
  3025. return lResult;
  3026. }
  3027. LONG
  3028. WINAPI
  3029. phoneSetDisplay(
  3030. HPHONE hPhone,
  3031. DWORD dwRow,
  3032. DWORD dwColumn,
  3033. LPCSTR lpsDisplay,
  3034. DWORD dwSize
  3035. )
  3036. {
  3037. LONG lResult = (*pfnCallProc5)(
  3038. (DWORD) hPhone,
  3039. (DWORD) dwRow,
  3040. (DWORD) dwColumn,
  3041. (DWORD) lpsDisplay,
  3042. (DWORD) dwSize,
  3043. (LPVOID)gaProcs[pSetDisplay],
  3044. 0x2,
  3045. 5
  3046. );
  3047. PhoneResult ("SetDisplay", lResult);
  3048. return lResult;
  3049. }
  3050. LONG
  3051. WINAPI
  3052. phoneSetGain(
  3053. HPHONE hPhone,
  3054. DWORD dwHookSwitchDev,
  3055. DWORD dwGain
  3056. )
  3057. {
  3058. LONG lResult = (*pfnCallProc3)(
  3059. (DWORD) hPhone,
  3060. (DWORD) dwHookSwitchDev,
  3061. (DWORD) dwGain,
  3062. (LPVOID)gaProcs[pSetGain],
  3063. 0x0,
  3064. 3
  3065. );
  3066. PhoneResult ("SetGain", lResult);
  3067. return lResult;
  3068. }
  3069. LONG
  3070. WINAPI
  3071. phoneSetHookSwitch(
  3072. HPHONE hPhone,
  3073. DWORD dwHookSwitchDevs,
  3074. DWORD dwHookSwitchMode
  3075. )
  3076. {
  3077. LONG lResult = (*pfnCallProc3)(
  3078. (DWORD) hPhone,
  3079. (DWORD) dwHookSwitchDevs,
  3080. (DWORD) dwHookSwitchMode,
  3081. (LPVOID)gaProcs[pSetHookSwitch],
  3082. 0x0,
  3083. 3
  3084. );
  3085. PhoneResult ("SetHookSwitch", lResult);
  3086. return lResult;
  3087. }
  3088. LONG
  3089. WINAPI
  3090. phoneSetLamp(
  3091. HPHONE hPhone,
  3092. DWORD dwButtonLampID,
  3093. DWORD dwLampMode
  3094. )
  3095. {
  3096. LONG lResult = (*pfnCallProc3)(
  3097. (DWORD) hPhone,
  3098. (DWORD) dwButtonLampID,
  3099. (DWORD) dwLampMode,
  3100. (LPVOID)gaProcs[pSetLamp],
  3101. 0x0,
  3102. 3
  3103. );
  3104. PhoneResult ("SetLamp", lResult);
  3105. return lResult;
  3106. }
  3107. LONG
  3108. WINAPI
  3109. phoneSetRing(
  3110. HPHONE hPhone,
  3111. DWORD dwRingMode,
  3112. DWORD dwVolume
  3113. )
  3114. {
  3115. LONG lResult = (*pfnCallProc3)(
  3116. (DWORD) hPhone,
  3117. (DWORD) dwRingMode,
  3118. (DWORD) dwVolume,
  3119. (LPVOID)gaProcs[pSetRing],
  3120. 0x0,
  3121. 3
  3122. );
  3123. PhoneResult ("SetRing", lResult);
  3124. return lResult;
  3125. }
  3126. LONG
  3127. WINAPI
  3128. phoneSetStatusMessages(
  3129. HPHONE hPhone,
  3130. DWORD dwPhoneStates,
  3131. DWORD dwButtonModes,
  3132. DWORD dwButtonStates
  3133. )
  3134. {
  3135. LONG lResult = (*pfnCallProc4)(
  3136. (DWORD) hPhone,
  3137. (DWORD) dwPhoneStates,
  3138. (DWORD) dwButtonModes,
  3139. (DWORD) dwButtonStates,
  3140. (LPVOID)gaProcs[pSetStatusMessages],
  3141. 0x0,
  3142. 4
  3143. );
  3144. PhoneResult ("SetStatusMessages", lResult);
  3145. return lResult;
  3146. }
  3147. LONG
  3148. WINAPI
  3149. phoneSetVolume(
  3150. HPHONE hPhone,
  3151. DWORD dwHookSwitchDev,
  3152. DWORD dwVolume
  3153. )
  3154. {
  3155. LONG lResult = (*pfnCallProc3)(
  3156. (DWORD) hPhone,
  3157. (DWORD) dwHookSwitchDev,
  3158. (DWORD) dwVolume,
  3159. (LPVOID)gaProcs[pSetVolume],
  3160. 0x0,
  3161. 3
  3162. );
  3163. PhoneResult ("SetVolume", lResult);
  3164. return lResult;
  3165. }
  3166. LONG
  3167. WINAPI
  3168. phoneShutdown(
  3169. HPHONEAPP hPhoneApp
  3170. )
  3171. {
  3172. LONG lResult;
  3173. LPTAPI_APP_DATA pAppData;
  3174. if ((pAppData = IsValidXxxApp ((HLINEAPP) hPhoneApp)))
  3175. {
  3176. if ((lResult = (*pfnCallProc1)(
  3177. (DWORD) pAppData->hXxxApp,
  3178. (LPVOID)gaProcs[pShutdown],
  3179. 0x0,
  3180. 1
  3181. )) == 0)
  3182. {
  3183. //
  3184. // Destroy the associated window & free the app data instance
  3185. //
  3186. DestroyWindow (pAppData->hwnd);
  3187. pAppData->dwKey = 0xefefefef;
  3188. free (pAppData);
  3189. }
  3190. }
  3191. else
  3192. {
  3193. lResult = PHONEERR_INVALAPPHANDLE;
  3194. }
  3195. PhoneResult ("Shutdown", lResult);
  3196. return lResult;
  3197. }
  3198. LONG
  3199. WINAPI
  3200. tapiRequestMakeCall(
  3201. LPCSTR lpszDestAddress,
  3202. LPCSTR lpszAppName,
  3203. LPCSTR lpszCalledParty,
  3204. LPCSTR lpszComment
  3205. )
  3206. {
  3207. LONG lResult;
  3208. lResult = (*pfnCallProc4)(
  3209. (DWORD) lpszDestAddress,
  3210. (DWORD) lpszAppName,
  3211. (DWORD) lpszCalledParty,
  3212. (DWORD) lpszComment,
  3213. (LPVOID)gaProcs[tRequestMakeCall],
  3214. 0xf,
  3215. 4
  3216. );
  3217. TapiResult ("RequestMakeCall", lResult);
  3218. return lResult;
  3219. }
  3220. LONG
  3221. WINAPI
  3222. tapiRequestMediaCall(
  3223. HWND hWnd,
  3224. WPARAM wRequestID,
  3225. LPCSTR lpszDeviceClass,
  3226. LPCSTR lpDeviceID,
  3227. DWORD dwSize,
  3228. DWORD dwSecure,
  3229. LPCSTR lpszDestAddress,
  3230. LPCSTR lpszAppName,
  3231. LPCSTR lpszCalledParty,
  3232. LPCSTR lpszComment
  3233. )
  3234. {
  3235. LONG lResult;
  3236. lResult = (*pfnCallProc10)(
  3237. (DWORD) hWnd,
  3238. (DWORD) wRequestID,
  3239. (DWORD) lpszDeviceClass,
  3240. (DWORD) lpDeviceID,
  3241. (DWORD) dwSize,
  3242. (DWORD) dwSecure,
  3243. (DWORD) lpszDestAddress,
  3244. (DWORD) lpszAppName,
  3245. (DWORD) lpszCalledParty,
  3246. (DWORD) lpszComment,
  3247. (LPVOID)gaProcs[tRequestMediaCall],
  3248. 0xcf,
  3249. 10
  3250. );
  3251. TapiResult ("RequestMediaCall", lResult);
  3252. return lResult;
  3253. }
  3254. LONG
  3255. WINAPI
  3256. tapiRequestDrop(
  3257. HWND hWnd,
  3258. WPARAM wRequestID
  3259. )
  3260. {
  3261. LONG lResult;
  3262. lResult = (*pfnCallProc2)(
  3263. (DWORD) hWnd,
  3264. (DWORD) wRequestID,
  3265. (LPVOID)gaProcs[tRequestDrop],
  3266. 0x0,
  3267. 2
  3268. );
  3269. TapiResult ("Drop", lResult);
  3270. return lResult;
  3271. }
  3272. LONG
  3273. WINAPI
  3274. tapiGetLocationInfo(
  3275. LPSTR lpszCountryCode,
  3276. LPSTR lpszCityCode
  3277. )
  3278. {
  3279. LONG lResult;
  3280. lResult = (*pfnCallProc2)(
  3281. (DWORD) lpszCountryCode,
  3282. (DWORD) lpszCityCode,
  3283. (LPVOID)gaProcs[tGetLocationInfo],
  3284. 0x3,
  3285. 2
  3286. );
  3287. TapiResult ("GetLocationInfo", lResult);
  3288. return lResult;
  3289. }
  3290. //*******************************************************************************
  3291. //*******************************************************************************
  3292. //*******************************************************************************
  3293. LONG
  3294. WINAPI
  3295. LAddrParamsInited(
  3296. LPDWORD lpdwInited
  3297. )
  3298. {
  3299. LONG lResult;
  3300. lResult = (*pfnCallProc1)(
  3301. (DWORD)lpdwInited,
  3302. (LPVOID)gaProcs[LAddrParamsInitedVAL],
  3303. 0x1,
  3304. 1
  3305. );
  3306. LineResult ("LAddrParamsInited", lResult);
  3307. return lResult;
  3308. }
  3309. //*******************************************************************************
  3310. //*******************************************************************************
  3311. //*******************************************************************************
  3312. LONG
  3313. WINAPI
  3314. LOpenDialAsst(
  3315. HWND hwnd,
  3316. LPCSTR lpszAddressIn,
  3317. BOOL fSimple,
  3318. BOOL fSilentInstall)
  3319. {
  3320. LONG lResult;
  3321. lResult = (*pfnCallProc4)(
  3322. hwnd,
  3323. (DWORD)lpszAddressIn,
  3324. fSimple,
  3325. fSilentInstall,
  3326. (LPVOID)gaProcs[LOpenDialAsstVAL],
  3327. 0x4,
  3328. 4
  3329. );
  3330. LineResult ("LOpenDialAsst", lResult);
  3331. return lResult;
  3332. }
  3333. //*******************************************************************************
  3334. //*******************************************************************************
  3335. //*******************************************************************************
  3336. //BOOL CALLBACK EXPORT __loadds LocWizardDlgProc(
  3337. //BOOL CALLBACK LocWizardDlgProc(
  3338. BOOL CALLBACK _loadds LocWizardDlgProc(
  3339. HWND hWnd,
  3340. UINT uMessage,
  3341. WPARAM wParam,
  3342. LPARAM lParam)
  3343. {
  3344. DWORD dwMapFlags = 0;
  3345. DWORD dwNewwParam = wParam;
  3346. LPARAM dwNewlParam = lParam;
  3347. LONG Newnmhdr[3];
  3348. if (
  3349. ( WM_HELP == uMessage ) ||
  3350. ( WM_NOTIFY == uMessage )
  3351. )
  3352. {
  3353. //
  3354. // For these messages, lParam is a pointer. Let's tell the thunk thing
  3355. // to map it.
  3356. //
  3357. dwMapFlags = 0x1;
  3358. if ( WM_NOTIFY == uMessage )
  3359. {
  3360. //
  3361. // Rebuild for 32bit
  3362. //
  3363. Newnmhdr[0] = (DWORD)(((NMHDR *)lParam)->hwndFrom);
  3364. Newnmhdr[1] = (LONG)((int)((NMHDR *)lParam)->idFrom);
  3365. Newnmhdr[2] = (LONG)((int)((NMHDR *)lParam)->code);
  3366. dwNewlParam = (LPARAM)&Newnmhdr;
  3367. }
  3368. }
  3369. else
  3370. {
  3371. if ( WM_COMMAND == uMessage )
  3372. {
  3373. if (
  3374. (EN_CHANGE == HIWORD(lParam)) ||
  3375. (CBN_SELCHANGE == HIWORD(lParam))
  3376. )
  3377. {
  3378. //
  3379. // Move the command to the new Win32 place, and zero out the old command place
  3380. //
  3381. dwNewwParam |= ( ((DWORD)HIWORD(lParam)) << 16 );
  3382. dwNewlParam &= 0x0000ffff;
  3383. }
  3384. }
  3385. }
  3386. return (BOOL)(*pfnCallProc4)(
  3387. hWnd,
  3388. uMessage,
  3389. dwNewwParam,
  3390. dwNewlParam,
  3391. (LPVOID)gaProcs[LocWizardDlgProc32],
  3392. dwMapFlags,
  3393. 4
  3394. );
  3395. }