//********************************************************************* //* 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