/*++ 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__