📄 rasentry.c
字号:
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 + -