365 lines
9.8 KiB
C++
365 lines
9.8 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1997.
|
||
|
//
|
||
|
// File: M A I N . C P P
|
||
|
//
|
||
|
// Contents: Code to provide a simple cmdline interface to
|
||
|
// the sample code functions
|
||
|
//
|
||
|
// Notes: The code in this file is not required to access any
|
||
|
// netcfg functionality. It merely provides a simple cmdline
|
||
|
// interface to the sample code functions provided in
|
||
|
// file snetcfg.cpp.
|
||
|
//
|
||
|
// Author: kumarp 28-September-98
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "pch.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "snetcfg.h"
|
||
|
#include "error.h"
|
||
|
#include <wbemcli.h>
|
||
|
#include <winnls.h>
|
||
|
#include "tracelog.h"
|
||
|
|
||
|
BOOL g_fVerbose = FALSE;
|
||
|
|
||
|
BOOL WlbsCheckSystemVersion ();
|
||
|
BOOL WlbsCheckFiles ();
|
||
|
HRESULT WlbsRegisterDlls ();
|
||
|
HRESULT WlbsCompileMof ();
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: wmain
|
||
|
//
|
||
|
// Purpose: The main function
|
||
|
//
|
||
|
// Arguments: standard main args
|
||
|
//
|
||
|
// Returns: 0 on success, non-zero otherwise
|
||
|
//
|
||
|
// Author: kumarp 25-December-97
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
EXTERN_C int __cdecl wmain (int argc, WCHAR * argv[]) {
|
||
|
HRESULT hr = S_OK;
|
||
|
WCHAR ch;
|
||
|
enum NetClass nc = NC_Unknown;
|
||
|
WCHAR szFileFullPath[MAX_PATH+1];
|
||
|
WCHAR szFileFullPathDest[MAX_PATH+1];
|
||
|
PWCHAR pwc;
|
||
|
PWSTR szFileComponent;
|
||
|
|
||
|
TRACELogRegister(L"wlbs");
|
||
|
|
||
|
LOG_INFO("Checking Windows version information.");
|
||
|
|
||
|
if (!WlbsCheckSystemVersion()) {
|
||
|
hr = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_NLB, NLB_E_INVALID_OS);
|
||
|
LOG_ERROR("The NLB install pack can only be used on Windows 2000 Server Service Pack 1 or higher.");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
LOG_INFO("Checking for previous NLB installations.");
|
||
|
|
||
|
hr = FindIfComponentInstalled(_TEXT("ms_wlbs"));
|
||
|
|
||
|
if (hr == S_OK) {
|
||
|
/* AppCenter request on 1.9.01 to revert to S_FALSE in this case due to RTM proximity. */
|
||
|
/* hr = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_NLB, NLB_E_ALREADY_INSTALLED); */
|
||
|
hr = S_FALSE;
|
||
|
LOG_ERROR("Network Load Balancing Service is already installed.");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (FAILED(hr)) {
|
||
|
LOG_ERROR("Warning: Error querying for Network Load Balancing Service. There may be errors in this installtion.");
|
||
|
}
|
||
|
|
||
|
LOG_INFO("Checking for necessary files.");
|
||
|
|
||
|
if (!WlbsCheckFiles()) {
|
||
|
hr = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_NLB, NLB_E_FILES_MISSING);
|
||
|
LOG_ERROR1("Please install the NLB hotfix before running %ls", argv[0]);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
GetModuleFileName(NULL, szFileFullPath, MAX_PATH + 1);
|
||
|
|
||
|
pwc = wcsrchr(szFileFullPath, L'\\');
|
||
|
* (pwc + 1) = L'\0';
|
||
|
wcscat(szFileFullPath, L"netwlbs.inf");
|
||
|
|
||
|
LOG_INFO("Checking language version.");
|
||
|
|
||
|
switch (GetSystemDefaultLangID()) {
|
||
|
case 0x0409: case 0x0809: case 0x0c09: case 0x1009: case 0x1409: case 0x1809: case 0x1c09:
|
||
|
case 0x2009: case 0x2409: case 0x2809: case 0x2c09:
|
||
|
LOG_INFO1("English version detected 0x%x.", GetSystemDefaultLangID());
|
||
|
wcscat (szFileFullPath, L".eng");
|
||
|
break;
|
||
|
case 0x0411:
|
||
|
LOG_INFO1("Japanese version detected 0x%x.", GetSystemDefaultLangID());
|
||
|
wcscat (szFileFullPath, L".jpn");
|
||
|
break;
|
||
|
case 0x0407: case 0x0807: case 0x0c07: case 0x1007: case 0x1407:
|
||
|
LOG_INFO1("German version detected 0x%x.", GetSystemDefaultLangID());
|
||
|
wcscat (szFileFullPath, L".ger");
|
||
|
break;
|
||
|
case 0x040c: case 0x080c: case 0x0c0c: case 0x100c: case 0x140c:
|
||
|
LOG_INFO1("French version detected 0x%x.", GetSystemDefaultLangID());
|
||
|
wcscat (szFileFullPath, L".fr");
|
||
|
break;
|
||
|
default:
|
||
|
LOG_INFO1("Unsupported Language.Please contact PSS for a new %ls.", argv[0]);
|
||
|
wcscat (szFileFullPath, L".eng");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
/* First copy the .inf file. */
|
||
|
GetWindowsDirectory(szFileFullPathDest, MAX_PATH + 1);
|
||
|
wcscat(szFileFullPathDest, L"\\INF\\netwlbs.inf");
|
||
|
|
||
|
LOG_INFO("Copying the NLB .inf file.");
|
||
|
|
||
|
if (!CopyFile(szFileFullPath, szFileFullPathDest, FALSE)) {
|
||
|
hr = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_NLB, NLB_E_INF_FAILURE);
|
||
|
LOG_ERROR2("Warning: Unable to copy the inf file %ls %ls.", szFileFullPath, szFileFullPathDest);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Now install the service. */
|
||
|
hr = HrInstallNetComponent(L"ms_wlbs", NC_NetService, szFileFullPathDest);
|
||
|
|
||
|
if (!SUCCEEDED(hr)) {
|
||
|
LOG_ERROR("Error installing Network Load Balancing.");
|
||
|
goto error;
|
||
|
} else {
|
||
|
LOG_INFO("Installation of Network Load Balancing done.");
|
||
|
}
|
||
|
|
||
|
/* Change working directory to %TEMP%. Needed because of a IMofCopiler::CompileFile error on Win2K. */
|
||
|
WCHAR * szTempDir = _wgetenv(L"TEMP");
|
||
|
_wchdir(szTempDir);
|
||
|
|
||
|
LOG_INFO("Registering NLB Dlls.");
|
||
|
|
||
|
/* Register the provider .dll here. */
|
||
|
hr = WlbsRegisterDlls();
|
||
|
|
||
|
if (!SUCCEEDED(hr)) {
|
||
|
hr = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_NLB, NLB_E_REGISTER_DLL);
|
||
|
LOG_ERROR("Error registering NLB Dlls.");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
LOG_INFO("Compiling the NLB MOF.");
|
||
|
|
||
|
/* Compile wlbsprov.mof here */
|
||
|
hr = WlbsCompileMof();
|
||
|
|
||
|
if (!SUCCEEDED(hr)) {
|
||
|
hr = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_NLB, NLB_E_COMPILE_MOF);
|
||
|
LOG_ERROR("Error compiling the NLB MOF.");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
LOG_INFO("WLBS Setup successful.");
|
||
|
|
||
|
return hr;
|
||
|
|
||
|
error:
|
||
|
LOG_ERROR1("WLBS Setup failed 0x%x", hr);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
/* This checks whether the system on which NLB is being installed is a W2K Server or not. */
|
||
|
BOOL WlbsCheckSystemVersion () {
|
||
|
OSVERSIONINFOEX osinfo;
|
||
|
|
||
|
osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
||
|
|
||
|
if (!GetVersionEx((LPOSVERSIONINFO)&osinfo)) return FALSE;
|
||
|
|
||
|
/* For install, we return TRUE only if its Windows 2000 Server. */
|
||
|
if ((osinfo.dwMajorVersion == 5) &&
|
||
|
(osinfo.dwMinorVersion == 0) &&
|
||
|
(osinfo.wProductType == VER_NT_SERVER) &&
|
||
|
!(osinfo.wSuiteMask & VER_SUITE_ENTERPRISE) &&
|
||
|
!(osinfo.wSuiteMask & VER_SUITE_DATACENTER))
|
||
|
return TRUE;
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL WlbsCheckFiles () {
|
||
|
WCHAR * FileList [] = {
|
||
|
L"\\system32\\drivers\\wlbs.sys",
|
||
|
L"\\system32\\wlbs.exe",
|
||
|
L"\\help\\wlbs.chm",
|
||
|
L"\\help\\wlbs.hlp",
|
||
|
L"\\system32\\wlbsctrl.dll",
|
||
|
L"\\system32\\wbem\\wlbsprov.dll",
|
||
|
L"\\system32\\wbem\\wlbsprov.mof",
|
||
|
L"\\system32\\wbem\\wlbsprov.mfl",
|
||
|
L"\\inf\\netwlbsm.inf",
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
WCHAR wszPath [MAX_PATH + 1];
|
||
|
PWCHAR pwc;
|
||
|
INT i = 0;
|
||
|
BOOL first = FALSE;
|
||
|
WIN32_FIND_DATA FileFind;
|
||
|
HANDLE hdl;
|
||
|
|
||
|
while (FileList [i] != NULL) {
|
||
|
GetWindowsDirectory(wszPath, MAX_PATH + 1);
|
||
|
wcscat(wszPath, FileList [i]);
|
||
|
|
||
|
hdl = FindFirstFile(wszPath, & FileFind);
|
||
|
|
||
|
if (hdl == INVALID_HANDLE_VALUE) {
|
||
|
if (!first) {
|
||
|
first = TRUE;
|
||
|
LOG_ERROR("Error: The following files were not found:");
|
||
|
}
|
||
|
|
||
|
LOG_ERROR1("%\tls",wszPath);
|
||
|
}
|
||
|
|
||
|
if (hdl != INVALID_HANDLE_VALUE)
|
||
|
FindClose(hdl);
|
||
|
|
||
|
i++;
|
||
|
}
|
||
|
|
||
|
return !first;
|
||
|
}
|
||
|
|
||
|
HRESULT WlbsRegisterDlls () {
|
||
|
WCHAR * DllList [] = {
|
||
|
L"\\wbem\\wlbsprov.dll",
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
INT i = 0;
|
||
|
WCHAR pszDllPath [MAX_PATH + 1];
|
||
|
HINSTANCE hLib;
|
||
|
CHAR * pszDllEntryPoint = "DllRegisterServer";
|
||
|
HRESULT (STDAPICALLTYPE * lpDllEntryPoint)(void);
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if (!GetSystemDirectory(pszDllPath, MAX_PATH + 1)) {
|
||
|
hr = E_UNEXPECTED;
|
||
|
LOG_ERROR("GetSystemDirectoryFailed.");
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
wcscat(pszDllPath, DllList [0]);
|
||
|
|
||
|
if (FAILED(hr = OleInitialize(NULL))) {
|
||
|
LOG_ERROR("OleInitialize Failed.");
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
hLib = LoadLibrary(pszDllPath);
|
||
|
|
||
|
if (hLib == NULL) {
|
||
|
hr = E_UNEXPECTED;
|
||
|
LOG_ERROR("LoadLibrary for wlbsprov.dll Failed.");
|
||
|
goto CleanOle;
|
||
|
}
|
||
|
|
||
|
(FARPROC &)lpDllEntryPoint = GetProcAddress(hLib, pszDllEntryPoint);
|
||
|
|
||
|
if (lpDllEntryPoint == NULL) {
|
||
|
hr = E_UNEXPECTED;
|
||
|
LOG_ERROR("DllRegisterServer was not found.");
|
||
|
goto CleanLib;
|
||
|
}
|
||
|
|
||
|
if (FAILED(hr = (*lpDllEntryPoint)())) {
|
||
|
LOG_ERROR("DllRegisterServer failed.");
|
||
|
goto CleanLib;
|
||
|
}
|
||
|
|
||
|
LOG_INFO("Dll Registration Succeeded.");
|
||
|
|
||
|
CleanLib:
|
||
|
FreeLibrary(hLib);
|
||
|
|
||
|
CleanOle:
|
||
|
OleUninitialize();
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT WlbsCompileMof () {
|
||
|
WCHAR * MofList [] = {
|
||
|
L"\\wbem\\wlbsprov.mof",
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
IMofCompiler * pMofComp = NULL;
|
||
|
WBEM_COMPILE_STATUS_INFO Info;
|
||
|
HRESULT hr = S_OK;
|
||
|
WCHAR pszMofPath [MAX_PATH + 1];
|
||
|
|
||
|
if (!GetSystemDirectory(pszMofPath, MAX_PATH + 1)) {
|
||
|
hr = E_UNEXPECTED;
|
||
|
LOG_ERROR("GetSystemDirectoryFailed.");
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
wcscat(pszMofPath, MofList [0]);
|
||
|
|
||
|
hr = CoInitialize(NULL);
|
||
|
|
||
|
if (FAILED(hr)) {
|
||
|
LOG_ERROR("CoInitialize failed.");
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
hr = CoCreateInstance(CLSID_MofCompiler, NULL, CLSCTX_INPROC_SERVER, IID_IMofCompiler, (LPVOID *)&pMofComp);
|
||
|
|
||
|
if (FAILED(hr)) {
|
||
|
LOG_ERROR("CoCreateInstance Failed.");
|
||
|
|
||
|
switch (hr) {
|
||
|
case REGDB_E_CLASSNOTREG:
|
||
|
LOG_ERROR("Not registered.");
|
||
|
break;
|
||
|
case CLASS_E_NOAGGREGATION:
|
||
|
LOG_ERROR("No aggregration.");
|
||
|
break;
|
||
|
default:
|
||
|
LOG_ERROR1("Error ox%x.", hr);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
CoUninitialize();
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
hr = pMofComp->CompileFile(pszMofPath, NULL, NULL, NULL, NULL, 0, 0, 0, &Info);
|
||
|
|
||
|
if (hr != WBEM_S_NO_ERROR)
|
||
|
LOG_ERROR("Compile Failed.");
|
||
|
|
||
|
pMofComp->Release();
|
||
|
|
||
|
CoUninitialize();
|
||
|
|
||
|
return Info.hRes;
|
||
|
}
|
||
|
|