Leaked source code of windows server 2003
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.
 
 
 
 
 
 

422 lines
12 KiB

/*++
Microsoft Windows NT RPC Name Service
Copyright (C) Microsoft Corporation, 1995 - 1999
Module Name:
api.hxx
Abstract:
This module defines the locator class which keeps all top level
state and defines the essential APIs in object form.
Author:
Satish Thatte (SatishT) 010/10/95 Created all the code below except where
otherwise indicated.
--*/
#ifndef _API_
#define _API_
enum SystemType {
Workgroup,
Domain
};
enum LocatorRole {
Master,
Backup,
Client
};
enum LookupType {
BroadcastLookup,
LocalLookup
};
class CInterfaceIndex;
/*++
Class Definition:
Locator
Abstract:
The class that defines the top level operations of the locator and
encapsulates its major data structures. The operations include both
API-oriented methods, and utility methods.
There is a possibility that this structure will be destroyed in
case of domain name change and we are expected to keep locator
running.
We will be destroying this structure and recreating it.
--*/
class Locator {
LocatorRole Role;
SystemType System;
int fDCsAreDown;
TGSLEntryList * pInternalCache;
// cache that maintains the list of the entries
// for responding to broadcast requests.
CInterfaceIndex * pCacheInterfaceIndex;
// list of interfaces that actually maintains
// that is in the cache on the local machine.
TSLLBroadcastQP *psllBroadcastHistory;
CPrivateCriticalSection PCSBroadcastHistory;
CStringW *pComputerName, *pPrimaryDCName;
TGSLString * pAllMasters;
void InitializeDomainBasedLocator();
void InitializeWorkgroupBasedLocator();
BOOL SetRoleAndSystemType(DSROLE_PRIMARY_DOMAIN_INFO_BASIC dsrole);
void SetCompatConfigInfo(DSROLE_PRIMARY_DOMAIN_INFO_BASIC dsrole);
void SetConfigInfoFromDS(DSROLE_PRIMARY_DOMAIN_INFO_BASIC dsrole);
static TGSLString *
EnumDCs(
CStringW * DomainName,
DWORD ServerType,
long lNumWanted
);
public:
BOOL fNT4Compat;
// flag that decides on whether to
// provide compatibilty or not.
BOOL fDSEnabled;
// flag that sees whether a DS is
// available in the current domain.
CStringW *pRpcContainerDN;
CStringW *pDomainName;
CStringW *pDomainNameDns;
Locator();
~Locator();
unsigned long ulMaxCacheAge;
READ_MAIL_SLOT *hMailslotForReplies, *hMasterFinderSlot;
BOOL broadcastCleared(
QueryPacket& NetRequest,
ULONG cacheTolerance
);
void markBroadcast(
QueryPacket& NetRequest
)
{
SimpleCriticalSection me(PCSBroadcastHistory);
psllBroadcastHistory->insert(new CBroadcastQueryPacket(NetRequest));
}
TSLLEntryListIterator *IndexLookup(
CGUIDVersion * pGVinterface
)
{
TSLLEntryList * pELL = pCacheInterfaceIndex->lookup(pGVinterface);
if (pELL->size()>1) pELL->rotate(rand() % pELL->size()); // simple randomizing
TSLLEntryListIterator *pIndexIter = new TSLLEntryListIterator(*pELL);
delete pELL; // see CServerLookupHandle::CServerLookupHandle
return pIndexIter;
}
CStringW* getDomainName() {
return pDomainName;
}
CStringW* getDomainNameDns() {
return pDomainNameDns;
}
CStringW* getComputerName() {
return pComputerName;
}
TGSLString * getMasters() {
return pAllMasters;
}
CStringW * getPDC() {
return pPrimaryDCName;
}
void addMaster(STRING_T szMaster) {
CStringW *pNewMaster = new CStringW(szMaster);
if (Duplicate == pAllMasters->insert(pNewMaster)) delete pNewMaster;
}
int IsInWorkgroup() {
return System == Workgroup;
}
int IsInMasterRole() {
return Role == Master;
}
void becomeMasterLocator() {
Role = Master;
}
int IsInBackupRole() {
return fDCsAreDown || (Role == Backup);
}
void SetDCsDown() {
fDCsAreDown = TRUE;
}
void SetDCsUp() {
fDCsAreDown = FALSE;
}
int IsInDomain() {
return System == Domain;
}
int IsSelf(
STRING_T szName
)
{
return CStringW(szName) == *pComputerName;
}
CEntry * findEntry(CStringW * pName) {
return pInternalCache->find(pName);
}
CFullServerEntry *
GetEntryFromCache(
UNSIGNED32 EntryNameSyntax,
STRING_T EntryName
);
void
respondToLocatorSeeker(
IN QUERYLOCATOR Query
);
void
TryBroadcastingForMasterLocator();
BOOL
nsi_binding_export(
UNSIGNED32 EntryNameSyntax,
STRING_T EntryName,
NSI_INTERFACE_ID_T * Interface,
NSI_SERVER_BINDING_VECTOR_T * BindingVector,
NSI_UUID_VECTOR_P_T ObjectVector,
IN ExportType type
);
void
nsi_mgmt_binding_unexport(
UNSIGNED32 EntryNameSyntax,
STRING_T EntryName,
NSI_IF_ID_P_T Interface,
UNSIGNED32 VersOption,
NSI_UUID_VECTOR_P_T ObjectVector
);
NSI_NS_HANDLE_T
nsi_binding_lookup_begin(
UNSIGNED32 EntryNameSyntax,
STRING_T EntryName,
NSI_INTERFACE_ID_T * Interface,
NSI_UUID_P_T Object,
UNSIGNED32 VectorSize,
UNSIGNED32 MaxCacheAge,
LookupType type
);
CLookupHandle *
nsi_binding_lookup_begin_null(
CGUIDVersion * pGVinterface,
CGUIDVersion * pGVsyntax,
CGUID * pIDobject,
UNSIGNED32 ulVectorSize,
UNSIGNED32 MaxCacheAge,
int * fTentativeStatus
);
CLookupHandle *
nsi_binding_lookup_begin_name(
UNSIGNED32 EntryNameSyntax,
STRING_T EntryName,
CGUIDVersion * pGVinterface,
CGUIDVersion * pGVsyntax,
CGUID * pIDobject,
UNSIGNED32 ulVectorSize,
UNSIGNED32 MaxCacheAge,
LookupType type,
int * fTentativeStatus
);
NSI_NS_HANDLE_T
nsi_entry_object_inq_begin(
UNSIGNED32 EntryNameSyntax,
STRING_T EntryName,
LookupType type
);
void
nsi_profile_elt_add(
IN UNSIGNED32 profile_name_syntax,
IN STRING_T profile_name,
IN NSI_IF_ID_P_T if_id,
IN UNSIGNED32 member_name_syntax,
IN STRING_T member_name,
IN UNSIGNED32 priority,
IN STRING_T annotation
);
void
nsi_profile_elt_remove(
IN UNSIGNED32 profile_name_syntax,
IN STRING_T profile_name,
IN NSI_IF_ID_P_T if_id,
IN UNSIGNED32 member_name_syntax,
IN STRING_T member_name
);
void nsi_group_mbr_add(
IN UNSIGNED32 group_name_syntax,
IN STRING_T group_name,
IN UNSIGNED32 member_name_syntax,
IN STRING_T member_name
);
void nsi_group_mbr_remove(
IN UNSIGNED32 group_name_syntax,
IN STRING_T group_name,
IN UNSIGNED32 member_name_syntax,
IN STRING_T member_name
);
NSI_NS_HANDLE_T nsi_group_mbr_inq_begin(
IN UNSIGNED32 group_name_syntax,
IN STRING_T group_name,
IN UNSIGNED32 member_name_syntax
);
NSI_NS_HANDLE_T nsi_profile_elt_inq_begin(
IN UNSIGNED32 profile_name_syntax,
IN STRING_T profile_name,
IN UNSIGNED32 inquiry_type,
IN NSI_IF_ID_P_T if_id,
IN UNSIGNED32 vers_option,
IN UNSIGNED32 member_name_syntax,
IN STRING_T member_name
);
void
nsi_mgmt_entry_create(
IN UNSIGNED32 entry_name_syntax,
IN STRING_T entry_name
);
void
nsi_mgmt_entry_delete(
IN UNSIGNED32 entry_name_syntax,
IN STRING_T entry_name,
EntryType entry_type
);
void
nsi_group_delete(
UNSIGNED32 group_name_syntax,
STRING_T group_name
);
void
nsi_profile_delete(
UNSIGNED32 profile_name_syntax,
STRING_T profile_name
);
// The functions that actually puts it in the DS.
HRESULT
CreateEntryInDS(CEntryName *pEntryName);
//-----------------------
void
UpdateCache(
STRING_T entry_name,
UNSIGNED32 entry_name_syntax,
RPC_SYNTAX_IDENTIFIER rsiInterface,
RPC_SYNTAX_IDENTIFIER rsiTransferSyntax,
STRING_T string,
NSI_UUID_VECTOR_P_T pUuidVector,
TSSLEntryList * psslTempNetCache
);
CRemoteLookupHandle *
NetLookup(
UNSIGNED32 EntryNameSyntax,
STRING_T EntryName,
CGUIDVersion * pGVInterface,
CGUIDVersion * pGVTransferSyntax,
CGUID * pIDobject,
unsigned long ulVectorSize,
unsigned long ulCacheAge
);
CLookupHandle *
DSLookup(
UNSIGNED32 EntryNameSyntax,
STRING_T EntryName,
CGUIDVersion * pGVInterface,
CGUIDVersion * pGVTransferSyntax,
CGUID * pIDobject,
unsigned long ulVectorSize,
unsigned long ulCacheAge
);
CObjectInqHandle *
NetObjectInquiry(
UNSIGNED32 EntryNameSyntax,
STRING_T EntryName
);
};
#endif _API_