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.
323 lines
8.1 KiB
323 lines
8.1 KiB
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name :
|
|
ControlChannel.cxx
|
|
|
|
Abstract:
|
|
Defines the functions used to access the control channel.
|
|
|
|
Author:
|
|
|
|
Murali R. Krishnan ( MuraliK ) 15-Oct-1998
|
|
Lei Jin ( leijin ) 13-Apr-1999 Porting
|
|
|
|
Project:
|
|
|
|
IIS Worker Process
|
|
|
|
--*/
|
|
|
|
|
|
# include "precomp.hxx"
|
|
# include "ControlChannel.hxx"
|
|
|
|
/********************************************************************++
|
|
|
|
UL_CONTROL_CHANNEL::Initialize()
|
|
|
|
Description:
|
|
This function initializes the control channel for given address, NSGO,
|
|
and host name. It opens the control channel, registers a virtual host,
|
|
and NSGO. After that it registers the URL for which notifications are
|
|
to be handled within the NSGO.
|
|
|
|
Arguments:
|
|
|
|
|
|
Returns:
|
|
|
|
++********************************************************************/
|
|
|
|
ULONG
|
|
UL_CONTROL_CHANNEL::Initialize(
|
|
IN MULTISZ& mszURLList,
|
|
IN LPCWSTR pwszAppPoolName,
|
|
IN DWORD dwSiteId
|
|
)
|
|
{
|
|
ULONG rc;
|
|
LPCWSTR pwszURL;
|
|
|
|
if ( m_hControlChannel != NULL)
|
|
{
|
|
//
|
|
// There is already a control channel
|
|
//
|
|
|
|
DBGPRINTF(( DBG_CONTEXT, "Duplicate open of control channel\n"));
|
|
return ERROR_DUP_NAME;
|
|
}
|
|
|
|
//
|
|
// 1. Open a control channel object from the UL driver
|
|
//
|
|
|
|
rc = HttpOpenControlChannel( &m_hControlChannel, 0);
|
|
|
|
if ( NO_ERROR != rc)
|
|
{
|
|
IF_DEBUG( ERROR)
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"UlOpenControlChannel() failed. Error = %08x. Returning\n",
|
|
rc
|
|
));
|
|
}
|
|
|
|
return (rc);
|
|
}
|
|
|
|
//
|
|
// 2. Create a Config Group on this control channel
|
|
//
|
|
|
|
rc = HttpCreateConfigGroup( m_hControlChannel, &m_ConfigGroupId );
|
|
|
|
if ( NO_ERROR != rc)
|
|
{
|
|
IF_DEBUG(ERROR)
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"UlCreateConfigGroup failed. Error=%08x. Returning\n",
|
|
rc
|
|
));
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
|
|
//
|
|
// 3. Insert all specified URLs into the config group
|
|
//
|
|
|
|
pwszURL = mszURLList.First();
|
|
|
|
while (NULL != pwszURL)
|
|
{
|
|
rc = AddURLToConfigGroup(pwszURL, dwSiteId);
|
|
|
|
if (NO_ERROR != rc)
|
|
{
|
|
return rc;
|
|
}
|
|
|
|
pwszURL = mszURLList.Next(pwszURL);
|
|
}
|
|
|
|
//
|
|
// 4. Activate the Control Channel and the Config Group
|
|
//
|
|
|
|
HTTP_ENABLED_STATE ccState = HttpEnabledStateActive;
|
|
|
|
rc = HttpSetControlChannelInformation( m_hControlChannel,
|
|
HttpControlChannelStateInformation,
|
|
&ccState,
|
|
sizeof(ccState));
|
|
|
|
if ( NO_ERROR != rc)
|
|
{
|
|
IF_DEBUG(ERROR)
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"Unable to activate ControlChannel. Error=%08x. Returning\n", rc
|
|
));
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
|
|
HTTP_CONFIG_GROUP_STATE cgState;
|
|
|
|
cgState.Flags.Present = 1;
|
|
cgState.State = HttpEnabledStateActive;
|
|
|
|
rc = HttpSetConfigGroupInformation( m_hControlChannel,
|
|
m_ConfigGroupId,
|
|
HttpConfigGroupStateInformation,
|
|
&cgState,
|
|
sizeof(cgState));
|
|
|
|
if ( NO_ERROR != rc)
|
|
{
|
|
IF_DEBUG(ERROR)
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"Unable to activate Config Group. Error=%08x. Returning\n", rc
|
|
));
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
|
|
//
|
|
// 5. Create an AppPool
|
|
//
|
|
|
|
rc = HttpCreateAppPool( &m_hAppPool,
|
|
pwszAppPoolName,
|
|
0,
|
|
0
|
|
);
|
|
|
|
if ( NO_ERROR != rc)
|
|
{
|
|
IF_DEBUG(ERROR)
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"UlCreateAppPool failed for AppPool '%ws'. Error=%08x. Returning\n",
|
|
pwszAppPoolName, rc
|
|
));
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
|
|
//
|
|
// 6. Associate AppPool with the config group
|
|
//
|
|
|
|
HTTP_CONFIG_GROUP_APP_POOL AppPoolConfig;
|
|
|
|
AppPoolConfig.Flags.Present = 1;
|
|
AppPoolConfig.AppPoolHandle = m_hAppPool;
|
|
|
|
rc = HttpSetConfigGroupInformation( m_hControlChannel,
|
|
m_ConfigGroupId,
|
|
HttpConfigGroupAppPoolInformation,
|
|
&AppPoolConfig,
|
|
sizeof(AppPoolConfig)
|
|
);
|
|
if ( NO_ERROR != rc)
|
|
{
|
|
IF_DEBUG(ERROR)
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"UlSetConfigGroupInformation failed for AppPool '%ws'. Error=%08x. Returning\n",
|
|
pwszAppPoolName, rc
|
|
));
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
|
|
//
|
|
// 7. Enable the app pool
|
|
//
|
|
|
|
HTTP_APP_POOL_ENABLED_STATE NewHttpAppPoolState = HttpAppPoolEnabled;
|
|
|
|
rc = HttpSetAppPoolInformation(
|
|
m_hAppPool, // app pool handle
|
|
HttpAppPoolStateInformation, // information class
|
|
reinterpret_cast <VOID *> ( &NewHttpAppPoolState ), // data
|
|
sizeof( HTTP_APP_POOL_ENABLED_STATE ) // data length
|
|
);
|
|
|
|
if ( rc != NO_ERROR )
|
|
{
|
|
IF_DEBUG(ERROR)
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"HttpSetAppPoolInformation failed for AppPool '%ws'. Error=%08x. Returning\n",
|
|
pwszAppPoolName, rc
|
|
));
|
|
}
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
return (rc);
|
|
|
|
} // UL_CONTROL_CHANNEL::Initialize()
|
|
|
|
/********************************************************************++
|
|
++********************************************************************/
|
|
|
|
|
|
ULONG
|
|
UL_CONTROL_CHANNEL::Cleanup(void)
|
|
{
|
|
ULONG rc = NO_ERROR;
|
|
|
|
if ( m_hControlChannel != NULL)
|
|
{
|
|
if ( ! HTTP_IS_NULL_ID(&m_ConfigGroupId) )
|
|
{
|
|
rc = HttpDeleteConfigGroup( m_hControlChannel, m_ConfigGroupId);
|
|
HTTP_SET_NULL_ID(&m_ConfigGroupId);
|
|
}
|
|
|
|
if ( NULL != m_hAppPool )
|
|
{
|
|
if ( !::CloseHandle( m_hAppPool))
|
|
{
|
|
rc = GetLastError();
|
|
}
|
|
}
|
|
|
|
m_hAppPool = NULL;
|
|
|
|
if (!::CloseHandle( m_hControlChannel))
|
|
{
|
|
rc = GetLastError();
|
|
}
|
|
|
|
m_hControlChannel = NULL;
|
|
}
|
|
|
|
return (rc);
|
|
|
|
} // UL_CONTROL_CHANNEL::Cleanup()
|
|
|
|
/********************************************************************++
|
|
++********************************************************************/
|
|
|
|
ULONG
|
|
UL_CONTROL_CHANNEL::AddURLToConfigGroup( IN LPCWSTR pwszURL,
|
|
IN DWORD dwSiteId )
|
|
{
|
|
//
|
|
// Add the URL to the Config Group
|
|
//
|
|
|
|
ULONG rc;
|
|
|
|
HTTP_URL_CONTEXT UrlContext = dwSiteId;
|
|
UrlContext = UrlContext << 32;
|
|
|
|
rc = HttpAddUrlToConfigGroup( m_hControlChannel,
|
|
m_ConfigGroupId,
|
|
pwszURL,
|
|
UrlContext
|
|
);
|
|
|
|
if ( NO_ERROR != rc)
|
|
{
|
|
IF_DEBUG (ERROR)
|
|
{
|
|
DBGPRINTF((DBG_CONTEXT,
|
|
"UlAddUrlToConfigGroup() failed. Error=%08x\n",
|
|
rc));
|
|
}
|
|
}
|
|
|
|
return (rc);
|
|
}
|
|
|
|
/************************ End of File ***********************/
|
|
|