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.
1079 lines
27 KiB
1079 lines
27 KiB
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
#include "pch.hxx"
|
|
#pragma hdrstop
|
|
|
|
static const WCHAR PSZ_SETUPDLL[] = L"SetupDll.Dll";
|
|
static const WCHAR PSZ_SETUPEXE[] = L"Setup.Exe";
|
|
static const CHAR PSZ_SETUPENTRY[] = "LegacyInfInterpret";
|
|
|
|
// setup command line flags
|
|
static const WCHAR PSZ_SETUP_NOBLUEWASH[] = L"/f" ;
|
|
static const WCHAR PSZ_SETUP_INFNAME[] = L"/I" ;
|
|
static const WCHAR PSZ_SETUP_SYMOPTION[] = L"/t" ;
|
|
static const WCHAR PSZ_SETUP_HWND[] = L"/w" ;
|
|
static const WCHAR PSZ_SETUP_INFSECTION[] = L"/c" ;
|
|
|
|
// origination state strings
|
|
static WCHAR PSZ_SETUP_ORIGIN_NCPA[] = L"ncpa" ;
|
|
static WCHAR PSZ_SETUP_ORIGIN_INSTALL[] = L"install" ;
|
|
|
|
// install mode state strings
|
|
static WCHAR PSZ_SETUP_MODE_INSTALL[] = L"install" ;
|
|
static WCHAR PSZ_SETUP_MODE_REMOVE[] = L"deinstall" ;
|
|
static WCHAR PSZ_SETUP_MODE_PROPERTIES[] = L"configure" ;
|
|
static WCHAR PSZ_SETUP_MODE_BIND[] = L"bind" ;
|
|
static WCHAR PSZ_SETUP_MODE_UPDATE[] = L"update" ;
|
|
|
|
// net symbols
|
|
static const WCHAR PSZ_SETUP_NET_INFSECTION[] = L"NTN_InfSection" ;
|
|
static const WCHAR PSZ_SETUP_NET_INFNAME[] = L"NTN_Infname" ;
|
|
static const WCHAR PSZ_SETUP_NET_INFOPTION[] = L"NTN_InfOption" ;
|
|
static const WCHAR PSZ_SETUP_NET_ORIGINATION[] = L"NTN_Origination" ;
|
|
static const WCHAR PSZ_SETUP_NET_INSTALLMODE[] = L"NTN_InstallMode" ;
|
|
|
|
static const WCHAR PSZ_SETUP_NET_REGBASE[] = L"NTN_RegBase" ;
|
|
|
|
// these are unused
|
|
// static const WCHAR PSZ_SETUP_NET_SERVICEBASE[] = L"NTN_ServiceBase" ;
|
|
// static const WCHAR PSZ_SETUP_NET_SERVICEKEY[] = L"NTN_ServicekeyName" ;
|
|
// static const WCHAR PSZ_SETUP_NET_REGPRODUCT[] = L"NTN_RegProduct" ;
|
|
|
|
typedef
|
|
DWORD
|
|
(* SETUPINTERPRETERPROC) (
|
|
IN HWND OwnerWindow,
|
|
IN PCSTR InfFilename,
|
|
IN PCSTR InfSection,
|
|
IN PCHAR ExtraVariables,
|
|
OUT PSTR InfResult,
|
|
IN DWORD BufferSize,
|
|
OUT int *InterpResult,
|
|
IN PCSTR InfSourceDir OPTIONAL
|
|
);
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
|
|
void Arguments::Clear()
|
|
{
|
|
while (_argc > 0)
|
|
{
|
|
_argc--;
|
|
delete [] _argv[_argc];
|
|
}
|
|
|
|
delete [] _argv;
|
|
|
|
_argv = NULL;
|
|
_argc = 0;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL Arguments::Include(PCWSTR pszArgument, BOOL fAddQuotes )
|
|
{
|
|
PSTR pszNewArg;
|
|
PSTR pszTemp;
|
|
int cchNewArg;
|
|
ASSERT( pszArgument != NULL );
|
|
BOOL frt = TRUE;
|
|
|
|
do
|
|
{
|
|
// make a local copy of the string in CHAR
|
|
//
|
|
cchNewArg = (lstrlen(pszArgument) * 2); // need room for converting
|
|
if (fAddQuotes)
|
|
{
|
|
cchNewArg += 2;
|
|
}
|
|
|
|
pszTemp = pszNewArg = new CHAR[ cchNewArg + 1 ];
|
|
if (NULL == pszNewArg)
|
|
{
|
|
frt = FALSE;
|
|
break;
|
|
}
|
|
|
|
if (fAddQuotes)
|
|
{
|
|
pszTemp[0] = '\"';
|
|
pszTemp++;
|
|
cchNewArg--;
|
|
}
|
|
|
|
// use Windows api
|
|
//
|
|
::WideCharToMultiByte(CP_ACP,0,pszArgument,-1,pszTemp,cchNewArg,NULL,NULL);
|
|
|
|
// wcstombs( pszTemp, pszArgument, cchNewArg );
|
|
|
|
if (fAddQuotes)
|
|
{
|
|
lstrcatA( pszNewArg, "\"" );
|
|
}
|
|
|
|
|
|
// increase the size of _argv to hold another
|
|
//
|
|
CHAR** argvNew;
|
|
|
|
argvNew = new PSTR[_argc+1];
|
|
if (NULL == argvNew)
|
|
{
|
|
frt = FALSE;
|
|
break;
|
|
}
|
|
memcpy( argvNew, _argv, _argc * sizeof( PSTR ) );
|
|
delete _argv;
|
|
_argv = argvNew;
|
|
|
|
// add new entry
|
|
_argv[_argc] = pszNewArg;
|
|
_argc++;
|
|
} while (FALSE);
|
|
if (!frt)
|
|
{
|
|
delete [] pszNewArg;
|
|
}
|
|
return( frt );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL Arguments::IncludeAsDec( DWORD dwArgument )
|
|
{
|
|
WCHAR pszTemp[11]; // 4294967295
|
|
|
|
wsprintf( pszTemp, L"%ld", dwArgument );
|
|
return( Include( pszTemp ) );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL Arguments::IncludeAsHex( DWORD dwArgument )
|
|
{
|
|
WCHAR pszTemp[11]; // 0xFFFFFFFF
|
|
|
|
wsprintf( pszTemp, L"%lx", dwArgument );
|
|
return( Include( pszTemp ) );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
PSTR Arguments::CreateCommandLineA( PCSTR pszExe )
|
|
{
|
|
PSTR pszTemp;
|
|
INT iArgs;
|
|
INT cchTemp = 0;
|
|
|
|
if (NULL != pszExe)
|
|
{
|
|
cchTemp = lstrlenA( pszExe );
|
|
}
|
|
|
|
|
|
// get total length
|
|
for (iArgs = 0 ; iArgs < _argc; iArgs++)
|
|
{
|
|
// include a space delemitor for each arg
|
|
cchTemp += lstrlenA( _argv[iArgs] ) + 1;
|
|
}
|
|
pszTemp = new CHAR[cchTemp + 1];
|
|
if (NULL != pszTemp)
|
|
{
|
|
|
|
|
|
if (NULL != pszExe)
|
|
{
|
|
lstrcpyA(pszTemp, pszExe);
|
|
}
|
|
else
|
|
{
|
|
pszTemp[0] = '\0';
|
|
}
|
|
|
|
// copy the items over
|
|
for (iArgs = 0; iArgs < _argc; iArgs++)
|
|
{
|
|
lstrcatA( pszTemp, _argv[iArgs] );
|
|
lstrcatA( pszTemp, " " ); // place a space between args
|
|
|
|
}
|
|
}
|
|
return( pszTemp );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
PWSTR Arguments::CreateCommandLineW( PCWSTR pszExe )
|
|
{
|
|
PSTR pszTemp;
|
|
PWSTR pszWide = NULL;
|
|
PWSTR pszPostExe;
|
|
INT cchTemp;
|
|
|
|
pszTemp = CreateCommandLineA();
|
|
if (NULL != pszTemp)
|
|
{
|
|
cchTemp = lstrlenA( pszTemp );
|
|
if (NULL != pszExe)
|
|
{
|
|
cchTemp += lstrlen( pszExe ) + 1; // and a space
|
|
}
|
|
pszPostExe = pszWide = new WCHAR[ cchTemp + 1 ];
|
|
if (NULL != pszWide)
|
|
{
|
|
if (NULL != pszExe)
|
|
{
|
|
lstrcpy( pszWide, pszExe );
|
|
lstrcat( pszWide, L" " );
|
|
pszPostExe += lstrlen( pszExe ) + 1; // and a space
|
|
}
|
|
mbstowcs( pszPostExe, pszTemp, cchTemp + 1 );
|
|
}
|
|
delete [] pszTemp;
|
|
}
|
|
return( pszWide );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
void InfExeSymbols::Clear()
|
|
{
|
|
Reset();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
void InfExeSymbols::Reset()
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL InfExeSymbols::Include( PCWSTR pszSymbol, DWORD dwValue, BOOL fAsHex )
|
|
{
|
|
WCHAR pszTemp[11]; // 4294967295 or 0xFFFFFFFF
|
|
String( pszTemp, dwValue, fAsHex );
|
|
return( Include( pszSymbol, pszTemp ) );
|
|
};
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL InfExeSymbols::Include( PCWSTR pszSymbol, PCWSTR pszValue, BOOL fQuoted )
|
|
{
|
|
BOOL frt = TRUE;
|
|
ASSERT( pszSymbol != NULL );
|
|
ASSERT( pszValue != NULL );
|
|
|
|
if ((NULL != pszSymbol) &&
|
|
(NULL != pszValue) )
|
|
{
|
|
PWSTR pszNewValue;
|
|
INT cchNewValue;
|
|
INT cchConverted;
|
|
|
|
cchNewValue = lstrlen(pszValue);
|
|
if (fQuoted)
|
|
{
|
|
cchNewValue += 2; // we will be adding quotes to the value
|
|
|
|
}
|
|
|
|
// create new buffer
|
|
pszNewValue = new WCHAR[ cchNewValue + 1 ];
|
|
if (NULL == pszNewValue)
|
|
{
|
|
frt = FALSE;
|
|
}
|
|
else
|
|
{
|
|
// create new value
|
|
if (fQuoted)
|
|
{
|
|
lstrcpy( pszNewValue, L"\"" );
|
|
}
|
|
else
|
|
{
|
|
pszNewValue[0] = L'\0';
|
|
}
|
|
lstrcat( pszNewValue, pszValue );
|
|
if (fQuoted)
|
|
{
|
|
lstrcat( pszNewValue, L"\"" );
|
|
}
|
|
|
|
// add the arguments
|
|
|
|
if ( !_argSymbols.Include( PSZ_SETUP_SYMOPTION ) ||
|
|
!_argSymbols.Include( pszSymbol ) ||
|
|
!_argSymbols.Include( L"=" ) ||
|
|
!_argSymbols.Include( pszNewValue ) )
|
|
{
|
|
frt = FALSE;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
frt = FALSE;
|
|
}
|
|
return( frt );
|
|
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
void InfDllSymbols::Clear()
|
|
{
|
|
delete [] _plszSymbols;
|
|
Reset();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
void InfDllSymbols::Reset()
|
|
{
|
|
_cchSymbols = 0;
|
|
_plszSymbols = NULL;
|
|
};
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL InfDllSymbols::Include( PCWSTR pszSymbol, DWORD dwValue, BOOL fAsHex )
|
|
{
|
|
WCHAR pszTemp[11]; // 4294967295 or 0xFFFFFFFF
|
|
String( pszTemp, dwValue, fAsHex );
|
|
return( Include( pszSymbol, pszTemp ) );
|
|
};
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL InfDllSymbols::Include( PCWSTR pszSymbol, PCWSTR pszValue, BOOL fQuoted )
|
|
{
|
|
BOOL frt = TRUE;
|
|
ASSERT( pszSymbol != NULL );
|
|
ASSERT( pszValue != NULL );
|
|
|
|
if ((NULL != pszSymbol) &&
|
|
(NULL != pszValue) )
|
|
{
|
|
PSTR plszNewSymbols;
|
|
INT cchNewSymbols;
|
|
INT cbConverted;
|
|
PSTR pmbszValue;
|
|
INT cbValue;
|
|
|
|
do
|
|
{
|
|
// since value maybe localized, the conversion from WideChar to MultiByte
|
|
// may require more space
|
|
cbValue = lstrlen(pszValue) * 2 + 1;
|
|
pmbszValue = new CHAR[ cbValue ];
|
|
if (NULL == pmbszValue)
|
|
{
|
|
frt = FALSE;
|
|
break;
|
|
}
|
|
|
|
// use Windows api
|
|
//
|
|
cbValue = ::WideCharToMultiByte(CP_ACP,0,pszValue,-1,pmbszValue,cbValue,NULL,NULL);
|
|
cbValue--; // elimitate null-terminate.
|
|
|
|
// cbValue = wcstombs( pmbszValue, pszValue, cbValue);
|
|
|
|
// _cchSymbols never includes the extra terminating null
|
|
// so we must always allocate that extra one
|
|
//
|
|
cchNewSymbols = _cchSymbols + lstrlen(pszSymbol) + cbValue + 2;
|
|
if (fQuoted)
|
|
{
|
|
cchNewSymbols += 2; // we will be adding quotes to the value
|
|
|
|
}
|
|
|
|
// create new buffer
|
|
plszNewSymbols = new CHAR[ cchNewSymbols + 1 ];
|
|
if (NULL == plszNewSymbols)
|
|
{
|
|
frt = FALSE;
|
|
break;
|
|
}
|
|
|
|
// copy old data
|
|
memcpy( plszNewSymbols, _plszSymbols, _cchSymbols );
|
|
// free old data
|
|
delete [] _plszSymbols;
|
|
|
|
// use the new stuff
|
|
_plszSymbols = plszNewSymbols;
|
|
|
|
// append new symbol and value
|
|
plszNewSymbols += _cchSymbols;
|
|
|
|
// use Windows api
|
|
//
|
|
cbConverted = ::WideCharToMultiByte(CP_ACP,0,pszSymbol,-1,plszNewSymbols,lstrlen(pszSymbol) + 1,NULL,NULL);
|
|
cbConverted--; // elimitate null-terminate.
|
|
|
|
// cbConverted = wcstombs( plszNewSymbols, pszSymbol, lstrlen(pszSymbol) + 1 );
|
|
|
|
plszNewSymbols += cbConverted + 1;
|
|
if (fQuoted)
|
|
{
|
|
plszNewSymbols[0] = '\"';
|
|
plszNewSymbols++;
|
|
}
|
|
lstrcpyA( plszNewSymbols, pmbszValue );
|
|
plszNewSymbols += cbValue;
|
|
if (fQuoted)
|
|
{
|
|
plszNewSymbols[0] = '\"';
|
|
plszNewSymbols++;
|
|
}
|
|
// null terminate the value and null terminate the list
|
|
plszNewSymbols[0] = '\0';
|
|
plszNewSymbols[1] = '\0';
|
|
|
|
_cchSymbols = cchNewSymbols;
|
|
} while (FALSE);
|
|
delete [] pmbszValue;
|
|
}
|
|
else
|
|
{
|
|
frt = FALSE;
|
|
}
|
|
return( frt );
|
|
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
PWSTR InfSymbols::String( PWSTR pszString, DWORD dwValue, BOOL fAsHex )
|
|
{
|
|
if (fAsHex)
|
|
{
|
|
wsprintf( pszString, L"%lx", dwValue );
|
|
}
|
|
else
|
|
{
|
|
wsprintf( pszString, L"%ld", dwValue );
|
|
}
|
|
return( pszString );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
SetupInterpreter::SetupInterpreter( BOOL fInProcess )
|
|
{
|
|
_fInProcess = fInProcess;
|
|
_hwnd = NULL;
|
|
_pszInfName = NULL;
|
|
_pszInfSection = NULL;
|
|
_hthrd = NULL;
|
|
_dwRt = 0;
|
|
_pinfDllSymbols = NULL;
|
|
_pinfExeSymbols = NULL;
|
|
};
|
|
|
|
|
|
void SetupInterpreter::Clear()
|
|
{
|
|
if (NULL != _hthrd)
|
|
{
|
|
::CloseHandle( _hthrd );
|
|
}
|
|
delete [] _pszInfName;
|
|
delete [] _pszInfSection;
|
|
delete _pinfExeSymbols;
|
|
delete _pinfDllSymbols;
|
|
|
|
_hwnd = NULL;
|
|
_pszInfName = NULL;
|
|
_pszInfSection = NULL;
|
|
_hthrd = NULL;
|
|
_dwRt = 0;
|
|
_pinfDllSymbols = NULL;
|
|
_pinfExeSymbols = NULL;
|
|
};
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL SetupInterpreter::Initialize( HWND hwnd,
|
|
PCWSTR pszInfSection,
|
|
PCWSTR pszInfName )
|
|
{
|
|
BOOL frt = TRUE;
|
|
INT cbTemp;
|
|
ASSERT( NULL != pszInfName );
|
|
|
|
// a thread is still running, cannot re-Initialize
|
|
if ((NULL == _hthrd) &&
|
|
(NULL != pszInfName))
|
|
{
|
|
do
|
|
{
|
|
Clear();
|
|
|
|
_hwnd = hwnd;
|
|
|
|
if (NULL != pszInfSection)
|
|
{
|
|
_pszInfSection = new WCHAR[ lstrlen( pszInfSection ) + 1 ];
|
|
if (NULL == _pszInfSection)
|
|
{
|
|
frt = FALSE;
|
|
break;
|
|
}
|
|
|
|
lstrcpy( _pszInfSection, pszInfSection );
|
|
}
|
|
_pszInfName = new WCHAR[ lstrlen( pszInfName ) + 1 ];
|
|
if (NULL == _pszInfName)
|
|
{
|
|
frt = FALSE;
|
|
break;
|
|
}
|
|
|
|
lstrcpy( _pszInfName, pszInfName );
|
|
|
|
if (_fInProcess)
|
|
{
|
|
_pinfDllSymbols = new InfDllSymbols;
|
|
if (NULL == _pinfDllSymbols)
|
|
{
|
|
frt = FALSE;
|
|
break;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
_pinfExeSymbols = new InfExeSymbols;
|
|
if (NULL == _pinfExeSymbols)
|
|
{
|
|
frt = FALSE;
|
|
break;
|
|
}
|
|
|
|
frt = _pinfExeSymbols->Include( PSZ_SETUP_NOBLUEWASH );
|
|
}
|
|
} while (FALSE);
|
|
if (!frt)
|
|
{
|
|
Clear();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
frt = FALSE;
|
|
}
|
|
|
|
return( frt );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL SetupInterpreter::SetNetShellModes( SETUP_INSTALL_MODE simMode,
|
|
SETUP_INSTALL_ORIGIN sioOrigin)
|
|
{
|
|
BOOL frt = FALSE;
|
|
|
|
if (NULL == _hthrd)
|
|
{
|
|
// set origination
|
|
//
|
|
PWSTR pszOrigin;
|
|
|
|
switch ( sioOrigin )
|
|
{
|
|
case SIO_NCPA:
|
|
pszOrigin = PSZ_SETUP_ORIGIN_NCPA ;
|
|
break;
|
|
case SIO_INSTALL:
|
|
pszOrigin = PSZ_SETUP_ORIGIN_INSTALL ;
|
|
break ;
|
|
}
|
|
if (IncludeSymbol( PSZ_SETUP_NET_ORIGINATION, pszOrigin ))
|
|
{
|
|
|
|
// set install modes
|
|
//
|
|
PWSTR pszMode = NULL;
|
|
|
|
switch ( simMode )
|
|
{
|
|
case SIM_INSTALL:
|
|
pszMode = PSZ_SETUP_MODE_INSTALL ;
|
|
break ;
|
|
case SIM_DEINSTALL:
|
|
pszMode = PSZ_SETUP_MODE_REMOVE ;
|
|
break ;
|
|
case SIM_CONFIGURE:
|
|
pszMode = PSZ_SETUP_MODE_PROPERTIES ;
|
|
break ;
|
|
case SIM_UPDATE:
|
|
pszMode = PSZ_SETUP_MODE_UPDATE ;
|
|
break ;
|
|
case SIM_BIND:
|
|
pszMode = PSZ_SETUP_MODE_BIND ;
|
|
break ;
|
|
}
|
|
frt = IncludeSymbol( PSZ_SETUP_NET_INSTALLMODE, pszMode );
|
|
}
|
|
}
|
|
return( frt );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
DWORD SetupInterpreter::SetNetComponent( PCWSTR pszOption, PCWSTR pszInfName, PCWSTR pszRegBase )
|
|
{
|
|
DWORD dwrt = ERROR_SUCCESS;
|
|
ASSERT( pszOption != NULL );
|
|
ASSERT( pszInfName != NULL );
|
|
|
|
if (!IncludeSymbol( PSZ_SETUP_NET_INFNAME, pszInfName ) ||
|
|
!IncludeSymbol( PSZ_SETUP_NET_INFOPTION, pszOption, TRUE ) )
|
|
{
|
|
dwrt = ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
if (pszRegBase != NULL)
|
|
{
|
|
if (!IncludeSymbol( PSZ_SETUP_NET_REGBASE, pszRegBase, TRUE ) )
|
|
{
|
|
dwrt = ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
}
|
|
return( dwrt );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
DWORD SetupInterpreter::SetNetComponent( REG_KEY& rnComponent )
|
|
{
|
|
DWORD dwrt = ERROR_SUCCESS;
|
|
ASSERT( &rnComponent != NULL );
|
|
|
|
if (NULL == _hthrd)
|
|
{
|
|
NLS_STR nlsRegProductName ;
|
|
NLS_STR nlsNetRulesName( RGAS_NETRULES_NAME ) ;
|
|
NLS_STR nlsInfOption;
|
|
NLS_STR nlsInfName;
|
|
|
|
do
|
|
{
|
|
// Get the Registry key name.
|
|
if ( dwrt = nlsRegProductName.QueryError())
|
|
break;
|
|
|
|
if ( dwrt = rnComponent.QueryName( & nlsRegProductName, FALSE ))
|
|
break ;
|
|
|
|
REG_KEY rnNetRules( rnComponent, nlsNetRulesName ) ;
|
|
|
|
if ( dwrt = nlsInfName.QueryError() )
|
|
break ;
|
|
|
|
if ( dwrt = nlsNetRulesName.QueryError() )
|
|
break ;
|
|
|
|
// Check that the NetRules key really exists.
|
|
|
|
if ( rnNetRules.QueryError() )
|
|
{
|
|
dwrt = IDS_NCPA_COMP_KEY_NF ;
|
|
break ;
|
|
}
|
|
|
|
// Get the name of the INF file from the Registry
|
|
|
|
dwrt = rnNetRules.QueryValue( RGAS_INF_FILE_NAME, &nlsInfName ) ;
|
|
if ( dwrt )
|
|
{
|
|
dwrt = IDS_NCPA_COMP_INF_VALUE_NF ;
|
|
break ;
|
|
}
|
|
|
|
if ( dwrt = rnNetRules.QueryValue( RGAS_INF_OPTION, & nlsInfOption ) )
|
|
break ;
|
|
|
|
dwrt = ERROR_NOT_ENOUGH_MEMORY ;
|
|
|
|
dwrt = SetNetComponent( nlsInfOption.QueryPch(),
|
|
nlsInfName.QueryPch(),
|
|
nlsRegProductName.QueryPch() );
|
|
|
|
} while (FALSE);
|
|
}
|
|
else
|
|
{
|
|
dwrt = ERROR_MAX_THRDS_REACHED;
|
|
}
|
|
return( dwrt );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL SetupInterpreter::SetNetInf( PCWSTR pszInfSection, PCWSTR pszInfName )
|
|
{
|
|
BOOL frt = TRUE;
|
|
ASSERT( pszInfSection != NULL );
|
|
ASSERT( pszInfName != NULL );
|
|
|
|
if ( (NULL == _hthrd) &&
|
|
(NULL != pszInfSection) &&
|
|
(NULL != pszInfName) )
|
|
{
|
|
frt = (IncludeSymbol( PSZ_SETUP_NET_INFNAME, pszInfName ) &&
|
|
IncludeSymbol( PSZ_SETUP_NET_INFSECTION, pszInfSection, TRUE ) );
|
|
}
|
|
else
|
|
{
|
|
frt = FALSE;
|
|
}
|
|
return( frt );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
DWORD SetupInterpreter::InProcessRun( BOOL fDisableParent )
|
|
{
|
|
HINSTANCE hinstSetup;
|
|
DWORD dwError = ERROR_SUCCESS ;
|
|
|
|
#ifdef DBG
|
|
{
|
|
::OutputDebugString(L"NETCFG: ");
|
|
::OutputDebugString(L"\n");
|
|
}
|
|
#endif
|
|
|
|
hinstSetup = ::LoadLibrary( PSZ_SETUPDLL );
|
|
if (NULL != hinstSetup)
|
|
{
|
|
SETUPINTERPRETERPROC fp;
|
|
|
|
fp = (SETUPINTERPRETERPROC)::GetProcAddress( hinstSetup, PSZ_SETUPENTRY );
|
|
if (NULL != fp)
|
|
{
|
|
PSTR pszInfName = NULL;
|
|
PSTR pszInfSection = NULL;
|
|
INT cbTemp;
|
|
HWND hwndFocus = NULL;
|
|
|
|
|
|
if (fDisableParent)
|
|
{
|
|
// need to get the focus and save it
|
|
hwndFocus = GetFocus();
|
|
::EnableWindow( _hwnd, FALSE );
|
|
}
|
|
|
|
do
|
|
{
|
|
if (NULL != _pszInfSection)
|
|
{
|
|
|
|
// convert inf section name
|
|
cbTemp = lstrlen( _pszInfSection ) * 2 + 1;
|
|
pszInfSection = new CHAR[ cbTemp ];
|
|
if (NULL == pszInfSection)
|
|
{
|
|
dwError = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
|
|
// use Windows api
|
|
//
|
|
::WideCharToMultiByte(CP_ACP,0,_pszInfSection,-1,pszInfSection,cbTemp,NULL,NULL);
|
|
|
|
// wcstombs( pszInfSection, _pszInfSection, cbTemp );
|
|
|
|
}
|
|
// convert inf name
|
|
cbTemp = lstrlen( _pszInfName ) * 2 + 1;
|
|
pszInfName = new CHAR[ cbTemp ];
|
|
if (NULL == pszInfName)
|
|
{
|
|
dwError = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
// use Windows api
|
|
//
|
|
::WideCharToMultiByte(CP_ACP,0,_pszInfName,-1,pszInfName,cbTemp,NULL,NULL);
|
|
|
|
// wcstombs( pszInfName, _pszInfName, cbTemp );
|
|
|
|
|
|
if (!fp( _hwnd,
|
|
pszInfName,
|
|
pszInfSection,
|
|
_pinfDllSymbols->QuerySymbols(),
|
|
_pszInfResult,
|
|
CB_INFRESULT,
|
|
(PINT)&_dwRt,
|
|
NULL ))
|
|
{
|
|
dwError = ERROR_PROCESS_ABORTED;
|
|
}
|
|
} while (FALSE);
|
|
|
|
delete [] pszInfName;
|
|
delete [] pszInfSection;
|
|
|
|
if (fDisableParent)
|
|
{
|
|
// need to restore the focus that was saved
|
|
::EnableWindow( _hwnd, TRUE );
|
|
if (NULL != hwndFocus)
|
|
{
|
|
SetFocus( hwndFocus );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwError = GetLastError();
|
|
}
|
|
// make sure that the library is unloaded before continuing
|
|
//
|
|
{
|
|
WCHAR pszDllName[MAX_PATH + 1];
|
|
|
|
while (0 != ::GetModuleFileName(hinstSetup, pszDllName, MAX_PATH + 1))
|
|
{
|
|
::FreeLibrary( hinstSetup );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwError = GetLastError();
|
|
}
|
|
return( dwError );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
DWORD SetupInterpreter::OutProcessRun( BOOL fDisableParent )
|
|
{
|
|
DWORD dwError = ERROR_SUCCESS ;
|
|
PWSTR pszCommandLine = NULL;
|
|
STARTUPINFO StartupInfo;
|
|
PROCESS_INFORMATION ProcessInfo;
|
|
|
|
do
|
|
{
|
|
if (NULL != _pszInfSection)
|
|
{
|
|
if (!IncludeSymbol( PSZ_SETUP_INFSECTION, _pszInfSection, TRUE ))
|
|
{
|
|
dwError = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!_pinfExeSymbols->Include( PSZ_SETUP_INFNAME ) ||
|
|
!_pinfExeSymbols->Include( _pszInfName ) ||
|
|
!_pinfExeSymbols->Include( PSZ_SETUP_HWND ) ||
|
|
!_pinfExeSymbols->Include( (DWORD)_hwnd ) )
|
|
{
|
|
dwError = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
|
|
pszCommandLine = _pinfExeSymbols->CreateCommandLine( PSZ_SETUPEXE );
|
|
if (NULL == pszCommandLine)
|
|
{
|
|
dwError = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
|
|
StartupInfo.cb = sizeof( STARTUPINFO );
|
|
StartupInfo.lpReserved = NULL;
|
|
StartupInfo.lpDesktop = NULL;
|
|
StartupInfo.lpTitle = NULL;
|
|
StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
|
|
StartupInfo.cbReserved2 = 0;
|
|
StartupInfo.lpReserved2 = NULL;
|
|
StartupInfo.wShowWindow = SW_SHOWMINNOACTIVE;
|
|
|
|
if (!::CreateProcess( NULL,
|
|
pszCommandLine,
|
|
NULL,
|
|
NULL,
|
|
FALSE,
|
|
0,
|
|
NULL,
|
|
NULL,
|
|
&StartupInfo,
|
|
&ProcessInfo ))
|
|
{
|
|
dwError = GetLastError();
|
|
break;
|
|
}
|
|
|
|
::WaitForSingleObject( ProcessInfo.hProcess, INFINITE );
|
|
|
|
::GetExitCodeProcess( ProcessInfo.hProcess, &_dwRt );
|
|
|
|
::CloseHandle( ProcessInfo.hProcess );
|
|
::CloseHandle( ProcessInfo.hThread );
|
|
} while (FALSE);
|
|
|
|
delete [] pszCommandLine;
|
|
return( dwError );
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL SetupInterpreter::IncludeSymbol( PCWSTR pszSymbol, PCWSTR pszValue, BOOL fQuoted )
|
|
{
|
|
BOOL frt;
|
|
|
|
if (_fInProcess)
|
|
{
|
|
frt = _pinfDllSymbols->Include( pszSymbol, pszValue, fQuoted );
|
|
}
|
|
else
|
|
{
|
|
frt = _pinfExeSymbols->Include( pszSymbol, pszValue, fQuoted );
|
|
}
|
|
return( frt );
|
|
};
|
|
|
|
//-------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
BOOL SetupInterpreter::IncludeSymbol( PCWSTR pszSymbol, DWORD dwValue, BOOL fAsHex )
|
|
{
|
|
BOOL frt;
|
|
|
|
if (_fInProcess)
|
|
{
|
|
frt = _pinfDllSymbols->Include( pszSymbol, dwValue, fAsHex );
|
|
}
|
|
else
|
|
{
|
|
frt = _pinfExeSymbols->Include( pszSymbol, dwValue, fAsHex );
|
|
}
|
|
|
|
return( frt );
|
|
};
|