mirror of https://github.com/lianthony/NT4.0
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.
354 lines
13 KiB
354 lines
13 KiB
#include "pch.h"
|
|
#pragma hdrstop
|
|
//#include "tcpipcpl.hxx"
|
|
|
|
extern "C"
|
|
{
|
|
#include "tcpras.h"
|
|
}
|
|
|
|
BOOL fSavedEnableQueryWINS;
|
|
|
|
APIERR TcpipInfoToGlobalInfo( TCPIP_INFO *pTcpipInfo, GLOBAL_INFO *pGlobalInfo,
|
|
ADAPTER_INFO **parAdapterInfo )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
if (( pTcpipInfo == NULL ) ||
|
|
( pGlobalInfo == NULL ))
|
|
{
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// set up gloabl info
|
|
|
|
pGlobalInfo->nNumCard = pTcpipInfo->nNumCard;
|
|
pGlobalInfo->nlsPermanentName = pTcpipInfo->pszPermanentName;
|
|
pGlobalInfo->nlsScopeID = pTcpipInfo->pszScopeID;
|
|
|
|
pGlobalInfo->nlsHostName = pTcpipInfo->pszHostName;
|
|
pGlobalInfo->nlsDomain = pTcpipInfo->pszDomain;
|
|
pGlobalInfo->nlsSearchList = pTcpipInfo->pmszSearchList;
|
|
pGlobalInfo->nlsNameServer = pTcpipInfo->pmszNameServer;
|
|
|
|
pGlobalInfo->nReturn = 0;
|
|
|
|
pGlobalInfo->fDNSEnableWINS = pTcpipInfo->fDNSEnableWINS;
|
|
pGlobalInfo->fEnableLMHOSTS = pTcpipInfo->fEnableLMHOSTS;
|
|
pGlobalInfo->fEnableRouter = pTcpipInfo->fEnableIPRouter;
|
|
pGlobalInfo->fEnableRip = pTcpipInfo->fEnableRip;
|
|
pGlobalInfo->fRipInstalled = pTcpipInfo->fRipInstalled;
|
|
pGlobalInfo->fWorkstation = pTcpipInfo->fWorkstation;
|
|
pGlobalInfo->fEnableWINSProxy = pTcpipInfo->fEnableWINSProxy;
|
|
pGlobalInfo->fEnableRelayAgent = pTcpipInfo->fEnableRelayAgent;
|
|
pGlobalInfo->fRelayAgentInstalled = pTcpipInfo->fRelayAgentInstalled;
|
|
|
|
// set up each adapter card
|
|
*parAdapterInfo = new ADAPTER_INFO[ pTcpipInfo->nNumCard ];
|
|
if ( *parAdapterInfo == NULL )
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
for ( INT i = 0; i < pTcpipInfo->nNumCard; i++ )
|
|
{
|
|
(*parAdapterInfo)[i].fChange = pTcpipInfo->adapter[i].fChange;
|
|
(*parAdapterInfo)[i].nlsServiceName = pTcpipInfo->adapter[i].pszServiceName;
|
|
(*parAdapterInfo)[i].nlsTitle = pTcpipInfo->adapter[i].pszTitle;
|
|
(*parAdapterInfo)[i].fEnableDHCP = pTcpipInfo->adapter[i].fEnableDHCP;
|
|
(*parAdapterInfo)[i].fAutoIP = TRUE;
|
|
(*parAdapterInfo)[i].fUpdateMask = FALSE;
|
|
(*parAdapterInfo)[i].fNeedIP = FALSE;
|
|
(*parAdapterInfo)[i].nlsPrimaryWINS = pTcpipInfo->adapter[i].pszPrimaryWINS;
|
|
(*parAdapterInfo)[i].nlsSecondaryWINS = pTcpipInfo->adapter[i].pszSecondaryWINS;
|
|
(*parAdapterInfo)[i].dwNodeType = pTcpipInfo->adapter[i].dwNodeType;
|
|
(*parAdapterInfo)[i].m_bDisconnect = pTcpipInfo->adapter[i].bDisconnect;
|
|
(*parAdapterInfo)[i].m_bIsWanAdapter = pTcpipInfo->adapter[i].bIsWanAdapter;
|
|
(*parAdapterInfo)[i].m_bChanged = pTcpipInfo->adapter[i].bChanged;
|
|
|
|
|
|
STRLIST *pstrlst;
|
|
pstrlst = new STRLIST( pTcpipInfo->adapter[i].pmszIPAddresses, SZ(" "));
|
|
if ( pstrlst == NULL )
|
|
{
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
|
|
CopyStrList( pstrlst, &((*parAdapterInfo)[i].strlstIPAddresses), TRUE);
|
|
delete pstrlst;
|
|
|
|
pstrlst = new STRLIST( pTcpipInfo->adapter[i].pmszSubnetMask, SZ(" "));
|
|
if ( pstrlst == NULL )
|
|
{
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
CopyStrList( pstrlst, &((*parAdapterInfo)[i].strlstSubnetMask), TRUE);
|
|
delete pstrlst;
|
|
|
|
pstrlst = new STRLIST( pTcpipInfo->adapter[i].pmszDefaultGateway, SZ(" "));
|
|
if ( pstrlst == NULL )
|
|
{
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
CopyStrList( pstrlst, &((*parAdapterInfo)[i].strlstDefaultGateway), TRUE);
|
|
delete pstrlst;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
APIERR AllocCopy( TCHAR ** ppszDest, NLS_STR & nlsSrc )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
|
|
if ( *ppszDest != NULL )
|
|
delete ppszDest;
|
|
|
|
*ppszDest = new TCHAR[ nlsSrc.QueryNumChar() + 1 ];
|
|
if ( *ppszDest == NULL )
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
else
|
|
lstrcpy( *ppszDest, nlsSrc.QueryPch());
|
|
|
|
return err;
|
|
}
|
|
|
|
APIERR ConvertStrLstToStr( TCHAR ** ppszDest, STRLIST & strlst )
|
|
{
|
|
ITER_STRLIST iterTmp( strlst );
|
|
NLS_STR *pnlsTmp;
|
|
NLS_STR nlsCombine;
|
|
BOOL fFirstTime = TRUE;
|
|
for ( pnlsTmp = iterTmp.Next(); pnlsTmp != NULL; pnlsTmp = iterTmp.Next() )
|
|
{
|
|
if ( fFirstTime )
|
|
{
|
|
fFirstTime = FALSE;
|
|
} else
|
|
{
|
|
nlsCombine.AppendChar( TCH(' '));
|
|
}
|
|
nlsCombine.strcat( *pnlsTmp );
|
|
}
|
|
return AllocCopy( ppszDest, nlsCombine );
|
|
}
|
|
|
|
APIERR GlobalInfoToTcpipInfo(TCPIP_INFO ** ppTcpipInfo, GLOBAL_INFO *pGlobalInfo, ADAPTER_INFO **parAdapterInfo )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
|
|
if ( *ppTcpipInfo == NULL )
|
|
*ppTcpipInfo = (TCPIP_INFO *)new BYTE[sizeof(TCPIP_INFO)];
|
|
else
|
|
{
|
|
// delete the old adapter information
|
|
delete [] (*ppTcpipInfo)->adapter;
|
|
}
|
|
|
|
(*ppTcpipInfo)->nNumCard = pGlobalInfo->nNumCard ;
|
|
(*ppTcpipInfo)->fDNSEnableWINS = pGlobalInfo->fDNSEnableWINS ;
|
|
(*ppTcpipInfo)->fEnableLMHOSTS = pGlobalInfo->fEnableLMHOSTS ;
|
|
(*ppTcpipInfo)->fEnableIPRouter = pGlobalInfo->fEnableRouter ;
|
|
(*ppTcpipInfo)->fEnableRip = pGlobalInfo->fEnableRip ;
|
|
(*ppTcpipInfo)->fRipInstalled = pGlobalInfo->fRipInstalled ;
|
|
(*ppTcpipInfo)->fWorkstation = pGlobalInfo->fWorkstation ;
|
|
(*ppTcpipInfo)->fEnableWINSProxy = pGlobalInfo->fEnableWINSProxy ;
|
|
(*ppTcpipInfo)->fEnableRelayAgent = pGlobalInfo->fEnableRelayAgent ;
|
|
(*ppTcpipInfo)->fRelayAgentInstalled = pGlobalInfo->fRelayAgentInstalled ;
|
|
(*ppTcpipInfo)->pszPermanentName = NULL;
|
|
(*ppTcpipInfo)->pszScopeID = NULL;
|
|
(*ppTcpipInfo)->pszHostName = NULL;
|
|
(*ppTcpipInfo)->pszDomain = NULL;
|
|
(*ppTcpipInfo)->pmszSearchList = NULL;
|
|
(*ppTcpipInfo)->pmszNameServer = NULL;
|
|
|
|
if ((( err = AllocCopy(&((*ppTcpipInfo)->pszPermanentName), pGlobalInfo->nlsPermanentName)) != NERR_Success ) ||
|
|
(( err = AllocCopy(&((*ppTcpipInfo)->pszScopeID), pGlobalInfo->nlsScopeID)) != NERR_Success ) ||
|
|
(( err = AllocCopy(&((*ppTcpipInfo)->pszHostName), pGlobalInfo->nlsHostName)) != NERR_Success ) ||
|
|
(( err = AllocCopy(&((*ppTcpipInfo)->pszDomain), pGlobalInfo->nlsDomain)) != NERR_Success ) ||
|
|
(( err = AllocCopy(&((*ppTcpipInfo)->pmszSearchList), pGlobalInfo->nlsSearchList)) != NERR_Success ) ||
|
|
(( err = AllocCopy(&((*ppTcpipInfo)->pmszNameServer), pGlobalInfo->nlsNameServer)) != NERR_Success ))
|
|
{
|
|
return err;
|
|
}
|
|
|
|
(*ppTcpipInfo)->adapter = (ADAPTER_TCPIP_INFO*)new BYTE[sizeof(ADAPTER_TCPIP_INFO)*(pGlobalInfo->nNumCard)];
|
|
|
|
if ( (*ppTcpipInfo)->adapter == NULL )
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
for ( INT i = 0; i < (*ppTcpipInfo)->nNumCard; i++ )
|
|
{
|
|
(*ppTcpipInfo)->adapter[i].fChange = (*parAdapterInfo)[i].fChange;
|
|
(*ppTcpipInfo)->adapter[i].fEnableDHCP = (*parAdapterInfo)[i].fEnableDHCP;
|
|
(*ppTcpipInfo)->adapter[i].dwNodeType = (*parAdapterInfo)[i].dwNodeType;
|
|
(*ppTcpipInfo)->adapter[i].bDisconnect = (*parAdapterInfo)[i].m_bDisconnect;
|
|
(*ppTcpipInfo)->adapter[i].bIsWanAdapter = (*parAdapterInfo)[i].m_bIsWanAdapter;
|
|
(*ppTcpipInfo)->adapter[i].bChanged = (*parAdapterInfo)[i].m_bChanged;
|
|
|
|
|
|
(*ppTcpipInfo)->adapter[i].pszServiceName= NULL;
|
|
(*ppTcpipInfo)->adapter[i].pszTitle = NULL;
|
|
(*ppTcpipInfo)->adapter[i].pmszIPAddresses = NULL;
|
|
(*ppTcpipInfo)->adapter[i].pmszSubnetMask = NULL;
|
|
(*ppTcpipInfo)->adapter[i].pmszDefaultGateway = NULL;
|
|
(*ppTcpipInfo)->adapter[i].pszPrimaryWINS = NULL;
|
|
(*ppTcpipInfo)->adapter[i].pszSecondaryWINS = NULL;
|
|
|
|
if ((( err = AllocCopy(&((*ppTcpipInfo)->adapter[i].pszServiceName), (*parAdapterInfo)[i].nlsServiceName )) != NERR_Success ) ||
|
|
(( err = AllocCopy(&((*ppTcpipInfo)->adapter[i].pszTitle), (*parAdapterInfo)[i].nlsTitle )) != NERR_Success ) ||
|
|
(( err = AllocCopy(&((*ppTcpipInfo)->adapter[i].pszPrimaryWINS), (*parAdapterInfo)[i].nlsPrimaryWINS )) != NERR_Success ) ||
|
|
(( err = AllocCopy(&((*ppTcpipInfo)->adapter[i].pszSecondaryWINS), (*parAdapterInfo)[i].nlsSecondaryWINS )) != NERR_Success ) ||
|
|
(( err = ConvertStrLstToStr(&((*ppTcpipInfo)->adapter[i].pmszIPAddresses), (*parAdapterInfo)[i].strlstIPAddresses )) != NERR_Success ) ||
|
|
(( err = ConvertStrLstToStr(&((*ppTcpipInfo)->adapter[i].pmszSubnetMask), (*parAdapterInfo)[i].strlstSubnetMask )) != NERR_Success ) ||
|
|
(( err = ConvertStrLstToStr(&((*ppTcpipInfo)->adapter[i].pmszDefaultGateway), (*parAdapterInfo)[i].strlstDefaultGateway )) != NERR_Success ))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
APIERR FreeTcpipInfo( TCPIP_INFO **ppTcpipInfo )
|
|
{
|
|
for ( INT i = 0; i < (*ppTcpipInfo)->nNumCard; i++ )
|
|
{
|
|
delete (*ppTcpipInfo)->adapter[i].pszServiceName;
|
|
delete (*ppTcpipInfo)->adapter[i].pszTitle;
|
|
delete (*ppTcpipInfo)->adapter[i].pmszIPAddresses;
|
|
delete (*ppTcpipInfo)->adapter[i].pmszSubnetMask;
|
|
delete (*ppTcpipInfo)->adapter[i].pmszDefaultGateway;
|
|
delete (*ppTcpipInfo)->adapter[i].pszPrimaryWINS;
|
|
delete (*ppTcpipInfo)->adapter[i].pszSecondaryWINS;
|
|
}
|
|
|
|
delete (*ppTcpipInfo)->adapter;
|
|
|
|
delete (*ppTcpipInfo)->pszPermanentName;
|
|
delete (*ppTcpipInfo)->pszScopeID;
|
|
delete (*ppTcpipInfo)->pszHostName;
|
|
delete (*ppTcpipInfo)->pszDomain;
|
|
delete (*ppTcpipInfo)->pmszSearchList;
|
|
delete (*ppTcpipInfo)->pmszNameServer;
|
|
|
|
delete *ppTcpipInfo;
|
|
|
|
*ppTcpipInfo = NULL;
|
|
|
|
return NERR_Success;
|
|
}
|
|
|
|
APIERR FAR PASCAL SaveTcpipInfo( TCPIP_INFO * pTcpipInfo)
|
|
{
|
|
APIERR err = NERR_Success;
|
|
GLOBAL_INFO GlobalInfo;
|
|
ADAPTER_INFO *arAdapterInfo;
|
|
|
|
if ((( err = TcpipInfoToGlobalInfo( pTcpipInfo, &GlobalInfo, &arAdapterInfo )) != NERR_Success ) ||
|
|
(( err = SaveRegistry( &GlobalInfo, arAdapterInfo, TRUE)) != NERR_Success ))
|
|
{
|
|
// return err to the caller
|
|
}
|
|
|
|
delete [] arAdapterInfo;
|
|
|
|
return err;
|
|
}
|
|
|
|
#define RGAS_TCPIP_BIND SZ("System\\CurrentControlSet\\Services\\Tcpip\\Linkage")
|
|
|
|
APIERR GetCardList( NLS_STR * pnlsCardList )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
REG_KEY rkLocalMachine( HKEY_LOCAL_MACHINE ) ;
|
|
NLS_STR nlsBind = RGAS_TCPIP_BIND;
|
|
REG_KEY rkBind ( rkLocalMachine, nlsBind, MAXIMUM_ALLOWED ) ;
|
|
STRLIST *pstrlstBind;
|
|
BOOL fFirst = TRUE;
|
|
ALIAS_STR nlsBackSlash = SZ("\\");
|
|
|
|
if (( err = rkBind.QueryError()) == NERR_Success )
|
|
{
|
|
// get the binding data
|
|
if ( rkBind.QueryValue( RGAS_BIND1, & pstrlstBind ) == NERR_Success )
|
|
{
|
|
ITER_STRLIST iterBind( *pstrlstBind );
|
|
NLS_STR *pnlsTmp;
|
|
for ( pnlsTmp = iterBind.Next(); pnlsTmp != NULL; pnlsTmp = iterBind.Next())
|
|
{
|
|
STRLIST strlstBindStr( *pnlsTmp, nlsBackSlash);
|
|
//look for the last element
|
|
ITER_STRLIST iterBindStr( strlstBindStr );
|
|
NLS_STR *pnlsCard = NULL;
|
|
NLS_STR *pnlsNext = NULL;
|
|
do {
|
|
pnlsCard = pnlsNext;
|
|
} while (( pnlsNext = iterBindStr.Next()) != NULL );
|
|
// add the card to the string
|
|
if ( fFirst )
|
|
{
|
|
fFirst = FALSE;
|
|
} else
|
|
{
|
|
|
|
pnlsCardList->AppendChar(TCH('@'));
|
|
}
|
|
pnlsCardList->strcat( *pnlsCard );
|
|
}
|
|
}
|
|
}
|
|
return err;
|
|
}
|
|
|
|
APIERR FAR PASCAL LoadTcpipInfo( TCPIP_INFO ** ppTcpipInfo, LPCTSTR lpszAdapterName)
|
|
{
|
|
APIERR err = NERR_Success;
|
|
GLOBAL_INFO GlobalInfo;
|
|
ADAPTER_INFO *arAdapterInfo;
|
|
INT cInfo;
|
|
|
|
ASSERT(lpszAdapterName != NULL);
|
|
|
|
// make it NULL
|
|
*ppTcpipInfo = NULL;
|
|
|
|
// get pszParms;
|
|
NLS_STR nlsCardList = lpszAdapterName;
|
|
|
|
// Convert Computer Name
|
|
TCHAR szComputerName [MAX_PATH] ;
|
|
szComputerName[0] = '\0';
|
|
|
|
DWORD dwCch = sizeof szComputerName;
|
|
|
|
BOOL fOk = ::GetComputerName( szComputerName, & dwCch );
|
|
if (fOk)
|
|
{
|
|
szComputerName[dwCch] = 0;
|
|
}
|
|
|
|
::CharLowerBuff( szComputerName, ::strlenf( szComputerName ) ) ;
|
|
for ( TCHAR * pch = szComputerName; *pch != TCH('\0'); pch++ )
|
|
{
|
|
if ( *pch != TCH('-') && *pch != TCH('.')
|
|
&& !(( *pch >= TCH('a') && *pch <= TCH('z'))
|
|
|| ( *pch >= TCH('0') && *pch <= TCH('9')) ) )
|
|
{
|
|
*pch = TCH('-');
|
|
}
|
|
}
|
|
|
|
NLS_STR nlsDomainName;
|
|
err = LoadRegistry( nlsCardList.QueryPch(), szComputerName, nlsDomainName, &GlobalInfo, & arAdapterInfo, &cInfo, TRUE, TRUE);
|
|
GlobalInfoToTcpipInfo( ppTcpipInfo, &GlobalInfo, &arAdapterInfo );
|
|
|
|
delete [] arAdapterInfo;
|
|
|
|
return err;
|
|
}
|
|
|