|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
lsads.h
Abstract:
Private macros/definitions/prototypes for implementing portions of the LSA store in the DS and in the registry, simultaneously
Author:
Mac McLain (MacM) Jan 17, 1997
Environment:
User Mode
Revision History:
--*/
#ifndef __LSADS_H__
#define __LSADS_H__
#include <ntdsa.h>
#include <dsysdbg.h>
#include <safelock.h>
#if DBG == 1
#ifdef ASSERT
#undef ASSERT
#endif
#define ASSERT DsysAssert
#define DEB_UPGRADE 0x10
#define DEB_POLICY 0x20
#define DEB_REPL 0x40
#define DEB_FIXUP 0x80
#define DEB_NOTIFY 0x100
#define DEB_DSNOTIFY 0x200
#define DEB_FTRACE 0x400
#define DEB_LOOKUP 0x800
#define DEB_HANDLE 0x1000
#define DEB_FTINFO 0x2000
#ifdef __cplusplus
extern "C" { #endif // __cplusplus
DECLARE_DEBUG2( LsaDs )
#ifdef __cplusplus
} #endif // __cplusplus
#define LsapDsDebugOut( args ) LsaDsDebugPrint args
#define LsapEnterFunc( x ) \
LsaDsDebugPrint( DEB_FTRACE, "0x%lx: Entering %s\n", GetCurrentThreadId(), x );
#define LsapExitFunc( x, y ) \
LsaDsDebugPrint( DEB_FTRACE, "0x%lx: Leaving %s: 0x%lx\n", GetCurrentThreadId(), x, y );
#define LsapDsDebugDumpGuid( level, tag, pg ) \
pg == NULL ? LsapDsDebugOut(( level, "%s: (NULL)\n", tag)) : \ LsapDsDebugOut((level, \ "%s: %08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x\n", \ tag,(pg)->Data1,(pg)->Data2,(pg)->Data3,(pg)->Data4[0], \ (pg)->Data4[1],(pg)->Data4[2],(pg)->Data4[3],(pg)->Data4[4], \ (pg)->Data4[5],(pg)->Data4[6],(pg)->Data4[7]))
#define LSAP_TRACK_LOCK
#else
#define LsapDsDebugOut(args)
#define LsapDsDebugDumpGuid(level, tag, pguid)
#define LsapEnterFunc( x )
#define LsapExitFunc( x, y )
#endif // DBG
//
// These function prototypes control how the Ds transactioning is done. In
// the Ds case, the pointers are initialized to routines that actually do
// transactioning. In the non-Ds case, they point to dummy rountines that
// do nothing.
//
typedef NTSTATUS ( *pfDsOpenTransaction ) ( ULONG ); typedef NTSTATUS ( *pfDsApplyTransaction ) ( ULONG ); typedef NTSTATUS ( *pfDsAbortTransaction ) ( ULONG );
//
// Ds functions that behave differently for the Ds and non-Ds case exist
// in this function table.
//
typedef struct _LSADS_DS_FUNC_TABLE {
pfDsOpenTransaction pOpenTransaction; pfDsApplyTransaction pApplyTransaction; pfDsAbortTransaction pAbortTransaction;
} LSADS_DS_FUNC_TABLE, *PLSADS_DS_FUNC_TABLE;
typedef struct _LSADS_DS_SYSTEM_CONTAINER_ITEMS {
BOOLEAN NamesInitialized; PDSNAME TrustedDomainObject; PDSNAME SecretObject;
} LSADS_DS_SYSTEM_CONTAINER_ITEMS, *PLSADS_DS_SYSTEM_CONTAINER_ITEMS;
//
// Basic LsaDs information structure
//
typedef struct _LSADS_DS_STATE_INFO {
PDSNAME DsRoot; // DSNAME of the root of the Ds
PDSNAME DsPartitionsContainer; // DSNAME of the partitions container
PDSNAME DsSystemContainer; // DSNAME of the system container
PDSNAME DsConfigurationContainer; // DSNAME of the configuration container
ULONG DsDomainHandle; // DS Handle of the domain
LSADS_DS_FUNC_TABLE DsFuncTable; // Function table for Ds specific
// functions
LSADS_DS_SYSTEM_CONTAINER_ITEMS SystemContainerItems; PVOID SavedThreadState; // Results from THSave
BOOLEAN DsTransactionSave; BOOLEAN DsTHStateSave; BOOLEAN DsOperationSave; BOOLEAN WriteLocal; // Can we write to the registry?
BOOLEAN UseDs; // Is the Ds active?
BOOLEAN FunctionTableInitialized; // Is the function table initialized
BOOLEAN DsInitializedAndRunning; // Has the Ds started
BOOLEAN Nt4UpgradeInProgress; // Is this the case of an upgrade from NT4
} LSADS_DS_STATE_INFO, *PLSADS_DS_STATE_INFO;
typedef struct _LSADS_PER_THREAD_INFO {
BOOLEAN SavedTransactionValid; ULONG UseCount; ULONG DsThreadStateUseCount; ULONG DsTransUseCount; ULONG DsOperationCount; PVOID SavedThreadState; PVOID InitialThreadState; ULONG OldTrustDirection; ULONG OldTrustType;
} LSADS_PER_THREAD_INFO, *PLSADS_PER_THREAD_INFO;
#if DBG
typedef struct _LSADS_THREAD_INFO_NODE { PLSADS_PER_THREAD_INFO ThreadInfo; ULONG ThreadId; } LSADS_THREAD_INFO_NODE, *PLSADS_THREAD_INFO_NODE;
#define LSAP_THREAD_INFO_LIST_MAX 15
extern LSADS_THREAD_INFO_NODE LsapDsThreadInfoList[ LSAP_THREAD_INFO_LIST_MAX ]; extern SAFE_RESOURCE LsapDsThreadInfoListResource; #endif
//
// Extern definitions
//
extern LSADS_DS_STATE_INFO LsaDsStateInfo;
#ifdef __cplusplus
extern "C" { #endif // __cplusplus
extern DWORD LsapDsThreadState;
#ifdef __cplusplus
} #endif // __cplusplus
//
// Implemented as a macro for performance reasons
//
// PLSADS_PER_THREAD_INFO
// LsapQueryThreadInfo(
// VOID
// );
#define LsapQueryThreadInfo( ) TlsGetValue( LsapDsThreadState )
VOID LsapDsDebugInitialize( VOID );
//
// Registry specific functions
//
NTSTATUS LsapRegReadObjectSD( IN LSAPR_HANDLE ObjectHandle, OUT PSECURITY_DESCRIPTOR *ppSD );
NTSTATUS LsapRegGetPhysicalObjectName( IN PLSAP_DB_OBJECT_INFORMATION ObjectInformation, IN PUNICODE_STRING LogicalNameU, OUT OPTIONAL PUNICODE_STRING PhysicalNameU );
NTSTATUS LsapRegOpenObject( IN LSAP_DB_HANDLE ObjectHandle, IN ULONG OpenMode, OUT PVOID *pvKey );
NTSTATUS LsapRegOpenTransaction( );
NTSTATUS LsapRegApplyTransaction( );
NTSTATUS LsapRegAbortTransaction( );
NTSTATUS LsapRegCreateObject( IN PUNICODE_STRING ObjectPath, IN LSAP_DB_OBJECT_TYPE_ID ObjectType );
NTSTATUS LsapRegDeleteObject( IN PUNICODE_STRING ObjectPath );
NTSTATUS LsapRegWriteAttribute( IN PUNICODE_STRING AttributePath, IN PVOID pvAttribute, IN ULONG AttributeLength );
NTSTATUS LsapRegDeleteAttribute( IN PUNICODE_STRING AttributePath, IN BOOLEAN DeleteSecurely, IN ULONG AttributeLength );
NTSTATUS LsapRegReadAttribute( IN LSAPR_HANDLE ObjectHandle, IN PUNICODE_STRING AttributeName, IN OPTIONAL PVOID AttributeValue, IN OUT PULONG AttributeValueLength );
//
// Counterpart Ds functions
//
NTSTATUS LsapDsReadObjectSD( IN LSAPR_HANDLE ObjectHandle, OUT PSECURITY_DESCRIPTOR *ppSD );
NTSTATUS LsapDsGetPhysicalObjectName( IN PLSAP_DB_OBJECT_INFORMATION ObjectInformation, IN BOOLEAN DefaultName, IN PUNICODE_STRING LogicalNameU, OUT OPTIONAL PUNICODE_STRING PhysicalNameU );
NTSTATUS LsapDsOpenObject( IN LSAP_DB_HANDLE ObjectHandle, IN ULONG OpenMode, OUT PVOID *pvKey );
NTSTATUS LsapDsVerifyObjectExistenceByDsName( IN PDSNAME DsName );
NTSTATUS LsapDsOpenTransaction( IN ULONG Options );
//
// Assert that there is a DS transaction open
//
#define LsapAssertDsTransactionOpen() \
{ \ PLSADS_PER_THREAD_INFO CurrentThreadInfo; \ CurrentThreadInfo = LsapQueryThreadInfo(); \ \ ASSERT( CurrentThreadInfo != NULL ); \ if ( CurrentThreadInfo != NULL ) { \ ASSERT( CurrentThreadInfo->DsTransUseCount > 0 ); \ } \ }
NTSTATUS LsapDsOpenTransactionDummy( IN ULONG Options );
NTSTATUS LsapDsApplyTransaction( IN ULONG Options );
NTSTATUS LsapDsApplyTransactionDummy( IN ULONG Options );
NTSTATUS LsapDsAbortTransaction( IN ULONG Options );
NTSTATUS LsapDsAbortTransactionDummy( IN ULONG Options );
NTSTATUS LsapDsCreateObject( IN PUNICODE_STRING ObjectPath, IN ULONG Flags, IN LSAP_DB_OBJECT_TYPE_ID ObjectType );
NTSTATUS LsapDsDeleteObject( IN PUNICODE_STRING ObjectPath );
NTSTATUS LsapDsWriteAttributes( IN PUNICODE_STRING ObjectPath, IN PLSAP_DB_ATTRIBUTE Attributes, IN ULONG AttributeCount, IN ULONG Options );
NTSTATUS LsapDsWriteAttributesByDsName( IN PDSNAME ObjectPath, IN PLSAP_DB_ATTRIBUTE Attributes, IN ULONG AttributeCount, IN ULONG Options );
NTSTATUS LsapDsReadAttributes( IN PUNICODE_STRING ObjectPath, IN ULONG Options, IN OUT PLSAP_DB_ATTRIBUTE Attributes, IN ULONG AttributeCount );
NTSTATUS LsapDsReadAttributesByDsName( IN PDSNAME ObjectPath, IN ULONG Options, IN OUT PLSAP_DB_ATTRIBUTE Attributes, IN ULONG AttributeCount );
NTSTATUS LsapDsRenameObject( IN PDSNAME OldObject, IN PDSNAME NewParent, IN ULONG AttrType, IN PUNICODE_STRING NewObject );
NTSTATUS LsapDsDeleteAttributes( IN PUNICODE_STRING ObjectPath, IN OUT PLSAP_DB_ATTRIBUTE Attributes, IN ULONG AttributeCount );
//
// Interesting or global functions
//
PVOID LsapDsAlloc( IN DWORD dwLen );
VOID LsapDsFree( IN PVOID pvMemory );
NTSTATUS LsapDsPostDsInstallSetup( VOID );
NTSTATUS LsapDsInitializePromoteInterface( VOID );
BOOLEAN LsapDsIsValidSid( IN PSID Sid, IN BOOLEAN DsSid );
NTSTATUS LsapDsTruncateNameToFitCN( IN PUNICODE_STRING OriginalName, OUT PUNICODE_STRING TruncatedName );
BOOLEAN LsapDsIsNtStatusResourceError( NTSTATUS NtStatus );
//
// Exported for the DsSetup functions
//
NTSTATUS LsapDsRemoveDuplicateTrustObjects( IN LSAPR_HANDLE PolicyHandle );
#endif
|