230 lines
6.8 KiB
C++
230 lines
6.8 KiB
C++
|
//*********************************************************************
|
||
|
//* Microsoft Windows **
|
||
|
//* Copyright (c) 1994-1998 Microsoft Corporation
|
||
|
//*********************************************************************
|
||
|
//
|
||
|
|
||
|
// HISTORY:
|
||
|
//
|
||
|
// 96/05/23 markdu Created.
|
||
|
// 96/05/26 markdu Update config API.
|
||
|
// 96/05/27 markdu Added lpIcfgGetLastInstallErrorText.
|
||
|
// 96/05/27 markdu Use lpIcfgInstallInetComponents and lpIcfgNeedInetComponents.
|
||
|
|
||
|
#include "wizard.h"
|
||
|
|
||
|
// instance handle must be in per-instance data segment
|
||
|
#pragma data_seg(DATASEG_PERINSTANCE)
|
||
|
|
||
|
// Global variables
|
||
|
HINSTANCE ghInstConfigDll=NULL; // handle to Config dll we load explicitly
|
||
|
DWORD dwCfgRefCount=0;
|
||
|
BOOL fCFGLoaded=FALSE; // TRUE if config function addresses have been loaded
|
||
|
|
||
|
// global function pointers for Config apis
|
||
|
GETSETUPXERRORTEXT lpGetSETUPXErrorText=NULL;
|
||
|
ICFGSETINSTALLSOURCEPATH lpIcfgSetInstallSourcePath=NULL;
|
||
|
ICFGINSTALLSYSCOMPONENTS lpIcfgInstallInetComponents=NULL;
|
||
|
ICFGNEEDSYSCOMPONENTS lpIcfgNeedInetComponents=NULL;
|
||
|
ICFGISGLOBALDNS lpIcfgIsGlobalDNS=NULL;
|
||
|
ICFGREMOVEGLOBALDNS lpIcfgRemoveGlobalDNS=NULL;
|
||
|
ICFGTURNOFFFILESHARING lpIcfgTurnOffFileSharing=NULL;
|
||
|
ICFGISFILESHARINGTURNEDON lpIcfgIsFileSharingTurnedOn=NULL;
|
||
|
ICFGGETLASTINSTALLERRORTEXT lpIcfgGetLastInstallErrorText=NULL;
|
||
|
ICFGSTARTSERVICES lpIcfgStartServices=NULL;
|
||
|
|
||
|
//
|
||
|
// These two calls are only in NT icfg32.dll
|
||
|
//
|
||
|
ICFGNEEDMODEM lpIcfgNeedModem = NULL;
|
||
|
ICFGINSTALLMODEM lpIcfgInstallModem = NULL;
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////
|
||
|
// Config api function names
|
||
|
//////////////////////////////////////////////////////
|
||
|
//static const CHAR szDoGenInstall[] = "DoGenInstall";
|
||
|
static const CHAR szGetSETUPXErrorText[] = "GetSETUPXErrorText";
|
||
|
|
||
|
static const CHAR szIcfgSetInstallSourcePath[] = "IcfgSetInstallSourcePath";
|
||
|
static const CHAR szIcfgInstallInetComponents[] = "IcfgInstallInetComponents";
|
||
|
static const CHAR szIcfgNeedInetComponents[] = "IcfgNeedInetComponents";
|
||
|
static const CHAR szIcfgIsGlobalDNS[] = "IcfgIsGlobalDNS";
|
||
|
static const CHAR szIcfgRemoveGlobalDNS[] = "IcfgRemoveGlobalDNS";
|
||
|
static const CHAR szIcfgTurnOffFileSharing[] = "IcfgTurnOffFileSharing";
|
||
|
static const CHAR szIcfgIsFileSharingTurnedOn[] = "IcfgIsFileSharingTurnedOn";
|
||
|
static const CHAR szIcfgGetLastInstallErrorText[] = "IcfgGetLastInstallErrorText";
|
||
|
static const CHAR szIcfgStartServices[] = "IcfgStartServices";
|
||
|
//
|
||
|
// Available only on NT icfg32.dll
|
||
|
//
|
||
|
static const CHAR szIcfgNeedModem[] = "IcfgNeedModem";
|
||
|
static const CHAR szIcfgInstallModem[] = "IcfgInstallModem";
|
||
|
|
||
|
|
||
|
// API table for function addresses to fetch
|
||
|
#define NUM_CFGAPI_PROCS 12
|
||
|
APIFCN ConfigApiList[NUM_CFGAPI_PROCS] =
|
||
|
{
|
||
|
{ (PVOID *) &lpGetSETUPXErrorText, szGetSETUPXErrorText},
|
||
|
{ (PVOID *) &lpIcfgSetInstallSourcePath, szIcfgSetInstallSourcePath},
|
||
|
{ (PVOID *) &lpIcfgInstallInetComponents, szIcfgInstallInetComponents},
|
||
|
{ (PVOID *) &lpIcfgNeedInetComponents, szIcfgNeedInetComponents},
|
||
|
{ (PVOID *) &lpIcfgIsGlobalDNS, szIcfgIsGlobalDNS},
|
||
|
{ (PVOID *) &lpIcfgRemoveGlobalDNS, szIcfgRemoveGlobalDNS},
|
||
|
{ (PVOID *) &lpIcfgTurnOffFileSharing, szIcfgTurnOffFileSharing},
|
||
|
{ (PVOID *) &lpIcfgIsFileSharingTurnedOn, szIcfgIsFileSharingTurnedOn},
|
||
|
{ (PVOID *) &lpIcfgGetLastInstallErrorText, szIcfgGetLastInstallErrorText},
|
||
|
{ (PVOID *) &lpIcfgStartServices, szIcfgStartServices},
|
||
|
//
|
||
|
// These two calls are only in NT icfg32.dll
|
||
|
//
|
||
|
{ (PVOID *) &lpIcfgNeedModem, szIcfgNeedModem},
|
||
|
{ (PVOID *) &lpIcfgInstallModem, szIcfgInstallModem}
|
||
|
};
|
||
|
|
||
|
#pragma data_seg(DATASEG_DEFAULT)
|
||
|
|
||
|
extern BOOL GetApiProcAddresses(HMODULE hModDLL,APIFCN * pApiProcList,
|
||
|
UINT nApiProcs);
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: InitConfig
|
||
|
|
||
|
SYNOPSIS: Loads the Config dll (ICFG32), gets proc addresses,
|
||
|
|
||
|
EXIT: TRUE if successful, or FALSE if fails. Displays its
|
||
|
own error message upon failure.
|
||
|
|
||
|
********************************************************************/
|
||
|
BOOL InitConfig(HWND hWnd)
|
||
|
{
|
||
|
UINT uiNumCfgApiProcs = 0;
|
||
|
|
||
|
|
||
|
DEBUGMSG("icfgcall.c::InitConfig()");
|
||
|
|
||
|
// only actually do init stuff on first call to this function
|
||
|
// (when reference count is 0), just increase reference count
|
||
|
// for subsequent calls
|
||
|
if (dwCfgRefCount == 0) {
|
||
|
|
||
|
CHAR szConfigDll[SMALL_BUF_LEN];
|
||
|
|
||
|
DEBUGMSG("Loading Config DLL");
|
||
|
|
||
|
// set an hourglass cursor
|
||
|
WAITCURSOR WaitCursor;
|
||
|
|
||
|
if (TRUE == IsNT())
|
||
|
{
|
||
|
//
|
||
|
// On Windows NT get the filename (ICFGNT.DLL) out of resource
|
||
|
//
|
||
|
LoadSz(IDS_CONFIGNTDLL_FILENAME,szConfigDll,sizeof(szConfigDll));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// On Windows 95 get the filename (ICFG95.DLL) out of resource
|
||
|
//
|
||
|
LoadSz(IDS_CONFIG95DLL_FILENAME,szConfigDll,sizeof(szConfigDll));
|
||
|
}
|
||
|
|
||
|
// load the Config api dll
|
||
|
ghInstConfigDll = LoadLibrary(szConfigDll);
|
||
|
if (!ghInstConfigDll) {
|
||
|
UINT uErr = GetLastError();
|
||
|
// Normandy 11985 - chrisk
|
||
|
// filenames changed for Win95 and NT
|
||
|
if (TRUE == IsNT())
|
||
|
{
|
||
|
DisplayErrorMessage(hWnd,IDS_ERRLoadConfigDllNT1,uErr,ERRCLS_STANDARD,
|
||
|
MB_ICONSTOP);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DisplayErrorMessage(hWnd,IDS_ERRLoadConfigDll1,uErr,ERRCLS_STANDARD,
|
||
|
MB_ICONSTOP);
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Cycle through the API table and get proc addresses for all the APIs we
|
||
|
// need - on NT icfg32.dll has 2 extra entry points
|
||
|
//
|
||
|
if (TRUE == IsNT())
|
||
|
uiNumCfgApiProcs = NUM_CFGAPI_PROCS;
|
||
|
else
|
||
|
uiNumCfgApiProcs = NUM_CFGAPI_PROCS - 2;
|
||
|
|
||
|
if (!GetApiProcAddresses(ghInstConfigDll,ConfigApiList,uiNumCfgApiProcs)) {
|
||
|
// Normandy 11985 - chrisk
|
||
|
// filenames changed for Win95 and NT
|
||
|
if (TRUE == IsNT())
|
||
|
{
|
||
|
MsgBox(hWnd,IDS_ERRLoadConfigDllNT2,MB_ICONSTOP,MB_OK);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
MsgBox(hWnd,IDS_ERRLoadConfigDll2,MB_ICONSTOP,MB_OK);
|
||
|
}
|
||
|
DeInitConfig();
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
fCFGLoaded = TRUE;
|
||
|
|
||
|
dwCfgRefCount ++;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: DeInitConfig
|
||
|
|
||
|
SYNOPSIS: Unloads Config dll.
|
||
|
|
||
|
********************************************************************/
|
||
|
VOID DeInitConfig()
|
||
|
{
|
||
|
DEBUGMSG("icfgcall.c::DeInitConfig()");
|
||
|
|
||
|
UINT nIndex;
|
||
|
|
||
|
// decrement reference count
|
||
|
if (dwCfgRefCount)
|
||
|
dwCfgRefCount --;
|
||
|
|
||
|
// when the reference count hits zero, do real deinitialization stuff
|
||
|
if (dwCfgRefCount == 0)
|
||
|
{
|
||
|
if (fCFGLoaded)
|
||
|
{
|
||
|
// set function pointers to NULL
|
||
|
for (nIndex = 0;nIndex<NUM_CFGAPI_PROCS;nIndex++)
|
||
|
*ConfigApiList[nIndex].ppFcnPtr = NULL;
|
||
|
|
||
|
fCFGLoaded = FALSE;
|
||
|
}
|
||
|
|
||
|
// free the Config dll
|
||
|
if (ghInstConfigDll)
|
||
|
{
|
||
|
DEBUGMSG("Unloading Config DLL");
|
||
|
FreeLibrary(ghInstConfigDll);
|
||
|
ghInstConfigDll = NULL;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|