324 lines
7.3 KiB
C++
324 lines
7.3 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1996 Microsoft Corporation
|
||
|
|
||
|
Module Name :
|
||
|
|
||
|
iisendp.hxx
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file contains type definitions for IIS_ENDPOINT.
|
||
|
Each IIS_ENDPOINT corresponds to an ATQ_ENDPOINT structure.
|
||
|
|
||
|
This structure is used to hold multiple instances listening
|
||
|
on the same ATQ_ENDPOINT.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Johnson Apacible (JohnsonA) Jun-04-1996
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _IISENDP_H_
|
||
|
#define _IISENDP_H_
|
||
|
|
||
|
#include <reftrace.h>
|
||
|
//
|
||
|
// Determines if iis_endpoint reference count tracking is enabled
|
||
|
//
|
||
|
#if DBG
|
||
|
#define IE_REF_TRACKING 1
|
||
|
#else
|
||
|
#define IE_REF_TRACKING 0
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//
|
||
|
// Forward references.
|
||
|
//
|
||
|
|
||
|
class IIS_ASSOCIATION;
|
||
|
typedef class IIS_ASSOCIATION *PIIS_ASSOCIATION;
|
||
|
|
||
|
//
|
||
|
// Instance qualifiers.
|
||
|
//
|
||
|
|
||
|
typedef enum _INSTANCE_QUALIFIER {
|
||
|
|
||
|
FullyQualified, // "1.2.3.4:80:foo.com"
|
||
|
QualifiedByIpAddress, // "1.2.3.4:80:"
|
||
|
QualifiedByHostName, // ":80:foo.com"
|
||
|
NumInstanceQualifiers, // sentinel for qualified instances
|
||
|
WildcardInstance // ":80:"
|
||
|
|
||
|
} INSTANCE_QUALIFIER, *PINSTANCE_QUALIFIER;
|
||
|
|
||
|
//
|
||
|
// Each head block corresponds to an ATQ endpoint
|
||
|
//
|
||
|
|
||
|
class IIS_ENDPOINT {
|
||
|
|
||
|
private:
|
||
|
|
||
|
//
|
||
|
// Signature for this block
|
||
|
//
|
||
|
|
||
|
DWORD m_signature;
|
||
|
|
||
|
//
|
||
|
// ref count.
|
||
|
//
|
||
|
|
||
|
LONG m_reference;
|
||
|
|
||
|
//
|
||
|
// Does this contain secure sockets. It cannot contain both!
|
||
|
//
|
||
|
|
||
|
BOOL m_isSecure;
|
||
|
|
||
|
//
|
||
|
// pointer to the service (this is a reference)
|
||
|
//
|
||
|
|
||
|
PIIS_SERVICE m_service;
|
||
|
|
||
|
//
|
||
|
// State of this block
|
||
|
//
|
||
|
|
||
|
BLOCK_STATE m_state;
|
||
|
|
||
|
//
|
||
|
// Instance associations
|
||
|
//
|
||
|
|
||
|
DWORD m_NumQualifiedInstances;
|
||
|
DWORD m_nInstances;
|
||
|
PIIS_ASSOCIATION m_QualifiedInstances[NumInstanceQualifiers];
|
||
|
PIIS_SERVER_INSTANCE m_WildcardInstance;
|
||
|
|
||
|
INSTANCE_QUALIFIER
|
||
|
CalcQualifier(
|
||
|
IN DWORD IpAddress,
|
||
|
IN const CHAR * HostName
|
||
|
) {
|
||
|
if( IpAddress == INADDR_ANY ) {
|
||
|
return *HostName == '\0'
|
||
|
? WildcardInstance
|
||
|
: QualifiedByHostName;
|
||
|
} else {
|
||
|
return *HostName == '\0'
|
||
|
? QualifiedByIpAddress
|
||
|
: FullyQualified;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Is the ATQ endpoint already stopped?
|
||
|
// NYI: This should be included in the m_state itself
|
||
|
//
|
||
|
BOOL m_fAtqEpStopped;
|
||
|
|
||
|
public:
|
||
|
|
||
|
//
|
||
|
// list entry for the list of endpoints
|
||
|
//
|
||
|
|
||
|
LIST_ENTRY m_EndpointListEntry;
|
||
|
|
||
|
//
|
||
|
// Pointer to the endpoint object
|
||
|
//
|
||
|
|
||
|
PVOID m_atqEndpoint;
|
||
|
|
||
|
//
|
||
|
// Port & IP address used
|
||
|
//
|
||
|
|
||
|
USHORT m_Port;
|
||
|
DWORD m_IpAddress;
|
||
|
|
||
|
//
|
||
|
// AcceptEx Outstanding
|
||
|
//
|
||
|
|
||
|
DWORD m_nAcceptExOutstanding;
|
||
|
DWORD m_nMaximumAcceptExOutstanding;
|
||
|
|
||
|
//
|
||
|
// AcceptEx Timeout
|
||
|
//
|
||
|
|
||
|
DWORD m_AcceptExTimeout;
|
||
|
|
||
|
//
|
||
|
// Lock to protect endpoint objects
|
||
|
//
|
||
|
|
||
|
CRITICAL_SECTION m_endpointLock;
|
||
|
|
||
|
public:
|
||
|
#if IE_REF_TRACKING
|
||
|
|
||
|
//
|
||
|
// For object local refcount tracing
|
||
|
//
|
||
|
|
||
|
PTRACE_LOG _pDbgIERefTraceLog;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//
|
||
|
// add and remove a server instance
|
||
|
//
|
||
|
|
||
|
BOOL
|
||
|
AddInstance(
|
||
|
IN PIIS_SERVER_INSTANCE pInstance,
|
||
|
IN DWORD IpAddress,
|
||
|
IN const CHAR * HostName
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
RemoveInstance(
|
||
|
IN PIIS_SERVER_INSTANCE pInstance,
|
||
|
IN DWORD IpAddress,
|
||
|
IN const CHAR * HostName
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// member access
|
||
|
//
|
||
|
|
||
|
BLOCK_STATE QueryState( VOID ) {return m_state;}
|
||
|
BOOL IsSecure( ) { return m_isSecure; }
|
||
|
USHORT QueryPort( ) {return m_Port;}
|
||
|
DWORD QueryIpAddress( ) {return m_IpAddress;}
|
||
|
PIIS_SERVICE QueryService() {return m_service;}
|
||
|
VOID SetService( PIIS_SERVICE pservice ) { m_service = pservice; }
|
||
|
BOOL CheckSignature( DWORD signature ) { return (m_signature == signature); }
|
||
|
|
||
|
//
|
||
|
// Find the instance
|
||
|
//
|
||
|
|
||
|
dllexp
|
||
|
PIIS_SERVER_INSTANCE FindAndReferenceInstance(
|
||
|
IN LPCSTR szDomainName,
|
||
|
IN const DWORD LocalIpAddress,
|
||
|
OUT LPBOOL pbMaxConnExceeded
|
||
|
);
|
||
|
|
||
|
IIS_ENDPOINT(
|
||
|
IN PIIS_SERVICE pService,
|
||
|
IN USHORT Port,
|
||
|
IN DWORD IpAddress,
|
||
|
IN BOOL IsSecure
|
||
|
);
|
||
|
|
||
|
dllexp
|
||
|
~IIS_ENDPOINT( VOID );
|
||
|
|
||
|
VOID LockEndpoint( VOID ) {EnterCriticalSection(&m_endpointLock);}
|
||
|
VOID UnlockEndpoint( VOID ) {LeaveCriticalSection(&m_endpointLock);}
|
||
|
|
||
|
|
||
|
BOOL ActivateEndpoint( VOID );
|
||
|
BOOL StopEndpoint( VOID);
|
||
|
VOID ShutdownEndpoint( VOID );
|
||
|
|
||
|
dllexp VOID Reference( VOID );
|
||
|
dllexp VOID Dereference( );
|
||
|
};
|
||
|
|
||
|
typedef IIS_ENDPOINT *PIIS_ENDPOINT;
|
||
|
|
||
|
//
|
||
|
// signatures
|
||
|
//
|
||
|
|
||
|
#define IIS_ENDPOINT_SIGNATURE (DWORD)' BHE'
|
||
|
#define IIS_ENDPOINT_SIGNATURE_FREE (DWORD)'fBHE'
|
||
|
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
Support for IIS_ENDPPOINT debug ref trace logging
|
||
|
|
||
|
SYNOPSIS: Macro for writing to debug ref trace log.
|
||
|
|
||
|
HISTORY:
|
||
|
MCourage 31-Oct-1997 Created
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
//
|
||
|
// NOTE we avoid compile failure by hokey double typecast, below
|
||
|
// (since endpState is an enum, we must first cast it to int).
|
||
|
//
|
||
|
|
||
|
#define IE_SHARED_LOG_REF_COUNT( \
|
||
|
cRefs \
|
||
|
, pIisEndp \
|
||
|
, endpState \
|
||
|
, patqEndp \
|
||
|
, dummy \
|
||
|
) \
|
||
|
\
|
||
|
if( g_pDbgIERefTraceLog != NULL ) { \
|
||
|
\
|
||
|
DWORD i = (int) endpState; \
|
||
|
PVOID pv = (PVOID) (ULONG_PTR)i; \
|
||
|
\
|
||
|
WriteRefTraceLogEx( \
|
||
|
g_pDbgIERefTraceLog \
|
||
|
, cRefs \
|
||
|
, pIisEndp \
|
||
|
, pv \
|
||
|
, patqEndp \
|
||
|
, (PVOID)(ULONG_PTR) dummy \
|
||
|
); \
|
||
|
} \
|
||
|
|
||
|
//
|
||
|
// This macro logs the CLIENT_CONN specific ref trace log
|
||
|
//
|
||
|
|
||
|
#define IE_LOCAL_LOG_REF_COUNT( \
|
||
|
cRefs \
|
||
|
, pIisEndp \
|
||
|
, endpState \
|
||
|
, patqEndp \
|
||
|
, dummy \
|
||
|
) \
|
||
|
\
|
||
|
if( _pDbgIERefTraceLog != NULL ) { \
|
||
|
\
|
||
|
DWORD i = (int) endpState; \
|
||
|
PVOID pv = (PVOID) (ULONG_PTR)i; \
|
||
|
\
|
||
|
WriteRefTraceLogEx( \
|
||
|
_pDbgIERefTraceLog \
|
||
|
, cRefs \
|
||
|
, pIisEndp \
|
||
|
, pv \
|
||
|
, patqEndp \
|
||
|
, (PVOID)(ULONG_PTR) dummy \
|
||
|
); \
|
||
|
} \
|
||
|
|
||
|
|
||
|
|
||
|
#endif // _IISENDP_H_
|
||
|
|