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.
351 lines
12 KiB
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, ®Create );
|
|
|
|
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, ®Create );
|
|
|
|
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;
|
|
}
|