You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1286 lines
38 KiB
1286 lines
38 KiB
/*-----------------------------------------------------------------------------
|
|
import.cpp
|
|
|
|
This file contain all the functions that handle importing connection
|
|
information from .DUN files
|
|
|
|
Copyright (C) 1996 Microsoft Corporation
|
|
All rights reserved.
|
|
|
|
Authors:
|
|
ChrisK ChrisKauffman
|
|
|
|
History:
|
|
Sat 10-Mar-1996 23:50:40 -by- Mark MacLin [mmaclin]
|
|
this code started its life as ixport.c in RNAUI.DLL
|
|
my thanks to viroont
|
|
7/22/96 ChrisK Cleaned and formatted
|
|
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
#include "pch.hpp"
|
|
#include "resource.h"
|
|
|
|
#include "inetcfg.h"
|
|
|
|
#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
|
|
|
|
#define IDS_DEFAULT_SCP 0
|
|
#define IDS_INI_SCRIPT_DIR 1
|
|
#define IDS_INI_SCRIPT_SHORTDIR 2
|
|
|
|
#define MAXLONGLEN 80
|
|
#define MAXNAME 80
|
|
|
|
//#ifdef __cplusplus
|
|
//extern "C" {
|
|
//#endif // __cplusplus
|
|
//extern HINSTANCE g_hInstance;
|
|
//#ifdef __cplusplus
|
|
//}
|
|
//#endif // __cplusplus
|
|
|
|
#define MAXIPADDRLEN 20
|
|
#define SIZE_ReadBuf 0x00008000 // 32K buffer size
|
|
|
|
#define AUTORUNSIGNUPWIZARDAPI "InetConfigClient"
|
|
|
|
typedef HRESULT (CALLBACK *PFNAUTORUNSIGNUPWIZARD) (HWND hwndParent,
|
|
LPCTSTR lpszPhoneBook,
|
|
LPCTSTR lpszConnectoidName,
|
|
LPRASENTRY lpRasEntry,
|
|
LPCTSTR lpszUsername,
|
|
LPCTSTR lpszPassword,
|
|
LPCTSTR lpszProfileName,
|
|
LPINETCLIENTINFO lpINetClientInfo,
|
|
DWORD dwfOptions,
|
|
LPBOOL lpfNeedsRestart);
|
|
|
|
#pragma data_seg(".rdata")
|
|
|
|
TCHAR cszEntrySection[] = TEXT("Entry");
|
|
TCHAR cszEntryName[] = TEXT("Entry_Name");
|
|
TCHAR cszAlias[] = TEXT("Import_Name");
|
|
TCHAR cszML[] = TEXT("Multilink");
|
|
|
|
TCHAR cszPhoneSection[] = TEXT("Phone");
|
|
TCHAR cszDialAsIs[] = TEXT("Dial_As_Is");
|
|
TCHAR cszPhone[] = TEXT("Phone_Number");
|
|
TCHAR cszAreaCode[] = TEXT("Area_Code");
|
|
TCHAR cszCountryCode[] = TEXT("Country_Code");
|
|
TCHAR cszCountryID[] = TEXT("Country_ID");
|
|
|
|
TCHAR cszDeviceSection[] = TEXT("Device");
|
|
TCHAR cszDeviceType[] = TEXT("Type");
|
|
TCHAR cszDeviceName[] = TEXT("Name");
|
|
TCHAR cszDevCfgSize[] = TEXT("Settings_Size");
|
|
TCHAR cszDevCfg[] = TEXT("Settings");
|
|
|
|
TCHAR cszServerSection[] = TEXT("Server");
|
|
TCHAR cszServerType[] = TEXT("Type");
|
|
TCHAR cszSWCompress[] = TEXT("SW_Compress");
|
|
TCHAR cszPWEncrypt[] = TEXT("PW_Encrypt");
|
|
TCHAR cszNetLogon[] = TEXT("Network_Logon");
|
|
TCHAR cszSWEncrypt[] = TEXT("SW_Encrypt");
|
|
TCHAR cszNetBEUI[] = TEXT("Negotiate_NetBEUI");
|
|
TCHAR cszIPX[] = TEXT("Negotiate_IPX/SPX");
|
|
TCHAR cszIP[] = TEXT("Negotiate_TCP/IP");
|
|
|
|
TCHAR cszIPSection[] = TEXT("TCP/IP");
|
|
TCHAR cszIPSpec[] = TEXT("Specify_IP_Address");
|
|
TCHAR cszIPAddress[] = TEXT("IP_address");
|
|
TCHAR cszServerSpec[] = TEXT("Specify_Server_Address");
|
|
TCHAR cszDNSAddress[] = TEXT("DNS_address");
|
|
TCHAR cszDNSAltAddress[] = TEXT("DNS_Alt_address");
|
|
TCHAR cszWINSAddress[] = TEXT("WINS_address");
|
|
TCHAR cszWINSAltAddress[]= TEXT("WINS_Alt_address");
|
|
TCHAR cszIPCompress[] = TEXT("IP_Header_Compress");
|
|
TCHAR cszWanPri[] = TEXT("Gateway_On_Remote");
|
|
|
|
TCHAR cszMLSection[] = TEXT("Multilink");
|
|
TCHAR cszLinkIndex[] = TEXT("Line_%s");
|
|
|
|
TCHAR cszScriptingSection[] = TEXT("Scripting");
|
|
TCHAR cszScriptName[] = TEXT("Name");
|
|
|
|
TCHAR cszScriptSection[] = TEXT("Script_File");
|
|
|
|
TCHAR cszYes[] = TEXT("yes");
|
|
TCHAR cszNo[] = TEXT("no");
|
|
|
|
TCHAR cszUserSection[] = TEXT("User");
|
|
TCHAR cszUserName[] = TEXT("Name");
|
|
TCHAR cszPassword[] = TEXT("Password");
|
|
|
|
TCHAR szNull[] = TEXT("");
|
|
|
|
#define DUN_NOPHONENUMBER TEXT("000000000000")
|
|
|
|
struct {
|
|
TCHAR *szType;
|
|
DWORD dwType;
|
|
DWORD dwfOptions;
|
|
} aServerTypes[] =
|
|
{
|
|
{TEXT("PPP"), RASFP_Ppp, 0},
|
|
{TEXT("SLIP"), RASFP_Slip, 0},
|
|
{TEXT("CSLIP"), RASFP_Slip, RASEO_IpHeaderCompression},
|
|
{TEXT("RAS"), RASFP_Ras, 0}
|
|
};
|
|
|
|
#pragma data_seg()
|
|
|
|
//#define RASAPI_LIBRARY "RASAPI32.DLL"
|
|
//#define RNAPH_LIBRARY "RNAPH.DLL"
|
|
//typedef DWORD (WINAPI* PFNRASSETENTRYPROPERTIES)(LPSTR lpszPhonebook, LPSTR lpszEntry, LPBYTE lpbEntryInfo, DWORD dwEntryInfoSize, LPBYTE lpbDeviceInfo, DWORD dwDeviceInfoSize);
|
|
|
|
//PreWriteConnectoid(LPSTR pszEntryName,RASENTRY *lpRasEntry)
|
|
//{
|
|
// FARPROC fp = NULL;
|
|
// HINSTANCE hRNADLL;
|
|
// DWORD dwRasSize;
|
|
// hRNADLL = LoadLibrary(RASAPI_LIBRARY);
|
|
// fp = NULL;
|
|
// if (hRNADLL)
|
|
// {
|
|
// fp = GetProcAddress(hRNADLL,"RasGetEntryProperties");
|
|
// }
|
|
// if (!fp)
|
|
// {
|
|
// if (hRNADLL) FreeLibrary(hRNADLL);
|
|
// hRNADLL = LoadLibrary(RNAPH_LIBRARY);
|
|
// if (hRNADLL) fp = GetProcAddress(hRNADLL,"RasSetEntryProperties");
|
|
// }
|
|
// if (fp)
|
|
// {
|
|
// dwRasSize = sizeof(RASENTRY);
|
|
// ((PFNRASSETENTRYPROPERTIES)fp)(NULL,pszEntryName,(LPBYTE)lpRasEntry,dwRasSize,NULL,0);
|
|
// }
|
|
// if (hRNADLL) FreeLibrary(hRNADLL);
|
|
//}
|
|
|
|
//****************************************************************************
|
|
// DWORD NEAR PASCAL StrToip (LPSTR szIPAddress, LPDWORD lpdwAddr)
|
|
//
|
|
// This function converts a IP address string to an IP address structure.
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Cloned from SMMSCRPT.
|
|
//****************************************************************************
|
|
|
|
LPCTSTR NEAR PASCAL StrToSubip (LPCTSTR szIPAddress, BYTE *pVal)
|
|
{
|
|
LPCTSTR pszIP = szIPAddress;
|
|
|
|
*pVal = (BYTE)Sz2W(pszIP);
|
|
// skip over digits
|
|
while (FIsDigit(*pszIP))
|
|
{
|
|
++pszIP;
|
|
}
|
|
|
|
// skip over one or more separators
|
|
while (*pszIP && !FIsDigit(*pszIP))
|
|
{
|
|
++pszIP;
|
|
}
|
|
|
|
return pszIP;
|
|
}
|
|
|
|
|
|
DWORD NEAR PASCAL StrToip (LPCTSTR szIPAddress, RASIPADDR *ipAddr)
|
|
{
|
|
LPCTSTR pszIP = szIPAddress;
|
|
|
|
pszIP = StrToSubip(pszIP, &ipAddr->a);
|
|
pszIP = StrToSubip(pszIP, &ipAddr->b);
|
|
pszIP = StrToSubip(pszIP, &ipAddr->c);
|
|
pszIP = StrToSubip(pszIP, &ipAddr->d);
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
|
|
//****************************************************************************
|
|
// DWORD NEAR PASCAL ImportPhoneInfo(PPHONENUM ppn, LPCTSTR szFileName)
|
|
//
|
|
// This function imports the phone number.
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
DWORD NEAR PASCAL ImportPhoneInfo(LPRASENTRY lpRasEntry, LPCTSTR szFileName)
|
|
{
|
|
TCHAR szYesNo[MAXNAME];
|
|
|
|
GetPrivateProfileString(cszPhoneSection,
|
|
cszPhone,
|
|
DUN_NOPHONENUMBER,
|
|
lpRasEntry->szLocalPhoneNumber,
|
|
RAS_MaxPhoneNumber,
|
|
szFileName);
|
|
/****************
|
|
we need to accept entries w/o phone numbers
|
|
if (GetPrivateProfileString(cszPhoneSection,
|
|
cszPhone,
|
|
szNull,
|
|
lpRasEntry->szLocalPhoneNumber,
|
|
sizeof(lpRasEntry->szLocalPhoneNumber),
|
|
szFileName) == 0)
|
|
{
|
|
return ERROR_CORRUPT_PHONEBOOK;
|
|
};
|
|
****************/
|
|
|
|
lpRasEntry->dwfOptions &= ~RASEO_UseCountryAndAreaCodes;
|
|
|
|
GetPrivateProfileString(cszPhoneSection,
|
|
cszDialAsIs,
|
|
cszYes,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName);
|
|
|
|
// Do we have to get country code and area code?
|
|
//
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
|
|
// If we cannot get the country ID or it is zero, default to dial as is
|
|
//
|
|
if ((lpRasEntry->dwCountryID = GetPrivateProfileInt(cszPhoneSection,
|
|
cszCountryID,
|
|
0,
|
|
szFileName)) != 0)
|
|
{
|
|
lpRasEntry->dwCountryCode = GetPrivateProfileInt(cszPhoneSection,
|
|
cszCountryCode,
|
|
1,
|
|
szFileName);
|
|
|
|
if (GetPrivateProfileString(cszPhoneSection,
|
|
cszAreaCode,
|
|
szNull,
|
|
lpRasEntry->szAreaCode,
|
|
RAS_MaxAreaCode,
|
|
szFileName) != 0)
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_UseCountryAndAreaCodes;
|
|
}
|
|
}
|
|
}
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// DWORD NEAR PASCAL ImportServerInfo(PSMMINFO psmmi, LPSTR szFileName)
|
|
//
|
|
// This function imports the server type name and settings.
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
DWORD NEAR PASCAL ImportServerInfo(LPRASENTRY lpRasEntry, LPCTSTR szFileName)
|
|
{
|
|
TCHAR szYesNo[MAXNAME];
|
|
TCHAR szType[MAXNAME];
|
|
DWORD i;
|
|
|
|
// Get the server type name
|
|
//
|
|
GetPrivateProfileString(cszServerSection,
|
|
cszServerType,
|
|
szNull,
|
|
szType,
|
|
MAXNAME,
|
|
szFileName);
|
|
|
|
// need to convert the string into
|
|
// one of the following values
|
|
// RASFP_Ppp
|
|
// RASFP_Slip Note CSLIP is SLIP with IP compression on
|
|
// RASFP_Ras
|
|
|
|
for (i = 0; i < sizeof(aServerTypes)/sizeof(aServerTypes[0]); ++i)
|
|
{
|
|
if (!lstrcmpi(aServerTypes[i].szType, szType))
|
|
{
|
|
lpRasEntry->dwFramingProtocol = aServerTypes[i].dwType;
|
|
lpRasEntry->dwfOptions |= aServerTypes[i].dwfOptions;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Get the server type settings
|
|
//
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszSWCompress,
|
|
szNull,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_SwCompression;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_SwCompression;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszPWEncrypt,
|
|
szNull,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_RequireEncryptedPw;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_RequireEncryptedPw;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszNetLogon,
|
|
szNull,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_NetworkLogon;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_NetworkLogon;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszSWEncrypt,
|
|
szNull,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_RequireDataEncryption;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_RequireDataEncryption;
|
|
};
|
|
};
|
|
|
|
// Get the protocol settings
|
|
//
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszNetBEUI,
|
|
szNull,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
//#ifdef _CHRISK
|
|
lpRasEntry->dwfNetProtocols &= ~RASNP_NetBEUI;
|
|
//#else
|
|
// lpRasEntry->dwfNetProtocols &= ~RASNP_Netbeui;
|
|
//#endif
|
|
}
|
|
else
|
|
{
|
|
//#ifdef _CHRISK
|
|
lpRasEntry->dwfNetProtocols |= RASNP_NetBEUI;
|
|
//#else
|
|
// lpRasEntry->dwfNetProtocols |= RASNP_Netbeui;
|
|
//#endif
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszIPX,
|
|
szNull,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfNetProtocols &= ~RASNP_Ipx;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfNetProtocols |= RASNP_Ipx;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszServerSection,
|
|
cszIP,
|
|
szNull,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfNetProtocols &= ~RASNP_Ip;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfNetProtocols |= RASNP_Ip;
|
|
};
|
|
};
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// DWORD NEAR PASCAL ImportIPInfo(LPSTR szEntryName, LPSTR szFileName)
|
|
//
|
|
// This function imports the TCP/IP information
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
DWORD NEAR PASCAL ImportIPInfo(LPRASENTRY lpRasEntry, LPCTSTR szFileName)
|
|
{
|
|
TCHAR szIPAddr[MAXIPADDRLEN];
|
|
TCHAR szYesNo[MAXNAME];
|
|
|
|
// Import IP address information
|
|
//
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszIPSpec,
|
|
szNull,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszYes))
|
|
{
|
|
// The import file has IP address specified, get the IP address
|
|
//
|
|
lpRasEntry->dwfOptions |= RASEO_SpecificIpAddr;
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszIPAddress,
|
|
szNull,
|
|
szIPAddr,
|
|
MAXIPADDRLEN,
|
|
szFileName))
|
|
{
|
|
StrToip (szIPAddr, &lpRasEntry->ipaddr);
|
|
};
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_SpecificIpAddr;
|
|
};
|
|
};
|
|
|
|
// Import Server address information
|
|
//
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszServerSpec,
|
|
szNull,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszYes))
|
|
{
|
|
// The import file has server address specified, get the server address
|
|
//
|
|
lpRasEntry->dwfOptions |= RASEO_SpecificNameServers;
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszDNSAddress,
|
|
szNull,
|
|
szIPAddr,
|
|
MAXIPADDRLEN,
|
|
szFileName))
|
|
{
|
|
StrToip (szIPAddr, &lpRasEntry->ipaddrDns);
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszDNSAltAddress,
|
|
szNull,
|
|
szIPAddr,
|
|
MAXIPADDRLEN,
|
|
szFileName))
|
|
{
|
|
StrToip (szIPAddr, &lpRasEntry->ipaddrDnsAlt);
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszWINSAddress,
|
|
szNull,
|
|
szIPAddr,
|
|
MAXIPADDRLEN,
|
|
szFileName))
|
|
{
|
|
StrToip (szIPAddr, &lpRasEntry->ipaddrWins);
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszWINSAltAddress,
|
|
szNull,
|
|
szIPAddr,
|
|
MAXIPADDRLEN,
|
|
szFileName))
|
|
{
|
|
StrToip (szIPAddr, &lpRasEntry->ipaddrWinsAlt);
|
|
};
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_SpecificNameServers;
|
|
};
|
|
};
|
|
|
|
// Header compression and the gateway settings
|
|
//
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszIPCompress,
|
|
szNull,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_IpHeaderCompression;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_IpHeaderCompression;
|
|
};
|
|
};
|
|
|
|
if (GetPrivateProfileString(cszIPSection,
|
|
cszWanPri,
|
|
szNull,
|
|
szYesNo,
|
|
MAXNAME,
|
|
szFileName))
|
|
{
|
|
if (!lstrcmpi(szYesNo, cszNo))
|
|
{
|
|
lpRasEntry->dwfOptions &= ~RASEO_RemoteDefaultGateway;
|
|
}
|
|
else
|
|
{
|
|
lpRasEntry->dwfOptions |= RASEO_RemoteDefaultGateway;
|
|
};
|
|
};
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// HANDLE NEAR PASCAL CreateUniqueFile(LPSTR szPath, LPSTR szFile)
|
|
//
|
|
// This function creates a unique file. If the file already exists, it will
|
|
// try to create a file with similar name and return the name.
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
HANDLE NEAR PASCAL CreateUniqueFile(LPTSTR szPath, LPTSTR szScript)
|
|
{
|
|
HANDLE hFile;
|
|
LPTSTR pszSuffix, lpsz;
|
|
UINT uSuffix;
|
|
|
|
pszSuffix = szPath + lstrlen(szPath);
|
|
lpsz = CharPrev(szPath, pszSuffix);
|
|
if (*lpsz != '\\')
|
|
{
|
|
*pszSuffix = '\\';
|
|
pszSuffix++;
|
|
};
|
|
lstrcpy(pszSuffix, szScript);
|
|
|
|
// Try the specified filename
|
|
//
|
|
hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
|
|
FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
// If the file exists
|
|
//
|
|
if ((hFile == INVALID_HANDLE_VALUE) && (GetLastError() == ERROR_FILE_EXISTS))
|
|
{
|
|
TCHAR szNewName[MAX_PATH];
|
|
|
|
// Need to copy it to another name in the same directory
|
|
//
|
|
if (LoadString(g_hInstance, IDS_DEFAULT_SCP, szNewName, MAX_PATH))
|
|
{
|
|
// Increment the file index until a non-duplicated file can be created
|
|
//
|
|
uSuffix = 0;
|
|
do
|
|
{
|
|
wsprintf(pszSuffix, szNewName, uSuffix);
|
|
uSuffix++;
|
|
hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL, NULL);
|
|
}
|
|
while ((hFile == INVALID_HANDLE_VALUE) &&
|
|
(GetLastError() == ERROR_FILE_EXISTS) &&
|
|
(uSuffix < 0x0000FFFF));
|
|
};
|
|
};
|
|
|
|
// If we do not have the file, reserve the pathname
|
|
//
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
*pszSuffix = '\0';
|
|
};
|
|
return hFile;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// HANDLE NEAR PASCAL CreateScriptFile(LPTSTR szScript, LPTSTR szImportFile)
|
|
//
|
|
// This function creates the script file
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
HANDLE NEAR PASCAL CreateScriptFile(LPTSTR szScript, LPCTSTR szImportFile)
|
|
{
|
|
LPTSTR pszPath, pszShortName;
|
|
LPTSTR pszDir;
|
|
DWORD cb;
|
|
HANDLE hFile;
|
|
|
|
// Assume failure
|
|
//
|
|
hFile = INVALID_HANDLE_VALUE;
|
|
|
|
// Allocate a buffer for pathname
|
|
//
|
|
if ((pszPath = (LPTSTR)GlobalAlloc(LMEM_FIXED, 2*MAX_PATH)) == NULL)
|
|
{
|
|
TraceMsg(TF_GENERAL, "CONNECT:CreateScriptFile(): Local Alloc failed\n");
|
|
return INVALID_HANDLE_VALUE;
|
|
}
|
|
pszShortName = pszPath+MAX_PATH;
|
|
|
|
// Get the default directory
|
|
//
|
|
if (GetWindowsDirectory(pszPath, MAX_PATH) != 0)
|
|
{
|
|
// Get the Windows drive
|
|
//
|
|
pszDir = pszPath;
|
|
while((*pszDir != '\\') && (*pszDir != '\0'))
|
|
{
|
|
pszDir = CharNext(pszDir);
|
|
};
|
|
|
|
// Did we find Windows drive?
|
|
//
|
|
if (*pszDir != '\0')
|
|
{
|
|
// Prepare the drive
|
|
//
|
|
cb = (DWORD)(pszDir - pszPath);
|
|
MyMemCpy(szScript, pszPath, cb);
|
|
pszDir = szScript + cb;
|
|
|
|
// Get the script filename
|
|
//
|
|
if (GetPrivateProfileString(cszScriptingSection,
|
|
cszScriptName,
|
|
szNull,
|
|
pszShortName,
|
|
MAX_PATH,
|
|
szImportFile) != 0)
|
|
{
|
|
// Try the favorite script directory
|
|
//
|
|
if (LoadString(g_hInstance, IDS_INI_SCRIPT_DIR, pszDir,
|
|
MAX_PATH - cb) != 0)
|
|
{
|
|
// Try creating the file
|
|
//
|
|
hFile = CreateUniqueFile(szScript, pszShortName);
|
|
};
|
|
|
|
// If we do not have the file yet, try the second favorite
|
|
//
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
if (LoadString(g_hInstance, IDS_INI_SCRIPT_SHORTDIR, pszDir,
|
|
MAX_PATH - cb))
|
|
{
|
|
// Try creating the file
|
|
//
|
|
hFile = CreateUniqueFile(szScript, pszShortName);
|
|
};
|
|
};
|
|
|
|
// If we do not have the file yet, try Windows directory
|
|
//
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
// Get original Windows directory
|
|
//
|
|
lstrcpy(szScript, pszPath);
|
|
|
|
// Try one more time
|
|
//
|
|
hFile = CreateUniqueFile(szScript, pszShortName);
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
GlobalFree((HLOCAL)pszPath);
|
|
return hFile;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// DWORD NEAR PASCAL ImportScriptFile(LPTSTR szEntryName, LPTSTR szImportFile)
|
|
//
|
|
// This function imports the script file
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
DWORD NEAR PASCAL ImportScriptFile(LPRASENTRY lpRasEntry, LPCTSTR szImportFile)
|
|
{
|
|
HANDLE hfScript;
|
|
LPTSTR pszLine;
|
|
LPTSTR pszFile;
|
|
int i, iMaxLine;
|
|
UINT cbSize, cbRet;
|
|
TCHAR szTmp[4];
|
|
DWORD dwRet;
|
|
|
|
dwRet=ERROR_SUCCESS;
|
|
|
|
// If a script section does not exist, do nothing
|
|
//
|
|
if (GetPrivateProfileString(cszScriptingSection,
|
|
cszScriptName,
|
|
szNull,
|
|
szTmp,
|
|
4,
|
|
szImportFile) == 0)
|
|
{
|
|
return ERROR_SUCCESS;
|
|
};
|
|
|
|
// Allocate a buffer for the script lines
|
|
//
|
|
if ((pszLine = (LPTSTR)GlobalAlloc(LMEM_FIXED, SIZE_ReadBuf+MAX_PATH))
|
|
== NULL)
|
|
{
|
|
TraceMsg(TF_GENERAL, "CONNECT:ImportScriptFile(): Local Alloc failed\n");
|
|
return ERROR_OUTOFMEMORY;
|
|
}
|
|
|
|
// Look for script
|
|
//
|
|
if (GetPrivateProfileString(cszScriptSection,
|
|
NULL,
|
|
szNull,
|
|
pszLine,
|
|
SIZE_ReadBuf,
|
|
szImportFile) != 0)
|
|
{
|
|
// Get the maximum line number
|
|
//
|
|
pszFile = pszLine;
|
|
iMaxLine = -1;
|
|
while (*pszFile)
|
|
{
|
|
i = Sz2W(pszFile);
|
|
iMaxLine = max(iMaxLine, i);
|
|
pszFile += lstrlen(pszFile)+1;
|
|
};
|
|
|
|
// If we have at least one line, we will import the script file
|
|
//
|
|
if (iMaxLine >= 0)
|
|
{
|
|
pszFile = pszLine+SIZE_ReadBuf;
|
|
|
|
// Create the script file
|
|
//
|
|
//DebugBreak();
|
|
hfScript = CreateScriptFile(pszFile, szImportFile);
|
|
TraceMsg(TF_GENERAL, "CONNECT:ImportScriptFile(): CreateScriptFile hfScript %d, %s, %s\n",hfScript,pszFile,szImportFile);
|
|
|
|
if (hfScript != INVALID_HANDLE_VALUE)
|
|
{
|
|
TCHAR szLineNum[MAXLONGLEN+1];
|
|
|
|
// From The first line to the last line
|
|
//
|
|
for (i = 0; i <= iMaxLine; i++)
|
|
{
|
|
// Read the script line
|
|
//
|
|
wsprintf(szLineNum, TEXT("%d"), i);
|
|
if ((cbSize = GetPrivateProfileString(cszScriptSection,
|
|
szLineNum,
|
|
szNull,
|
|
pszLine,
|
|
SIZE_ReadBuf,
|
|
szImportFile)) != 0)
|
|
{
|
|
// Write to the script file
|
|
//
|
|
lstrcat(pszLine, TEXT("\x0d\x0a"));
|
|
WriteFile(hfScript, pszLine, cbSize+2, (LPDWORD)&cbRet, NULL);
|
|
};
|
|
};
|
|
|
|
CloseHandle(hfScript);
|
|
|
|
// Associate it with the phonebook entry
|
|
//
|
|
lstrcpyn(lpRasEntry->szScript, pszFile, RAS_MaxEntryName);
|
|
}
|
|
else
|
|
{
|
|
dwRet = GetLastError();
|
|
};
|
|
}
|
|
else
|
|
{
|
|
dwRet = ERROR_PATH_NOT_FOUND;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
dwRet = ERROR_PATH_NOT_FOUND;
|
|
};
|
|
GlobalFree((HLOCAL)pszLine);
|
|
|
|
return dwRet;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// DWORD WINAPI RnaValidateImportEntry (LPTSTR)
|
|
//
|
|
// This function is called to validate an importable file
|
|
//
|
|
// History:
|
|
// Wed 03-Jan-1996 09:45:01 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
DWORD WINAPI RnaValidateImportEntry (LPCTSTR szFileName)
|
|
{
|
|
TCHAR szTmp[4];
|
|
|
|
// Get the alias entry name
|
|
//
|
|
return (GetPrivateProfileString(cszEntrySection,
|
|
cszEntryName,
|
|
szNull,
|
|
szTmp,
|
|
4,
|
|
szFileName) > 0 ?
|
|
ERROR_SUCCESS : ERROR_CORRUPT_PHONEBOOK);
|
|
}
|
|
|
|
//****************************************************************************
|
|
// HRESULT ImportConnection (LPCTSTR szFileName, LPTSTR pszEntryName, LPTSTR pszUserName, LPTSTR pszPassword)
|
|
//
|
|
// This function is called to import an entry from a specified file
|
|
//
|
|
// History:
|
|
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
// Sat 16-Mar-1996 10:01:00 -by- Chris Kauffman [chrisk]
|
|
// Modified to return HRESULT and load DLL dynamically
|
|
//****************************************************************************
|
|
|
|
HRESULT ImportConnection (LPCTSTR szFileName, LPTSTR pszEntryName, LPTSTR pszUserName, LPTSTR pszPassword)
|
|
{
|
|
LPRASENTRY lpRasEntry;
|
|
DWORD dwRet;
|
|
HINSTANCE hinetcfg;
|
|
FARPROC fp;
|
|
BOOL fNeedsRestart;
|
|
//#ifdef DEBUG
|
|
// char szDebug[256];
|
|
//#endif
|
|
//char szEntryName[RAS_MaxEntryName+1];
|
|
//char szUserName[UNLEN+1];
|
|
//char szPassword[PWLEN+1];
|
|
//BOOL fNeedsRestart;
|
|
|
|
// Get the size of device configuration
|
|
// This also validates an exported file
|
|
//
|
|
if ((dwRet = RnaValidateImportEntry(szFileName)) != ERROR_SUCCESS)
|
|
{
|
|
return dwRet;
|
|
};
|
|
|
|
// Allocate a buffer for entry and device config
|
|
//
|
|
if ((lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR, sizeof(RASENTRY))) == NULL)
|
|
{
|
|
return ERROR_OUTOFMEMORY;
|
|
};
|
|
|
|
// Get the entry name
|
|
// Need to find a good name for it and remember it as an alias
|
|
//
|
|
GetPrivateProfileString(cszEntrySection,
|
|
cszEntryName,
|
|
szNull,
|
|
pszEntryName,
|
|
RAS_MaxEntryName+1,
|
|
szFileName);
|
|
|
|
GetPrivateProfileString(cszUserSection,
|
|
cszUserName,
|
|
szNull,
|
|
pszUserName,
|
|
UNLEN+1,
|
|
szFileName);
|
|
|
|
GetPrivateProfileString(cszUserSection,
|
|
cszPassword,
|
|
szNull,
|
|
pszPassword,
|
|
PWLEN+1,
|
|
szFileName);
|
|
|
|
if ((dwRet = ImportPhoneInfo(lpRasEntry, szFileName))
|
|
== ERROR_SUCCESS)
|
|
{
|
|
// Get device name, type and config
|
|
//
|
|
GetPrivateProfileString(cszDeviceSection,
|
|
cszDeviceType,
|
|
szNull,
|
|
lpRasEntry->szDeviceType,
|
|
RAS_MaxDeviceType,
|
|
szFileName);
|
|
// Get Server Type settings
|
|
//
|
|
ImportServerInfo(lpRasEntry, szFileName);
|
|
|
|
// Get IP address
|
|
//
|
|
ImportIPInfo(lpRasEntry, szFileName);
|
|
|
|
// Import the script file
|
|
//
|
|
if ((dwRet = ImportScriptFile(lpRasEntry, szFileName)) != ERROR_SUCCESS)
|
|
{
|
|
TraceMsg(TF_GENERAL, "CONNECT:ImportScriptFile Failed with the error %d,%s,%s",dwRet,szFileName,lpRasEntry->szScript);
|
|
}
|
|
|
|
lpRasEntry->dwSize = sizeof(RASENTRY);
|
|
|
|
// Load and Locate AutoRunSignUpWizard entry point
|
|
//
|
|
|
|
hinetcfg = LoadLibrary(TEXT("INETCFG.DLL"));
|
|
AssertMsg(hinetcfg,"Cannot find INETCFG.DLL");
|
|
if (!hinetcfg)
|
|
{
|
|
dwRet = GetLastError();
|
|
goto ImportConnectionExit;
|
|
}
|
|
fp = GetProcAddress(hinetcfg,AUTORUNSIGNUPWIZARDAPI);
|
|
AssertMsg(fp,"Cannot find AutoRunSignupWizard entry point");
|
|
if (!fp)
|
|
{
|
|
dwRet = GetLastError();
|
|
goto ImportConnectionExit;
|
|
}
|
|
|
|
// Insert Autodialer
|
|
//
|
|
|
|
lstrcpy(lpRasEntry->szAutodialDll,TEXT("ICWDIAL.DLL"));
|
|
lstrcpy(lpRasEntry->szAutodialFunc,TEXT("AutoDialHandler"));
|
|
TraceMsg(TF_GENERAL, "CONNECT:Autodialer installed at %s, %s.\n",lpRasEntry->szAutodialDll,lpRasEntry->szAutodialFunc);
|
|
|
|
// Call InetClientConfig
|
|
//
|
|
|
|
// PreWriteConnectoid(pszEntryName,lpRasEntry);
|
|
|
|
dwRet = ((PFNAUTORUNSIGNUPWIZARD)fp)(
|
|
NULL,
|
|
NULL,
|
|
pszEntryName,
|
|
lpRasEntry,
|
|
pszUserName,
|
|
pszPassword,
|
|
NULL,
|
|
NULL,
|
|
INETCFG_SETASAUTODIAL |
|
|
INETCFG_INSTALLRNA |
|
|
INETCFG_INSTALLTCP |
|
|
INETCFG_OVERWRITEENTRY,
|
|
&fNeedsRestart);
|
|
#if !defined(WIN16)
|
|
RasSetEntryPropertiesScriptPatch(lpRasEntry->szScript,pszEntryName);
|
|
#endif //!Win16
|
|
//RestoreDeskTopInternetCommand();
|
|
|
|
TraceMsg(TF_GENERAL, "CONNECT:EntryName %s, User %s, Password %s, Number %s\n",pszEntryName,pszUserName,pszPassword,lpRasEntry->szLocalPhoneNumber);
|
|
AssertMsg(!fNeedsRestart,"We have to reboot AGAIN!!");
|
|
}
|
|
|
|
// Exit and cleanup
|
|
//
|
|
|
|
ImportConnectionExit:
|
|
if (hinetcfg) FreeLibrary(hinetcfg);
|
|
GlobalFree((HLOCAL)lpRasEntry);
|
|
return dwRet;
|
|
}
|
|
|
|
|
|
// ############################################################################
|
|
HRESULT CreateEntryFromDUNFile(PTSTR pszDunFile)
|
|
{
|
|
TCHAR szFileName[MAX_PATH];
|
|
//char szEntryName[RAS_MaxEntryName+1];
|
|
TCHAR szUserName[UNLEN+1];
|
|
TCHAR szPassword[PWLEN+1];
|
|
LPTSTR pszTemp;
|
|
HRESULT hr;
|
|
|
|
hr = ERROR_SUCCESS;
|
|
|
|
// Get fully qualified path name
|
|
//
|
|
|
|
if (!SearchPath(GIGetAppDir(),pszDunFile,NULL,MAX_PATH,&szFileName[0],&pszTemp))
|
|
{
|
|
//MsgBox(IDS_CANTREADDUNFILE,MB_APPLMODAL | MB_ICONERROR);
|
|
hr = ERROR_FILE_NOT_FOUND;
|
|
goto CreateEntryFromDUNFileExit;
|
|
}
|
|
|
|
// save current DUN file name in global (for ourself)
|
|
SetCurrentDUNFile(&szFileName[0]);
|
|
|
|
hr = ImportConnection (&szFileName[0], g_szEntryName, szUserName, szPassword);
|
|
//if (hr != ERROR_SUCCESS)
|
|
//{
|
|
// MsgBox(IDS_CANTREADDUNFILE,MB_APPLMODAL | MB_ICONERROR);
|
|
// goto CreateEntryFromDUNFileExit;
|
|
//}// else {
|
|
//
|
|
// // place the name of the connectoid in the registry
|
|
// //
|
|
if (ERROR_SUCCESS != (StoreInSignUpReg((LPBYTE)g_szEntryName, lstrlen(g_szEntryName), REG_SZ, RASENTRYVALUENAME)))
|
|
{
|
|
MsgBox(IDS_CANTSAVEKEY,MB_MYERROR);
|
|
goto CreateEntryFromDUNFileExit;
|
|
}
|
|
// }
|
|
CreateEntryFromDUNFileExit:
|
|
return hr;
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOL FSz2Dw(PCTSTR pSz,DWORD *dw)
|
|
{
|
|
DWORD val = 0;
|
|
while (*pSz && *pSz != '.')
|
|
{
|
|
if (*pSz >= '0' && *pSz <= '9')
|
|
{
|
|
val *= 10;
|
|
val += *pSz++ - '0';
|
|
}
|
|
else
|
|
{
|
|
return FALSE; //bad number
|
|
}
|
|
}
|
|
*dw = val;
|
|
return (TRUE);
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOL BreakUpPhoneNumber(RASENTRY *prasentry, LPTSTR pszPhone)
|
|
{
|
|
PTSTR pszStart,pszNext, pszLim;
|
|
// LPPHONENUM ppn;
|
|
|
|
if (!pszPhone) return FALSE; // skip if no number
|
|
|
|
pszLim = pszPhone + lstrlen(pszPhone); // find end of string
|
|
|
|
//ppn = (fMain) ? &(pic->PhoneNum) : &(pic->PhoneNum2);
|
|
|
|
////Get the country ID...
|
|
//ppn->dwCountryID = PBKDWCountryId();
|
|
|
|
// Get Country Code from phone number...
|
|
pszStart = _tcschr(pszPhone,'+');
|
|
if(!pszStart) goto error; // bad format
|
|
|
|
// get country code
|
|
pszStart = GetNextNumericChunk(pszStart, pszLim, &pszNext);
|
|
if(!pszStart || !pszNext) goto error; // bad format
|
|
//ppn->dwCountryCode = Sz2Dw(pszStart);
|
|
FSz2Dw(pszStart,&prasentry->dwCountryCode);
|
|
pszStart = pszNext;
|
|
|
|
//Now get the area code
|
|
pszStart = GetNextNumericChunk(pszStart, pszLim, &pszNext);
|
|
if(!pszStart || !pszNext) goto error; // bad format
|
|
//lstrcpy(ppn->szAreaCode, pszStart);
|
|
lstrcpyn(prasentry->szAreaCode,pszStart,ARRAYSIZE(prasentry->szAreaCode));
|
|
pszStart = pszNext;
|
|
|
|
//now the local phone number (everything from here to : or end)
|
|
pszNext = _tcschr(pszStart, ':');
|
|
if(pszNext) *pszNext='\0';
|
|
//lstrcpy(ppn->szLocal,pszStart);
|
|
lstrcpyn(prasentry->szLocalPhoneNumber,pszStart,RAS_MaxPhoneNumber);
|
|
|
|
//no extension. what is extension?
|
|
//ppn->szExtension[0] = '\0';
|
|
//GlobalFree(pszPhone);
|
|
return TRUE;
|
|
|
|
error:
|
|
// This means number is not canonical. Set it as local number anyway!
|
|
// memset(ppn, 0, sizeof(*ppn));
|
|
// Bug#422: need to strip stuff after : or dial fails!!
|
|
pszNext = _tcschr(pszPhone, ':');
|
|
if(pszNext) *pszNext='\0';
|
|
//lstrcpy(ppn->szLocal,pszPhone);
|
|
lstrcpy(prasentry->szLocalPhoneNumber,pszPhone);
|
|
//GlobalFree(pszPhone);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
// ############################################################################
|
|
int Sz2W (LPCTSTR szBuf)
|
|
{
|
|
DWORD dw;
|
|
if (FSz2Dw(szBuf,&dw))
|
|
{
|
|
return (WORD)dw;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// ############################################################################
|
|
int FIsDigit( int c )
|
|
{
|
|
TCHAR szIn[2];
|
|
WORD rwOut[2];
|
|
szIn[0] = (TCHAR)c;
|
|
szIn[1] = '\0';
|
|
GetStringTypeEx(LOCALE_USER_DEFAULT,CT_CTYPE1,szIn,-1,rwOut);
|
|
return rwOut[0] & C1_DIGIT;
|
|
}
|
|
|
|
// ############################################################################
|
|
void *MyMemCpy(void *dest,const void *src, size_t count)
|
|
{
|
|
LPBYTE pbDest = (LPBYTE)dest;
|
|
LPBYTE pbSrc = (LPBYTE)src;
|
|
LPBYTE pbEnd = (LPBYTE)((DWORD_PTR)src + count);
|
|
while (pbSrc < pbEnd)
|
|
{
|
|
*pbDest = *pbSrc;
|
|
pbSrc++;
|
|
pbDest++;
|
|
}
|
|
return dest;
|
|
}
|
|
|
|
|
|
// ############################################################################
|
|
HRESULT ReadSignUpReg(LPBYTE lpbData, DWORD *pdwSize, DWORD dwType, LPCTSTR pszKey)
|
|
{
|
|
HRESULT hr = ERROR_ACCESS_DENIED;
|
|
HKEY hKey = 0;
|
|
|
|
hr = RegOpenKey(HKEY_LOCAL_MACHINE,SIGNUPKEY,&hKey);
|
|
if (hr != ERROR_SUCCESS) goto ReadSignUpRegExit;
|
|
hr = RegQueryValueEx(hKey,pszKey,0,&dwType,lpbData,pdwSize);
|
|
|
|
ReadSignUpRegExit:
|
|
if (hKey) RegCloseKey (hKey);
|
|
return hr;
|
|
}
|
|
|
|
// ############################################################################
|
|
HRESULT StoreInSignUpReg(LPBYTE lpbData, DWORD dwSize, DWORD dwType, LPCTSTR pszKey)
|
|
{
|
|
HRESULT hr = ERROR_ACCESS_DENIED;
|
|
HKEY hKey = 0;
|
|
|
|
hr = RegOpenKey(HKEY_LOCAL_MACHINE,SIGNUPKEY,&hKey);
|
|
if (hr != ERROR_SUCCESS) goto ReadSignUpRegExit;
|
|
hr = RegSetValueEx(hKey,pszKey,0,dwType,lpbData,sizeof(TCHAR)*dwSize);
|
|
|
|
ReadSignUpRegExit:
|
|
if (hKey) RegCloseKey (hKey);
|
|
return hr;
|
|
}
|
|
|
|
// ############################################################################
|
|
PTSTR GetNextNumericChunk(PTSTR psz, PTSTR pszLim, PTSTR* ppszNext)
|
|
{
|
|
PTSTR pszEnd;
|
|
|
|
// init for error case
|
|
*ppszNext = NULL;
|
|
// skip non numerics if any to start of next numeric chunk
|
|
while(*psz<'0' || *psz>'9')
|
|
{
|
|
if(psz >= pszLim) return NULL;
|
|
psz++;
|
|
}
|
|
// skip all numerics to end of country code
|
|
for(pszEnd=psz; *pszEnd>='0' && *pszEnd<='9' && pszEnd<pszLim; pszEnd++)
|
|
;
|
|
// zap whatever delimiter there was to terminate this chunk
|
|
*pszEnd++ = '\0';
|
|
// return ptr to next chunk (pszEnd now points to it)
|
|
if(pszEnd<pszLim)
|
|
*ppszNext = pszEnd;
|
|
|
|
return psz; // return ptr to start of chunk
|
|
}
|