windows-nt/Source/XPSP1/NT/net/rras/cm/cnetcfg/icfgcall.cpp
2020-09-26 16:20:57 +08:00

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;
}
}
}