453 lines
9.6 KiB
C
453 lines
9.6 KiB
C
/*++
|
|
|
|
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
|