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

📄 rasentry.c

📁 1.wince下判断拨号连接状态.以及设置拨号参数.
💻 C
📖 第 1 页 / 共 2 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.


Module Name:
    RasEntry.c

Abstract:
    RAS Phonebook Entry Program
		This program adds an entry to the RAS phonebook, which is kept in the
	registry under Windows CE, using data read from a configuration file.  The
	configuration file is a text file consisting of several lines in the form
	"Label=Data"; any configuration constants not included in the file are set
	to default values.  Output is to the console/debugger.

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


#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <ras.h>
#include <raserror.h>
#include <tapi.h>
#ifdef UNDER_CE
#include <unimodem.h>
#endif

#ifdef UNICODE
#define _TEOF		WEOF
#else
#define _TEOF		EOF
#endif

#define _FILENAM  "RasEntry"

/*		The enumerated constants in "LabelValue" and the corresponding array  */
/* "Labels" are used to parse the RAS configuration file for matching strings.*/

enum {
	VAL_NAME,
	VAL_COUNTRYCODE,
	VAL_AREACODE,
	VAL_PHONE,
	VAL_SPECIFICIPADDR,
	VAL_IPADDR,
	VAL_SPECIFICNAMESERVERS,
	VAL_DNSADDR,
	VAL_ALTDNSADDR,
	VAL_WINSADDR,
	VAL_ALTWINSADDR,
	VAL_DEVICETYPE,
	VAL_DEVICENAME,
	VAL_IPHEADERCOMPRESSION,
	VAL_SWCOMPRESSION,
	VAL_USECOUNTRYANDAREACODES,
	VAL_REQUIREENCRYPTEDPW,
	VAL_REQUIREMSENCRYPTEDPW,
	VAL_REQUIREDATAENCRYPTION,
	VAL_DIALASLOCALCALL,
	VAL_FRAMING,
	VAL_FRAMESIZE,
	VAL_SCRIPT,
	VAL_USERNAME,
	VAL_PASSWORD,
	VAL_DOMAIN,
#ifdef UNDER_CE
    VAL_BAUDRATE,
#endif
	VAL_MAX
}  LabelValue;

TCHAR	*Labels[] = {
	TEXT("Name"),
	TEXT("CountryCode"),
	TEXT("AreaCode"),
	TEXT("Phone"),
	TEXT("SpecificIpAddr"),
	TEXT("IpAddr"),
	TEXT("SpecificNameServers"),
	TEXT("DnsAddr"),
	TEXT("AltDnsAddr"),
	TEXT("WinsAddr"),
	TEXT("AltWinsAddr"),
	TEXT("DeviceType"),
	TEXT("DeviceName"),
	TEXT("IpHeaderCompression"),
	TEXT("SwCompression"),
	TEXT("UseCountryAndAreaCodes"),
	TEXT("RequireEncryptedPw"),
	TEXT("RequireMsEncryptedPw"),
	TEXT("RequireDataEncryption"),
	TEXT("DialAsLocalCall"),
	TEXT("Framing"),
	TEXT("FrameSize"),
	TEXT("Script"),
	TEXT("UserName"),
	TEXT("Password"),
	TEXT("Domain")
#ifdef UNDER_CE
    , TEXT("BaudRate")
#endif
};

#define LOG_EXCEPTION          0				  /* Output verbosity levels */
#define LOG_FAIL               2
#define LOG_WARNING            3
#define LOG_ABORT              4
#define LOG_SKIP               6
#define LOG_NOT_IMPLEMENTED    8
#define LOG_PASS              10
#define LOG_DETAIL            12
#define LOG_COMMENT           14
#define LOG_MAX_VERBOSITY     15

#define MAX_LINE			 256
#define MAXENTRIES            25      /* Maximum number of phonebook entries */

HANDLE		hFile;
DWORD		dwDebugFlag = LOG_PASS;
RASENTRY    RasEntry;
#ifdef UNDER_CE
BOOL g_fUseDevConfig;
BOOL g_fDevName;
LPVARSTRING g_lpDevConfig;
DWORD g_dwDevConfigLen;

BOOL SetBaudRate(TCHAR *s);
#endif


//------------------------------------------------------------------------
//	Program functions - prototypes:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

int _tmain(int, TCHAR**);
TCHAR GetFileChar(void);
TCHAR *GetFileLine(TCHAR *s, int cch);
void Usage(void);
RASIPADDR *GetRasIpAddress(LPTSTR lpszIpString, RASIPADDR *lpRasIpAddr);
void LogDebugData(DWORD dwVerbosity, LPCTSTR szFormat, ...);




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

Function:
    _tmain

Description:
    The main function for the program.  It reads the name of a RAS
	configuration file from the command line, opens and parses it, and places
	the data it contains in RAS configuration structures which are then saved.
	If there are no command-line arguments, a list of the current entries is
	printed.

Notes:
	Arguments containing quotes are parsed by replacing the leading quote with
	a space; this must be allowed for when reading strings.

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

int _tmain(int argc, TCHAR *argv[])
{
	DWORD           cb;
	RASDIALPARAMS	RasDialParams;
	TCHAR			szName[RAS_MaxEntryName + 1];
	TCHAR			szLine[MAX_LINE];
	TCHAR			szFileName[MAX_LINE];
	DWORD			dwLineNum = 0;
	TCHAR			*szStart, *szEnd;
	DWORD			dwLabel;
	int				i;

	LogDebugData(LOG_PASS, TEXT("\n\r")  TEXT(_FILENAM)
	  TEXT(" - RAS Connection Creation Program"));

    // This will create the default entries if the key does not exist.
    RasEnumEntries (NULL, NULL, NULL, &cb, NULL);

	if (argc < 2)	/* If no command-line parameters, list current entries */
	{
		LPRASENTRYNAME lpRasEntries;	// Pointer to the RasEntries.
		int            cEntries;			// Number of Entries found
		
		cb = MAXENTRIES * sizeof(RASENTRYNAME);
		lpRasEntries = (LPRASENTRYNAME)LocalAlloc(LPTR, cb);
		if (RasEnumEntries (NULL, NULL, lpRasEntries, &cb, &cEntries))
			LogDebugData(LOG_ABORT, TEXT("Unable to read RAS phonebook"));
		else
		{
			LogDebugData(LOG_PASS, TEXT("RAS phonebook: %lu entries:"),
			  cEntries);
			for (i = 0; i < cEntries; i++)
				LogDebugData(LOG_PASS, TEXT("Entry #%d: \"%s\""), i,
				  lpRasEntries[i].szEntryName);
		}
		return 0;
	}
	
	// Get a default RasEntry
	RasEntry.dwSize = sizeof(RASENTRY);
#ifdef UNDER_CE
	cb = sizeof(RASENTRY);
	RasGetEntryProperties (NULL, TEXT(""), &RasEntry, &cb, NULL, NULL);
#else
	cb = sizeof(RASENTRY) + 1000; /* NT needs space for alternate phone list */
	RasGetEntryProperties(NULL,  TEXT(""), &RasEntry, &cb, NULL, NULL);
#endif
	memset((char *)&RasDialParams, 0, sizeof(RasDialParams));
	szName[0] = TEXT('\0');
	szFileName[0] = TEXT('\0');

	// Parse the command line parameters
	for (i = 1; i < argc; ++i)
	{
		if ((_tcsnicmp(argv[i], TEXT("-d"), 2) == 0) ||
 		  (_tcsnicmp(argv[i], TEXT("/d"), 2) == 0))
		{
			if (_tcslen(argv[i]) > 2)
				dwDebugFlag = _tcstoul(argv[i] + 2, NULL, 10);
			else
				dwDebugFlag = LOG_MAX_VERBOSITY;
			LogDebugData(LOG_MAX_VERBOSITY, TEXT("Verbosity level = %lu"),
			  dwDebugFlag);
		}
		else if ((*(argv[i]) == '-') || (*(argv[i]) == '/'))
		{
			Usage();
			return 0;
		}
		else if (szFileName[0] == TEXT('\0'))	   /* copy the filename over */
		{
			if (*(argv[i] + 2) == TEXT(' ')) {  /* skip over leading space */
				if (_tcslen(argv[i] + 1) < MAX_LINE) 
					_tcscpy(szFileName, argv[i] + 1);
			}
			else {
				if (_tcslen(argv[i]) < MAX_LINE) 
					_tcscpy(szFileName, argv[i]);
			}
		}
	}
	if (szFileName[0] == TEXT('\0'))
	{
		Usage();
		return 0;
	}
	LogDebugData(LOG_MAX_VERBOSITY,
	  TEXT("RasEntry: verbosity = %d szFileName = \"%s\""), dwDebugFlag,
	  szFileName);

#ifdef UNDER_CE
    g_fUseDevConfig = FALSE;
    g_fDevName = FALSE;
    g_lpDevConfig = NULL;
#endif

	hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
	  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (INVALID_HANDLE_VALUE == hFile)
	{
		LogDebugData (LOG_ABORT, TEXT("Error %u opening file '%s'"), GetLastError(), szFileName);
		return -1;
	}

	while ((TCHAR *)_TEOF != GetFileLine(szLine, MAX_LINE))
	{
		dwLineNum++;
		LogDebugData(LOG_DETAIL, TEXT("Line %d: '%s'"), dwLineNum, szLine);

		for (szStart = szLine; _istspace(*szStart); szStart++)
			;
		
		// Allow comment lines
		if ((TEXT(';') == *szStart) || (TEXT('#') == *szStart))
			continue;
		
		for (szEnd = szStart; *szEnd && !_istspace(*szEnd) &&
		  (TEXT('=') != *szEnd); szEnd++)
			;
		if (szEnd)
		{
			PREFAST_SUPPRESS(394, "False positive since szEnd is not past the end of the buffer");
			*szEnd = TEXT('\0');
		}
		else
		{
			LogDebugData(LOG_ABORT, TEXT("%d : Invalid input line '%s'"), dwLineNum, szLine);
			continue;
		}
		for (dwLabel = 0; dwLabel != VAL_MAX; dwLabel++)
		{
			if (!_tcsicmp (Labels[dwLabel], szStart))
				break;
		}
		szStart = szEnd + 1;

		switch (dwLabel)
		{
			case VAL_NAME:
				_tcsncpy(szName, szStart, RAS_MaxEntryName);
				break;
			case VAL_COUNTRYCODE:
				RasEntry.dwCountryCode = _ttol(szStart);
				break;
			case VAL_AREACODE:
				_tcsncpy (RasEntry.szAreaCode, szStart, RAS_MaxAreaCode);
				break;
			case VAL_PHONE:
				_tcsncpy (RasEntry.szLocalPhoneNumber, szStart,
				  RAS_MaxPhoneNumber);
				break;
			case VAL_SPECIFICIPADDR:
				if ((*szStart == 'y') || (*szStart == 'Y'))
					RasEntry.dwfOptions |= RASEO_SpecificIpAddr;
				else
					RasEntry.dwfOptions &= ~(RASEO_SpecificIpAddr);
				break;
			case VAL_IPADDR:
				GetRasIpAddress(szStart, &(RasEntry.ipaddr));
				break;
			case VAL_SPECIFICNAMESERVERS:
				if ((*szStart == 'y') || (*szStart == 'Y'))
					RasEntry.dwfOptions |= RASEO_SpecificNameServers;
				else
					RasEntry.dwfOptions &= ~(RASEO_SpecificNameServers);
				break;
			case VAL_DNSADDR:
				GetRasIpAddress(szStart, &(RasEntry.ipaddrDns));
				break;
			case VAL_ALTDNSADDR:
				GetRasIpAddress(szStart, &(RasEntry.ipaddrDnsAlt));
				break;
			case VAL_WINSADDR:
				GetRasIpAddress(szStart, &(RasEntry.ipaddrWins));
				break;
			case VAL_ALTWINSADDR:
				GetRasIpAddress(szStart, &(RasEntry.ipaddrWinsAlt));
				break;
			case VAL_DEVICETYPE:
				_tcsncpy (RasEntry.szDeviceType, szStart, RAS_MaxDeviceType + 1);
				break;
			case VAL_DEVICENAME:
				_tcsncpy (RasEntry.szDeviceName, szStart, RAS_MaxDeviceName + 1);
#ifdef UNDER_CE
                g_fDevName = TRUE;
#endif
				break;
			case VAL_IPHEADERCOMPRESSION:
				if ((*szStart == 'y') || (*szStart == 'Y'))
					RasEntry.dwfOptions |= RASEO_IpHeaderCompression;
				else
					RasEntry.dwfOptions &= ~(RASEO_IpHeaderCompression);
				break;
			case VAL_SWCOMPRESSION:
				if ((*szStart == 'y') || (*szStart == 'Y'))
					RasEntry.dwfOptions |= RASEO_SwCompression;
				else
					RasEntry.dwfOptions &= ~(RASEO_SwCompression);
				break;
			case VAL_USECOUNTRYANDAREACODES:
				if ((*szStart == 'y') || (*szStart == 'Y'))
					RasEntry.dwfOptions |= RASEO_UseCountryAndAreaCodes;
				else
					RasEntry.dwfOptions &= ~(RASEO_UseCountryAndAreaCodes);
				break;
			case VAL_REQUIREENCRYPTEDPW:
				if ((*szStart == 'y') || (*szStart == 'Y'))
					RasEntry.dwfOptions |= RASEO_RequireEncryptedPw;
				else
					RasEntry.dwfOptions &= ~(RASEO_RequireEncryptedPw);
				break;
			case VAL_REQUIREMSENCRYPTEDPW:
				if ((*szStart == 'y') || (*szStart == 'Y'))
					RasEntry.dwfOptions |= RASEO_RequireMsEncryptedPw;
				else
					RasEntry.dwfOptions &= ~(RASEO_RequireMsEncryptedPw);
				break;
			case VAL_REQUIREDATAENCRYPTION:
				if ((*szStart == 'y') || (*szStart == 'Y'))
					RasEntry.dwfOptions |= RASEO_RequireDataEncryption;
				else
					RasEntry.dwfOptions &= ~(RASEO_RequireDataEncryption);
				break;
#ifdef UNDER_CE
			case VAL_DIALASLOCALCALL:
				if ((*szStart == 'y') || (*szStart == 'Y'))
					RasEntry.dwfOptions |= RASEO_DialAsLocalCall;
				else
					RasEntry.dwfOptions &= ~(RASEO_DialAsLocalCall);
				break;
#endif
			case VAL_FRAMING :
				if ((*szStart == 's') || (*szStart == 'S'))
					RasEntry.dwFramingProtocol = RASFP_Slip;
				break;
			case VAL_FRAMESIZE:
				RasEntry.dwFrameSize = _ttol(szStart);
				break;
			case VAL_SCRIPT :
			    _tcsncpy (RasEntry.szScript, szStart, MAX_PATH);
				break;
			case VAL_USERNAME:
				_tcsncpy (RasDialParams.szUserName, szStart, UNLEN);
				break;
			case VAL_PASSWORD:
				_tcsncpy (RasDialParams.szPassword, szStart, PWLEN);
				break;
			case VAL_DOMAIN:
			    _tcsncpy (RasDialParams.szDomain, szStart, DNLEN);
				break;
#ifdef UNDER_CE
            case VAL_BAUDRATE:
                if (g_fDevName) {
                    g_fUseDevConfig = SetBaudRate(szStart);
                }
                break;
#endif                
			default :
				LogDebugData(LOG_PASS,
				  TEXT("Line %d: Unable to copy '%s' (data ='%s')"),
						   dwLineNum, szLine, szStart);
				break;
		}
	}

	if (szName[0] == TEXT('\0'))
	{
		LogDebugData(LOG_ABORT, TEXT("Error: connectoid name required"));
		CloseHandle (hFile);
		return -2;
	}

#ifdef UNDER_CE
    if (FALSE == g_fUseDevConfig) {
        g_lpDevConfig = NULL;
        g_dwDevConfigLen = 0;
    }
	if (RasSetEntryProperties(NULL, szName, &RasEntry,

⌨️ 快捷键说明

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