typedef struct _ADS_LDP { LIST_ENTRY List ; LPWSTR Server ; ULONG RefCount ; LUID Luid ; LUID ModifiedId; DWORD Flags ; LDAP *LdapHandle ; CCredentials *pCredentials; DWORD PortNumber; DWORD TickCount ; _ADS_LDP **ReferralEntries; DWORD nReferralEntries; BOOL fKeepAround; DWORD dwLastUsed; LIST_ENTRY ReferralList; } ADS_LDP, *PADS_LDP, *PADSLDP ; extern LUID ReservedLuid ; #define MAX_BIND_CACHE_SIZE 100 #define MAX_REFERRAL_ENTRIES 32 #define ENTER_BIND_CRITSECT() EnterCriticalSection(&BindCacheCritSect) #define LEAVE_BIND_CRITSECT() LeaveCriticalSection(&BindCacheCritSect) #define LDP_CACHE_INVALID (0x00000001) // // The following is used to specify ADS_AUTHENTICATION_ENUM flags // which are to be ignored when deciding whether a cached connection // can be reused. Set the bits corresponding to the flags to be ignored // to 1. // #define BIND_CACHE_IGNORED_FLAGS (ADS_FAST_BIND \ | ADS_SERVER_BIND \ | ADS_AUTH_RESERVED \ ) DWORD BindCacheAllocEntry( ADS_LDP **ppCacheEntry ) ; VOID BindCacheInvalidateEntry( ADS_LDP *pCacheEntry ) ; PADS_LDP BindCacheLookup( LPWSTR Address, LUID Luid, LUID ModifiedId, CCredentials& Credentials, DWORD dwPort ) ; BOOL CanCredentialsBeReused( CCredentials *pCachedCreds, CCredentials *pIncomingCreds ); PADS_LDP GetCacheEntry( PLDAP pLdap ) ; DWORD BindCacheAdd( LPWSTR Address, LUID Luid, LUID ModifiedId, CCredentials& Credentials, DWORD dwPort, ADS_LDP *pCacheEntry ) ; DWORD BindCacheDeref( ADS_LDP *pCacheEntry ) ; DWORD BindCacheDerefHelper( ADS_LDP *pCacheEntry, LIST_ENTRY* DeleteListEntry ) ; DWORD BindCacheGetLuid( LUID *Luid, LUID *ModifiedId ) ; VOID BindCacheInit( VOID ); VOID BindCacheCleanup( VOID ); BOOL AddReferralLink( PADS_LDP pPrimaryEntry, PADS_LDP pNewEntry ); BOOL BindCacheAddRef( ADS_LDP *pCacheEntry ); // // Mark handle so that we keep it around for 5 min after // last usage and only then delete it. // HRESULT LdapcKeepHandleAround( ADS_LDP *ld );