387 lines
9.4 KiB
C
387 lines
9.4 KiB
C
/*++
|
||
|
||
Copyright (c) 1998-2001 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
cgroup.h
|
||
|
||
Abstract:
|
||
|
||
The public definition of config group interfaces.
|
||
|
||
Author:
|
||
|
||
Paul McDaniel (paulmcd) 11-Jan-1999
|
||
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
|
||
#ifndef _CGROUP_H_
|
||
#define _CGROUP_H_
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
|
||
//
|
||
// Forwarders.
|
||
//
|
||
|
||
typedef struct _UL_CONNECTION_COUNT_ENTRY *PUL_CONNECTION_COUNT_ENTRY;
|
||
typedef struct _UL_CG_URL_TREE_HEADER *PUL_CG_URL_TREE_HEADER;
|
||
typedef struct _UL_CG_URL_TREE_ENTRY *PUL_CG_URL_TREE_ENTRY;
|
||
typedef struct _UL_CONTROL_CHANNEL *PUL_CONTROL_CHANNEL;
|
||
typedef struct _UL_APP_POOL_OBJECT *PUL_APP_POOL_OBJECT;
|
||
typedef struct _UL_INTERNAL_RESPONSE *PUL_INTERNAL_RESPONSE;
|
||
typedef struct _UL_LOG_FILE_ENTRY *PUL_LOG_FILE_ENTRY;
|
||
typedef struct _UL_SITE_COUNTER_ENTRY *PUL_SITE_COUNTER_ENTRY;
|
||
typedef struct _UL_HTTP_CONNECTION *PUL_HTTP_CONNECTION;
|
||
|
||
//
|
||
// Kernel mode mappings to the user mode set defined in ulapi.h :
|
||
//
|
||
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlCreateConfigGroup(
|
||
IN PUL_CONTROL_CHANNEL pControlChannel,
|
||
OUT HTTP_CONFIG_GROUP_ID * pConfigGroupId
|
||
);
|
||
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlDeleteConfigGroup(
|
||
IN HTTP_CONFIG_GROUP_ID ConfigGroupId
|
||
);
|
||
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlAddUrlToConfigGroup(
|
||
IN HTTP_CONFIG_GROUP_ID ConfigGroupId,
|
||
IN PUNICODE_STRING pUrl,
|
||
IN HTTP_URL_CONTEXT UrlContext
|
||
);
|
||
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlRemoveUrlFromConfigGroup(
|
||
IN HTTP_CONFIG_GROUP_ID ConfigGroupId,
|
||
IN PUNICODE_STRING pUrl
|
||
);
|
||
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlRemoveAllUrlsFromConfigGroup(
|
||
IN HTTP_CONFIG_GROUP_ID ConfigGroupId
|
||
);
|
||
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlAddTransientUrl(
|
||
PUL_APP_POOL_OBJECT pAppPool,
|
||
PUNICODE_STRING pUrl
|
||
);
|
||
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlRemoveTransientUrl(
|
||
PUL_APP_POOL_OBJECT pAppPool,
|
||
PUNICODE_STRING pUrl
|
||
);
|
||
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlQueryConfigGroupInformation(
|
||
IN HTTP_CONFIG_GROUP_ID ConfigGroupId,
|
||
IN HTTP_CONFIG_GROUP_INFORMATION_CLASS InformationClass,
|
||
IN PVOID pConfigGroupInformation,
|
||
IN ULONG Length,
|
||
OUT PULONG pReturnLength OPTIONAL
|
||
);
|
||
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlSetConfigGroupInformation(
|
||
IN HTTP_CONFIG_GROUP_ID ConfigGroupId,
|
||
IN HTTP_CONFIG_GROUP_INFORMATION_CLASS InformationClass,
|
||
IN PVOID pConfigGroupInformation,
|
||
IN ULONG Length
|
||
);
|
||
|
||
//
|
||
// This structure represents an internal cfg group object. These are linked
|
||
// and owned by control channels via a LIST_ENTRY list.
|
||
//
|
||
|
||
#define IS_VALID_CONFIG_GROUP(pObject) \
|
||
(((pObject) != NULL) && ((pObject)->Signature == UL_CG_OBJECT_POOL_TAG))
|
||
|
||
|
||
typedef struct _UL_CONFIG_GROUP_OBJECT
|
||
{
|
||
|
||
//
|
||
// PagedPool
|
||
//
|
||
|
||
ULONG Signature; // UL_CG_OBJECT_POOL_TAG
|
||
|
||
LONG RefCount;
|
||
|
||
HTTP_CONFIG_GROUP_ID ConfigGroupId;
|
||
|
||
UL_NOTIFY_ENTRY HandleEntry; // Links us to an apool or
|
||
// control channel handle
|
||
|
||
UL_NOTIFY_ENTRY ParentEntry; // Links transient groups
|
||
// to their static parents
|
||
|
||
UL_NOTIFY_HEAD ChildHead; // Links transient children
|
||
// into this group
|
||
|
||
LIST_ENTRY ControlChannelEntry;// Links into the
|
||
// control channel
|
||
|
||
PUL_CONTROL_CHANNEL pControlChannel; // the control channel
|
||
|
||
LIST_ENTRY UrlListHead; // Links UL_CG_URL_TREE_ENTRY
|
||
// into this group
|
||
|
||
HTTP_PROPERTY_FLAGS AppPoolFlags;
|
||
PUL_APP_POOL_OBJECT pAppPool; // Maps to our app
|
||
// pool.
|
||
|
||
PUL_INTERNAL_RESPONSE pAutoResponse; // The kernel version
|
||
// of the auto-response.
|
||
|
||
HTTP_CONFIG_GROUP_MAX_BANDWIDTH MaxBandwidth; // Applies all the flows below
|
||
|
||
LIST_ENTRY FlowListHead; // Links our flows to us so we can
|
||
// do a faster lookup and cleanup.
|
||
|
||
HTTP_CONFIG_GROUP_MAX_CONNECTIONS MaxConnections;
|
||
|
||
PUL_CONNECTION_COUNT_ENTRY pConnectionCountEntry;
|
||
|
||
HTTP_CONFIG_GROUP_STATE State; // The current state
|
||
// (active, etc.)
|
||
|
||
HTTP_CONFIG_GROUP_SECURITY Security; // Security descriptor for
|
||
// transient registrations
|
||
|
||
|
||
HTTP_CONFIG_GROUP_LOGGING LoggingConfig; // logging config for the
|
||
// site<74>s root app. //
|
||
|
||
PUL_LOG_FILE_ENTRY pLogFileEntry;
|
||
|
||
|
||
|
||
PUL_SITE_COUNTER_ENTRY pSiteCounters; // Perfmon Counters (ref'd)
|
||
|
||
LONGLONG ConnectionTimeout; // Connection Timeout override
|
||
// in 100ns ticks
|
||
|
||
|
||
} UL_CONFIG_GROUP_OBJECT, *PUL_CONFIG_GROUP_OBJECT;
|
||
|
||
//
|
||
// Public functions for config group objects:
|
||
//
|
||
|
||
//
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
|
||
VOID
|
||
UlReferenceConfigGroup(
|
||
IN PVOID pObject
|
||
REFERENCE_DEBUG_FORMAL_PARAMS
|
||
);
|
||
|
||
#define REFERENCE_CONFIG_GROUP( pConfigGroup ) \
|
||
UlReferenceConfigGroup( \
|
||
(pConfigGroup) \
|
||
REFERENCE_DEBUG_ACTUAL_PARAMS \
|
||
)
|
||
|
||
//
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
|
||
VOID
|
||
UlDereferenceConfigGroup(
|
||
PUL_CONFIG_GROUP_OBJECT pConfigGroup
|
||
REFERENCE_DEBUG_FORMAL_PARAMS
|
||
);
|
||
|
||
#define DEREFERENCE_CONFIG_GROUP( pConfigGroup ) \
|
||
UlDereferenceConfigGroup( \
|
||
(pConfigGroup) \
|
||
REFERENCE_DEBUG_ACTUAL_PARAMS \
|
||
)
|
||
|
||
//
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
HTTP_CONFIG_GROUP_ID
|
||
UlConfigGroupFromListEntry(
|
||
IN PLIST_ENTRY pControlChannelEntry
|
||
);
|
||
|
||
|
||
|
||
//
|
||
// This info is built for an URL, and returned from UlGetConfigGroupForUrl
|
||
//
|
||
|
||
#define IS_VALID_URL_CONFIG_GROUP_INFO(pInfo) \
|
||
(((pInfo) != NULL) && ((pInfo)->Signature == UL_CG_URL_INFO_POOL_TAG))
|
||
|
||
typedef struct _UL_URL_CONFIG_GROUP_INFO
|
||
{
|
||
//
|
||
// NonPagedPool
|
||
//
|
||
|
||
//
|
||
// UL_CG_URL_INFO_POOL_TAG
|
||
//
|
||
|
||
ULONG Signature;
|
||
|
||
//
|
||
// used by the cache mgr and need to be live from the
|
||
// real config group objects
|
||
//
|
||
|
||
PUL_CONFIG_GROUP_OBJECT pMaxBandwidth;
|
||
PUL_CONFIG_GROUP_OBJECT pMaxConnections;
|
||
PUL_CONNECTION_COUNT_ENTRY pConnectionCountEntry;
|
||
PUL_CONFIG_GROUP_OBJECT pCurrentState;
|
||
PUL_CONFIG_GROUP_OBJECT pLoggingConfig;
|
||
|
||
//
|
||
// Site Counters (ref'd)
|
||
//
|
||
ULONG SiteId;
|
||
PUL_SITE_COUNTER_ENTRY pSiteCounters;
|
||
|
||
//
|
||
// Connection Timeout (100ns Ticks)
|
||
//
|
||
LONGLONG ConnectionTimeout;
|
||
|
||
//
|
||
// used by the http engine routing to the app pool, no
|
||
// need to be live. copies work great.
|
||
//
|
||
|
||
HTTP_ENABLED_STATE CurrentState; // a copy of the above, for
|
||
// callers that don't need
|
||
// live access
|
||
PUL_CONTROL_CHANNEL pControlChannel;
|
||
|
||
HTTP_URL_CONTEXT UrlContext; // The context for the url.
|
||
// NULL = not set
|
||
|
||
PUL_APP_POOL_OBJECT pAppPool; // Points the app pool
|
||
// associated with this url
|
||
|
||
PUL_INTERNAL_RESPONSE pAutoResponse; // The kernel version of the
|
||
// auto-response.
|
||
|
||
} UL_URL_CONFIG_GROUP_INFO, *PUL_URL_CONFIG_GROUP_INFO;
|
||
|
||
//
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlGetConfigGroupInfoForUrl(
|
||
IN PWSTR pUrl,
|
||
IN PUL_HTTP_CONNECTION pHttpConn,
|
||
OUT PUL_URL_CONFIG_GROUP_INFO pInfo
|
||
);
|
||
|
||
//
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlInitializeCG(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
UlTerminateCG(
|
||
VOID
|
||
);
|
||
|
||
BOOLEAN
|
||
UlNotifyOrphanedConfigGroup(
|
||
IN PUL_NOTIFY_ENTRY pEntry,
|
||
IN PVOID pHost,
|
||
IN PVOID pv
|
||
);
|
||
|
||
//
|
||
// url info helpers
|
||
//
|
||
|
||
NTSTATUS
|
||
UlpSetUrlInfo(
|
||
IN OUT PUL_URL_CONFIG_GROUP_INFO pInfo,
|
||
IN PUL_CG_URL_TREE_ENTRY pMatchEntry
|
||
);
|
||
|
||
__inline
|
||
VOID
|
||
FASTCALL
|
||
UlpInitializeUrlInfo(
|
||
OUT PUL_URL_CONFIG_GROUP_INFO pInfo
|
||
)
|
||
{
|
||
ASSERT(pInfo != NULL);
|
||
|
||
RtlZeroMemory(
|
||
(PCHAR)pInfo,
|
||
sizeof(UL_URL_CONFIG_GROUP_INFO)
|
||
);
|
||
|
||
pInfo->Signature = UL_CG_URL_INFO_POOL_TAG;
|
||
pInfo->CurrentState = HttpEnabledStateInactive;
|
||
}
|
||
|
||
//
|
||
// IRQL == PASSIVE_LEVEL
|
||
//
|
||
NTSTATUS
|
||
UlpConfigGroupInfoRelease(
|
||
IN PUL_URL_CONFIG_GROUP_INFO pInfo
|
||
);
|
||
|
||
NTSTATUS
|
||
UlpConfigGroupInfoDeepCopy(
|
||
IN const PUL_URL_CONFIG_GROUP_INFO pOrigInfo,
|
||
IN OUT PUL_URL_CONFIG_GROUP_INFO pNewInfo
|
||
);
|
||
|
||
#ifdef __cplusplus
|
||
}; // extern "C"
|
||
#endif
|
||
|
||
#endif // _CGROUP_H_
|