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.
319 lines
10 KiB
319 lines
10 KiB
/**********************************************************************/
|
|
/** Microsoft Windows NT **/
|
|
/** Copyright(c) Microsoft Corp., 1991 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
Upgrade.cxx
|
|
Upgrade the network component call out.
|
|
|
|
FILE HISTORY:
|
|
terryk 11/30/92 Created
|
|
|
|
*/
|
|
|
|
#include "pchncpa.hxx"
|
|
|
|
extern "C"
|
|
{
|
|
|
|
BOOL FAR PASCAL UpgradeCardNum (
|
|
DWORD nArgs, // Number of string arguments
|
|
LPSTR apszArgs[], // The arguments, NULL-terminated
|
|
LPSTR * ppszResult ) ; // Result variable storage
|
|
|
|
}
|
|
|
|
#define VALUEEXTRASIZE 100
|
|
|
|
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_SERVICE SZ("ServiceName")
|
|
#define RGAS_SZ_BINDFORM SZ("bindform")
|
|
#define RGAS_SZ_NETRULES SZ("NetRules")
|
|
#define RGAS_DLC_PARAMETERS SZ("DLC\\Parameters\\")
|
|
|
|
BOOL FAR PASCAL UpgradeCardNum (
|
|
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;
|
|
|
|
ITER_STRLIST istrNetCard( strCardList );
|
|
|
|
while ( ( pnlsCard = istrNetCard.Next()) != NULL )
|
|
{
|
|
// check to see if the name is start with a 0
|
|
if ( *(pnlsCard->QueryPch()) == TCH('0') )
|
|
{
|
|
// do something about it
|
|
TCHAR szNewNum[3];
|
|
wsprintf( szNewNum, SZ("%s"), (pnlsCard->QueryPch() + 1) );
|
|
NLS_STR nlsNewNum = szNewNum;
|
|
|
|
REG_KEY regCard( regNetworkCards, *pnlsCard );
|
|
REG_KEY regNewCard( regNetworkCards, nlsNewNum, ®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 ))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
// change 0X\ServiceName
|
|
NLS_STR nlsServiceName;
|
|
NLS_STR nlsNewServiceName;
|
|
|
|
regNewCard.QueryValue( RGAS_SZ_SERVICE, &nlsServiceName );
|
|
|
|
nlsNewServiceName = nlsServiceName;
|
|
|
|
ISTR istrStartServiceName( nlsNewServiceName );
|
|
ISTR istrEndServiceName( nlsNewServiceName );
|
|
istrStartServiceName += nlsNewServiceName.QueryNumChar() - 2;
|
|
istrEndServiceName += nlsNewServiceName.QueryNumChar() - 1;
|
|
nlsNewServiceName.DelSubStr( istrStartServiceName, istrEndServiceName );
|
|
|
|
regNewCard.SetValue( RGAS_SZ_SERVICE, nlsNewServiceName );
|
|
|
|
// change 0X\Title
|
|
NLS_STR nlsTitle;
|
|
|
|
regNewCard.QueryValue( RGAS_SZ_TITLE, &nlsTitle );
|
|
ISTR istrStartTitle( nlsTitle );
|
|
ISTR istrEndTitle( nlsTitle );
|
|
istrStartTitle += 1;
|
|
istrEndTitle += 2;
|
|
|
|
nlsTitle.DelSubStr( istrStartTitle, istrEndTitle );
|
|
|
|
regNewCard.SetValue( RGAS_SZ_TITLE, nlsTitle );
|
|
|
|
// change 0x\NetRules\bindform
|
|
NLS_STR nlsNetRules = RGAS_SZ_NETRULES;
|
|
|
|
REG_KEY regNetRules( regNewCard, nlsNetRules );
|
|
if (( err = regNetRules.QueryError()) != NERR_Success )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
NLS_STR nlsBindForm;
|
|
|
|
regNetRules.QueryValue( RGAS_SZ_BINDFORM, &nlsBindForm );
|
|
|
|
ISTR istrStartBindForm( nlsBindForm );
|
|
ISTR istrEndBindForm( nlsBindForm );
|
|
ISTR istrTmp( nlsBindForm ); // temporary storage
|
|
ISTR istrHead( nlsBindForm ); // starting position for search
|
|
|
|
while (nlsBindForm.strstr( & istrTmp, *pnlsCard, istrHead ))
|
|
{
|
|
// advance to the next starting position
|
|
istrHead += pnlsCard->QueryNumChar();
|
|
|
|
// remember the last found
|
|
istrStartBindForm = istrTmp;
|
|
}
|
|
|
|
istrEndBindForm = istrStartBindForm;
|
|
istrEndBindForm += 1;
|
|
nlsBindForm.DelSubStr( istrStartBindForm, istrEndBindForm );
|
|
|
|
regNetRules.SetValue( RGAS_SZ_BINDFORM, nlsBindForm );
|
|
|
|
// change System\CurrentControlSet\Services\<ServiceName>
|
|
NLS_STR nlsServices = RGAS_SERVICES_HOME;
|
|
|
|
REG_KEY regServices( rkLocalMachine, nlsServices );
|
|
|
|
if (( err = regServices.QueryError()) != NERR_Success )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
REG_KEY regServiceName( regServices, nlsServiceName );
|
|
REG_KEY regNewServiceName( regServices, nlsNewServiceName, ®Create );
|
|
|
|
if ((( err = regServiceName.QueryError()) != NERR_Success ) ||
|
|
(( err = regNewServiceName.QueryError()) != NERR_Success ) ||
|
|
(( err = CopyReg( regServiceName, regNewServiceName )) != NERR_Success ) ||
|
|
// delete nlsServiceName
|
|
(( err = regServiceName.DeleteTree()) != NERR_Success ))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
// check whether DLC is installed or not
|
|
// if yes, update it
|
|
|
|
NLS_STR nlsOldDLCName = RGAS_DLC_PARAMETERS;
|
|
nlsOldDLCName += nlsServiceName;
|
|
NLS_STR nlsNewDLCName = RGAS_DLC_PARAMETERS;
|
|
nlsNewDLCName += nlsNewServiceName;
|
|
|
|
REG_KEY regOldDLCName( regServices, nlsOldDLCName );
|
|
REG_KEY regNewDLCName( regServices, nlsNewDLCName, ®Create );
|
|
|
|
|
|
if ((( err = regOldDLCName.QueryError()) != NERR_Success ) ||
|
|
(( err = regNewDLCName.QueryError()) != NERR_Success ) ||
|
|
(( err = CopyReg( regOldDLCName, regNewDLCName )) != NERR_Success ) ||
|
|
// delete nlsOldDLCName
|
|
(( err = regOldDLCName.DeleteTree()) != NERR_Success ))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
|
|
} while (FALSE);
|
|
|
|
wsprintfA( achBuff, "{\"0\"}" );
|
|
*ppszResult = achBuff;
|
|
|
|
return TRUE;
|
|
}
|