Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//+---------------------------------------------------------------------------
//
// 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; }
|