windows-nt/Source/XPSP1/NT/inetsrv/iis/admin/snapin/pshed.cpp
2020-09-26 16:20:57 +08:00

188 lines
4.9 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows 2000 (c) 1999
//
// File: install.cpp
//
// Contents: Net config code that installs the packet scheduler based
// the domain policy
//
// Author: Shreedhar Madhavapeddi (ShreeM)
//
// Reworked by Sergei Antonov (sergeia) -- removed ugly notation and
// adapted to iis needs
//
// Usage Notes:
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include <netcfgx.h>
#include <devguid.h>
static const GUID * c_aguidClass[] =
{
&GUID_DEVCLASS_NET,
&GUID_DEVCLASS_NETTRANS,
&GUID_DEVCLASS_NETSERVICE,
&GUID_DEVCLASS_NETCLIENT
};
HRESULT CallINetCfg(BOOL Install);
HRESULT
AddRemovePSCHED(INetCfg * pINetCfg, BOOL Install)
{
HRESULT hr;
INetCfgClassSetup * pSetup;
INetCfgComponent * pIComp;
OBO_TOKEN OboToken;
pSetup = NULL;
pIComp = NULL;
if (!pINetCfg)
{
return E_POINTER;
}
hr = pINetCfg->QueryNetCfgClass (&GUID_DEVCLASS_NETSERVICE,
IID_INetCfgClassSetup, (VOID**)&pSetup);
if (S_OK == hr)
{
ZeroMemory (&OboToken, sizeof(OboToken));
OboToken.Type = OBO_USER;
if (Install)
{
hr = pSetup->Install (
L"ms_psched",
&OboToken,
0, 0, NULL, NULL,
&pIComp);
if (NETCFG_S_REBOOT == hr)
{
hr = S_OK;
}
if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr)
{
hr = S_OK;
}
}
else
{
// first find the component.
hr = pINetCfg->FindComponent (L"ms_psched", &pIComp);
if (S_OK == hr)
{
hr = pSetup->DeInstall (
pIComp,
&OboToken,
NULL);
if (NETCFG_S_REBOOT == hr)
{
hr = S_OK;
}
if (NETCFG_S_STILL_REFERENCED == hr)
{
hr = S_OK;
}
}
}
if (pIComp && SUCCEEDED(hr))
{
pIComp->Release();
}
pSetup->Release();
}
HRESULT hrT = pINetCfg->Uninitialize ();
return hr;
}
HRESULT
CallINetCfg(BOOL Install)
{
HRESULT hr = S_OK;
// initialize COM
hr = CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED );
if (SUCCEEDED(hr))
{
// Create the object implementing INetCfg.
//
INetCfg* pnc;
hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER,
IID_INetCfg, (void**)&pnc);
if (SUCCEEDED(hr))
{
INetCfgLock * pncLock = NULL;
// Get the locking interface
hr = pnc->QueryInterface(IID_INetCfgLock,
(LPVOID *)&pncLock);
if (SUCCEEDED(hr))
{
// Attempt to lock the INetCfg for read/write
static const ULONG c_cmsTimeout = 15000;
static const WCHAR c_szSampleNetcfgApp[] =
L"Internet Information Services MMC Snapin";
PWSTR szLockedBy;
hr = pncLock->AcquireWriteLock(c_cmsTimeout,
c_szSampleNetcfgApp,
&szLockedBy);
if (S_FALSE == hr)
{
hr = NETCFG_E_NO_WRITE_LOCK;
// _tprintf(L"Could not lock INetcfg, it is already locked by '%s'", szLockedBy);
pncLock->Release();
pnc->Release();
CoUninitialize();
}
if (SUCCEEDED(hr))
{
// Initialize the INetCfg object.
//
hr = pnc->Initialize(NULL);
if (SUCCEEDED(hr))
{
pnc->AddRef();
AddRemovePSCHED(pnc, Install);
}
else
{
// initialize failed, if obtained lock, release it
pncLock->ReleaseWriteLock();
}
}
pncLock->Release();
pnc->Release();
}
else
{
pnc->Release();
}
}
if (FAILED(hr))
{
CoUninitialize();
}
}
return hr;
}