tspi.c

来自「wince下的源代码集合打包」· C语言 代码 · 共 1,992 行 · 第 1/5 页

C
1,992
字号
    DWORD          dwSelect,    LPVARSTRING    lpDeviceID,    LPCWSTR        lpszDeviceClass    ){    PTLINEDEV   pLineDev;    UINT       cbPort;    UINT       idClass;    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineGetID - ProcPerm=0x%X\n"),			  GetCurrentPermissions()));    switch (dwSelect)    {        case LINECALLSELECT_ADDRESS:            if (dwAddressID != 0)            {                DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetID - INVALADDRESSID\n")));                return LINEERR_INVALADDRESSID;            }             // FALLTHROUGH        case LINECALLSELECT_LINE:            if ((pLineDev = GetLineDevfromHandle ((DWORD)hdLine)) == NULL)            {                DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetID - INVALLINEHANDLE\n")));                return LINEERR_INVALLINEHANDLE;            }            break;        case LINECALLSELECT_CALL:            if ((pLineDev = GetLineDevfromHandle ((DWORD)hdCall)) == NULL)            {                DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetID - INVALCALLHANDLE\n")));                return LINEERR_INVALCALLHANDLE;            }            break;        default:            DEBUGMSG(ZONE_FUNC,                     (TEXT("UNIMODEM:-TSPI_lineGetID - Invalid dwSelect x%X\n"),                         dwSelect));            return LINEERR_OPERATIONFAILED;    }     // Determine the device class     //    for (idClass = 0; idClass < MAX_SUPPORT_CLASS; idClass++)    {                DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:TSPI_lineGetID Comparing strings %s to %s\n"),                  lpszDeviceClass, aGetID[idClass].szClassName));        if (wcsicmp(lpszDeviceClass, aGetID[idClass].szClassName) == 0)            break;    };	DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:TSPI_lineGetID Class ID = %d (%s)\n"), idClass,			  aGetID[idClass].szClassName));         // Determine the required size     //    switch (idClass)    {        case TAPILINE:            cbPort = sizeof(DWORD);            break;        case COMM:            cbPort = (wcslen(pLineDev->szFriendlyName) + 1) * sizeof(WCHAR);            break;        case COMMMODEM:            cbPort = (wcslen(pLineDev->szFriendlyName) + 1) * sizeof(WCHAR) + sizeof(DWORD);            break;        case NDIS:            cbPort = sizeof(g_szDeviceClass) + sizeof(DWORD);            break;                    default:            DEBUGMSG(ZONE_FUNC,                     (TEXT("UNIMODEM:-TSPI_lineGetID - Invalid ID Class x%X\n"),                      idClass ));            return LINEERR_OPERATIONFAILED;    };     // Calculate the required size     //     //lpDeviceID->dwUsedSize = sizeof(VARSTRING); // TAPI fills it in.    lpDeviceID->dwNeededSize = sizeof(VARSTRING) + cbPort;    lpDeviceID->dwStringFormat = aGetID[idClass].dwFormat;    ASSERT(lpDeviceID->dwUsedSize == sizeof(VARSTRING));    if ((lpDeviceID->dwTotalSize - lpDeviceID->dwUsedSize) <        cbPort)    {        DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetID - Inusufficient space\n")));        return SUCCESS;    }         // We have enough space to return valid information     //    lpDeviceID->dwStringSize   = cbPort;    lpDeviceID->dwStringOffset = sizeof(VARSTRING);    lpDeviceID->dwUsedSize    += cbPort;     // Return the useful information    switch (idClass)    {        case TAPILINE:        {            LPDWORD lpdwDeviceID;            lpdwDeviceID = (LPDWORD)(((LPBYTE)lpDeviceID) + sizeof(VARSTRING));            *lpdwDeviceID = (DWORD) pLineDev->dwDeviceID;            DEBUGMSG(ZONE_MISC,                     (TEXT("UNIMODEM:-TSPI_lineGetID TAPILINE - Device ID x%X\n"),                      pLineDev->dwDeviceID));            break;        }        case COMM:        {            wcsncpy( (LPWSTR)((LPBYTE)lpDeviceID + sizeof(VARSTRING)),                      pLineDev->szFriendlyName, (cbPort/sizeof(WCHAR)) );            DEBUGMSG(ZONE_MISC,                     (TEXT("UNIMODEM:-TSPI_lineGetID COMM - Device name \"%s\" (len %d)\n"),                      pLineDev->szFriendlyName, (cbPort/sizeof(WCHAR))));            break;        }        case COMMMODEM:        {            LPDWORD lpdwDeviceHandle;            lpdwDeviceHandle = (LPDWORD)(((LPBYTE)lpDeviceID) + sizeof(VARSTRING));            if (pLineDev->hDevice != (HANDLE)INVALID_DEVICE)            {                *lpdwDeviceHandle = (DWORD)pLineDev->hDevice;				SetHandleOwner((HANDLE)*lpdwDeviceHandle, GetCallerProcess());            }            else            {                *lpdwDeviceHandle = (DWORD)NULL;            };            wcscpy((LPWSTR)(lpdwDeviceHandle+1), pLineDev->szFriendlyName );            DEBUGMSG(ZONE_MISC,                     (TEXT("UNIMODEM:-TSPI_lineGetID COMMMODEM - Device Handle x%X, Device name %s\n"),                      *lpdwDeviceHandle, pLineDev->szFriendlyName));            break;        }        case NDIS:        {            LPDWORD lpdwDeviceID;            lpdwDeviceID = (LPDWORD)(((LPBYTE)lpDeviceID) + sizeof(VARSTRING));            *lpdwDeviceID = (pLineDev->hDevice != (HANDLE)INVALID_DEVICE ?                             (DWORD)pLineDev->hDevice_r0 : (DWORD)NULL);            wcscpy((LPWSTR)(lpdwDeviceID+1), g_szDeviceClass);            DEBUGMSG(ZONE_MISC,                     (TEXT("UNIMODEM:-TSPI_lineGetID NDIS - Device Handle x%X, Device name %s\n"),                      *lpdwDeviceID, g_szDeviceClass));            break;        }    };    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetID\n")));    return SUCCESS;}LONGTSPIAPITSPI_lineGetLineDevStatus(    HDRVLINE hdLine,    LPLINEDEVSTATUS lpLineDevStatus    ){    LONG rc;    PTLINEDEV  pLineDev;    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineGetLineDevStatus\n")));        InitVarData((LPVOID)lpLineDevStatus, sizeof(LINEDEVSTATUS));        if ((pLineDev = GetLineDevfromHandle ((DWORD)hdLine)) == NULL) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineGetLineDevStatus ** Invalid Handle\n")));        rc = LINEERR_INVALLINEHANDLE;        goto exitPoint;    }        rc = 0;    if (pLineDev->dwCallFlags & CALL_ACTIVE) {        lpLineDevStatus->dwNumActiveCalls = 1;        lpLineDevStatus->dwLineFeatures = 0;    } else {        lpLineDevStatus->dwNumActiveCalls = 0;        lpLineDevStatus->dwLineFeatures = (pLineDev->dwCallFlags & CALL_ALLOCATED) ?                                            0 : LINEFEATURE_MAKECALL;    }        // Line hardware information    //    lpLineDevStatus->dwSignalLevel  = 0x0000FFFF;    lpLineDevStatus->dwBatteryLevel = 0x0000FFFF;    lpLineDevStatus->dwRoamMode     = LINEROAMMODE_UNAVAIL;        // Always allow TAPI calls    //    lpLineDevStatus->dwDevStatusFlags = LINEDEVSTATUSFLAGS_CONNECTED;    /* TODO    if (!(pLineDev->fdwResources & LINEDEVFLAGS_OUTOFSERVICE)) {        lpLineDevStatus->dwDevStatusFlags |= LINEDEVSTATUSFLAGS_INSERVICE;    }      */    exitPoint:        DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetLineDevStatus 0x%x\n"), rc));    return rc;}   // TSPI_lineGetLineDevStatusLONGTSPIAPITSPI_lineGetNumAddressIDs(    HDRVLINE hdLine,    LPDWORD lpdwNumAddressIDs    ){    LONG rc;    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineGetNumAddressIDs\n")));    if (GetLineDevfromHandle ((DWORD)hdLine) == NULL) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineGetNumAddressIDs ** Invalid Handle\n")));        rc = LINEERR_INVALLINEHANDLE;    } else {        rc = 0;        *lpdwNumAddressIDs = 1;    }    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetNumAddressIDs 0x%x\n"), rc));    return rc;}   // TSPI_lineGetNumAddressIDsLONG TSPIAPITSPI_lineMakeCall(    DRV_REQUESTID          dwRequestID,    HDRVLINE               hdLine,    HTAPICALL              htCall,    LPHDRVCALL             lphdCall,    LPCWSTR                lpszDestAddress,    DWORD                  dwCountryCode,    LPLINECALLPARAMS const lpCallParams    ){    PTLINEDEV pLineDev;    DWORD dwRet;    BOOL  fDoTakeover = FALSE;    WCHAR szSuffix[16];    DWORD dwSize;    DEBUGMSG(ZONE_FUNC|ZONE_CALLS, (TEXT("UNIMODEM:+TSPI_lineMakeCall\n")));    if ((pLineDev = GetLineDevfromHandle ((DWORD)hdLine)) == NULL) {        DEBUGMSG(ZONE_FUNC|ZONE_ERROR|ZONE_CALLS,                 (TEXT("UNIMODEM:-TSPI_lineMakeCall ** Invalid Handle\n")));        return LINEERR_INVALLINEHANDLE;    }         // See if we have a free call struct.    if (pLineDev->dwCallFlags & CALL_ALLOCATED) {        DEBUGMSG(ZONE_FUNC|ZONE_ERROR|ZONE_CALLS,                 (TEXT("UNIMODEM:-TSPI_lineMakeCall ** Call already allocated\n")));        return LINEERR_CALLUNAVAIL;    }        // By default, don't do blind dialing.    pLineDev->dwDialOptions &= ~MDM_BLIND_DIAL;     // Examine LINECALLPARAMS, if present    if (lpCallParams) {        DEBUGMSG(ZONE_FUNC|ZONE_ERROR|ZONE_CALLS,                 (TEXT("UNIMODEM:TSPI_lineMakeCall - Check CallParams\n")));                 // verify media mode        if (lpCallParams->dwMediaMode & ~pLineDev->dwMediaModes) {            DEBUGMSG(ZONE_FUNC|ZONE_ERROR|ZONE_CALLS,                     (TEXT("UNIMODEM:-TSPI_lineMakeCall ** Invalid Media Mode\n")));            return LINEERR_INVALMEDIAMODE;        }        DEBUGMSG(ZONE_MISC,                 (TEXT("UNIMODEM:TSPI_lineMakeCall - verified media modes\n")));                 // verify bearer mode        if ((~pLineDev->dwBearerModes) & lpCallParams->dwBearerMode) {            DEBUGMSG(ZONE_FUNC|ZONE_ERROR|ZONE_CALLS,                     (TEXT("UNIMODEM:-TSPI_lineMakeCall ** Invalid Bearer Mode 0x%x vs 0x%x\n"),                      pLineDev->dwBearerModes, lpCallParams->dwBearerMode));            return LINEERR_INVALBEARERMODE;        }        if (lpCallParams->dwBearerMode & LINEBEARERMODE_PASSTHROUGH) {            fDoTakeover = TRUE;        } else {             // We're not requested to do passthrough.  Can we actually             // dial the media modes without passthrough?  This is to             // prevent G3FAX from being used without passthrough...             // (We can only dial with DATAMODEM)            if ((lpCallParams->dwMediaMode &                 (LINEMEDIAMODE_DATAMODEM)) == 0) {                DEBUGMSG(ZONE_FUNC|ZONE_ERROR|ZONE_CALLS,                         (TEXT("UNIMODEM:-TSPI_lineMakeCall ** Invalid Media Mode\n")));                return LINEERR_INVALMEDIAMODE;            }        }        pLineDev->dwCurBearerModes = lpCallParams->dwBearerMode;        pLineDev->dwCurMediaModes = lpCallParams->dwMediaMode;        DEBUGMSG(ZONE_MISC,                 (TEXT("UNIMODEM:TSPI_lineMakeCall - got media & bearer modes\n")));        if (!(lpCallParams->dwCallParamFlags & LINECALLPARAMFLAGS_IDLE)) {            DEBUGMSG(ZONE_FUNC|ZONE_CALLS,             (TEXT("UNIMODEM:TSPI_lineMakeCall LINECALLPARAMFLAGS_IDLE: not set, no dialtone detect\n") ));             // Turn on blind dialing            pLineDev->dwDialOptions |= MDM_BLIND_DIAL;        }        if ((lpCallParams->dwAddressType) && (lpCallParams->dwAddressType != LINEADDRESSTYPE_PHONENUMBER)) {            DEBUGMSG(ZONE_FUNC|ZONE_ERROR|ZONE_CALLS,                     (TEXT("UNIMODEM:-TSPI_lineMakeCall ** Invalid Address Type\n")));            return LINEERR_INVALADDRESS;        }                        } else {         // set the standard defaults - for peg tapi it is DATAMODEM        ASSERT(pLineDev->dwMediaModes & LINEMEDIAMODE_DATAMODEM);        pLineDev->dwCurMediaModes = LINEMEDIAMODE_DATAMODEM;        pLineDev->dwCurBearerModes = pLineDev->dwBearerModes & ~LINEBEARERMODE_PASSTHROUGH;    }     // Do we have a phone number?     //    if (!fDoTakeover)    {        if (IS_NULL_MODEM(pLineDev) ||            pLineDev->DevMiniCfg.fwOptions & MANUAL_DIAL)        {            *pLineDev->szAddress = '\0';            DEBUGMSG(ZONE_MISC|ZONE_CALLS,                     (TEXT("UNIMODEM:TSPI_lineMakeCall - Manual dial, zeroing dial string\n")));             // Turn on blind dialing if this is MANUAL_DIAL.            if (pLineDev->DevMiniCfg.fwOptions & MANUAL_DIAL)            {                pLineDev->dwDialOptions |= MDM_BLIND_DIAL;            }        }        else        {             // Validate lpszDestAddress and get the processed form of it.            DEBUGMSG(ZONE_MISC|ZONE_CALLS,                     (TEXT("UNIMODEM:TSPI_lineMakeCall - validating destination address\n")));            dwRet = ValidateAddress(pLineDev, lpszDestAddress, pLineDev->szAddress);            if (SUCCESS != dwRet)            {                DEBUGMSG(ZONE_FUNC|ZONE_ERROR|ZONE_CALLS,                         (TEXT("UNIMODEM:-TSPI_lineMakeCall ** Invalid Address\n")));                return dwRet;            }                 // if the lpszDestAddress was NULL or "", then we just want to do a             // dialtone detection.  We expect that lineDial will be called.             // Setting the szAddress to ";" will do this.            if ('\0' == pLineDev->szAddress[0])            {                dwSize = sizeof(szSuffix);                if (ERROR_SUCCESS != MdmRegGetValue( pLineDev,                                         szSettings,                                         szDialSuffix,                                         REG_SZ,                                         (PUCHAR)szSuffix,                                         &dwSize) )                {                    wcscpy(szSuffix, TEXT(";"));                }                                wcscpy(pLineDev->szAddress, szSuffix);            }        }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?