CodeData equ <THUNK16BCodeData>

include thkrp.inc
include cbcheck.inc
include thkframe.inc
include public.inc
include thkmacro.inc
;include struc.inc

include cbcid.inc
include tapicbid.inc

;externDef IsBadCodePtr:far16
externDef CALLBACK_BODY_16:far16
externDef Escape:far16
externDef AllocCallback:far16
externDef MapLS:far16
externDef UnmapLS:far16
ifdef DEBUG
externDef _wsprintf:far16
externDef OutputDebugString:far16
endif

externDef FreeCallback:far16


externDef lineInitialize:far16
externDef phoneInitialize:far16
externDef lineShutdown:far16
externDef phoneShutdown:far16


public addrCBLineInit   ;Address of callback routine passed in lineInitialize
public addrCBPhoneInit  ;Address of callback routine passed in phoneInitialize
public cbcidTapi        ;Callback ID for client returned by RegisterCBClient
_DATA     SEGMENT
addrCBLineInit          dd 0
addrCBPhoneInit         dd 0
cbcidTapi               dd 0
_DATA ENDS

ifdef DEBUG
;; Writes message to debug port.
;;
;; Usage:
;;      DPRINT "I'm feeling buggy."
;;
DPRINT  macro   string
        local   mes, skip_mes

        jmp     skip_mes
mes     db      &string&,13,10,0
skip_mes:
        push    eax     ;Save all registers not preserved by PASCAL format.
        push    ebx
        push    ecx
        push    edx
        
        push    cs      ;Arg: OutputDebugString(lpstr)
        push    offset mes
        call    OutputDebugString

        pop     edx
        pop     ecx
        pop     ebx
        pop     eax
endm  ;DPRINT
endif


;-----------------------------------------------------------------------;
; body_LINEINITIALIZE16
;-----------------------------------------------------------------------;
body_LINEINITIALIZE16 macro

;LONG lineInitialize16 (LPHLINEAPP lphLineApp,
;                     HINSTANCE hInstance,
;                     LINECALLBACK lpfnCallback,
;                     LPCSTR lpszAppName,
;                     LPDWORD lpdwNumDevs)
;
bp_lphLineApp           equ     <bp_top>
bp_hInstance            equ     <bp_top+4>
bp_lpfnCallback         equ     <bp_top+8>
bp_lpszAppName          equ     <bp_top+12>
bp_lpdwNumDevs          equ     <bp_top+16>
;

bp_lpszAppNameTmp       equ     <dword ptr [bp-4]>
bp_lpdwNumDevsTmp       equ     <dword ptr [bp-8]>
bp_lphLineAppTmp        equ     <dword ptr [bp-12]>

        ;
        ; First order of business: check the code pointer.  If it's
        ; bogus, we leave.
        ;

;        push    dword ptr bp_lpfnCallback
;        call    IsBadCodePtr
;        or      eax, eax
;        jnz     DoNothing

        sub     eax, eax
        push    eax                             ;bp_lpszAppNameTmp
        push    eax                             ;bp_lpdwNumDevsTmp
        push    eax                             ;bp_lphLineAppTmp

        push    dword ptr bp_lphLineApp
        call    MapLS
        mov     bp_lphLineAppTmp, eax
        push    eax

        mov     eax, dword ptr bp_hInstance     ; Get the hInst
        or      eax, eax                        ; Is it NULL?
        jz      @f                              ; Yup, and that's ok.
        MAP_NULL_HINST eax                      ; Needs to be mapped.
        push    ax

;       mov     ax, seg addrCBLineInit
;       mov     ds, ax
;       mov     eax, dword ptr bp_lpfnCallback
;       mov     addrCBLineInit, eax
;       push    eax
;       mov     eax, cbcidTapi
;       shl     eax, 16
;       add     eax, ID_LINEINITIALIZE
;       push    eax
;        call    AllocCallback
;        push    dx
;        push    ax

        push    dword ptr bp_lpfnCallback

        push    dword ptr bp_lpszAppName
        call    MapLS
        mov     bp_lpszAppNameTmp, eax
        push    eax

        push    dword ptr bp_lpdwNumDevs
        call    MapLS
        mov     bp_lpdwNumDevsTmp, eax
        push    eax


        call    lineInitialize


        shl     eax,16                          ; Convert the 16bit retcode...
        shrd    eax,edx,16                      ; to a 32bit retcode.

        push    eax                             ; Save the retcode for later.

        push    dword ptr bp_lpdwNumDevsTmp
        call    UnMapLS

        push    dword ptr bp_lpszAppNameTmp
        call    UnMapLS

        push    dword ptr bp_lphLineAppTmp
        call    UnMapLS

        pop     eax                             ; Get the retcode

;DoNothing:

endm


;-----------------------------------------------------------------------;
; body_PHONEINITIALIZE
;-----------------------------------------------------------------------;
body_PHONEINITIALIZE16 macro

;LONG phoneInitialize (LPHPHONEAPP lphPhoneApp,
;                      HINSTANCE hInstance,
;                      PHONECALLBACK lpfnCallback,
;                      LPCSTR lpszAppName,
;                      LPDWORD lpdwNumDevs)
;
bp_lphPhoneApp          equ     <bp_top>
bp_hInstance            equ     <bp_top+4>
bp_lpfnCallback         equ     <bp_top+8>
bp_lpszAppName          equ     <bp_top+12>
bp_lpdwNumDevs          equ     <bp_top+16>
;

bp_lpszAppNameTmp       equ     <dword ptr [bp-4]>
bp_lpdwNumDevsTmp       equ     <dword ptr [bp-8]>
bp_lphPhoneAppTmp       equ     <dword ptr [bp-12]>

        sub     eax, eax
        push    eax                             ;bp_lpszAppNameTmp
        push    eax                             ;bp_lpdwNumDevsTmp
        push    eax                             ;bp_lphPhoneAppTmp

        push    dword ptr bp_lphPhoneApp
        call    MapLS
        mov     bp_lphPhoneAppTmp, eax
        push    eax

        mov     eax, dword ptr bp_hInstance     ; Get the hInst
        or      eax, eax                        ; Is it NULL?
        jz      @f                              ; Yup, and that's ok.
        MAP_NULL_HINST eax                      ; Needs to be mapped.
        push    ax

;       mov     ax, seg addrCBPhoneInit
;       mov     ds, ax
;       mov     eax, dword ptr bp_lpfnCallback
;       mov     addrCBPhoneInit, eax
;       push    eax
;       mov     eax, cbcidTapi
;       shl     eax, 16
;       add     eax, ID_PHONEINITIALIZE
;       push    eax
;        call    AllocCallback
;        push    dx
;        push    ax
        push    dword ptr bp_lpfnCallback

        push    dword ptr bp_lpszAppName
        call    MapLS
        mov     bp_lpszAppNameTmp, eax
        push    eax

        push    dword ptr bp_lpdwNumDevs
        call    MapLS
        mov     bp_lpdwNumDevsTmp, eax
        push    eax


        call    phoneInitialize


        shl     eax,16                          ; Convert the 16bit retcode...
        shrd    eax,edx,16                      ; to a 32bit retcode.

        push    eax                             ; Save the retcode for later.

        push    dword ptr bp_lpdwNumDevsTmp
        call    UnMapLS

        push    dword ptr bp_lpszAppNameTmp
        call    UnMapLS

        push    dword ptr bp_lphPhoneAppTmp
        call    UnMapLS

        pop     eax                             ; Get the retcode

endm


;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;PUSH__LINEINITIALIZE_hInstance macro   iOffset, iJunk
;   local   Null_OK
;       
;    mov        eax, [bp+iOffset]       ;;Allow NULL to be passed here (for now)
;    or eax, eax
;    jz Null_OK
;    MAP_NULL_HINST eax
;Null_OK:
;    push    ax
;
;endm ;PUSH__LINEINITIALIZE_hInstance
;
;
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
;PUSH__PHONEINITIALIZE_hInstance        macro   iOffset, iJunk
;   local   Null_OK
;       
;    mov        eax, [bp+iOffset]       ;;Allow NULL to be passed here (for now)
;    or eax, eax
;    jz Null_OK
;    MAP_NULL_HINST eax
;Null_OK:
;    push    ax
;
;endm ;PUSH__PHONEINITIALIZE_hInstance
;
;
;;-----------------------------------------------------------------------;
;; PUSH__LINEINITIALIZE_lpfnCallback (similar to PUSH_SetAbortProc_pfnAbort)
;;-----------------------------------------------------------------------;
;PUSH__LINEINITIALIZE_lpfnCallback    macro iOffset, iTempOffset
;;      assume  ds:DATA16
;
;       mov     ax, seg addrCBLineInit
;       mov     ds, ax
;
;       mov     eax, dword ptr [bp+iOffset]
;       mov     addrCBLineInit, eax
;       push    eax
;       mov     eax, cbcidTapi
;       shl     eax, 16
;       add     eax, ID_LINEINITIALIZE
;       push    eax
;        call    AllocCallback
;        push    dx
;        push    ax
;endm
;
;
;-----------------------------------------------------------------------;
; PUSH__PHONEINITIALIZE_lpfnCallback
;-----------------------------------------------------------------------;
;PUSH__PHONEINITIALIZE_lpfnCallback    macro iOffset, iTempOffset
;       assume  ds:DATA16
;       mov     ax, seg addrCBPhoneInit
;       mov     ds, ax
;
;       mov     eax, dword ptr [bp+iOffset]
;       mov     addrCBPhoneInit, eax
;       push    eax
;       mov     eax, cbcidTapi
;       shl     eax, 16
;       add     eax, ID_PHONEINITIALIZE
;       push    eax
;        call    AllocCallback
;        push    dx
;        push    ax
;endm


;==============================================================================
; local macro, free resources allocated for a call-back function
; check if it is a NULL pointer before calling FreeCallBack.
; eax contains the 32-bit address of the mapped call-back function
; ecx contains the callback ID ((cbcidTapi << 16) + ID[PHONE/LINE]INITIALIZE)
;==============================================================================
;FREE_CALLBACK_TAPI  macro
;        local   done
;
;        or      eax,eax
;        jz      done                            ;don't process NULL pointers
;
;        push    bx                              ;save BX
;        push    es                              ;save ES
;
;        push    eax                             ;32-bit callback address
;        push    ecx
;        call    FreeCallback
;
;        pop     es                              ;restore ES
;        pop     bx                              ;restore BX
;done:
;endm


;-----------------------------------------------------------------------;
; body_LINESHUTDOWN
; Use FREE_CALLBACK instead of directly calling FreeCallback so that we
; check for NULL pointers.
;-----------------------------------------------------------------------;
body_LINESHUTDOWN16 macro
bp_hLineApp     equ     <bp_top>
;       assume  ds:DATA16
        mov     ax, seg addrCBLineInit
        mov     ds, ax

        mov     eax, dword ptr bp_hLineApp
        push    eax
ifdef DEBUG
        int     3
endif
        call    lineShutdown

; return code long --> long
        rol     eax,16
        xchg    ax,dx
        rol     eax,16

;       push    eax     ;; Save
;       push    ecx     ;; Save
;
;       mov     eax,  addrCBLineInit
;
;       mov     ecx, cbcidTapi
;       shl     ecx, 16
;       add     ecx, ID_LINEINITIALIZE
;
;       FREE_CALLBACK_TAPI
;
;       pop     ecx
;       pop     eax
endm


;-----------------------------------------------------------------------;
; body_PHONESHUTDOWN
;-----------------------------------------------------------------------;
body_PHONESHUTDOWN16 macro
bp_hLineApp     equ     <bp_top>
;       assume  ds:DATA16
        mov     ax, seg addrCBPhoneInit
        mov     ds, ax

        mov     eax, dword ptr bp_hLineApp
        push    eax
        call    phoneShutdown

; return code long --> long
        rol     eax,16
        xchg    ax,dx
        rol     eax,16

;       push    eax     ;; Save it
;       push    ecx     ;; Save it
;
;       mov     eax,  addrCBPhoneInit
;
;       mov     ecx, cbcidTapi
;       shl     ecx, 16
;       add     ecx, ID_PHONEINITIALIZE
;
;       FREE_CALLBACK_TAPI
;
;       pop     ecx
;       pop     eax
endm


;-----------------------------------------------------------------------;
; body_LINEFORWARD
;-----------------------------------------------------------------------;
body_LINEFORWARD macro

bp_hLine                equ     <bp_top>
bp_bAllAddresses        equ     <bp_top+4>
bp_dwAddressID          equ     <bp_top+8>
bp_lpForwardList        equ     <bp_top+12>
bp_dwNumRingsNoAnswer   equ     <bp_top+16>
bp_lphConsultCall       equ     <bp_top+20>
bp_lpCallParams         equ     <bp_top+24>
;
; dword ptr [ebp+8]:  hLine
; dword ptr [ebp+12]:  bAllAddresses
; dword ptr [ebp+16]:  dwAddressID
; dword ptr [ebp+20]:  lpForwardList
; dword ptr [ebp+24]:  dwNumRingsNoAnswer
; dword ptr [ebp+28]:  lphConsultCall
; dword ptr [ebp+32]:  lpCallParams
;

bp_lpForwardListTmp     equ     <dword ptr [bp-4]>
bp_lphConsultCallTmp    equ     <dword ptr [bp-8]>
bp_lpCallParamsTmp      equ     <dword ptr [bp-12]>


        sub     eax, eax
        push    eax                             ;bp_lpForwardListTmp
        push    eax                             ;bp_lphConsultCallTmp
        push    eax                             ;bp_lpCallParams

        push    dword ptr bp_hLine              ;hLine: dword->dword
        push    dword ptr bp_bAllAddresses      ;bAllAddresses: dword->dword
        push    dword ptr bp_dwAddressID        ;dwAddressID: dword->dword
        push    dword ptr bp_lpForwardList
        call    MapLS
        mov     bp_lpForwardListTmp, eax
        push    eax
        push    dword ptr bp_dwNumRingsNoAnswer ;dwNumRingsNoAnswer: dword->dword
        push    dword ptr bp_lphConsultCall
        call    MapLS
        mov     bp_lphConsultCallTmp, eax
        push    eax
        push    dword ptr bp_lpCallParams
        call    MapLS
        mov     bp_lpCallParamsTmp, eax
        push    eax

        call    lineForward

        shl     eax,16
        shrd    eax,edx,16

        push    eax
        push    dword ptr bp_lpForwardListTmp
        call    UnMapLS
;
; Don't UnMap lphConsultCallTmp: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lphConsultCallTmp
;       call    UnMapLS
        push    dword ptr bp_lpCallParamsTmp
        call    UnMapLS
        pop     eax

endm


;-----------------------------------------------------------------------;
; body_LINEMAKECALL
;-----------------------------------------------------------------------;
body_LINEMAKECALL macro

bp_hLine                equ     <bp_top>
bp_lphCall              equ     <bp_top+4>
bp_lpszDestAddress      equ     <bp_top+8>
bp_dwCountryCode        equ     <bp_top+12>
bp_lpCallParams         equ     <bp_top+16>
;
; dword ptr [ebp+8]:  hLine
; dword ptr [ebp+12]:  lphCall
; dword ptr [ebp+16]:  lpszDestAddress
; dword ptr [ebp+20]:  dwCountryCode
; dword ptr [ebp+24]:  lpCallParams
;

bp_lphCallTmp           equ     <dword ptr [bp-4]>
bp_lpszDestAddressTmp   equ     <dword ptr [bp-8]>
bp_lpCallParamsTmp      equ     <dword ptr [bp-12]>


        sub     eax, eax
        push    eax                             ;bp_lphCallTmp
        push    eax                             ;bp_lpszDestAddress
        push    eax                             ;bp_lpCallParams

        push    dword ptr bp_hLine              ;hLine: dword->dword
        push    dword ptr bp_lphCall
        call    MapLS
        mov     bp_lphCallTmp, eax
        push    eax
        push    dword ptr bp_lpszDestAddress
        call    MapLS
        mov     bp_lpszDestAddressTmp, eax
        push    eax
        push    dword ptr bp_dwCountryCode      ;dwCountryCode: dword->dword
        push    dword ptr bp_lpCallParams
        call    MapLS
        mov     bp_lpCallParamsTmp, eax
        push    eax
        
        call    lineMakeCall

        shl     eax,16
        shrd    eax,edx,16

        push    eax
;
; Don't UnMap lphCallTmp: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lphCallTmp
;       call    UnMapLS
        push    dword ptr bp_lpszDestAddressTmp
        call    UnMapLS
        push    dword ptr bp_lpCallParamsTmp
        call    UnMapLS
        pop     eax

endm


;-----------------------------------------------------------------------;
; body_LINEUNPARK
;-----------------------------------------------------------------------;
body_LINEUNPARK macro

bp_hLine                equ     <bp_top>
bp_dwAddressID          equ     <bp_top+4>
bp_lphCall              equ     <bp_top+8>
bp_lpszDestAddress      equ     <bp_top+12>
;
; dword ptr [ebp+8]:  hLine
; dword ptr [ebp+12]:  dwAddressID
; dword ptr [ebp+16]:  lphCall
; dword ptr [ebp+20]:  lpszDestAddress
;

bp_lphCallTmp           equ     <dword ptr [bp-4]>
bp_lpszDestAddressTmp   equ     <dword ptr [bp-8]>

        sub     eax, eax
        push    eax                             ;bp_lphCallTmp
        push    eax                             ;bp_lpszDestAddress

        push    dword ptr bp_hLine              ;hLine: dword->dword
        push    dword ptr bp_dwCountryCode      ;dwCountryCode: dword->dword
        push    dword ptr bp_lphCall
        call    MapLS
        mov     bp_lphCallTmp, eax
        push    eax
        push    dword ptr bp_lpszDestAddress
        call    MapLS
        mov     bp_lpszDestAddressTmp, eax
        push    eax

        call    lineUnpark

        shl     eax,16
        shrd    eax,edx,16

        push    eax
;
; Don't UnMap lphCallTmp: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lphCallTmp
;       call    UnMapLS
        push    dword ptr bp_lpszDestAddressTmp
        call    UnMapLS
        pop     eax
endm


;-----------------------------------------------------------------------;
; body_LINEPICKUP
;-----------------------------------------------------------------------;
body_LINEPICKUP macro

bp_hLine                equ     <bp_top>
bp_dwAddressID          equ     <bp_top+4>
bp_lphCall              equ     <bp_top+8>
bp_lpszDestAddress      equ     <bp_top+12>
bp_lpszGroupID          equ     <bp_top+16>
;
; dword ptr [ebp+8]:  hLine
; dword ptr [ebp+12]:  dwAddressID
; dword ptr [ebp+16]:  lphCall
; dword ptr [ebp+20]:  lpszDestAddress
; dword ptr [ebp+24]:  lpszGroupID
;

bp_lphCallTmp           equ     <dword ptr [bp-4]>
bp_lpszDestAddressTmp   equ     <dword ptr [bp-8]>
bp_lpszGroupIDTmp       equ     <dword ptr [bp-12]>

        sub     eax, eax
        push    eax                             ;bp_lphCallTmp
        push    eax                             ;bp_lpszDestAddressTmp
        push    eax                             ;bp_lpszGroupIDTmp

        push    dword ptr bp_hLine              ;hLine: dword->dword
        push    dword ptr bp_dwAddressID        ;dwAddressID: dword->dword
        push    dword ptr bp_lphCall
        call    MapLS
        mov     bp_lphCallTmp, eax
        push    eax
        push    dword ptr bp_lpszDestAddress
        call    MapLS
        mov     bp_lpszDestAddressTmp, eax
        push    eax
        push    dword ptr bp_lpszGroupID
        call    MapLS
        mov     bp_lpszGroupIDTmp, eax
        push    eax

        call    linePickup

        shl     eax,16
        shrd    eax,edx,16

        push    eax
;
; Don't UnMap lphCallTmp: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lphCallTmp
;       call    UnMapLS
        push    dword ptr bp_lpszDestAddressTmp
        call    UnMapLS
        push    dword ptr bp_lpszGroupIDTmp
        call    UnMapLS
        pop     eax
endm

;-----------------------------------------------------------------------;
; body_LINESETUPCONFERENCE
;-----------------------------------------------------------------------;
body_LINESETUPCONFERENCE macro

bp_hCall                equ     <bp_top>
bp_hLine                equ     <bp_top+4>
bp_lphConfCall          equ     <bp_top+8>
bp_lphConsultCall       equ     <bp_top+12>
bp_dwNumParties         equ     <bp_top+16>
bp_lpCallParams         equ     <bp_top+20>
;
; dword ptr [ebp+8]:  hCall
; dword ptr [ebp+12]:  hLine
; dword ptr [ebp+16]:  lphConfCall
; dword ptr [ebp+20]:  lphConsultCall
; dword ptr [ebp+24]:  dwNumParties
; dword ptr [ebp+28]:  lpCallParams
;

bp_lphConfCallTmp       equ     <dword ptr [bp-4]>
bp_lphConsultCallTmp    equ     <dword ptr [bp-8]>
bp_lpCallParamsTmp      equ     <dword ptr [bp-12]>

        sub     eax, eax
        push    eax                             ;bp_lphConfCallTmp
        push    eax                             ;bp_lphConsultCallTmp
        push    eax                             ;bp_lpCallParamsTmp

        push    dword ptr bp_hCall              ;hCall: dword->dword
        push    dword ptr bp_hLine              ;hLine: dword->dword
        push    dword ptr bp_lphConfCall
        call    MapLS
        mov     bp_lphConfCallTmp, eax
        push    eax
        push    dword ptr bp_lphConsultCall
        call    MapLS
        mov     bp_lphConsultCallTmp, eax
        push    eax
        push    dword ptr bp_dwNumParties       ;dwNumParties: dword->dword
        push    dword ptr bp_lpCallParams
        call    MapLS
        mov     bp_lpCallParamsTmp, eax
        push    eax

        call    lineSetupConference

        shl     eax,16
        shrd    eax,edx,16

        push    eax
;
; Don't UnMap lphConfCallTmp and lphConsultCallTmp: Done in tapi.dll
; due to async read/write.
;
;       push    dword ptr bp_lphConfCallTmp
;       call    UnMapLS
;       push    dword ptr bp_lphConsultCallTmp
;       call    UnMapLS
        push    dword ptr bp_lpCallParamsTmp
        call    UnMapLS
        pop     eax
endm

;-----------------------------------------------------------------------;
; body_LINECOMPLETETRANSFER
;-----------------------------------------------------------------------;
body_LINECOMPLETETRANSFER macro

bp_hCall                equ     <bp_top>
bp_hConsultCall         equ     <bp_top+4>
bp_lphConfCall          equ     <bp_top+8>
bp_dwTransferMode       equ     <bp_top+12>
;
; dword ptr [ebp+8]:  hCall
; dword ptr [ebp+12]:  hConsultCall
; dword ptr [ebp+16]:  lphConfCall
; dword ptr [ebp+20]:  dwTransferMode
;

bp_lphConfCallTmp       equ     <dword ptr [bp-4]>

        sub     eax, eax
        push    eax                             ;bp_lphConfCallTmp
        push    dword ptr bp_hCall              ;hCall: dword->dword
        push    dword ptr bp_hConsultCall       ;hConsultCall: dword->dword
        push    dword ptr bp_lphConfCall
        call    MapLS
        mov     bp_lphConfCallTmp, eax
        push    eax
        push    dword ptr bp_dwTransferMode     ;dwTransferMode: dword->dword

        call    lineCompleteTransfer

        shl     eax,16
        shrd    eax,edx,16

;       push    eax
;
; Don't UnMap lphConfCallTmp: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lphConfCallTmp
;       call    UnMapLS
;       pop     eax

endm


;-----------------------------------------------------------------------;
; body_LINEPREPAREADDTOCONFERENCE
;-----------------------------------------------------------------------;
body_LINEPREPAREADDTOCONFERENCE macro

bp_hConfCall            equ     <bp_top>
bp_lphAddCall           equ     <bp_top+4>
bp_lpCallParams         equ     <bp_top+8>
;
; dword ptr [ebp+8]:  hConfCall
; dword ptr [ebp+12]:  lphAddCall
; dword ptr [ebp+16]:  lpCallParams
;

bp_lphAddCallTmp        equ     <dword ptr [bp-4]>
bp_lpCallParamsTmp      equ     <dword ptr [bp-8]>

        sub     eax, eax
        push    eax                             ;bp_lphAddCallTmp
        push    eax                             ;bp_lpCallParams

        push    dword ptr bp_hConfCall          ;hConfCall: dword->dword
        push    dword ptr bp_lphAddCall
        call    MapLS
        mov     bp_lphAddCallTmp, eax
        push    eax
        push    dword ptr bp_lpCallParams
        call    MapLS
        mov     bp_lpCallParamsTmp, eax
        push    eax

        call    linePrepareAddToConference

        shl     eax,16
        shrd    eax,edx,16

        push    eax                             ; Save it

;
; Don't UnMap lphAddCallTmp: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lphAddCallTmp
;       call    UnMapLS
        push    dword ptr bp_lpCallParamsTmp
        call    UnMapLS
        pop     eax

endm

;-----------------------------------------------------------------------;
; body_LINESETUPTRANSFER
;-----------------------------------------------------------------------;
body_LINESETUPTRANSFER macro

bp_hCall                equ     <bp_top>
bp_lphConsultCall       equ     <bp_top+4>
bp_lpCallParams         equ     <bp_top+8>
;
; dword ptr [ebp+8]:  hCall
; dword ptr [ebp+12]:  lphConsultCall
; dword ptr [ebp+16]:  lpCallParams
;

bp_lphConsultCallTmp    equ     <dword ptr [bp-4]>
bp_lpCallParamsTmp      equ     <dword ptr [bp-8]>

        sub     eax, eax
        push    eax                             ;bp_lphConsultCallTmp
        push    eax                             ;bp_lpCallParams

        push    dword ptr bp_hCall              ;hCall: dword->dword
        push    dword ptr bp_lphConsultCall
        call    MapLS
        mov     bp_lphConsultCallTmp, eax
        push    eax
        push    dword ptr bp_lpCallParams
        call    MapLS
        mov     bp_lpCallParamsTmp, eax
        push    eax

        call    lineSetupTransfer

        shl     eax,16
        shrd    eax,edx,16

        push    eax                             ; Save it

;
; Don't UnMap lphConsultCallTmp: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lphConsultCallTmp
;       call    UnMapLS
        push    dword ptr bp_lpCallParamsTmp
        call    UnMapLS
        pop     eax

endm



;-----------------------------------------------------------------------;
; body_LINECOMPLETECALL
;-----------------------------------------------------------------------;
body_LINECOMPLETECALL macro

bp_hCall                equ     <bp_top>
bp_lpdwCompletionID     equ     <bp_top+4>
bp_dwCompletionMode     equ     <bp_top+8>
bp_dwMessageID          equ     <bp_top+12>
;
; dword ptr [ebp+8]:  hCall
; dword ptr [ebp+12]:  lpdwCompletionID
; dword ptr [ebp+16]:  dwCompletionMode
; dword ptr [ebp+20]:  dwMessageID
;

bp_lpdwCompletionIDTmp  equ     <dword ptr [bp-4]>

        sub     eax, eax
        push    eax                             ;bp_lpdwCompletionID

        push    dword ptr bp_hCall              ;hCall: dword->dword
        push    dword ptr bp_lpdwCompletionID
        call    MapLS
        mov     bp_lpdwCompletionIDTmp, eax
        push    eax
        push    dword ptr bp_dwCompletionMode
        push    dword ptr bp_dwMessageID

        call    lineCompleteCall

        shl     eax,16
        shrd    eax,edx,16

;       push    eax
;
; Don't UnMap lpdwCompletionIDTmp: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lpdwCompletionIDTmp
;       call    UnMapLS
;       pop     eax

endm

        
;-----------------------------------------------------------------------;
; body_LINEDEVSPECIFIC
;-----------------------------------------------------------------------;
body_LINEDEVSPECIFIC macro

bp_hLine                equ     <bp_top>
bp_dwAddressID          equ     <bp_top+4>
bp_hCall                equ     <bp_top+8>
bp_lpParams             equ     <bp_top+12>
bp_dwSize               equ     <bp_top+16>
;
; dword ptr [ebp+8]:  hLine
; dword ptr [ebp+12]:  dwAddressID
; dword ptr [ebp+16]:  hCall
; dword ptr [ebp+20]:  lpParams
; dword ptr [ebp+24]:  dwSize
;

bp_lpParamsTmp          equ     <dword ptr [bp-4]>

        sub     eax, eax
        push    eax                             ;bp_lpParams

        push    dword ptr bp_hLine              ;hLine: dword->dword
        push    dword ptr bp_dwAddressID        ;dwAddressID: dword->dword
        push    dword ptr bp_hCall              ;hCall: dword->dword
        push    dword ptr bp_lpParams
        call    MapLS
        mov     bp_lpParamsTmp, eax
        push    eax
        push    dword ptr bp_dwSize             ;dwSize: dword->dword

        call    lineDevSpecific

        shl     eax,16
        shrd    eax,edx,16

;       push    eax
;
; Don't UnMap lpParams: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lpParamsTmp
;       call    UnMapLS
;       pop     eax

endm

;-----------------------------------------------------------------------;
; body_PHONEDEVSPECIFIC
;-----------------------------------------------------------------------;
body_PHONEDEVSPECIFIC macro

bp_hPhone               equ     <bp_top>
bp_lpParams             equ     <bp_top+4>
bp_dwSize               equ     <bp_top+8>
;
; dword ptr [ebp+8]:  hPhone
; dword ptr [ebp+12]:  lpParams
; dword ptr [ebp+16]:  dwSize
;

;bp_lpParamsTmp         equ     <dword ptr [bp-4]>
;
        sub     eax, eax
        push    eax                             ;bp_lpParams

        push    dword ptr bp_hPhone             ;hPhone: dword->dword
        push    dword ptr bp_lpParams
        call    MapLS
        mov     bp_lpParamsTmp, eax
        push    eax
        push    dword ptr bp_dwSize             ;dwSize: dword->dword

        call    phoneDevSpecific

        shl     eax,16
        shrd    eax,edx,16

;       push    eax
;
; Don't UnMap lpParams: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lpParamsTmp
;       call    UnMapLS
;       pop     eax

endm

;-----------------------------------------------------------------------;
; body_LINEDEVSPECIFICFEATURE
;-----------------------------------------------------------------------;
body_LINEDEVSPECIFICFEATURE macro

bp_hLine                equ     <bp_top>
bp_dwFeature            equ     <bp_top+4>
bp_lpParams             equ     <bp_top+8>
bp_dwSize               equ     <bp_top+12>
;
; dword ptr [ebp+8]:  hLine
; dword ptr [ebp+12]:  dwFeature
; dword ptr [ebp+16]:  lpParams
; dword ptr [ebp+20]:  dwSize
;

bp_lpParamsTmp          equ     <dword ptr [bp-4]>

        sub     eax, eax
        push    eax                             ;bp_lpParams

        push    dword ptr bp_hLine              ;hLine: dword->dword
        push    dword ptr bp_dwFeature          ;dwFeature: dword->dword
        push    dword ptr bp_lpParams
        call    MapLS
        mov     bp_lpParamsTmp, eax
        push    eax
        push    dword ptr bp_dwSize             ;dwSize: dword->dword

        call    lineDevSpecificFeature

        shl     eax,16
        shrd    eax,edx,16

;       push    eax
;
; Don't UnMap lpParams: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lpParamsTmp
;       call    UnMapLS
;       pop     eax

endm


;-----------------------------------------------------------------------;
; body_LINEGATHERDIGITS
;-----------------------------------------------------------------------;
body_LINEGATHERDIGITS macro

bp_hCall                equ     <bp_top>
bp_dwDigitModes         equ     <bp_top+4>
bp_lpsDigits            equ     <bp_top+8>
bp_dwNumDigits          equ     <bp_top+12>
bp_lpszTermDigits       equ     <bp_top+16>
bp_dwFirstDigitTimeout  equ     <bp_top+20>
bp_dwInterDigitTimeout  equ     <bp_top+24>
;
; dword ptr [ebp+8]:  hCall
; dword ptr [ebp+12]:  dwDigitModes
; dword ptr [ebp+16]:  lpsDigits
; dword ptr [ebp+20]:  dwNumDigits
; dword ptr [ebp+24]:  lpszTerminationDigits
; dword ptr [ebp+28]:  dwFirstDigitTimeout
; dword ptr [ebp+32]:  dwInterDigitTimeout
;

bp_lpsDigitsTmp         equ     <dword ptr [bp-4]>
bp_lpszTermDigitsTmp    equ     <dword ptr [bp-8]>

        sub     eax, eax
        push    eax                             ;bp_lpsDigitsTmp
        push    eax                             ;bp_lpszTerminationDigitsTmp

        push    dword ptr bp_hCall              ;hCall: dword->dword
        push    dword ptr bp_dwDigitModes       ;dwDigitModes: dword->dword
        push    dword ptr bp_lpsDigits
        call    MapLS
        mov     bp_lpsDigitsTmp, eax
        push    eax
        push    dword ptr bp_dwNumDigits        ;dwNumDigits: dword->dword
        push    dword ptr bp_lpszTermDigits
        call    MapLS
        mov     bp_lpszTermDigitsTmp, eax
        push    eax
        push    dword ptr bp_dwFirstDigitTimeout ;dwFirstDigitTimeout: dword->dword
        push    dword ptr bp_dwInterDigitTimeout ;dwInterDigitTimeout: dword->dword

        call    lineGatherDigits

        shl     eax,16
        shrd    eax,edx,16

        push    eax                             ; Save it

;
; Don't UnMap lpsDigits: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lpsDigitsTmp
;       call    UnMapLS
        push    dword ptr bp_lpszTermDigitsTmp
        call    UnMapLS

        pop     eax
endm

;-----------------------------------------------------------------------;
; body_LINEPARK
;-----------------------------------------------------------------------;
body_LINEPARK macro

bp_hLine                equ     <bp_top>
bp_dwParkMode           equ     <bp_top+4>
bp_lpszDirAddress       equ     <bp_top+8>
bp_lpNonDirAddress      equ     <bp_top+12>
;
; dword ptr [ebp+8]:  hLine
; dword ptr [ebp+12]:  dwParkMode
; dword ptr [ebp+16]:  lpszDirAddress
; dword ptr [ebp+20]:  lpNonDirAddress
;

bp_lpszDirAddressTmp    equ     <dword ptr [bp-4]>
bp_lpNonDirAddressTmp   equ     <dword ptr [bp-8]>

        sub     eax, eax
        push    eax                             ;bp_lpszDirAddressTmp
        push    eax                             ;bp_lpNonDirAddressTmp

        push    dword ptr bp_hLine              ;hLine: dword->dword
        push    dword ptr bp_dwParkMode         ;dwParkMode: dworkd->dword
        push    dword ptr bp_lpszDirAddress
        call    MapLS
        mov     bp_lpszDirAddressTmp, eax
        push    eax
        push    dword ptr bp_lpNonDirAddress
        call    MapLS
        mov     bp_lpNonDirAddressTmp, eax
        push    eax

        call    linePark

        shl     eax,16
        shrd    eax,edx,16

        push    eax   ; Save it

        push    dword ptr bp_lpszDirAddressTmp
        call    UnMapLS
;
; Don't UnMap lpNonDirAddressTmp: Done in tapi.dll due to async read/write.
;
;       push    dword ptr bp_lpNonDirAddressTmp
;       call    UnMapLS

        pop     eax
endm


;-----------------------------------------------------------------------;
; body_TAPIREQUESTMEDIACALL
;-----------------------------------------------------------------------;
body_TAPIREQUESTMEDIACALL macro
        mov     eax, -16
endm


;-----------------------------------------------------------------------;
; body_TAPIREQUESTDROP
;-----------------------------------------------------------------------;
body_TAPIREQUESTDROP macro
        mov     eax, -16
endm


;-----------------------------------------------------------------------;
; body_LINEREGISTERREQUESTRECIPIENT
;-----------------------------------------------------------------------;
body_LINEREGISTERREQUESTRECIPIENT macro

bp_hLine                equ     <bp_top>
bp_dwRegistrationInstance  equ  <bp_top+4>
bp_dwRequestMode        equ     <bp_top+8>
bp_dwEnable             equ     <bp_top+12>
;
; dword ptr [ebp+8]:   hLine
; dword ptr [ebp+12]:  dwRegistrationInstance
; dword ptr [ebp+16]:  dwRequestMode
; dword ptr [ebp+20]:  bEnable
;

;
;       sub     eax, eax
;       push    eax                             ;bp_lpszDirAddressTmp
;       push    eax                             ;bp_lpNonDirAddressTmp
;

;
;       If this is a 32bit app asking to register for media calls, tell 'em
;       'e's nuts.
;
        test    dword ptr bp_dwRequestMode, 2 ;*** *** ***Or should this be 6?
        jz     @f

ifdef DEBUG
        DPRINT "32bit apps aren't allowed to register for Media calls"
endif
        mov     eax, 80000038h
        jmp     Done_LRRR

@@:
        push    dword ptr bp_hLine              ;hLine: dword->dword
        push    dword ptr bp_dwRegistrationInstance
        push    dword ptr bp_dwRequestMode
        push    dword ptr bp_dwEnable

        call    lineRegisterRequestRecipient

        shl     eax,16
        shrd    eax,edx,16

Done_LRRR:

endm