windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/logonsrv/server/domain.h
2020-09-26 16:20:57 +08:00

461 lines
12 KiB
C

/*++
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
//
// 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_DNSPNP_UPDATE_NEEDED 0x00000008 // TRUE if DNS records need 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_DNSPNPREREG_UPDATE_NEEDED 0x00020000 // TRUE if all (including already registered) DNS
// records need to be updated
#define DOM_API_TIMEOUT_NEEDED 0x00040000 // TRUE if client session API timeout is needed
//
// 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;
CRITICAL_SECTION DomDnsRegisterCritSect;
#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
);