windows-nt/Source/XPSP1/NT/net/config/netman/conman/nmhnet.cpp
2020-09-26 16:20:57 +08:00

151 lines
3 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997 - 2000.
//
// File: N M H N E T . C P P
//
// Contents: Home networking support routines
//
// Notes:
//
// Author: jonburs 15 August 2000
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "nmbase.h"
#include "nmhnet.h"
//
// Exported globals
//
IHNetCfgMgr *g_pHNetCfgMgr;
LONG g_lHNetModifiedEra;
//
// Private globals
//
CRITICAL_SECTION g_csHNetCfgMgr;
BOOLEAN g_fCreatingHNetCfgMgr;
VOID
InitializeHNetSupport(
VOID
)
{
g_pHNetCfgMgr = NULL;
g_lHNetModifiedEra = 0;
g_fCreatingHNetCfgMgr = FALSE;
__try
{
InitializeCriticalSection(&g_csHNetCfgMgr);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
AssertSz(FALSE, "InitializeHNetSupport: exception during InitializeCriticalSection");
}
}
VOID
CleanupHNetSupport(
VOID
)
{
ReleaseObj(g_pHNetCfgMgr);
DeleteCriticalSection(&g_csHNetCfgMgr);
}
HRESULT
HrGetHNetCfgMgr(
IHNetCfgMgr **ppHNetCfgMgr
)
{
HRESULT hr = S_OK;
Assert(ppHNetCfgMgr);
*ppHNetCfgMgr = NULL;
//
// Make sure that the service is in the correct state.
//
if (SERVICE_RUNNING != _Module.DwServiceStatus ())
{
hr = E_UNEXPECTED;
}
else
{
if (NULL == g_pHNetCfgMgr)
{
EnterCriticalSection(&g_csHNetCfgMgr);
if (!g_fCreatingHNetCfgMgr && NULL == g_pHNetCfgMgr)
{
IHNetCfgMgr *pHNetCfgMgr;
g_fCreatingHNetCfgMgr = TRUE;
LeaveCriticalSection(&g_csHNetCfgMgr);
hr = HrCreateInstance(
CLSID_HNetCfgMgr,
CLSCTX_INPROC_SERVER,
&pHNetCfgMgr
);
EnterCriticalSection(&g_csHNetCfgMgr);
Assert(NULL == g_pHNetCfgMgr);
g_fCreatingHNetCfgMgr = FALSE;
g_pHNetCfgMgr = pHNetCfgMgr;
}
else if (NULL == g_pHNetCfgMgr)
{
//
// Another thread is already trying to create the
// object. (Spin for a small amount of time to see
// if that thread succeeds?)
//
hr = HRESULT_FROM_WIN32(ERROR_BUSY);
}
LeaveCriticalSection(&g_csHNetCfgMgr);
}
Assert(g_pHNetCfgMgr || FAILED(hr));
if (SUCCEEDED(hr))
{
*ppHNetCfgMgr = g_pHNetCfgMgr;
AddRefObj(*ppHNetCfgMgr);
}
}
return hr;
}
//
// CNetConnectionHNetUtil implementation -- INetConnectionHNetUtil routines
//
STDMETHODIMP
CNetConnectionHNetUtil::NotifyUpdate(
VOID
)
{
InterlockedIncrement(&g_lHNetModifiedEra);
return S_OK;
}