windows-nt/Source/XPSP1/NT/ds/security/base/lsa/server/lsasrvp.h

552 lines
13 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
lsasrvp.h
Abstract:
LSA Subsystem - Private Includes for Server Side
This file contains includes that are global to the Lsa Server Side
Author:
Scott Birrell (ScottBi) January 22, 1992
Environment:
Revision History:
--*/
#ifndef _LSASRVP_
#define _LSASRVP_
//
// The LSA Server Is UNICODE Based. Define UNICODE before global includes
// so that it is defined before the TEXT macro.
//
#ifndef UNICODE
#define UNICODE
#endif // UNICODE
//
// Set the EXTERN macro so only one file allocates all the globals.
//
#ifdef ALLOC_EXTERN
#define EXTERN
#else
#define EXTERN extern
#endif // ALLOC_EXTERN
#include <lsacomp.h>
#include <wincred.h>
#include <alloca.h>
#include <malloc.h>
//
// The following come from \nt\private\inc
#include <align.h>
#include <samrpc.h>
#include <samsrv.h>
#include <samisrv.h>
#include <lsarpc.h>
#include <lsaisrv.h>
#include <nlrepl.h>
#include <seposix.h>
//
// The following all come from \nt\private\lsa\server
//
#include "lsasrvmm.h"
#include "au.h"
#include "db.h"
#include "adt.h"
#include "dblookup.h"
#include "lsads.h"
#include "lsads.h"
#include "lsastr.h"
#include "lsawow.h"
//////////////////////////////////////////////////////////////////////
// //
// The following define controls the diagnostic capabilities that //
// are built into LSA. //
// //
//////////////////////////////////////////////////////////////////////
#if DBG
#define LSAP_DIAGNOSTICS 1
#endif // DBG
//
// These definitions are useful diagnostics aids
//
#if LSAP_DIAGNOSTICS
//
// Diagnostics included in build
//
//
// Test for diagnostics enabled
//
#define IF_LSAP_GLOBAL( FlagName ) \
if (LsapGlobalFlag & (LSAP_DIAG_##FlagName))
//
// Diagnostics print statement
//
#define LsapDiagPrint( FlagName, _Text_ ) \
IF_LSAP_GLOBAL( FlagName ) \
DbgPrint _Text_
//
// Make sure no thread leaves with any open state
//
#define LSAP_TRACK_DBLOCK
#ifdef LSAP_TRACK_DBLOCK
#define LsarpReturnCheckSetup() \
ULONG __lsarpthreadusecountstart; \
{\
PLSADS_PER_THREAD_INFO __lsarpCurrentThreadInfo = (PLSADS_PER_THREAD_INFO) LsapQueryThreadInfo() ;\
if (__lsarpCurrentThreadInfo!=NULL)\
__lsarpthreadusecountstart = __lsarpCurrentThreadInfo->UseCount;\
else \
__lsarpthreadusecountstart =0;\
}
#define LsarpReturnPrologue() \
{\
PLSADS_PER_THREAD_INFO __lsarpCurrentThreadInfoEnd = (PLSADS_PER_THREAD_INFO)LsapQueryThreadInfo() ;\
ULONG __lsarpthreadusecountend ; \
if (__lsarpCurrentThreadInfoEnd!=NULL)\
__lsarpthreadusecountend = __lsarpCurrentThreadInfoEnd->UseCount;\
else\
__lsarpthreadusecountend = 0;\
ASSERT (__lsarpthreadusecountstart==__lsarpthreadusecountend);\
}
#else
#define LsarpReturnPrologue()
#define LsarpReturnCheckSetup()
#endif
#else
//
// No diagnostics included in build
//
//
// Test for diagnostics enabled
//
#define IF_LSAP_GLOBAL( FlagName ) if (FALSE)
//
// Diagnostics print statement (nothing)
//
#define LsapDiagPrint( FlagName, Text ) ;
#define LsarpReturnPrologue()
#define LsarpReturnCheckSetup()
#endif // LSAP_DIAGNOSTICS
//
// The following flags enable or disable various diagnostic
// capabilities within LSA. These flags are set in
// LsapGlobalFlag
//
// DB_LOOKUP_WORK_LIST - Display activities related to sid/name lookups.
//
// AU_TRACK_THREADS - Display dynamic AU thread creation / deletion
// information.
//
// AU_MESSAGES - Display information related to the processing of
// Authentication messages.
//
// AU_LOGON_SESSIONS - Display information about the creation/deletion
// of logon sessions within LSA.
//
// DB_INIT - Display information about the initialization of LSA.
//
#define LSAP_DIAG_DB_LOOKUP_WORK_LIST ((ULONG) 0x00000001L)
#define LSAP_DIAG_AU_TRACK_THREADS ((ULONG) 0x00000002L)
#define LSAP_DIAG_AU_MESSAGES ((ULONG) 0x00000004L)
#define LSAP_DIAG_AU_LOGON_SESSIONS ((ULONG) 0x00000008L)
#define LSAP_DIAG_DB_INIT ((ULONG) 0x00000010L)
//////////////////////////////////////////////////////////////////////
// //
// Other defines //
// //
//////////////////////////////////////////////////////////////////////
//
// Heap available for general use throughout LSA
//
EXTERN PVOID LsapHeap;
//
// LSA Private Global State Data Structure
//
typedef struct _LSAP_STATE {
HANDLE LsaCommandPortHandle;
HANDLE RmCommandPortHandle;
HANDLE AuditLogFileHandle;
HANDLE AuditLogSectionHandle;
PVOID AuditLogBaseAddress;
ULONG AuditLogViewSize;
LARGE_INTEGER AuditLogInitSize;
LARGE_INTEGER AuditLogMaximumSizeOfSection;
OBJECT_ATTRIBUTES AuditLogObjectAttributes;
STRING AuditLogNameString;
GENERIC_MAPPING GenericMapping;
UNICODE_STRING SubsystemName;
PRIVILEGE_SET Privileges;
BOOLEAN GenerateOnClose;
BOOLEAN SystemShutdownPending;
} LSAP_STATE, *PLSAP_STATE;
extern LSAP_STATE LsapState;
extern BOOLEAN LsapInitialized;
//
// Global handle to LSA's policy object.
// This handle is opened for trusted client.
//
extern LSAPR_HANDLE LsapPolicyHandle;
//
// LSA Server Command Dispatch Table Entry
//
typedef NTSTATUS (*PLSA_COMMAND_WORKER)(PLSA_COMMAND_MESSAGE, PLSA_REPLY_MESSAGE);
//
// LSA Client Control Block
//
// This structure contains context information relevant to a successful
// LsaOpenLsa call.
//
typedef struct _LSAP_CLIENT_CONTROL_BLOCK {
HANDLE KeyHandle; // Configuration Registry Key
ACCESS_MASK GrantedAccess; // Accesses granted to LSA Database Object
} LSAP_CLIENT_CONTROL_BLOCK, *PLSAP_CLIENT_CONTROL_BLOCK;
//
// LSA Privilege Pseudo-Object Types and Flags
//
// *********************** IMPORTANT NOTE ************************
//
// Privilege objects (privileges containing a list of users who have that
// privilge) are pseudo-objects that use the account objects as a backing
// stored. There are currently no public interfaces to open a privilege
// object, so there need not be public access flags.
//
#define PRIVILEGE_VIEW 0x00000001L
#define PRIVILEGE_ADJUST 0x00000002L
#define PRIVILEGE_ALL (STANDARD_RIGHTS_REQUIRED | \
PRIVILEGE_VIEW | \
PRIVILEGE_ADJUST)
//
// LSA API Error Handling Cleanup Flags
//
// These flags specify cleanup operations to be performed after an LSA
// API call has hit a fatal error. They are passed in the ErrorCleanupFlags
// variable of the API or worker's error handling routine.
//
#define LSAP_CLEANUP_REVERT_TO_SELF (0x00000001L)
#define LSAP_CLEANUP_CLOSE_LSA_HANDLE (0x00000002L)
#define LSAP_CLEANUP_FREE_USTRING (0x00000004L)
#define LSAP_CLEANUP_CLOSE_REG_KEY (0x00000008L)
#define LSAP_CLEANUP_DELETE_REG_KEY (0x00000010L)
#define LSAP_CLEANUP_DB_UNLOCK (0x00000020L)
BOOLEAN
LsapRmInitializeServer(
);
VOID
LsapRmServerThread(
);
NTSTATUS
LsapRPCInit(
);
BOOLEAN
LsapAuInit( // Authentication initialization
);
NTSTATUS
LsapDbInitializeRights(
);
VOID
LsapDbCleanupRights(
);
NTSTATUS
LsapCallRm(
IN RM_COMMAND_NUMBER CommandNumber,
IN OPTIONAL PVOID CommandParams,
IN ULONG CommandParamsLength,
OUT OPTIONAL PVOID ReplyBuffer,
IN ULONG ReplyBufferLength
);
NTSTATUS
LsapLogonSessionDeletedWrkr(
IN PLSA_COMMAND_MESSAGE CommandMessage,
OUT PLSA_REPLY_MESSAGE ReplyMessage
);
NTSTATUS
LsapComponentTestWrkr(
IN PLSA_COMMAND_MESSAGE CommandMessage,
OUT PLSA_REPLY_MESSAGE ReplyMessage
);
//
// Prototypes of RPC free routines used by LsaIFree.c
//
void _fgs__STRING (STRING * _source);
void _fgs__LSAPR_SID_INFORMATION (LSAPR_SID_INFORMATION * _source);
void _fgs__LSAPR_SID_ENUM_BUFFER (LSAPR_SID_ENUM_BUFFER * _source);
void _fgs__LSAPR_ACCOUNT_INFORMATION (LSAPR_ACCOUNT_INFORMATION * _source);
void _fgs__LSAPR_ACCOUNT_ENUM_BUFFER (LSAPR_ACCOUNT_ENUM_BUFFER * _source);
void _fgs__LSAPR_UNICODE_STRING (LSAPR_UNICODE_STRING * _source);
void _fgs__LSAPR_SECURITY_DESCRIPTOR (LSAPR_SECURITY_DESCRIPTOR * _source);
void _fgs__LSAPR_SR_SECURITY_DESCRIPTOR (LSAPR_SR_SECURITY_DESCRIPTOR * _source);
void _fgs__LSAPR_POLICY_PRIVILEGE_DEF (LSAPR_POLICY_PRIVILEGE_DEF * _source);
void _fgs__LSAPR_PRIVILEGE_ENUM_BUFFER (LSAPR_PRIVILEGE_ENUM_BUFFER * _source);
void _fgs__LSAPR_OBJECT_ATTRIBUTES (LSAPR_OBJECT_ATTRIBUTES * _source);
void _fgs__LSAPR_CR_CIPHER_VALUE (LSAPR_CR_CIPHER_VALUE * _source);
void _fgs__LSAPR_TRUST_INFORMATION (LSAPR_TRUST_INFORMATION * _source);
void _fgs__LSAPR_TRUSTED_ENUM_BUFFER (LSAPR_TRUSTED_ENUM_BUFFER * _source);
void _fgs__LSAPR_TRUSTED_ENUM_BUFFER_EX (LSAPR_TRUSTED_ENUM_BUFFER_EX * _source);
void _fgs__LSAPR_REFERENCED_DOMAIN_LIST (LSAPR_REFERENCED_DOMAIN_LIST * _source);
void _fgs__LSAPR_TRANSLATED_SIDS (LSAPR_TRANSLATED_SIDS * _source);
void _fgs__LSAPR_TRANSLATED_NAME (LSAPR_TRANSLATED_NAME * _source);
void _fgs__LSAPR_TRANSLATED_NAMES (LSAPR_TRANSLATED_NAMES * _source);
void _fgs__LSAPR_POLICY_ACCOUNT_DOM_INFO (LSAPR_POLICY_ACCOUNT_DOM_INFO * _source);
void _fgs__LSAPR_POLICY_PRIMARY_DOM_INFO (LSAPR_POLICY_PRIMARY_DOM_INFO * _source);
void _fgs__LSAPR_POLICY_PD_ACCOUNT_INFO (LSAPR_POLICY_PD_ACCOUNT_INFO * _source);
void _fgs__LSAPR_POLICY_REPLICA_SRCE_INFO (LSAPR_POLICY_REPLICA_SRCE_INFO * _source);
void _fgs__LSAPR_POLICY_AUDIT_EVENTS_INFO (LSAPR_POLICY_AUDIT_EVENTS_INFO * _source);
void _fgs__LSAPR_TRUSTED_DOMAIN_NAME_INFO (LSAPR_TRUSTED_DOMAIN_NAME_INFO * _source);
void _fgs__LSAPR_TRUSTED_CONTROLLERS_INFO (LSAPR_TRUSTED_CONTROLLERS_INFO * _source);
void _fgu__LSAPR_POLICY_INFORMATION (LSAPR_POLICY_INFORMATION * _source, POLICY_INFORMATION_CLASS _branch);
void _fgu__LSAPR_POLICY_DOMAIN_INFORMATION (LSAPR_POLICY_DOMAIN_INFORMATION * _source,
POLICY_DOMAIN_INFORMATION_CLASS _branch);
void _fgu__LSAPR_TRUSTED_DOMAIN_INFO (LSAPR_TRUSTED_DOMAIN_INFO * _source, TRUSTED_INFORMATION_CLASS _branch);
//
// Old worker prototypes - These are temporary
//
#define LsapComponentTestCommandWrkr LsapComponentTestWrkr
#define LsapWriteAuditMessageCommandWrkr LsapAdtWriteLogWrkr
NTSTATUS
ServiceInit (
);
NTSTATUS
LsapInitLsa(
);
BOOLEAN
LsapSeSetWellKnownValues(
);
VOID
RtlConvertSidToText(
IN PSID Sid,
OUT PUCHAR Buffer
);
ULONG
RtlSizeANSISid(
IN PSID Sid
);
NTSTATUS
LsapGetMessageStrings(
LPVOID Resource,
DWORD Index1,
PUNICODE_STRING String1,
DWORD Index2,
PUNICODE_STRING String2 OPTIONAL
);
VOID
LsapLogError(
IN OPTIONAL PUCHAR Message,
IN NTSTATUS Status
);
NTSTATUS
LsapWinerrorToNtStatus(
IN DWORD WinError
);
NTSTATUS
LsapNtStatusFromLastWinError( VOID );
NTSTATUS
LsapGetPrivilegesAndQuotas(
IN SECURITY_LOGON_TYPE LogonType,
IN ULONG IdCount,
IN PSID_AND_ATTRIBUTES Ids,
OUT PULONG PrivilegeCount,
OUT PLUID_AND_ATTRIBUTES *Privileges,
OUT PQUOTA_LIMITS QuotaLimits
);
NTSTATUS
LsapQueryClientInfo(
PTOKEN_USER *UserSid,
PLUID AuthenticationId
);
NTSTATUS
LsapGetAccountDomainInfo(
PPOLICY_ACCOUNT_DOMAIN_INFO *PolicyAccountDomainInfo
);
NTSTATUS
LsapOpenSam( VOID );
NTSTATUS
LsapOpenSamEx(
BOOLEAN DuringStartup
);
NTSTATUS
LsapNotifyProcessNotificationEvent(
IN POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass,
IN HANDLE EventHandle,
IN ULONG OwnerProcess,
IN HANDLE OwnerEventHandle,
IN BOOLEAN Register
);
/////////////////////////////////////////////////////////////////////////
// //
// Shared Global Variables //
// //
/////////////////////////////////////////////////////////////////////////
//
// Handles used to talk to SAM directly.
// Also, a flag to indicate whether or not the handles are valid.
//
extern BOOLEAN LsapSamOpened;
extern SAMPR_HANDLE LsapAccountDomainHandle;
extern SAMPR_HANDLE LsapBuiltinDomainHandle;
//
// These variables are used to control the number of
// threads used for processing Logon Process calls.
// See auloop.c for a description of these variables.
//
extern RTL_RESOURCE LsapAuThreadCountLock;
extern LONG LsapAuActiveThreads;
extern LONG LsapAuFreeThreads;
extern LONG LsapAuFreeThreadsGoal;
extern LONG LsapAuMinimumThreads;
extern LONG LsapAuMaximumThreads;
extern LONG LsapAuCallsToProcess;
#if DBG
//
// Used to extend the resource timeout for lsass.exe to
// prevent it from hitting deadlock warnings in stress tests.
//
extern IMAGE_LOAD_CONFIG_DIRECTORY _load_config_used;
#endif \\DBG
#if LSAP_DIAGNOSTICS
//
// Used as a global diagnostics control flag within lsass.exe
//
extern ULONG LsapGlobalFlag;
#endif // LSAP_DIAGNOSTICS
//
// Fast version of NtQuerySystemTime
//
#define LsapQuerySystemTime( _Time ) GetSystemTimeAsFileTime( (LPFILETIME)(_Time) )
#endif // _LSASRVP_