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.
340 lines
7.0 KiB
340 lines
7.0 KiB
/*++
|
|
|
|
Copyright (C) Microsoft Corporation, 1990 - 1999
|
|
|
|
Module Name:
|
|
|
|
local.h
|
|
|
|
Abstract:
|
|
|
|
Header file for Server side EP
|
|
|
|
Author:
|
|
|
|
Bharat Shah 2/22/92
|
|
|
|
Revision History:
|
|
|
|
06-03-97 gopalp Added code to cleanup stale EP Mapper entries.
|
|
|
|
--*/
|
|
|
|
#ifndef __LOCAL_H__
|
|
#define __LOCAL_H__
|
|
|
|
//#define DBG_DETAIL
|
|
|
|
#define EP_TABLE_ENTRIES 12
|
|
|
|
#define CLEANUP_MAGIC_VALUE 0xDECAFBAD
|
|
#define PROCESS_MAGIC_VALUE ((CLEANUP_MAGIC_VALUE)+1)
|
|
|
|
|
|
extern HANDLE hEpMapperHeap;
|
|
extern CRITICAL_SECTION EpCritSec;
|
|
extern CRITICAL_SECTION TableMutex;
|
|
extern PIFOBJNode IFObjList;
|
|
extern unsigned long cTotalEpEntries;
|
|
extern unsigned long GlobalIFOBJid;
|
|
extern unsigned long GlobalEPid;
|
|
extern PSAVEDCONTEXT GlobalContextList;
|
|
extern UUID NilUuid;
|
|
extern ProtseqEndpointPair EpMapperTable[EP_TABLE_ENTRIES];
|
|
|
|
|
|
|
|
//
|
|
// Global thread locking functions
|
|
//
|
|
|
|
#ifdef NTENV
|
|
#define CheckInSem() \
|
|
ASSERT(EpCritSec.OwningThread == ULongToPtr(GetCurrentThreadId()))
|
|
#else
|
|
#define CheckInSem()
|
|
#endif
|
|
|
|
#define EnterSem() EnterCriticalSection(&EpCritSec)
|
|
#define LeaveSem() LeaveCriticalSection(&EpCritSec)
|
|
|
|
|
|
//
|
|
// Allocation routines.
|
|
//
|
|
|
|
|
|
_inline void *
|
|
AllocMem(
|
|
size_t Size
|
|
)
|
|
{
|
|
return (HeapAlloc(hEpMapperHeap, 0, Size));
|
|
}
|
|
|
|
|
|
_inline void
|
|
FreeMem(
|
|
void * pvMem
|
|
)
|
|
{
|
|
HeapFree(hEpMapperHeap, 0, pvMem);
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
// Forward definitions
|
|
//
|
|
|
|
PIENTRY
|
|
Link(
|
|
PIENTRY *ppHead,
|
|
PIENTRY pNode
|
|
);
|
|
|
|
PIENTRY
|
|
UnLink(
|
|
PIENTRY *ppHead,
|
|
PIENTRY pNode
|
|
);
|
|
|
|
PIFOBJNode
|
|
FindIFOBJVer(
|
|
PIFOBJNode *pList,
|
|
I_EPENTRY *ep
|
|
);
|
|
|
|
RPC_STATUS
|
|
IsNullUuid(
|
|
UUID * Uuid
|
|
);
|
|
|
|
RPC_STATUS
|
|
GetEntries(
|
|
UUID *ObjUuid,
|
|
UUID *IFUuid,
|
|
ulong ver,
|
|
char * pseq,
|
|
PSID pSID,
|
|
ept_lookup_handle_t *map_lookup_handle,
|
|
char * binding,
|
|
ulong calltype,
|
|
ulong maxrequested,
|
|
ulong *returned,
|
|
ulong InqType,
|
|
ulong VersOpts,
|
|
PFNPointer Match
|
|
);
|
|
|
|
RPC_STATUS
|
|
PackDataIntoBuffer(
|
|
char * * buffer,
|
|
PIFOBJNode pNode, PPSEPNode pPSEP,
|
|
ulong fType,
|
|
BOOL fPatchTower,
|
|
int PatchTowerAddress
|
|
);
|
|
|
|
RPC_STATUS
|
|
ExactMatch(
|
|
PIFOBJNode pNode,
|
|
UUID * Obj,
|
|
UUID *If,
|
|
unsigned long Ver,
|
|
PSID pSID,
|
|
unsigned long InqType,
|
|
unsigned long Options
|
|
);
|
|
|
|
RPC_STATUS
|
|
WildCardMatch(
|
|
PIFOBJNode pNode,
|
|
UUID * Obj,
|
|
UUID * If,
|
|
unsigned long Vers,
|
|
PSID pSID,
|
|
unsigned long InqType,
|
|
unsigned long Options
|
|
);
|
|
|
|
RPC_STATUS
|
|
SearchIFObjNode(
|
|
PIFOBJNode pNode,
|
|
UUID * Obj,
|
|
UUID * If,
|
|
unsigned long Vers,
|
|
PSID pSID,
|
|
unsigned long InqType,
|
|
unsigned long Options
|
|
);
|
|
|
|
RPC_STATUS
|
|
StartServer(
|
|
);
|
|
|
|
VOID
|
|
LinkAtEnd(
|
|
PIFOBJNode *Head,
|
|
PIFOBJNode Node
|
|
);
|
|
|
|
RPC_STATUS RPC_ENTRY
|
|
GetForwardEp(
|
|
UUID *IfId,
|
|
RPC_VERSION * IFVersion,
|
|
UUID * Object,
|
|
unsigned char* Protseq,
|
|
void * * EpString
|
|
);
|
|
|
|
|
|
|
|
//
|
|
// Link list manipulation rountines
|
|
//
|
|
|
|
RPC_STATUS
|
|
EnLinkOnIFOBJList(
|
|
PEP_CLEANUP ProcessCtxt,
|
|
PIFOBJNode NewNode
|
|
);
|
|
|
|
RPC_STATUS
|
|
UnLinkFromIFOBJList(
|
|
PEP_CLEANUP ProcessCtxt,
|
|
PIFOBJNode DeleteMe
|
|
);
|
|
|
|
#define EnLinkOnPSEPList(x,p) \
|
|
\
|
|
(PPSEPNode) \
|
|
Link( \
|
|
(PIENTRY *)(x), \
|
|
(PIENTRY)(p) \
|
|
)
|
|
|
|
#define EnLinkContext(p) \
|
|
\
|
|
(PSAVEDCONTEXT) \
|
|
Link( \
|
|
(PIENTRY *)(&GlobalContextList),\
|
|
(PIENTRY)(p) \
|
|
)
|
|
|
|
#define UnLinkContext(p) \
|
|
\
|
|
(PSAVEDCONTEXT) \
|
|
UnLink( \
|
|
(PIENTRY *)&GlobalContextList, \
|
|
(PIENTRY) (p) \
|
|
)
|
|
|
|
#define UnLinkFromPSEPList(x,p) \
|
|
\
|
|
(PPSEPNode) \
|
|
UnLink( \
|
|
(PIENTRY *)(x), \
|
|
(PIENTRY)(p) \
|
|
)
|
|
|
|
#define MatchByIFOBJKey(x, p) \
|
|
\
|
|
(PIFOBJNode) \
|
|
MatchByKey( \
|
|
(PIENTRY)(x), \
|
|
(ulong)(p) \
|
|
)
|
|
|
|
#define MatchByPSEPKey(x, p) \
|
|
\
|
|
(PPSEPNode) \
|
|
MatchByKey( \
|
|
(PIENTRY)(x), \
|
|
(ulong)(p) \
|
|
)
|
|
|
|
|
|
|
|
#define MAXIFOBJID (256L)
|
|
#define MAKEGLOBALIFOBJID(x) ( ( ((x-1) % MAXIFOBJID) << 24 ) & 0xFF000000L )
|
|
#define MAKEGLOBALEPID(x,y) ( ( ((x) &0xFF000000L) | ((y) & 0x00FFFFFFL) ) )
|
|
|
|
#define IFOBJSIGN (0x49464F42L)
|
|
#define PSEPSIGN (0x50534550L)
|
|
#define FREE (0xBADDC0DEL)
|
|
|
|
|
|
//
|
|
// Error Codes Here ??
|
|
//
|
|
|
|
#define EP_LOOKUP 0x00000001L
|
|
#define EP_MAP 0x00000002L
|
|
|
|
#define RPC_C_EP_ALL_ELTS 0
|
|
#define RPC_C_EP_MATCH_BY_IF 1
|
|
#define RPC_C_EP_MATCH_BY_OBJ 2
|
|
#define RPC_C_EP_MATCH_BY_BOTH 3
|
|
|
|
#define I_RPC_C_VERS_UPTO_AND_COMPATIBLE 6
|
|
|
|
#define VERSION(x,y) ( ((0x0000FFFFL & x)<<16) | (y) )
|
|
|
|
|
|
//
|
|
// States of listening..
|
|
//
|
|
|
|
#define NOTSTARTED 0
|
|
#define STARTINGTOLISTEN 1
|
|
#define STARTED 2
|
|
|
|
|
|
|
|
|
|
//
|
|
// IP Port Management stuff
|
|
//
|
|
|
|
|
|
// Each server process connected to the endpoint mapper
|
|
// keeps on an open context handle so that rpcss can
|
|
// clean up the database when a process dies.
|
|
// The PROCESS struct is the context handle.
|
|
|
|
typedef struct _IP_PORT
|
|
{
|
|
struct _IP_PORT *pNext;
|
|
USHORT Type;
|
|
USHORT Port;
|
|
} IP_PORT;
|
|
|
|
typedef struct _PROCESS
|
|
{
|
|
DWORD MagicVal;
|
|
//
|
|
// Zero if the process doesn't own any reserved IP ports.
|
|
//
|
|
IP_PORT *pPorts;
|
|
|
|
} PROCESS;
|
|
|
|
typedef struct _PORT_RANGE
|
|
{
|
|
struct _PORT_RANGE *pNext;
|
|
USHORT Max; // Inclusive
|
|
USHORT Min; // Inclusive
|
|
} PORT_RANGE;
|
|
|
|
|
|
#ifdef DBG
|
|
void CountProcessContextList(EP_CLEANUP *pProcessContext, unsigned long nExpectedCount);
|
|
#define ASSERT_PROCESS_CONTEXT_LIST_COUNT(p, c) \
|
|
CountProcessContextList(p, c)
|
|
#else
|
|
#define ASSERT_PROCESS_CONTEXT_LIST_COUNT(p, c)
|
|
#endif
|
|
|
|
#endif // __LOCAL_H__
|