mirror of https://github.com/UMSKT/xpmgr.git
599 lines
13 KiB
C++
599 lines
13 KiB
C++
/*++
|
|
|
|
Copyright (c) 2004 Microsoft Corporation
|
|
|
|
Module Name :
|
|
wp_framework.h
|
|
|
|
Abstract:
|
|
|
|
Definition of
|
|
- IWorkerProcessFramework and related data and interfaces
|
|
- IProtocolManager and related interfaces
|
|
|
|
|
|
Protocol manager is a module that gets loaded by worker process in order
|
|
to handle traffic for a protocol. The actual startup/stopping of protocol
|
|
activity happens by starting/stopping protocol ListenerChannels.
|
|
|
|
Protocol manager is expected to handle
|
|
- protocol ListenerChannel commands
|
|
- health/lifetime monitoring for the internal activity
|
|
- custom actions (aka RSCA queries/functions)
|
|
- provide custom interfaces what other protocol managers may leverage
|
|
(it is meant to allow for protocol managers or their internal components
|
|
to share objects with other protocol managers)
|
|
|
|
|
|
Worker process framework is set of interfaces available in the worker
|
|
process that are presented to protocol managers.
|
|
|
|
Worker process framework allows protocol managers to
|
|
- retrieve the Config interface to be used within the worker process.
|
|
- retrieve certain cooked values such as AppPool name that protocol managers
|
|
may need
|
|
- report unhealthy events
|
|
- load another protocol manager to retrieve custom interface
|
|
- some additional utility functions (such as one that returns site ID and
|
|
virtual path for given AppID)
|
|
|
|
--*/
|
|
|
|
#ifndef _WP_FRAMEWORK_H_
|
|
#define _WP_FRAMEWORK_H_
|
|
|
|
|
|
#include <unknwn.h>
|
|
|
|
//
|
|
// Forward declarations
|
|
//
|
|
|
|
class IProtocolManager;
|
|
|
|
//
|
|
// Simple refcounted base class
|
|
//
|
|
|
|
class IWpfReferencedObject
|
|
{
|
|
public:
|
|
virtual
|
|
ULONG
|
|
AddRef(
|
|
VOID
|
|
) = 0;
|
|
|
|
virtual
|
|
ULONG
|
|
Release
|
|
(
|
|
VOID
|
|
) = 0;
|
|
|
|
};
|
|
|
|
//
|
|
// IWorkerProcessFramework related interfaces
|
|
//
|
|
|
|
//
|
|
// WorkerProcessFramework implements multiple interfaces
|
|
// that are used by IProtocolManager instances to retrieve
|
|
// configuration/settings and perform actions related to the worker process
|
|
// monitoring
|
|
//
|
|
|
|
|
|
enum WPF_INTERFACE_ID_ENUM
|
|
{
|
|
// retrieve native config interface
|
|
WPF_CONFIG_API_ID = 1,
|
|
|
|
// helps to translate application ID to site and virtual path
|
|
WPF_APPLICATION_INFO_UTIL_ID,
|
|
|
|
// exposes some settings that have process wide impact such
|
|
// as recycling counters, CLR version ...
|
|
WPF_SETTINGS_ID,
|
|
|
|
// way to request a recycle, shutdown worker pocess
|
|
WPF_ACTIONS_ID,
|
|
|
|
// way to ask worker process framework to
|
|
// load a protocol manager and request custom interface
|
|
// of that. This interface allows multiple protocol managers
|
|
// to share objects between them
|
|
//
|
|
WPF_EXPOSE_PROTOCOL_MANAGER_CUSTOM_INTERFACE_ID,
|
|
|
|
// way to get at preload information for an application
|
|
WPF_APPLICATION_PRELOAD_INFO_UTIL_ID,
|
|
};
|
|
|
|
|
|
class IWorkerProcessFramework: public IWpfReferencedObject
|
|
{
|
|
public:
|
|
|
|
virtual
|
|
HRESULT
|
|
GetWpfInterface(
|
|
IN WPF_INTERFACE_ID_ENUM WpfInterfaceId,
|
|
OUT PVOID* ppInterface
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
GetCustomInterface(
|
|
IN DWORD InterfaceId,
|
|
OUT PVOID* ppInterface
|
|
) = 0;
|
|
|
|
//
|
|
// return the IWorkerProcessFramework version
|
|
// (it is meant to allow consumer to determine
|
|
// what interfaces are available for retrieval)
|
|
//
|
|
virtual
|
|
HRESULT
|
|
GetInterfaceVersion(
|
|
OUT PDWORD pdwMajorVersion,
|
|
OUT PDWORD pdwMinorVersion
|
|
) = 0;
|
|
};
|
|
|
|
//
|
|
// Interface ID: WPF_APPLICATION_INFO_ID
|
|
//
|
|
// Exposes helper function to retrieve SiteID and Virtual path for the
|
|
// given AppId
|
|
//
|
|
|
|
class IWpfApplicationInfoUtil: public IWpfReferencedObject
|
|
{
|
|
public:
|
|
virtual
|
|
HRESULT
|
|
GetApplicationPropertiesFromAppId(
|
|
IN PCWSTR pszAppId,
|
|
__out_ecount_opt(*pcchVirtualPath) PWSTR pszVirtualPath,
|
|
OUT DWORD * pcchVirtualPath,
|
|
OUT DWORD * pdwSiteId ) = 0;
|
|
};
|
|
|
|
|
|
//
|
|
// enums used by IWpfSettings (WFP_SETTINGS_ID) interface
|
|
//
|
|
|
|
enum WPF_SETTINGS_STRING_ENUM
|
|
{
|
|
CLR_VERSION,
|
|
APP_POOL_NAME,
|
|
APP_HOST_FILE_NAME,
|
|
ROOT_WEB_CONFIG_FILE_NAME,
|
|
CLR_CONFIG_FILE_NAME
|
|
};
|
|
|
|
enum WPF_SETTINGS_DWORD_ENUM
|
|
{
|
|
PERIODIC_RESTART_REQUESTS = 1,
|
|
PERIODIC_RESTART_TIME,
|
|
IDLE_TIMEOUT,
|
|
MANAGED_PIPELINE_MODE,
|
|
};
|
|
|
|
enum WPF_SETTINGS_ULONGLONG_ENUM
|
|
{
|
|
PERIODIC_RESTART_VIRTUAL_MEMORY,
|
|
PERIODIC_RESTART_PRIVATE_MEMORY,
|
|
};
|
|
|
|
enum WPF_SETTINGS_BOOL_ENUM
|
|
{
|
|
ENABLED_CENTRAL_BINARY_LOGGING,
|
|
ENABLED_HOSTABLE_WEB_CORE
|
|
};
|
|
|
|
enum WPF_SETTINGS_HANDLE_ENUM
|
|
{
|
|
ANONYMOUS_USER_TOKEN
|
|
};
|
|
|
|
//
|
|
// Interface ID: WPF_SETTINGS_ID
|
|
//
|
|
// Exposes Application Pool / worker process related settings
|
|
// (based on applicationhost.config settings)
|
|
//
|
|
|
|
class IWpfSettings : public IWpfReferencedObject
|
|
{
|
|
public:
|
|
virtual
|
|
HRESULT
|
|
GetDwordProperty(
|
|
IN WPF_SETTINGS_DWORD_ENUM SettingId,
|
|
OUT DWORD* pdwSetting
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
GetUlonglongProperty(
|
|
IN WPF_SETTINGS_ULONGLONG_ENUM SettingId,
|
|
OUT ULONGLONG* pSetting
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
GetStringProperty(
|
|
IN WPF_SETTINGS_STRING_ENUM SettingId,
|
|
__out_ecount_opt(*pcchSetting) PWSTR pszSetting,
|
|
OUT DWORD* pcchSetting
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
GetBoolProperty(
|
|
IN WPF_SETTINGS_BOOL_ENUM SettingId,
|
|
OUT BOOL * pfSetting
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
GetHandleProperty(
|
|
IN WPF_SETTINGS_HANDLE_ENUM SettingId,
|
|
OUT HANDLE * phSetting
|
|
) = 0;
|
|
};
|
|
|
|
|
|
//
|
|
// Interface ID: WPF_ACTIONS_ID
|
|
//
|
|
// Allows protocol manager to request recycling or
|
|
// allows to report health issues (FailWorkerProcess)
|
|
//
|
|
|
|
|
|
class IWpfActions : public IWpfReferencedObject
|
|
{
|
|
public:
|
|
|
|
virtual
|
|
VOID
|
|
RecycleWorkerProcess(
|
|
IN PCWSTR pszReason
|
|
) = 0;
|
|
|
|
virtual
|
|
VOID
|
|
FailWorkerProcess(
|
|
IN PCWSTR pszReason,
|
|
IN HRESULT hrFailureToReport,
|
|
IN BOOL fFailOnNextPing = FALSE
|
|
) = 0;
|
|
};
|
|
|
|
//
|
|
// Interface ID: WPF_EXPOSE_PROTOCOL_MANAGER_CUSTOM_INTERFACE_ID
|
|
//
|
|
// Some protocol managers may have dependencies on other protocol managers
|
|
// (for reasons such as controling the lifetime of a shared singleton
|
|
// object). Use of this interface is expected to be very limited.
|
|
//
|
|
|
|
class IWpfExposeProtocolManagerCustomInterface: public IWpfReferencedObject
|
|
{
|
|
public:
|
|
|
|
//
|
|
// Load the given protocol manager and retrieve the requested interface
|
|
// The meaning of the call is to enable one protocol manager to leverage
|
|
// some functionality implemented in other protocol manager.
|
|
// Note that we don't allow full access to ProtocolManager interfaces
|
|
// because most of them are only meant for the interaction with
|
|
// the Worker Process Framework.
|
|
//
|
|
// Also note that when done using custom interface it is necessary
|
|
// to release the reference to custom interface not later then in
|
|
// Shutdown() call.
|
|
//
|
|
|
|
virtual
|
|
HRESULT
|
|
LoadProtocolManagerAndGetCustomInterface(
|
|
IN PCWSTR pProtocolManagerDll,
|
|
IN PCWSTR pProtocolManagerDllInitFunction,
|
|
IN DWORD dwCustomInterfaceId,
|
|
OUT PVOID* ppCustomInterface
|
|
) = 0;
|
|
|
|
};
|
|
|
|
//
|
|
// IProtocolManager related interfaces
|
|
// - exposed on the Protocol Manager for the Worker Process Framework to use
|
|
//
|
|
|
|
class IWpfListenerChannelCallback;
|
|
|
|
|
|
//
|
|
// IProtocolManager interface and related enum
|
|
// listing supported interfaces
|
|
//
|
|
|
|
enum PM_INTERFACE_ID_ENUM
|
|
{
|
|
// Protocol ListenerChannel management interface
|
|
PM_LISTENER_CHANNEL_MANAGER_ID = 1,
|
|
|
|
// Health/ idle monitoring interface
|
|
PM_HEALTH_AND_IDLE_MONITOR_ID,
|
|
|
|
// Custom actions interface (for RSCA query)
|
|
PM_CUSTOM_ACTIONS_ID,
|
|
|
|
// Application preload support
|
|
PM_APPLICATION_PRELOAD_ID,
|
|
};
|
|
|
|
//
|
|
// Finally the actual declaration of the IProtocolManager
|
|
//
|
|
|
|
class IProtocolManager : public IWpfReferencedObject
|
|
{
|
|
public:
|
|
virtual
|
|
HRESULT
|
|
GetPmInterface(
|
|
IN PM_INTERFACE_ID_ENUM PmInterfaceId,
|
|
OUT PVOID* ppInterface
|
|
) = 0;
|
|
|
|
|
|
virtual
|
|
HRESULT
|
|
GetCustomInterface(
|
|
IN DWORD InterfaceId,
|
|
OUT PVOID* ppInterface
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
Shutdown(
|
|
IN BOOL fImmediate
|
|
) = 0;
|
|
|
|
};
|
|
|
|
|
|
//
|
|
// Callback class used by IPmMonitor (PM_MONITOR_ID) interface
|
|
//
|
|
|
|
class IHealthStatusCallback: public IWpfReferencedObject
|
|
{
|
|
public:
|
|
virtual
|
|
HRESULT
|
|
ReportHealth(
|
|
BOOL fHealthy
|
|
) = 0;
|
|
};
|
|
|
|
//
|
|
// Interface ID: PM_HEALTH_AND_IDLE_MONITOR_ID
|
|
// IProtocolManager needs to expose health/ recycling monitoring means
|
|
//
|
|
|
|
class IPmHealthAndIdleMonitor : public IWpfReferencedObject
|
|
{
|
|
public:
|
|
|
|
virtual
|
|
HRESULT
|
|
CheckIdle(
|
|
OUT BOOL *pfIdle
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
CheckHealth( // health ping response
|
|
IHealthStatusCallback * pIHealthStatusCallback
|
|
) = 0;
|
|
};
|
|
|
|
//
|
|
// Callback class used by IPmCustomActions (PM_CUSTOM_ACTIONS_PM) interface
|
|
//
|
|
|
|
class ICustomActionResultCallback
|
|
: public IWpfReferencedObject
|
|
{
|
|
public:
|
|
virtual
|
|
HRESULT
|
|
ReportResult(
|
|
IN HRESULT hrStatus,
|
|
IN PBYTE pbResponse,
|
|
IN DWORD cbResponse
|
|
) = 0;
|
|
};
|
|
|
|
//
|
|
// Interface ID: WPF_APPLICATION_PRELOAD_INFO_UTIL_ID
|
|
//
|
|
// Exposes helper function to retrieve SiteID and Virtual path for the
|
|
// given AppId
|
|
//
|
|
class IWpfApplicationPreloadUtil : public IWpfReferencedObject
|
|
{
|
|
public:
|
|
virtual
|
|
HRESULT
|
|
GetApplicationPreloadInfo(
|
|
IN PCWSTR pszConfigPath,
|
|
OUT BOOL * pfEnabled,
|
|
OUT BSTR * pbstrType,
|
|
OUT SAFEARRAY ** psaPreloadValues
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
ReportApplicationPreloadFailure(
|
|
IN PCWSTR pszConfigPath,
|
|
IN HRESULT hrFailureCode,
|
|
IN PCWSTR pszErrorString
|
|
) = 0;
|
|
};
|
|
|
|
|
|
class IPmApplicationPreload : public IWpfReferencedObject
|
|
{
|
|
public:
|
|
|
|
virtual
|
|
HRESULT
|
|
PreloadApplication(
|
|
IN DWORD dwSiteId,
|
|
IN PCWSTR pszAppConfigPath
|
|
) = 0;
|
|
};
|
|
|
|
//
|
|
// Interface ID: PM_CUSTOM_ACTIONS_ID
|
|
// IProtocolManager needs to expose a way for Custom actions
|
|
// (so that custom queries such as RSCA query can be implemented)
|
|
//
|
|
|
|
class IPmCustomActions : public IWpfReferencedObject
|
|
{
|
|
public:
|
|
|
|
//
|
|
// RunCustomAction can report results back
|
|
// by using a callback interface
|
|
//
|
|
|
|
virtual
|
|
HRESULT
|
|
RunCustomAction(
|
|
IN PCWSTR pszFunctionName,
|
|
IN PCWSTR pszFunctionArgs,
|
|
IN ICustomActionResultCallback * pCompletionCallbackClass
|
|
) = 0 ;
|
|
|
|
};
|
|
|
|
//
|
|
// Used by IPmListenerChannelManager (PM_LISTENER_CHANNEL_MANAGER_ID)
|
|
// Interface ListenerChannelCallback provides notifications about
|
|
// ListenerChannel status changes from Protocol managers.
|
|
// It also allows protocol managers to access extra parameters/blob
|
|
// that is communicated to worker process when ListenerChannels
|
|
// are asked to be started
|
|
//
|
|
|
|
class IWpfListenerChannelCallback : public IWpfReferencedObject
|
|
{
|
|
public:
|
|
virtual
|
|
HRESULT
|
|
ReportStarted(
|
|
VOID
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
ReportStopped(
|
|
HRESULT hr
|
|
) = 0;
|
|
|
|
|
|
virtual
|
|
HRESULT
|
|
ReportMessageReceived(
|
|
VOID
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
GetId(
|
|
OUT DWORD* pdwListenerChannelId
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
GetBlob(
|
|
IN OUT PBYTE pBlob,
|
|
IN OUT DWORD* pcbBlob
|
|
) = 0;
|
|
};
|
|
|
|
//
|
|
// Interface ID: PM_LISTENER_CHANNEL_MANAGER_ID
|
|
// IProtocolManager needs to expose interface that allows
|
|
// controlling ListenerChannels (starting and stopping them)
|
|
//
|
|
|
|
class IPmListenerChannelManager: public IWpfReferencedObject
|
|
{
|
|
public:
|
|
|
|
// Function will ask that a ListenerChannel be launched for
|
|
// a protocol.
|
|
virtual
|
|
HRESULT
|
|
StartListenerChannel(
|
|
IN PCWSTR protocolId,
|
|
IN IWpfListenerChannelCallback * pListenerChannelCallback
|
|
) = 0;
|
|
|
|
virtual
|
|
HRESULT
|
|
StopListenerChannel(
|
|
IN PCWSTR protocolId,
|
|
IN IWpfListenerChannelCallback * pListenerChannelCallback,
|
|
IN BOOL fImmediate
|
|
) = 0;
|
|
|
|
|
|
};
|
|
|
|
|
|
//
|
|
// Default entrypoint of the protocol manager dll that allows worker
|
|
// process to instantiate the ProtocolManager instance
|
|
//
|
|
|
|
#define DEFAULT_PROTOCOL_MANAGER_INIT_FUNCTION L"GetProtocolManager"
|
|
|
|
typedef HRESULT (*PFN_GET_PROTOCOL_MANAGER)
|
|
( IN IWorkerProcessFramework * pWpFramework,
|
|
OUT IProtocolManager ** ppProtocolManager );
|
|
|
|
|
|
//
|
|
// Entry point for the Managed Runtime Loader method, which can be used
|
|
// to customize the loading of the Managed Runtime.
|
|
//
|
|
|
|
#define MANAGED_RUNTIME_LOADER_FUNCTION "LoadManagedRuntime"
|
|
|
|
HRESULT __stdcall LoadManagedRuntime(
|
|
PCWSTR pwszRuntimeVersion,
|
|
IUnknown ** ppManagedRuntimeHost );
|
|
|
|
// Corresponding function typedef
|
|
typedef HRESULT (__stdcall *PFNLoadManagedRuntime)(
|
|
PCWSTR pwszRuntimeVersion,
|
|
IUnknown ** ppManagedRuntimeHost );
|
|
|
|
|
|
#endif
|
|
|