Windows NT 4.0 source code leak
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

#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;
}