151 lines
3 KiB
C++
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;
|
|
}
|