⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rasentry.c

📁 1.wince下判断拨号连接状态.以及设置拨号参数.
💻 C
📖 第 1 页 / 共 2 页
字号:
							  sizeof(RasEntry), (g_lpDevConfig) ?
							  ((LPBYTE)g_lpDevConfig + g_lpDevConfig->dwStringOffset) : NULL,
							  (g_lpDevConfig) ? g_lpDevConfig->dwStringSize : 0))
#else
	if (RasSetEntryProperties(NULL, szName, &RasEntry, sizeof(RasEntry) + 1000,
	  NULL, 0))
#endif
		LogDebugData(LOG_ABORT, TEXT("Error %d from \"RasSetEntryProperties\""),
		  GetLastError());
	else
		LogDebugData(LOG_PASS, TEXT("RasEntry '%s' created"), szName);

#ifdef UNDER_CE
    if (g_fUseDevConfig) {
        LocalFree(g_lpDevConfig);
    }
#endif

	RasDialParams.dwSize = sizeof(RASDIALPARAMS);
	_tcscpy (RasDialParams.szEntryName, szName);
	RasSetEntryDialParams(NULL, &RasDialParams, FALSE);
	
	CloseHandle (hFile);
	return 0;
}


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Functions:
    GetFileChar and GetFileLine

Description:
    These functions are called to read, respectively, a single character or a
	line from a RAS configuration file previously opened for reading.

-------------------------------------------------------------------*/

TCHAR GetFileChar(void)
{
	unsigned char ch;
	UINT cnt;
    BOOL bRet;
	bRet = ReadFile (hFile, &ch, 1, &cnt, 0);
	if (!bRet || (0 == cnt))
		return _TEOF;
	return (TCHAR)ch;
}


TCHAR *GetFileLine(TCHAR *s, int cch)
{
	TCHAR ch;
	TCHAR *pch;

	pch = s;
	while ((ch = GetFileChar()) != _TEOF)
	{
		if (ch == TEXT('\r')|| ch == TEXT('\n'))
		{
			if (pch == s)
				continue;
			break;
		}
		else
		{
			PREFAST_SUPPRESS(394, "False positive since we pass in param cch as buffer size and do overrun check below");
			*pch++ = ch;
		}

		if (pch - s == (cch - 1))
			break;
	}

	if ((_TEOF == ch) && (pch == s))
		return (TCHAR *)_TEOF;

	*pch = TEXT('\0');
	return s;
}


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Function:
    Usage

Description:
    This function prints a short list of instructions.

-------------------------------------------------------------------*/

void Usage(void)
{
	LogDebugData(LOG_EXCEPTION, TEXT("RasEntry utility"));
	LogDebugData(LOG_EXCEPTION, TEXT("This program will create a RAS Entry (or connectoid)"));
	LogDebugData(LOG_EXCEPTION, TEXT("based on the contents of a text file"));
	LogDebugData(LOG_EXCEPTION, TEXT("Usage: RasEntry [-dNUM] <FileName>"));
	LogDebugData(LOG_EXCEPTION, TEXT("  -dNUM  : Set Debug verbosity to NUM (0 to 15; default = 10)"));
	LogDebugData(LOG_EXCEPTION, TEXT("  Example: RasEntry \\msft.ras\r\n"));
}


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Function:
    GetRasIpAddress

Description:
    This function reads a string containing an IP address in dotted-decimal
	format and returns it in a RASIPADDR structure; if an error occurs, NULL
	is returned.  Bytes in the structure are ordered in big-endian format for
	NT, in little-endian format for CE.

-------------------------------------------------------------------*/

RASIPADDR *GetRasIpAddress(LPTSTR lpszIpString, RASIPADDR *lpRasIpAddr)
{
	unsigned a, b, c, d;

	LogDebugData(LOG_MAX_VERBOSITY, TEXT("Reading IP address from \"%s\""),
	  lpszIpString);
	if (_stscanf(lpszIpString, TEXT("%u.%u.%u.%u"), &a, &b, &c, &d) < 4)
		return NULL;
#ifdef UNDER_CE
	lpRasIpAddr->a = d;
	lpRasIpAddr->b = c;
	lpRasIpAddr->c = b;
	lpRasIpAddr->d = a;
#else
	lpRasIpAddr->a = a;
	lpRasIpAddr->b = b;
	lpRasIpAddr->c = c;
	lpRasIpAddr->d = d;
#endif
	return lpRasIpAddr;
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Function:
    TapiCallback

Description:
    Stub because lineInitialize requires a callback function.
-------------------------------------------------------------------*/
void CALLBACK
TapiCallback(
    DWORD               hDevice,
    DWORD               dwMessage,
    DWORD               dwInstance,
    DWORD               dwParam1,
    DWORD               dwParam2,
    DWORD               dwParam3
    )
{
    return;
}


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Function:
    FindDeviceID

Description:
    Given the device name, find the corresponding TAPI device ID.
    Set pfUnimodem to TRUE if the device is a unimodem device.
    
    Returns the TAPI device ID or -1 for failure.
-------------------------------------------------------------------*/
DWORD FindDeviceID(TCHAR * szDeviceName, BOOL * pfUnimodem)
{
    DWORD dwDeviceID;
    DWORD dwNumDevices;
    DWORD rc;
    HLINEAPP hLineApp;
    LPLINEDEVCAPS lpDevCaps;
    DWORD dwCapsLen;
    LPTSTR lpszTSP;

    LogDebugData(LOG_DETAIL, TEXT(_FILENAM) TEXT(" - FindDeviceID: %s"), szDeviceName);

    rc = lineInitialize(
            &hLineApp,
            (HINSTANCE)1, // hInstance is unused
            TapiCallback,
            TEXT("RASENTRY"),
            &dwNumDevices
            );
    if (rc) {
        LogDebugData(LOG_WARNING, TEXT(_FILENAM) TEXT(" - FindDeviceID - lineInitialize failed 0x%x"), rc);
        return -1;
    }

    dwCapsLen = sizeof(LINEDEVCAPS);

    //
    // Loop looking for a TAPI device whose line name matches szDeviceName
    //
    for (dwDeviceID = 0; dwDeviceID < dwNumDevices; dwDeviceID++) {
        lpDevCaps = LocalAlloc(LPTR, dwCapsLen);
        if (NULL == lpDevCaps) {
            LogDebugData(LOG_WARNING, TEXT(_FILENAM) TEXT(" - FindDeviceID - LocalAlloc failed"));
            goto fdi_fail;
        }
        lpDevCaps->dwTotalSize = dwCapsLen;
        rc = lineGetDevCaps(
                hLineApp,
                dwDeviceID,
                TAPI_CURRENT_VERSION,
                0,
                lpDevCaps
                );
        if (rc) {
            LocalFree(lpDevCaps);
            continue;
        }

        //
        // Make sure we get the full devcaps info
        //
        if (lpDevCaps->dwTotalSize < lpDevCaps->dwNeededSize) {
            dwCapsLen = lpDevCaps->dwNeededSize;
            LocalFree(lpDevCaps);
            lpDevCaps = LocalAlloc(LPTR, dwCapsLen);
            if (NULL == lpDevCaps) {
                LogDebugData(LOG_WARNING, TEXT(_FILENAM) TEXT(" - FindDeviceID - LocalAlloc failed."));
                goto fdi_fail;
            }
            lpDevCaps->dwTotalSize = dwCapsLen;
            rc = lineGetDevCaps(
                    hLineApp,
                    dwDeviceID,
                    TAPI_CURRENT_VERSION,
                    0,
                    lpDevCaps
                    );
            if ((rc) || (lpDevCaps->dwTotalSize < lpDevCaps->dwNeededSize)) {
                LocalFree(lpDevCaps);
                continue;
            }
        }

        //
        // Compare the TAPI device's line name.
        //
		if (!_tcscmp((LPTSTR) ((char *)lpDevCaps + lpDevCaps->dwLineNameOffset), szDeviceName)) {
            //
            // It's a match. Now see if it's a unimodem device
            //
            if (pfUnimodem) {
                *pfUnimodem = FALSE;
                if (lpDevCaps->dwProviderInfoSize) {
                    lpszTSP = (LPTSTR)((DWORD)lpDevCaps + lpDevCaps->dwProviderInfoOffset);
                    LogDebugData(LOG_DETAIL, TEXT(_FILENAM) TEXT(" - FindDeviceID - TSP for %d is %s"), dwDeviceID, lpszTSP);
                    if (!_tcscmp(lpszTSP, TEXT("UNIMODEM"))) {
                        *pfUnimodem = TRUE;
                    }
                }
            }
            lineShutdown(hLineApp);
            LocalFree(lpDevCaps);
            return dwDeviceID;
        }

    }   // for dwDeviceID

fdi_fail:
    LogDebugData(LOG_WARNING, TEXT(_FILENAM) TEXT(" - FindDeviceID - %s is not a UNIMODEM device"), szDeviceName);
    lineShutdown(hLineApp);
    return -1;
}


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Function:
    SetBaudRate

Description:
    Convert the string form of the baud rate setting to an int and then
    use the lineDevSpecific interface to unimodem to edit the private
    structure.
-------------------------------------------------------------------*/
BOOL SetBaudRate(TCHAR * szBaud)
{
    BOOL fUnimodem;
    DWORD dwDeviceID;
    DWORD dwNumDevices;
    DWORD rc;
    HLINEAPP hLineApp;
    HLINE hLine;
    LPVARSTRING lpDevConfig;
    DWORD dwLen;
    UNIMDM_CHG_DEVCFG UCD;

    //
    // Get device ID of the TAPI device whose line name matches the RASENTRY szDeviceName
    //
    dwDeviceID = FindDeviceID(RasEntry.szDeviceName, &fUnimodem);
    if (dwDeviceID == -1) {
        return FALSE;
    }

    //
    // This interface is only supported by unimodem
    //
    if (fUnimodem == FALSE) {
        return FALSE;
    }

    rc = lineInitialize(
            &hLineApp,
            (HINSTANCE)1, // hInstance is unused
            TapiCallback,
            TEXT("RASENTRY"),
            &dwNumDevices
            );
    if (rc) {
        LogDebugData(LOG_WARNING, TEXT(_FILENAM) TEXT(" - SetBaudRate - lineInitialize failed 0x%x"), rc);
        return FALSE;
    }

    lpDevConfig = NULL;

    //
    // Open the TAPI device
    //
    rc = lineOpen(
            hLineApp,
            dwDeviceID,
            &hLine,
            TAPI_CURRENT_VERSION,
            0,
            0,
            LINECALLPRIVILEGE_MONITOR,
            LINEMEDIAMODE_DATAMODEM,
            NULL
            );
    if (rc) {
        LogDebugData(LOG_WARNING, TEXT(_FILENAM) TEXT(" - SetBaudRate - lineOpen(%d) failed 0x%x"), dwDeviceID, rc);
        goto gbr_fail;
    }

    //
    // Find out how big its DevConfig is and get it.
    //
    dwLen = sizeof(VARSTRING);
    lpDevConfig = LocalAlloc(LPTR, dwLen);
    if (NULL == lpDevConfig) {
        LogDebugData(LOG_WARNING, TEXT(_FILENAM) TEXT(" - SetBaudRate - LocalAlloc failed"));
        goto gbr_fail;
    }

    lpDevConfig->dwTotalSize = dwLen;
    rc = lineGetDevConfig(
            dwDeviceID,
            lpDevConfig,
            TEXT("comm/datamodem")
            );
    if (rc) {
        LogDebugData(LOG_WARNING, TEXT(_FILENAM) TEXT(" - SetBaudRate - lineGetDevConfig(%d) failed 0x%x"), dwDeviceID, rc);
        goto gbr_fail;
    }

    if (lpDevConfig->dwTotalSize < lpDevConfig->dwNeededSize) {
        dwLen = lpDevConfig->dwNeededSize;
        LocalFree(lpDevConfig);
        lpDevConfig = LocalAlloc(LPTR, dwLen);
        if (NULL == lpDevConfig) {
            LogDebugData(LOG_WARNING, TEXT(_FILENAM) TEXT(" - SetBaudRate - LocalAlloc failed."));
            goto gbr_fail;
        }

        lpDevConfig->dwTotalSize = dwLen;
        rc = lineGetDevConfig(
                dwDeviceID,
                lpDevConfig,
                TEXT("comm/datamodem")
                );
        if (rc) {
            LogDebugData(LOG_WARNING, TEXT(_FILENAM) TEXT(" - SetBaudRate - lineGetDevConfig(%d) failed 0x%x."), dwDeviceID, rc);
            goto gbr_fail;
        }
    }

    //
    // Use the lineDevSpecific interface to unimodem to edit the baud rate
    // in the devconfig.
    //
    UCD.dwCommand = UNIMDM_CMD_CHG_DEVCFG;
    UCD.lpszDeviceClass = TEXT("comm/datamodem");
    UCD.lpDevConfig = (LPVOID)lpDevConfig;
    UCD.dwOption = UNIMDM_OPT_BAUDRATE;
    UCD.dwValue  = _tcstol(szBaud, (TCHAR)0, 10);

    rc = lineDevSpecific(
            hLine,
            0,
            NULL,
            &UCD,
            sizeof(UCD)
            );
    if (!(rc & 0x80000000)) {   // Valid async ID ?
        lineShutdown(hLineApp);
        g_lpDevConfig = lpDevConfig;  // gets freed at end of main()
        g_dwDevConfigLen = lpDevConfig->dwNeededSize;
        return TRUE;
    }

    LogDebugData(LOG_WARNING, TEXT(_FILENAM) TEXT(" - SetBaudRate - lineDevSpecific(%d) failed 0x%x."), dwDeviceID, rc);

gbr_fail:
    if (lpDevConfig) {
        LocalFree(lpDevConfig);
    }
    lineShutdown(hLineApp);
    return FALSE;
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Function:
    LogDebugData

Description:
    This subroutine logs data to the debugger (CE) or command window (NT) if
	the requested verbosity is less than the global verbosity level.

-------------------------------------------------------------------*/
void LogDebugData(DWORD dwVerbosity, LPCTSTR szFormat, ...)
{
    TCHAR szBuffer[320];
    va_list pArgs;

	if (dwVerbosity <= dwDebugFlag)
	{
		va_start(pArgs, szFormat);
	    _vstprintf(szBuffer, szFormat, pArgs);
		va_end(pArgs);

	    _tcscat(szBuffer, TEXT("\n"));
		OutputDebugString(szBuffer);

#ifndef UNDER_CE
	    _tprintf(szBuffer);
#endif
	}
}


⌨️ 快捷键说明

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