/*++ Copyright (c) 1995-1996 Microsoft Corporation Module Name: domain.h Abstract: Header file for Code to manage multiple domains hosted on a DC. Author: Cliff Van Dyke (CliffV) 20-Feb-1995 Revision History: --*/ // // Role that a particular domain is playing // typedef enum _NETLOGON_ROLE { RoleInvalid = 0, RolePrimary, RoleBackup, RoleMemberWorkstation, RoleNdnc } NETLOGON_ROLE, * PNETLOGON_ROLE; ///////////////////////////////////////////////////////////////////////////// // // Description of a single hosted domain. (size of this struct is 0x164) // ///////////////////////////////////////////////////////////////////////////// typedef struct _DOMAIN_INFO { // // Link to next domain in 'NlGlobalServicedDomains' // (Serialized by NlGlobalDomainCritSect) // LIST_ENTRY DomNext; // // DomainThread WorkItem // (Serialized by NlGlobalDomainCritSect) // WORKER_ITEM DomThreadWorkItem; // // Name of the domain being handled // // On a Workstation, this is the Domain the workstation is a member of. // UNICODE_STRING DomUnicodeDomainNameString; WCHAR DomUnicodeDomainName[DNLEN+1]; CHAR DomOemDomainName[DNLEN+1]; DWORD DomOemDomainNameLength; // // DNS domain name of the domain being handled. // These fields will be null if there is no DNS domain name for the // domain. // // Access serialized by either NlGlobalDomainCritSect or DomTrustListCritSect // Modifications must lock both. // UNICODE_STRING DomUnicodeDnsDomainNameString; LPWSTR DomUnicodeDnsDomainName; LPSTR DomUtf8DnsDomainName; // // DNS domain name alias of the domain being handled. // Access serialized by NlGlobalDomainCritSect // LPSTR DomUtf8DnsDomainNameAlias; // // Name of the "Account Domain" of the current machine. // On a DC, this is the same as above. // On a workstation, this is the name of the workstation. UNICODE_STRING DomUnicodeAccountDomainNameString; // // Domain SID of the domain being handled. // // On a Workstation, this is the DomainId of the workstation SAM itself. // PSID DomAccountDomainId; // // Instance GUID of the domain object representing this hosted domain. // // Access serialized by either NlGlobalDomainCritSect or DomTrustListCritSect // Modifications must lock both. GUID DomDomainGuidBuffer; GUID *DomDomainGuid; // NULL if there is no GUID // // Computer name of this computer in this domain. // WCHAR DomUncUnicodeComputerName[UNCLEN+1]; UNICODE_STRING DomUnicodeComputerNameString; UNICODE_STRING DomUnicodeDnsHostNameString; LPSTR DomUtf8DnsHostName; CHAR DomOemComputerName[CNLEN+1]; DWORD DomOemComputerNameLength; LPSTR DomUtf8ComputerName; DWORD DomUtf8ComputerNameLength; // length in bytes #ifdef _DC_NETLOGON // // The RID of the computer account for DC. // Will be set to zero for workstations. // ULONG DomDcComputerAccountRid; // // Handle to SAM database // SAMPR_HANDLE DomSamServerHandle; SAMPR_HANDLE DomSamAccountDomainHandle; SAMPR_HANDLE DomSamBuiltinDomainHandle; // // Handle to LSA database // LSAPR_HANDLE DomLsaPolicyHandle; #endif // _DC_NETLOGON // // To serialize access to DomTrustList and DomClientSession // CRITICAL_SECTION DomTrustListCritSect; #ifdef _DC_NETLOGON // // The list of domains trusted by this domain. // LIST_ENTRY DomTrustList; DWORD DomTrustListLength; // Number of entries in DomTrustList // // The list of all trusted domains in the forest. // (Serialized by DomTrustListCritSect) // PDS_DOMAIN_TRUSTSW DomForestTrustList; DWORD DomForestTrustListSize; ULONG DomForestTrustListCount; // // On BDC, our secure channel to PDC of the domain. // On workstations, our secure channel to a DC in the domain. // (Serialized by DomTrustListCritSect) // struct _CLIENT_SESSION *DomClientSession; // // On a DC, our secure channel to our 'parent' domain. // NULL: if we have no parent. // (Serialized by DomTrustListCritSect) // struct _CLIENT_SESSION *DomParentClientSession; // // Table of all Server Sessions // The size of the hash table must be a power-of-2. // #define SERVER_SESSION_HASH_TABLE_SIZE 128 #define SERVER_SESSION_TDO_NAME_HASH_TABLE_SIZE 128 #define LOCK_SERVER_SESSION_TABLE(_DI) \ EnterCriticalSection( &(_DI)->DomServerSessionTableCritSect ) #define UNLOCK_SERVER_SESSION_TABLE(_DI) \ LeaveCriticalSection( &(_DI)->DomServerSessionTableCritSect ) CRITICAL_SECTION DomServerSessionTableCritSect; PLIST_ENTRY DomServerSessionHashTable; PLIST_ENTRY DomServerSessionTdoNameHashTable; LIST_ENTRY DomServerSessionTable; #endif // _DC_NETLOGON // // Number of outstanding pointers to the domain structure. // (Serialized by NlGlobalDomainCritSect) // DWORD ReferenceCount; // // Role: (PDC, BDC, or workstation) of this machine in the hosted domain // NETLOGON_ROLE DomRole; #ifdef _DC_NETLOGON // // Misc flags. // (Serialized by NlGlobalDomainCritSect) // DWORD DomFlags; #define DOM_CREATION_NEEDED 0x00000001 // TRUE if async phase 2 create needed #define DOM_ROLE_UPDATE_NEEDED 0x00000002 // TRUE if role of the machine needs update #define DOM_TRUST_UPDATE_NEEDED 0x00000004 // TRUE if trust list needs to be updated #define DOM_PROMOTED_BEFORE 0x00000010 // TRUE if this machine has been promoted to PDC before. #define DOM_THREAD_RUNNING 0x00000020 // TRUE if domain worker thread is queued or running #define DOM_THREAD_TERMINATE 0x00000040 // TRUE if domain worker thread should be terminated #define DOM_DELETED 0x00000080 // TRUE if domain is being deleted. #define DOM_ADDED_1B_NAME 0x00000100 // True if Domain<1B> name has been added #define DOM_ADD_1B_NAME_EVENT_LOGGED 0x00000200 // True if Domain<1B> name add failed at least once #define DOM_RENAMED_1B_NAME 0x00000400 // True if Domain<1B> name should be renamed #define DOM_DOMAIN_REFRESH_PENDING 0x00000800 // True if this Domain needs refreshing #define DOM_PRIMARY_DOMAIN 0x00001000 // True if this is the primary domain of the machine #define DOM_REAL_DOMAIN 0x00002000 // This is a real domain (as opposed to NDNC or forest) #define DOM_NON_DOMAIN_NC 0x00004000 // This is NDNC #define DOM_FOREST 0x00008000 // This is a forest entry (not currently used) #define DOM_FOREST_ROOT 0x00010000 // This domain is at the root of the forest. #define DOM_API_TIMEOUT_NEEDED 0x00040000 // TRUE if client session API timeout is needed #define DOM_PRIMARY_ANNOUNCE_NEEDED 0x00080000 // Primary announcement is needed #define DOM_PRIMARY_ANNOUNCE_CONTINUE 0x00100000 // Continuation of Primary announcement is needed #define DOM_PRIMARY_ANNOUNCE_IMMEDIATE 0x00200000 // Immediate Primary announcement is needed #define DOM_PRIMARY_ANNOUNCE_FLAGS ( \ DOM_PRIMARY_ANNOUNCE_NEEDED | \ DOM_PRIMARY_ANNOUNCE_CONTINUE | \ DOM_PRIMARY_ANNOUNCE_IMMEDIATE ) // // The lists of covered sites. Both lists protected by NlGlobalSiteCritSect. // // If this is a real domain, CoveredSites is a list of sites we cover as a DC. // If this is a non-domain NC, CoveredSites is a list of sites we cover as an NDNC. // struct _NL_COVERED_SITE *CoveredSites; ULONG CoveredSitesCount; // // If this is a real (primary) domain, GcCoveredSites is a list of sites we cover as a GC // in the forest which the primary domain belongs to. Otherwise, GcCoveredSites is NULL. // // ??: When we go multihosted, we will have a separate DOMAIN_INFO entry for each of the // hosted forests, so only one list of covered sites will be associated with DOMAIN_INFO // corresponding to the role we play in a given domain/forest/NDNC. // struct _NL_COVERED_SITE *GcCoveredSites; ULONG GcCoveredSitesCount; // // List of failed user logons with bad password. // Used on BDC to maintain the list of bad password // logons forwarded to the PDC. // LIST_ENTRY DomFailedUserLogonList; #endif // _DC_NETLOGON } DOMAIN_INFO, *PDOMAIN_INFO; #ifdef _DC_NETLOGON #define IsPrimaryDomain( _DomainInfo ) \ (((_DomainInfo)->DomFlags & DOM_PRIMARY_DOMAIN) != 0 ) #else // _DC_NETLOGON #define IsPrimaryDomain( _DomainInfo ) TRUE #endif // _DC_NETLOGON // // The DOMAIN_ENUM_CALLBACK is a callback for NlEnumerateDomains. // // It defines a routine that takes two parameters, the first is a DomainInfo // structure, the second is a context for that Domain. // typedef NET_API_STATUS (*PDOMAIN_ENUM_CALLBACK)( PDOMAIN_INFO DomainInfo, PVOID Context ); // // domain.c procedure forwards. // NET_API_STATUS NlGetDomainName( OUT LPWSTR *DomainName, OUT LPWSTR *DnsDomainName, OUT PSID *AccountDomainSid, OUT PSID *PrimaryDomainSid, OUT GUID **PrimaryDomainGuid, OUT PBOOLEAN DnsForestNameChanged OPTIONAL ); NET_API_STATUS NlInitializeDomains( VOID ); NET_API_STATUS NlCreateDomainPhase1( IN LPWSTR DomainName OPTIONAL, IN LPWSTR DnsDomainName OPTIONAL, IN PSID DomainSid OPTIONAL, IN GUID *DomainGuid OPTIONAL, IN LPWSTR ComputerName, IN LPWSTR DnsHostName OPTIONAL, IN BOOLEAN CallNlExitOnFailure, IN ULONG DomainFlags, OUT PDOMAIN_INFO *ReturnedDomainInfo ); #ifdef _DC_NETLOGON NET_API_STATUS NlCreateDomainPhase2( IN PDOMAIN_INFO DomainInfo, IN BOOLEAN CallNlExitOnFailure ); #endif // _DC_NETLOGON PDOMAIN_INFO NlFindDomain( LPCWSTR DomainName OPTIONAL, GUID *DomainGuid OPTIONAL, BOOLEAN DefaultToPrimary ); PDOMAIN_INFO NlFindNetbiosDomain( LPCWSTR DomainName, BOOLEAN DefaultToPrimary ); PDOMAIN_INFO NlFindDnsDomain( IN LPCSTR DnsDomainName OPTIONAL, IN GUID *DomainGuid OPTIONAL, IN BOOLEAN DefaultToNdnc, IN BOOLEAN CheckAliasName, OUT PBOOLEAN AliasNameMatched OPTIONAL ); #ifdef _DC_NETLOGON NET_API_STATUS NlStartDomainThread( PDOMAIN_INFO DomainInfo, PDWORD DomFlags ); NET_API_STATUS NlUpdateRole( IN PDOMAIN_INFO DomainInfo ); NET_API_STATUS NlUpdateServicedNdncs( IN LPWSTR ComputerName, IN LPWSTR DnsHostName, IN BOOLEAN CallNlExitOnFailure, OUT PBOOLEAN ServicedNdncChanged OPTIONAL ); NTSTATUS NlUpdateDnsRootAlias( IN PDOMAIN_INFO DomainInfo, OUT PBOOL AliasNamesChanged OPTIONAL ); #endif // _DC_NETLOGON struct _CLIENT_SESSION * NlRefDomClientSession( IN PDOMAIN_INFO DomainInfo ); struct _CLIENT_SESSION * NlRefDomParentClientSession( IN PDOMAIN_INFO DomainInfo ); VOID NlDeleteDomClientSession( IN PDOMAIN_INFO DomainInfo ); PDOMAIN_INFO NlFindDomainByServerName( LPWSTR ServerName ); NET_API_STATUS NlEnumerateDomains( IN BOOLEAN EnumerateNdncsToo, PDOMAIN_ENUM_CALLBACK Callback, PVOID Context ); NET_API_STATUS NlSetDomainForestRoot( IN PDOMAIN_INFO DomainInfo, IN PVOID Context ); GUID * NlCaptureDomainInfo ( IN PDOMAIN_INFO DomainInfo, OUT WCHAR DnsDomainName[NL_MAX_DNS_LENGTH+1] OPTIONAL, OUT GUID *DomainGuid OPTIONAL ); NET_API_STATUS NlSetDomainNameInDomainInfo( IN PDOMAIN_INFO DomainInfo, IN LPWSTR DnsDomainName OPTIONAL, IN LPWSTR NetbiosDomainName OPTIONAL, IN GUID *DomainGuid OPTIONAL, OUT PBOOLEAN DnsDomainNameChanged OPTIONAL, OUT PBOOLEAN NetbiosDomainNameChanged OPTIONAL, OUT PBOOLEAN DomainGuidChanged OPTIONAL ); VOID NlDereferenceDomain( IN PDOMAIN_INFO DomainInfo ); VOID NlDeleteDomain( IN PDOMAIN_INFO DomainInfo ); VOID NlUninitializeDomains( VOID );