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.
 
 
 
 
 
 

351 lines
12 KiB

/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1993,1994 **/
/**********************************************************************/
/*
Util.cxx
routines to modify the netcard name from 0x to 0
FILE HISTORY:
RamC 04/02/94 Borrowed from NCPA
Originally created by TerryK
*/
#include "pch.h"
#pragma hdrstop
#include "atsheet.h"
extern "C"
{
BOOL FAR PASCAL ChangeAdapterNum (
DWORD nArgs, // Number of string arguments
LPSTR apszArgs[], // The arguments, NULL-terminated
LPSTR * ppszResult ) ; // Result variable storage
}
#define VALUEEXTRASIZE 100
#define RGAS_GENERIC_CLASS SZ("GenericClass")
APIERR CopyReg( REG_KEY &src, REG_KEY &dest )
{
REG_KEY_INFO_STRUCT rni ;
REG_KEY_CREATE_STRUCT regCreate;
REG_VALUE_INFO_STRUCT rvi ;
REG_ENUM regEnum( src ) ;
BYTE * pbValueData = NULL ;
APIERR errIter,
err = NERR_Success;
REG_KEY * pRnNew = NULL,
* pRnSub = NULL ;
LONG cbMaxValue ;
err = src.QueryInfo( & rni ) ;
if ( err )
return err ;
regCreate.dwTitleIndex = 0;
regCreate.ulOptions = REG_OPTION_NON_VOLATILE;
regCreate.nlsClass = RGAS_GENERIC_CLASS;
regCreate.regSam = MAXIMUM_ALLOWED;
regCreate.pSecAttr = NULL;
regCreate.ulDisposition = 0;
cbMaxValue = rni.ulMaxValueLen + VALUEEXTRASIZE ;
pbValueData = new BYTE [ cbMaxValue ] ;
if ( pbValueData == NULL )
return ERROR_NOT_ENOUGH_MEMORY ;
// Next, copy all value items to the new node.
rvi.pwcData = pbValueData ;
rvi.ulDataLength = cbMaxValue ;
err = errIter = 0 ;
while ( (errIter = regEnum.NextValue( & rvi )) == NERR_Success )
{
rvi.ulDataLength = rvi.ulDataLengthOut ;
if ( err = dest.SetValue( & rvi ) )
break ;
rvi.ulDataLength = cbMaxValue ;
}
// BUGBUG: Check for iteration errors other than 'finished'.
if ( err == 0 )
{
// Finally, recursively copy the subkeys.
regEnum.Reset() ;
err = errIter = 0 ;
while ( (errIter = regEnum.NextSubKey( & rni )) == NERR_Success )
{
// Open the subkey.
REG_KEY RegSubKey( dest, rni.nlsName, &regCreate );
pRnSub = new REG_KEY( src, rni.nlsName );
if ( pRnSub == NULL )
{
err = ERROR_NOT_ENOUGH_MEMORY ;
}
else
if ( (err = pRnSub->QueryError()) == 0 )
{
// Recurse
err = CopyReg( *pRnSub, RegSubKey ) ;
}
// Delete the subkey object and continue
delete pRnSub ;
if ( err )
break ;
}
}
delete pRnNew ;
delete pbValueData ;
return err ;
}
#define RGAS_SZ_NETWORK_CARD SZ("Software\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards")
#define RGAS_SZ_TITLE SZ("Title")
#define RGAS_SZ_ATALK_ADAPTERS SZ("System\\CurrentControlSet\\Services\\AppleTalk\\Adapters")
#define RGAS_SZ_ATALK_PARAMS SZ("System\\CurrentControlSet\\Services\\AppleTalk\\Parameters")
#define RGAS_SZ_PORTNAME SZ("PortName")
#define RGAS_SZ_DEFAULTPORT SZ("DefaultPort")
BOOL FAR PASCAL ChangeAdapterNum (
DWORD nArgs, // Number of string arguments
LPSTR apszArgs[], // The arguments, NULL-terminated
LPSTR * ppszResult ) // Result variable storage
{
APIERR err = NERR_Success;
static CHAR achBuff[200];
REG_KEY_CREATE_STRUCT regCreate;
regCreate.dwTitleIndex = 0;
regCreate.ulOptions = REG_OPTION_NON_VOLATILE;
regCreate.nlsClass = RGAS_GENERIC_CLASS;
regCreate.regSam = MAXIMUM_ALLOWED;
regCreate.pSecAttr = NULL;
regCreate.ulDisposition = 0;
do {
NLS_STR nlsNetworkCards = RGAS_SZ_NETWORK_CARD;
REG_KEY rkLocalMachine( HKEY_LOCAL_MACHINE ) ;
REG_KEY regNetworkCards( rkLocalMachine, nlsNetworkCards );
if ((( err = rkLocalMachine.QueryError()) != NERR_Success ) ||
(( err = regNetworkCards.QueryError()) != NERR_Success ))
{
break;
}
REG_ENUM regEnumCards( regNetworkCards );
if (( err = regEnumCards.QueryError()) != NERR_Success )
{
break;
}
REG_KEY_INFO_STRUCT regKeyInfo;
STRLIST strCardList;
NLS_STR *pnlsCard = NULL;
while ( regEnumCards.NextSubKey( & regKeyInfo ) == NERR_Success )
{
pnlsCard = new NLS_STR( regKeyInfo.nlsName );
if ( pnlsCard != NULL )
{
strCardList.Append( pnlsCard );
} else
{
err = ERROR_NOT_ENOUGH_MEMORY;
break;
}
}
if ( err != NERR_Success )
break;
NLS_STR nlsAtalkAdapters = RGAS_SZ_ATALK_ADAPTERS;
REG_KEY regAtalkAdapters( rkLocalMachine, nlsAtalkAdapters );
if (( err = regAtalkAdapters.QueryError()) != NERR_Success )
{
break;
}
REG_ENUM regEnumAdapters ( regAtalkAdapters );
if (( err = regEnumAdapters .QueryError()) != NERR_Success )
{
break;
}
STRLIST strAdapterList;
NLS_STR *pnlsAdapter = NULL;
while ( regEnumAdapters.NextSubKey( & regKeyInfo ) == NERR_Success )
{
pnlsAdapter = new NLS_STR( regKeyInfo.nlsName );
if ( pnlsAdapter != NULL )
{
strAdapterList.Append( pnlsAdapter );
} else
{
err = ERROR_NOT_ENOUGH_MEMORY;
break;
}
}
ITER_STRLIST istrNetCard( strCardList );
while ( ( pnlsCard = istrNetCard.Next()) != NULL )
{
// check to see if the name starts with a 0
if ( *(pnlsCard->QueryPch()) == TCH('0') )
{
NLS_STR *pnlsAdapter = new NLS_STR(RGAS_SZ_NETWORK_CARD);
if(( err = pnlsAdapter->QueryError()) !=NERR_Success)
break;
pnlsAdapter->AppendChar(TCH('\\'));
pnlsAdapter->strcat(pnlsCard->QueryPch());
REG_KEY RegKeyNetCard (rkLocalMachine, *pnlsAdapter);
delete pnlsAdapter;
if (( err = RegKeyNetCard.QueryError())!=NERR_Success)
break;
NLS_STR nlsTemp;
ALIAS_STR nlsUnKnown = SZ("");
if (( err = GetRegKey (RegKeyNetCard,
SERVICENAME,
&nlsTemp,
nlsUnKnown)) != NERR_Success)
break;
ITER_STRLIST istrAdapter( strAdapterList );
istrAdapter.Reset();
while ( ( pnlsAdapter = istrAdapter.Next()) != NULL )
{
if(lstrcmpi((TCHAR *)pnlsAdapter->QueryPch(),
(TCHAR *)nlsTemp.QueryPch()) == 0)
{
// change the adapterName
NLS_STR nlsNewAdapterName;
nlsNewAdapterName = *pnlsAdapter;
ISTR istrStartAdapterName( nlsNewAdapterName );
ISTR istrEndAdapterName( nlsNewAdapterName );
istrStartAdapterName += nlsNewAdapterName.QueryNumChar() - 2;
istrEndAdapterName += nlsNewAdapterName.QueryNumChar() - 1;
if ( *(nlsNewAdapterName.QueryPch( istrStartAdapterName )) == TCH('0'))
{
nlsNewAdapterName.DelSubStr( istrStartAdapterName, istrEndAdapterName );
#ifdef DEBUG
OutputDebugString(SZ("\n\rnew adapter name: "));
OutputDebugString( nlsNewAdapterName.QueryPch() );
#endif
REG_KEY regCard( regAtalkAdapters, *pnlsAdapter );
REG_KEY regNewCard( regAtalkAdapters, nlsNewAdapterName, &regCreate );
if ((( err = regNewCard.QueryError()) != NERR_Success ) ||
(( err = regCard.QueryError()) != NERR_Success ) ||
(( err = CopyReg( regCard, regNewCard )) != NERR_Success ) ||
// delete NetworkCards\0X
(( err = regCard.DeleteTree()) != NERR_Success ))
{
break;
}
// change X\PortName to contain no 0 in the adapter name
NLS_STR nlsPortName;
NLS_STR nlsNewPortName;
regNewCard.QueryValue( RGAS_SZ_PORTNAME, &nlsPortName );
nlsNewPortName = nlsNewAdapterName;
ISTR istrAt(nlsPortName);
if(nlsPortName.strrchr(&istrAt, TCHAR('@')))
{
NLS_STR * nlsName = nlsPortName.QuerySubStr(istrAt);
nlsNewPortName.strcat(nlsName->QueryPch());
#ifdef DEBUG
OutputDebugString(SZ("\n\rnew port name: "));
OutputDebugString( nlsNewPortName.QueryPch() );
#endif
regNewCard.SetValue( RGAS_SZ_PORTNAME, nlsNewPortName );
delete nlsName;
}
// change AppleTalk\Parameters\DefaultPort to contain no 0
// in the adapter name
NLS_STR nlsAtalkParams = RGAS_SZ_ATALK_PARAMS;
REG_KEY regAtalkParams( rkLocalMachine, nlsAtalkParams );
if(( err = regAtalkParams.QueryError()) != NERR_Success )
{
break;
}
NLS_STR nlsDefaultPort;
regAtalkParams.QueryValue( RGAS_SZ_DEFAULTPORT, &nlsDefaultPort);
ISTR istrSlash(nlsDefaultPort);
if(nlsDefaultPort.strrchr(&istrSlash, TCHAR('\\')))
{
++istrSlash;
NLS_STR *nlsName = nlsDefaultPort.QuerySubStr(istrSlash);
if(lstrcmpi((TCHAR*)pnlsAdapter->QueryPch(),
nlsName->QueryPch()) == 0)
{
NLS_STR nlsNewDefaultPort( TEXT("\\Device\\"));
nlsNewDefaultPort.strcat(nlsNewAdapterName.QueryPch());
#ifdef DEBUG
OutputDebugString(SZ("\n\rnew default port name: "));
OutputDebugString( nlsNewDefaultPort.QueryPch() );
#endif
regAtalkParams.SetValue( RGAS_SZ_DEFAULTPORT, nlsNewDefaultPort );
}
delete nlsName;
}
}
break;
}
}
}
if (err != NERR_Success)
break;
}
} while(FALSE);
wsprintfA( achBuff, "{\"0\"}" );
*ppszResult = achBuff;
return err == NERR_Success;
}