亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tspi.c

?? wince3.0的源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/***********************************************************************/
/**Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved**/
/***********************************************************************/
//
//	tapi.c		The Telephony Service Provider Interface
//
//	@doc	EX_TSPI
//
//	@topic	TSPI |
//
//		Tspi Stuff
//
//
#include "windows.h"
#include "types.h"
#include "memory.h"
#include "mcx.h"
#include "tspi.h"
#include "linklist.h"
#include "tspip.h"
#include "tapicomn.h"
#include "config.h"
#include "resource.h"

TSPIGLOBALS TspiGlobals;

const GETIDINFO aGetID[] ={{TEXT("tapi/line"),     STRINGFORMAT_BINARY},
                           {TEXT("comm"),          STRINGFORMAT_UNICODE},
                           {TEXT("comm/datamodem"),STRINGFORMAT_BINARY},
                           {TEXT("ndis"),          STRINGFORMAT_BINARY}};

const WCHAR g_szzClassList[] = {TEXT("tapi/line")TEXT("\0")
                                TEXT("comm")TEXT("\0")
                                TEXT("comm/datamodem")TEXT("\0")
                                TEXT("ndis")TEXT("\0\0")};

const WCHAR g_szDeviceClass[] = TEXT("com");
extern const WCHAR szSettings[];
extern const WCHAR szDialSuffix[];

HANDLE g_hCoreDLL;

// Debug Zones.
#ifdef DEBUG
DBGPARAM dpCurSettings = {
    TEXT("Unimodem"), {
        TEXT("Init"),   TEXT("Temp"),       TEXT("Async"),      TEXT(""),
        TEXT(""),       TEXT(""),           TEXT(""),           TEXT("Dial"),
        TEXT("Thread"), TEXT("Lists"),      TEXT("Call State"), TEXT("Misc"),
        TEXT("Alloc"),  TEXT("Function"),   TEXT("Warning"),    TEXT("Error") },
    0xC000
}; 
#endif


extern BOOL IsAPIReady(DWORD dwAPISet);

// **********************************************************************
// First, we have the TSPI_provider functions
// **********************************************************************

LONG TSPIAPI
TSPI_providerInit(
    DWORD             dwTSPIVersion,  // @parm TSPI Version - in
    DWORD             dwPermanentProviderID, // @parm Permanent Provider ID - in
    DWORD             dwLineDeviceIDBase, // @parm Line Base ID - in
    DWORD             dwPhoneDeviceIDBase, // @parm phone Base ID - in
    DWORD             dwNumLines,  // @parm Number of lines - in
    DWORD             dwNumPhones,  // @parm Number of phones - in
    ASYNC_COMPLETION  lpfnCompletionProc, // @parm Pointer to callback - in
    LPDWORD           lpdwTSPIOptions // @parm Optional Behaviour Flags - out
    )
{
    DEBUGMSG(ZONE_FUNC|ZONE_INIT,
             (TEXT("UNIMODEM:+TSPI_providerInit, dwPPID 0x%X, dwDeviceIDBase 0x%X, dwNumLines 0x%X\n"),
              dwPermanentProviderID,
              dwLineDeviceIDBase,
              dwNumLines));
    
    TspiGlobals.fnCompletionCallback = lpfnCompletionProc;

    DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:-TSPI_providerInit\n")));
    return SUCCESS;
}

LONG TSPIAPI
TSPI_providerInstall(
    HWND   hwndOwner,
    DWORD  dwPermanentProviderID
    )
{
    DEBUGMSG(ZONE_FUNC|ZONE_INIT,
             (TEXT("UNIMODEM:+TSPI_providerInstall, dwPPID 0x%X\n"),
              dwPermanentProviderID ));
    
    // Unimodem doesn't really need an install.  Just say OK.

    DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:-TSPI_providerInstall\n")));
    return SUCCESS;
}

LONG TSPIAPI
TSPI_providerShutdown(
    DWORD    dwTSPIVersion
    )
{
    DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:+TSPI_providerShutdown\n")));
    DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:-TSPI_providerShutdown\n")));
    return SUCCESS;
}


LONG TSPIAPI TSPI_providerEnumDevices(
    DWORD       dwPermanentProviderID,
    LPDWORD     lpdwNumLines,
    LPDWORD     lpdwNumPhones,
    HPROVIDER   hProvider,
    LINEEVENT   lpfnLineCreateProc,
    PHONEEVENT  lpfnPhoneCreateProc
    )
{
    DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:+TSPI_providerEnumDevices\n")));

    *lpdwNumLines = 0;

    // This should be the same event proc that gets passed in to
    // lineOpen. but I need it here and now so that I can notify
    // TAPI about devices coming and going.  I'll probably go ahead
    // and store the per device copy just in case TAPI decides that
    // the two funcs should be different for some reason.
    TspiGlobals.fnLineEventProc  = lpfnLineCreateProc;

    TspiGlobals.dwProviderID     = dwPermanentProviderID;
    TspiGlobals.hProvider        = hProvider;
    
    // Note that the only devices that we actually enumerate are
    // the external modems.  All other entries are created when the
    // device loader loads the physical device and notifies us about
    // it.
    EnumExternModems();
    
    DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:-TSPI_providerEnumDevices\n")));
    return SUCCESS;
}

// **********************************************************************
// Then, we have the TSPI_line functions
// **********************************************************************

//
// This function serves as a stub in the vtbl for any of the TSPI
// functions which we choose not to support
//
LONG
TSPIAPI
TSPI_Unsupported( void )
{
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_Unsupported\n")));
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_Unsupported\n")));
    return LINEERR_OPERATIONUNAVAIL;
}


LONG
TSPIAPI
TSPI_lineAccept(
    DRV_REQUESTID dwRequestID,
    HDRVCALL      hdCall,
    LPCSTR        lpsUserUserInfo,
    DWORD         dwSize
    )
{
    PTLINEDEV pLineDev;
    LONG rc;
    
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineAccept\n")));
    
    if ((pLineDev = GetLineDevfromHandle ((DWORD)hdCall)) == NULL) {
        DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineAccept ** Invalid Call Handle\n")));
        rc = LINEERR_INVALCALLHANDLE;
        goto exitPoint;
    }

    if (LINECALLSTATE_OFFERING == pLineDev->dwCallState) {
        SetAsyncOp(pLineDev, PENDING_LINEACCEPT);
        SetAsyncStatus(pLineDev, 0);
        NewCallState(pLineDev, LINECALLSTATE_ACCEPTED, 0);
        rc = SetAsyncID(pLineDev, dwRequestID);
    } else {
        DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineAccept ** Invalid Call State\n")));
        rc = LINEERR_INVALCALLSTATE;
    }

exitPoint:
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineAccept %x\n"), rc));
    return rc;
}


LONG
TSPIAPI
TSPI_lineAnswer(
    DRV_REQUESTID  dwRequestID,
    HDRVCALL       hdCall,
    LPCSTR         lpsUserUserInfo,
    DWORD          dwSize
    )
{
    LONG rc;
    PTLINEDEV  pLineDev;


    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineAnswer\n")));

    if ((pLineDev = GetLineDevfromHandle ((DWORD)hdCall)) == NULL) {
        DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineAnswer ** Invalid Call Handle\n")));
        rc = LINEERR_INVALCALLHANDLE;
        goto exitPoint;
    }

    if ((pLineDev->dwCallState != LINECALLSTATE_OFFERING) &&
        (pLineDev->dwCallState != LINECALLSTATE_ACCEPTED)) {
        DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineAnswer ** Invalid Call State\n")));
        rc = LINEERR_INVALCALLSTATE;
        goto exitPoint;
    }

    rc = ControlThreadCmd(pLineDev, PENDING_LINEANSWER, dwRequestID);
    if (!(rc & 0x80000000)) {
        rc = SetAsyncID(pLineDev, dwRequestID);
    }

exitPoint:
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineAnswer %x\n"), rc));
    return rc;
}   // TSPI_lineAnswer


//
// Close a specified open line device
// 
LONG TSPIAPI
TSPI_lineClose(
    HDRVLINE hdLine
    )
{
    PTLINEDEV  pLineDev;
  
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineClose\n")));

    if ((pLineDev = GetLineDevfromHandle ((DWORD)hdLine)) == NULL) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:-TSPI_lineClose ** Invalid Line Handle\n")));
        return LINEERR_OPERATIONFAILED;
    }

    EnterCriticalSection(&pLineDev->OpenCS);
    pLineDev->dwDetMediaModes = 0;
    pLineDev->htLine = NULL;
    LeaveCriticalSection(&pLineDev->OpenCS);

    if (ControlThreadCmd(pLineDev, PENDING_EXIT, INVALID_PENDINGID)) {
        // Make sure that we do not leave anything open
        DevlineClose(pLineDev, TRUE);            
    }

    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineClose\n")));
    return SUCCESS;
}

LONG TSPIAPI
TSPI_lineCloseCall(
    HDRVCALL hdCall
    )
{
    LONG rc;
    PTLINEDEV  pLineDev;
  
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineCloseCall\n")));

    if ((pLineDev = GetLineDevfromHandle ((DWORD)hdCall)) == NULL) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineCloseCall ** Invalid Call Handle\n")));
        rc = LINEERR_OPERATIONFAILED;
        goto exitPoint;
    }

    // Mark call as unused
    pLineDev->dwCallFlags &= ~(CALL_ALLOCATED|CALL_ACTIVE);
    pLineDev->htCall = NULL;
    rc = 0;

exitPoint:
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineCloseCall\n")));
    return rc;
}


LONG TSPIAPI
TSPI_lineConditionalMediaDetection(
    HDRVLINE hdLine,
    DWORD dwMediaModes,
    LPLINECALLPARAMS const lpCallParams
    )
{
    LONG rc;
    PTLINEDEV  pLineDev;
  
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineConditionalMediaDetection\n")));

    if ((pLineDev = GetLineDevfromHandle ((DWORD)hdLine)) == NULL) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineConditionalMediaDetection ** Invalid Line Handle\n")));
        rc = LINEERR_OPERATIONFAILED;
        goto exitPoint;
    }

    // Check the requested modes. There must be only our media modes.
    //
    if (dwMediaModes & ~pLineDev->dwMediaModes) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineConditionalMediaDetection ** Invalid Media Mode\n")));
        rc = LINEERR_INVALMEDIAMODE;
        goto exitPoint;
    }
  
    // Check the call paramaters
    //
    if ((lpCallParams->dwBearerMode & (~pLineDev->dwBearerModes)) ||
        (lpCallParams->dwMediaMode  & (~pLineDev->dwMediaModes)) ||
        (lpCallParams->dwAddressMode & (~LINEADDRESSMODE_ADDRESSID))) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineConditionalMediaDetection ** Invalid Call Params\n")));
        rc = LINEERR_INVALCALLPARAMS;
        goto exitPoint;
    }

    if ((lpCallParams->dwAddressType) && (lpCallParams->dwAddressType != LINEADDRESSTYPE_PHONENUMBER)) {
        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineConditionalMediaDetection ** Invalid Call Params Address Type\n")));
        rc = LINEERR_INVALCALLPARAMS;
        goto exitPoint;
    }
  
    rc = 0;

exitPoint:
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineConditionalMediaDetection\n")));
    return rc;
}   // TSPI_lineConditionalMediaDetection


LONG TSPIAPI
TSPI_lineConfigDialogEdit(
    DWORD dwDeviceID,
    HWND hwndOwner, 
    LPCWSTR lpszDeviceClass,
    LPVOID const lpDeviceConfigIn, 
    DWORD dwSize,
    LPVARSTRING lpDeviceConfigOut
    )
{
    PTLINEDEV pLineDev;
    BYTE cbSize;
    DWORD dwRet = SUCCESS;
    
    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineConfigDialogEdit\n")));
    
    // Validate the input/output buffer
    //
    if (lpDeviceConfigOut == NULL) {
        DEBUGMSG(ZONE_FUNC|ZONE_ERROR, (TEXT("UNIMODEM:-TSPI_lineConfigDialogEdit Invalid lpDeviceConfigOut\n")));
        return LINEERR_INVALPOINTER;
    }

    if (lpDeviceConfigIn == NULL) {
        DEBUGMSG(ZONE_FUNC|ZONE_ERROR, (TEXT("UNIMODEM:-TSPI_lineConfigDialogEdit Invalid lpDeviceConfigIn\n")));
        return LINEERR_INVALPOINTER;
    }

    if (lpDeviceConfigOut->dwTotalSize < sizeof(VARSTRING)) {
        DEBUGMSG(ZONE_FUNC|ZONE_ERROR, (TEXT("UNIMODEM:-TSPI_lineConfigDialogEdit lpDeviceConfigOut too small\n")));
        return LINEERR_STRUCTURETOOSMALL;
    }

    // Validate the requested device class
    //
    if (lpszDeviceClass != NULL)
    {
        if (!ValidateDevCfgClass(lpszDeviceClass))
            return LINEERR_INVALDEVICECLASS;
    };

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕欧美激情一区| 国产精品美女久久久久久2018| 欧美经典一区二区| 美女脱光内衣内裤视频久久网站| 91香蕉国产在线观看软件| 欧美日韩美少妇| 亚洲国产精品黑人久久久| 激情深爱一区二区| 欧美大度的电影原声| 日本视频免费一区| 欧美精品高清视频| 日本中文在线一区| 69堂精品视频| 久久精品国产精品亚洲精品| 91精品国产综合久久国产大片| 亚洲日本一区二区三区| 成人av中文字幕| 自拍偷拍欧美精品| 欧美网站大全在线观看| 亚洲va欧美va天堂v国产综合| 欧美亚洲图片小说| 日韩电影免费在线观看网站| 日韩一区二区在线观看视频| 日韩精品国产精品| 欧美日韩一级黄| 免费在线看一区| 久久先锋影音av| av在线不卡免费看| 亚洲超丰满肉感bbw| 久久综合色婷婷| 色综合天天狠狠| 久久99精品久久久| 亚洲一区二区三区精品在线| 日韩精品在线网站| 91亚洲大成网污www| 久久草av在线| 亚洲激情av在线| 久久久亚洲精华液精华液精华液| 色婷婷久久99综合精品jk白丝| 日本中文字幕一区二区视频| 欧美高清在线视频| 久久免费视频一区| 欧美一卡二卡在线| 欧美中文字幕一二三区视频| 国产麻豆视频一区| 美国av一区二区| 亚洲成a人片在线观看中文| 欧美激情在线免费观看| 精品久久人人做人人爱| 欧美乱妇15p| 国产1区2区3区精品美女| 日韩国产欧美一区二区三区| **欧美大码日韩| 亚洲欧洲av在线| 中文欧美字幕免费| 国产精品理论片在线观看| 精品国产3级a| 久久久99久久精品欧美| 久久蜜桃香蕉精品一区二区三区| 欧美日韩视频不卡| 91一区二区三区在线观看| 国产资源精品在线观看| 免费在线欧美视频| 麻豆精品在线看| 中文字幕不卡在线播放| 日本一区二区三区国色天香| 欧美在线色视频| 欧美日韩黄色一区二区| 欧美自拍丝袜亚洲| 欧美日韩国产综合久久 | 欧美激情一区不卡| 久久九九久久九九| 国产欧美日韩三级| 国产精品网站在线观看| 国产精品网站一区| 久久久久久久久久看片| 91精品欧美福利在线观看| 欧美日韩一区在线| 欧美一个色资源| 国产欧美一区在线| 一区二区三区精品久久久| 亚洲成人一区二区在线观看| 久久国产生活片100| 国产麻豆91精品| aa级大片欧美| 91精品国产综合久久蜜臀| 精品国产乱码久久久久久牛牛 | 欧美电视剧在线观看完整版| 久久夜色精品国产欧美乱极品| 国产欧美视频一区二区| 亚洲色欲色欲www在线观看| 日韩成人免费电影| 成人免费毛片嘿嘿连载视频| 欧美久久久久久久久中文字幕| 欧美mv日韩mv| 亚洲曰韩产成在线| 成人做爰69片免费看网站| 51精品国自产在线| 国产精品传媒入口麻豆| 精品无人码麻豆乱码1区2区| 国产一区二区在线视频| 不卡的av网站| 国产清纯白嫩初高生在线观看91 | 青青草精品视频| 欧美亚洲一区二区在线| 国产精品久久影院| 久久99精品久久久久| 日韩一区二区在线观看视频播放| 亚洲一区精品在线| 欧美另类z0zxhd电影| 亚洲免费av网站| 91蜜桃视频在线| 亚洲人成在线播放网站岛国| 成人免费毛片片v| 国产欧美日韩激情| 国产做a爰片久久毛片| 中文字幕精品三区| 成人av一区二区三区| 日本一二三不卡| 91麻豆高清视频| 亚洲18色成人| 精品久久久久一区| 日本高清不卡在线观看| 亚洲六月丁香色婷婷综合久久| 91视频国产资源| 午夜欧美在线一二页| 欧美mv日韩mv| 95精品视频在线| 亚洲欧美福利一区二区| 99久久国产免费看| 亚洲午夜久久久久久久久久久| 欧美日韩成人高清| 久久国产福利国产秒拍| 欧美成人综合网站| 97久久精品人人做人人爽| 欧美国产97人人爽人人喊| 色伊人久久综合中文字幕| 亚洲另类中文字| 久久久久久久久久久99999| 国产乱理伦片在线观看夜一区| 综合婷婷亚洲小说| 欧美伦理视频网站| 波波电影院一区二区三区| 一区二区三区欧美亚洲| 日韩精品一区二区三区视频播放| 亚洲成人av福利| 综合激情成人伊人| 7777精品伊人久久久大香线蕉完整版| 精品一区二区三区免费| 日本一区二区三区dvd视频在线 | 精品国产免费视频| 欧美亚洲国产一区二区三区va| 久久精品国产色蜜蜜麻豆| 一区二区久久久| 欧美激情中文字幕一区二区| 欧美一区2区视频在线观看| 国产a级毛片一区| 国产乱码精品一区二区三区忘忧草| 国产免费成人在线视频| 欧美美女一区二区在线观看| 97精品国产露脸对白| av不卡在线播放| 91香蕉视频在线| 91国产视频在线观看| 色哟哟一区二区| 成人性色生活片免费看爆迷你毛片| 午夜影视日本亚洲欧洲精品| 亚洲视频小说图片| 亚洲综合色在线| 日韩一区精品视频| 久久精品国产99久久6| 精品一区二区免费在线观看| 久久国产欧美日韩精品| 国精产品一区一区三区mba视频| 狠狠网亚洲精品| 国产成人在线免费| 91一区二区在线观看| 欧美日韩亚洲国产综合| 欧美日韩一区二区在线观看视频| 欧美日韩国产另类一区| 欧美亚洲动漫制服丝袜| 911精品国产一区二区在线| 欧美精品一区二区在线观看| 中文字幕一区av| 日韩经典一区二区| 国产a久久麻豆| 欧美午夜片在线观看| 欧美羞羞免费网站| 26uuu精品一区二区| 国产精品成人网| 麻豆久久一区二区| 成人福利电影精品一区二区在线观看| 成人妖精视频yjsp地址| 在线观看亚洲精品视频| 欧美高清精品3d| 亚洲色图制服诱惑| 蜜臀精品久久久久久蜜臀| 成人app下载| 欧美猛男男办公室激情| 久久久精品天堂|