3319 lines
87 KiB
C
3319 lines
87 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1990 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
samsrvp.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This file contains definitions private to the SAM server program.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jim Kelly (JimK) 4-July-1991
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User Mode - Win32
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _NTSAMP_
|
|||
|
#define _NTSAMP_
|
|||
|
|
|||
|
|
|||
|
#ifndef UNICODE
|
|||
|
#define UNICODE
|
|||
|
#endif // UNICODE
|
|||
|
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// //
|
|||
|
// Diagnostics //
|
|||
|
// //
|
|||
|
////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
//
|
|||
|
// The following define controls the diagnostic capabilities that
|
|||
|
// are built into SAM.
|
|||
|
//
|
|||
|
|
|||
|
#if DBG
|
|||
|
#define SAMP_DIAGNOSTICS 1
|
|||
|
#endif // DBG
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// These definitions are useful diagnostics aids
|
|||
|
//
|
|||
|
|
|||
|
#if SAMP_DIAGNOSTICS
|
|||
|
|
|||
|
//
|
|||
|
// Diagnostics included in build
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Test for diagnostics enabled
|
|||
|
//
|
|||
|
|
|||
|
#define IF_SAMP_GLOBAL( FlagName ) \
|
|||
|
if (SampGlobalFlag & (SAMP_DIAG_##FlagName))
|
|||
|
|
|||
|
#define IF_NOT_SAMP_GLOBAL( FlagName ) \
|
|||
|
if ( !(SampGlobalFlag & (SAMP_DIAG_##FlagName)) )
|
|||
|
|
|||
|
//
|
|||
|
// Diagnostics print statement
|
|||
|
//
|
|||
|
|
|||
|
#define SampDiagPrint( FlagName, _Text_ ) \
|
|||
|
IF_SAMP_GLOBAL( FlagName ) \
|
|||
|
DbgPrint _Text_
|
|||
|
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
//
|
|||
|
// No diagnostics included in build
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Test for diagnostics enabled
|
|||
|
//
|
|||
|
|
|||
|
#define IF_SAMP_GLOBAL( FlagName ) if (FALSE)
|
|||
|
#define IF_NOT_SAMP_GLOBAL ( FlagName ) if (TRUE)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Diagnostics print statement (nothing)
|
|||
|
//
|
|||
|
|
|||
|
#define SampDiagPrint( FlagName, Text ) ;
|
|||
|
|
|||
|
|
|||
|
#endif // SAMP_DIAGNOSTICS
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The following flags enable or disable various diagnostic
|
|||
|
// capabilities within SAM. These flags are set in
|
|||
|
// SampGlobalFlag.
|
|||
|
//
|
|||
|
// DISPLAY_CACHE - print diagnostic messages related
|
|||
|
// to the display cache (additions, deletions,
|
|||
|
// modifications, etc).
|
|||
|
//
|
|||
|
// DISPLAY_LOCKOUT - print diagnostic messages related
|
|||
|
// to account lockout.
|
|||
|
//
|
|||
|
// DISPLAY_ROLE_CHANGES - print diagnostic messages related
|
|||
|
// to primary/backup role changes.
|
|||
|
//
|
|||
|
// DISPLAY_CACHE_ERRORS - print diagnostic messages related to
|
|||
|
// errors when manipulating the display cache.
|
|||
|
//
|
|||
|
// DISPLAY_STORAGE_FAIL - print diagnostic messages related to
|
|||
|
// backing store failures.
|
|||
|
//
|
|||
|
// BREAK_ON_STORAGE_FAIL - breakpoint if an attempt to write
|
|||
|
// to backing store fails.
|
|||
|
//
|
|||
|
// CONTEXT_TRACKING - print diagnostic messages related to
|
|||
|
// object context usage (creation / deletion, etc.).
|
|||
|
//
|
|||
|
// ACTIVATE_DEBUG_PROC - activate a process for use as a diagnostic
|
|||
|
// aid. This is expected to be used only during SETUP testing.
|
|||
|
//
|
|||
|
// DISPLAY_ADMIN_CHANGES - print diagnostic messages related to
|
|||
|
// changing user account protection to allow or dissallow
|
|||
|
// Account Operator access to admin or normal user accounts.
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_DIAG_DISPLAY_CACHE ((ULONG) 0x00000001L)
|
|||
|
#define SAMP_DIAG_DISPLAY_LOCKOUT ((ULONG) 0x00000002L)
|
|||
|
#define SAMP_DIAG_DISPLAY_ROLE_CHANGES ((ULONG) 0x00000004L)
|
|||
|
#define SAMP_DIAG_DISPLAY_CACHE_ERRORS ((ULONG) 0x00000008L)
|
|||
|
#define SAMP_DIAG_DISPLAY_STORAGE_FAIL ((ULONG) 0x00000010L)
|
|||
|
#define SAMP_DIAG_BREAK_ON_STORAGE_FAIL ((ULONG) 0x00000020L)
|
|||
|
#define SAMP_DIAG_CONTEXT_TRACKING ((ULONG) 0x00000040L)
|
|||
|
#define SAMP_DIAG_ACTIVATE_DEBUG_PROC ((ULONG) 0x00000080L)
|
|||
|
#define SAMP_DIAG_DISPLAY_ADMIN_CHANGES ((ULONG) 0x00000100L)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Choose a print type appropriate to how we are building.
|
|||
|
//
|
|||
|
|
|||
|
#ifdef SAMP_BUILD_CONSOLE_PROGRAM
|
|||
|
|
|||
|
#define BldPrint printf
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define BldPrint DbgPrint
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
#if DBG
|
|||
|
|
|||
|
#define SUCCESS_ASSERT(Status, Msg) \
|
|||
|
{ \
|
|||
|
if ( !NT_SUCCESS(Status) ) { \
|
|||
|
UnexpectedProblem(); \
|
|||
|
BldPrint(Msg); \
|
|||
|
BldPrint("Status is: 0x%lx \n", Status); \
|
|||
|
return(Status); \
|
|||
|
\
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define SUCCESS_ASSERT(Status, Msg) \
|
|||
|
{ \
|
|||
|
if ( !NT_SUCCESS(Status) ) { \
|
|||
|
return(Status); \
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
#endif // DBG
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Define this symbol to get context tracking messages printed
|
|||
|
// (otherwise, comment it out)
|
|||
|
//
|
|||
|
|
|||
|
//#define SAMP_DBG_CONTEXT_TRACKING
|
|||
|
|
|||
|
//
|
|||
|
// Maximum number of digits that may be specified to
|
|||
|
// SampRtlConvertRidToUnicodeString
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_MAXIMUM_ACCOUNT_RID_DIGITS ((ULONG) 8)
|
|||
|
|
|||
|
//
|
|||
|
// Account never expires timestamp (in ULONG form )
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_ACCOUNT_NEVER_EXPIRES ((ULONG) 0)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// SAM's shutdown order level (index).
|
|||
|
// Shutdown notifications are made in the order of highest level
|
|||
|
// to lowest level value.
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_SHUTDOWN_LEVEL ((DWORD) 481)
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Includes //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
#include <nt.h>
|
|||
|
#include <ntrtl.h> // DbgPrint prototype
|
|||
|
#include <nturtl.h> // needed for winbase.h
|
|||
|
#include <rpc.h> // DataTypes and runtime APIs
|
|||
|
|
|||
|
#include <string.h> // strlen
|
|||
|
#include <stdio.h> // sprintf
|
|||
|
#define UnicodeTerminate(p) ((PUNICODE_STRING)(p))->Buffer[(((PUNICODE_STRING)(p))->Length + 1)/sizeof(WCHAR)] = UNICODE_NULL
|
|||
|
|
|||
|
#include <ntrpcp.h> // prototypes for MIDL user functions
|
|||
|
#include <samrpc.h> // midl generated SAM RPC definitions
|
|||
|
#include <ntlsa.h>
|
|||
|
#include <samisrv.h> // SamIConnect()
|
|||
|
#include <lsarpc.h>
|
|||
|
#include <lsaisrv.h>
|
|||
|
#include <ntsam.h>
|
|||
|
#include <ntsamp.h>
|
|||
|
#include <samsrv.h> // prototypes available to security process
|
|||
|
#include "sampmsgs.h"
|
|||
|
|
|||
|
VOID
|
|||
|
UnexpectedProblem( VOID );
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// TEMPORARY GenTab2 definitions //
|
|||
|
// These structures should be considered opaque. //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Each element in the tree is pointed to from a leaf structure.
|
|||
|
// The leafs are linked together to arrange the elements in
|
|||
|
// ascending sorted order.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _GTB_TWO_THREE_LEAF {
|
|||
|
|
|||
|
//
|
|||
|
// Sort order list links
|
|||
|
//
|
|||
|
|
|||
|
LIST_ENTRY SortOrderEntry;
|
|||
|
|
|||
|
//
|
|||
|
// Pointer to element
|
|||
|
//
|
|||
|
|
|||
|
PVOID Element;
|
|||
|
|
|||
|
} GTB_TWO_THREE_LEAF, *PGTB_TWO_THREE_LEAF;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
typedef struct _GTB_TWO_THREE_NODE {
|
|||
|
|
|||
|
//
|
|||
|
// Pointer to parent node. If this is the root node,
|
|||
|
// then this pointer is null.
|
|||
|
//
|
|||
|
|
|||
|
struct _GTB_TWO_THREE_NODE *ParentNode;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Pointers to child nodes.
|
|||
|
//
|
|||
|
// 1) If a pointer is null, then this node does not have
|
|||
|
// that child. In this case, the control value MUST
|
|||
|
// indicate that the children are leaves.
|
|||
|
//
|
|||
|
// 2) If the children are leaves, then each child pointer
|
|||
|
// is either NULL (indicating this node doesn't have
|
|||
|
// that child) or points to a GTB_TWO_THREE_LEAF.
|
|||
|
// If ThirdChild is Non-Null, then so is SecondChild.
|
|||
|
// If SecondChild is Non-Null, then so is FirstChild.
|
|||
|
// (that is, you can't have a third child without a
|
|||
|
// second child, or a second child without a first
|
|||
|
// child).
|
|||
|
//
|
|||
|
|
|||
|
struct _GTB_TWO_THREE_NODE *FirstChild;
|
|||
|
struct _GTB_TWO_THREE_NODE *SecondChild;
|
|||
|
struct _GTB_TWO_THREE_NODE *ThirdChild;
|
|||
|
|
|||
|
//
|
|||
|
// Flags provding control information about this node
|
|||
|
//
|
|||
|
|
|||
|
ULONG Control;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// These fields point to the element that has the lowest
|
|||
|
// value of all elements in the second and third subtrees
|
|||
|
// (respectively). These fields are only valid if the
|
|||
|
// corresponding child subtree pointer is non-null.
|
|||
|
//
|
|||
|
|
|||
|
PGTB_TWO_THREE_LEAF LowOfSecond;
|
|||
|
PGTB_TWO_THREE_LEAF LowOfThird;
|
|||
|
|
|||
|
} GTB_TWO_THREE_NODE, *PGTB_TWO_THREE_NODE;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The comparison function takes as input pointers to elements containing
|
|||
|
// user defined structures and returns the results of comparing the two
|
|||
|
// elements. The result must indicate whether the FirstElement
|
|||
|
// is GreaterThan, LessThan, or EqualTo the SecondElement.
|
|||
|
//
|
|||
|
|
|||
|
typedef
|
|||
|
RTL_GENERIC_COMPARE_RESULTS
|
|||
|
(NTAPI *PRTL_GENERIC_2_COMPARE_ROUTINE) (
|
|||
|
PVOID FirstElement,
|
|||
|
PVOID SecondElement
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// The allocation function is called by the generic table package whenever
|
|||
|
// it needs to allocate memory for the table.
|
|||
|
//
|
|||
|
|
|||
|
typedef
|
|||
|
PVOID
|
|||
|
(NTAPI *PRTL_GENERIC_2_ALLOCATE_ROUTINE) (
|
|||
|
CLONG ByteSize
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// The deallocation function is called by the generic table package whenever
|
|||
|
// it needs to deallocate memory from the table that was allocated by calling
|
|||
|
// the user supplied allocation function.
|
|||
|
//
|
|||
|
|
|||
|
typedef
|
|||
|
VOID
|
|||
|
(NTAPI *PRTL_GENERIC_2_FREE_ROUTINE) (
|
|||
|
PVOID Buffer
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
typedef struct _RTL_GENERIC_TABLE2 {
|
|||
|
|
|||
|
//
|
|||
|
// Pointer to root node.
|
|||
|
//
|
|||
|
|
|||
|
PGTB_TWO_THREE_NODE Root;
|
|||
|
|
|||
|
//
|
|||
|
// Number of elements in table
|
|||
|
//
|
|||
|
|
|||
|
ULONG ElementCount;
|
|||
|
|
|||
|
//
|
|||
|
// Link list of leafs (and thus elements) in sort order
|
|||
|
//
|
|||
|
|
|||
|
LIST_ENTRY SortOrderHead;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Caller supplied routines
|
|||
|
//
|
|||
|
|
|||
|
PRTL_GENERIC_2_COMPARE_ROUTINE Compare;
|
|||
|
PRTL_GENERIC_2_ALLOCATE_ROUTINE Allocate;
|
|||
|
PRTL_GENERIC_2_FREE_ROUTINE Free;
|
|||
|
|
|||
|
|
|||
|
} RTL_GENERIC_TABLE2, *PRTL_GENERIC_TABLE2;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Generic Table2 Routine Definitions... //
|
|||
|
// //
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//NTSYSAPI
|
|||
|
VOID
|
|||
|
//NTAPI
|
|||
|
RtlInitializeGenericTable2 (
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PRTL_GENERIC_2_COMPARE_ROUTINE CompareRoutine,
|
|||
|
PRTL_GENERIC_2_ALLOCATE_ROUTINE AllocateRoutine,
|
|||
|
PRTL_GENERIC_2_FREE_ROUTINE FreeRoutine
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//NTSYSAPI
|
|||
|
PVOID
|
|||
|
//NTAPI
|
|||
|
RtlInsertElementGenericTable2 (
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PVOID Element,
|
|||
|
PBOOLEAN NewElement
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//NTSYSAPI
|
|||
|
BOOLEAN
|
|||
|
//NTAPI
|
|||
|
RtlDeleteElementGenericTable2 (
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PVOID Element
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//NTSYSAPI
|
|||
|
PVOID
|
|||
|
//NTAPI
|
|||
|
RtlLookupElementGenericTable2 (
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PVOID Element
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//NTSYSAPI
|
|||
|
PVOID
|
|||
|
//NTAPI
|
|||
|
RtlEnumerateGenericTable2 (
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PVOID *RestartKey
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//NTSYSAPI
|
|||
|
PVOID
|
|||
|
//NTAPI
|
|||
|
RtlRestartKeyByIndexGenericTable2(
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
ULONG I,
|
|||
|
PVOID *RestartKey
|
|||
|
);
|
|||
|
|
|||
|
//NTSYSAPI
|
|||
|
PVOID
|
|||
|
//NTAPI
|
|||
|
RtlRestartKeyByValueGenericTable2(
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PVOID Element,
|
|||
|
PVOID *RestartKey
|
|||
|
);
|
|||
|
|
|||
|
//NTSYSAPI
|
|||
|
ULONG
|
|||
|
//NTAPI
|
|||
|
RtlNumberElementsGenericTable2(
|
|||
|
PRTL_GENERIC_TABLE2 Table
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// The function IsGenericTableEmpty will return to the caller TRUE if
|
|||
|
// the generic table is empty (i.e., does not contain any elements)
|
|||
|
// and FALSE otherwise.
|
|||
|
//
|
|||
|
|
|||
|
//NTSYSAPI
|
|||
|
BOOLEAN
|
|||
|
//NTAPI
|
|||
|
RtlIsGenericTable2Empty (
|
|||
|
PRTL_GENERIC_TABLE2 Table
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Macros //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This macro generates TRUE if account auditing is enabled and this
|
|||
|
// server is a PDC. Otherwise, this macro generates FALSE.
|
|||
|
//
|
|||
|
// SampDoAccountAuditing(
|
|||
|
// IN ULONG i
|
|||
|
// )
|
|||
|
//
|
|||
|
// Where:
|
|||
|
//
|
|||
|
// i - is the index of the domain whose state is to be checked.
|
|||
|
//
|
|||
|
|
|||
|
#define SampDoAccountAuditing( i ) \
|
|||
|
((SampAccountAuditingEnabled == TRUE) && \
|
|||
|
(SampDefinedDomains[i].CurrentFixed.ServerRole == DomainServerRolePrimary))
|
|||
|
|
|||
|
//
|
|||
|
// VOID
|
|||
|
// SampSetAuditingInformation(
|
|||
|
// IN PPOLICY_AUDIT_EVENTS_INFO PolicyAuditEventsInfo
|
|||
|
// )
|
|||
|
//
|
|||
|
// Routine Description:
|
|||
|
//
|
|||
|
// This macro function sets the Audit Event Information relevant to SAM
|
|||
|
// given LSA Audit Events Information.
|
|||
|
//
|
|||
|
// Arguments:
|
|||
|
//
|
|||
|
// PolicyAuditEventsInfo - Pointer to Audit Events Information
|
|||
|
// structure.
|
|||
|
//
|
|||
|
// Return Values:
|
|||
|
//
|
|||
|
// None.
|
|||
|
//
|
|||
|
|
|||
|
#define SampSetAuditingInformation( PolicyAuditEventsInfo ) { \
|
|||
|
\
|
|||
|
if (PolicyAuditEventsInfo->AuditingMode && \
|
|||
|
(PolicyAuditEventsInfo->EventAuditingOptions[ AuditCategoryAccountManagement ] & \
|
|||
|
POLICY_AUDIT_EVENT_SUCCESS) \
|
|||
|
) { \
|
|||
|
\
|
|||
|
SampAccountAuditingEnabled = TRUE; \
|
|||
|
\
|
|||
|
} else { \
|
|||
|
\
|
|||
|
SampAccountAuditingEnabled = FALSE; \
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Defines //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Major and minor revision are stored as a single 32-bit
|
|||
|
// value with the major revision in the upper 16-bits and
|
|||
|
// the minor revision in the lower 16-bits.
|
|||
|
//
|
|||
|
// Major Revision: 1 - NT Version 1.0
|
|||
|
// Minor Revisions: 1 - NT Revision 1.0
|
|||
|
// 2 - NT Revision 1.0A
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_MAJOR_REVISION (0x00010000)
|
|||
|
#define SAMP_MINOR_REVISION_V1_0 (0x00000001)
|
|||
|
#define SAMP_MINOR_REVISION_V1_0A (0x00000002)
|
|||
|
#define SAMP_MINOR_REVISION (0x00000002)
|
|||
|
#define SAMP_REVISION (SAMP_MAJOR_REVISION + SAMP_MINOR_REVISION)
|
|||
|
#define SAMP_SERVER_REVISION (SAMP_REVISION + 1)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Maximum supported name length (in bytes) for this revision...
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_MAXIMUM_NAME_LENGTH (1024)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Maximum amount of memory anyone can ask us to spend on a single
|
|||
|
// request
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_MAXIMUM_MEMORY_TO_USE (4096*4096)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Maximum allowable number of object opens.
|
|||
|
// After this, opens will be rejected with INSUFFICIENT_RESOURCES
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_MAXIMUM_ACTIVE_CONTEXTS (2048)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The number of SAM Local Domains
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_DEFINED_DOMAINS_COUNT ((ULONG) 2)
|
|||
|
|
|||
|
//
|
|||
|
// Defines the maximum number of well-known (restricted) accounts
|
|||
|
// in the SAM database. Restricted accounts have rids less than this
|
|||
|
// value. User-defined accounts have rids >= this value.
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_RESTRICTED_ACCOUNT_COUNT 1000
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Maximum password history length. We store OWFs (16 bytes) in
|
|||
|
// a string (up to 64k), so we could have up to 4k. However, that's
|
|||
|
// much larger than necessary, and we'd like to leave room in case
|
|||
|
// OWFs grow or somesuch. So we'll limit it to 1k.
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_MAXIMUM_PASSWORD_HISTORY_LENGTH 1024
|
|||
|
|
|||
|
//
|
|||
|
// The default group attributes to return when anybody asks for them.
|
|||
|
// This saves the expense of looking at the user object every time.
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
#define SAMP_DEFAULT_GROUP_ATTRIBUTES ( SE_GROUP_MANDATORY | \
|
|||
|
SE_GROUP_ENABLED | \
|
|||
|
SE_GROUP_ENABLED_BY_DEFAULT )
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Each object has an associated set of attributes on disk. //
|
|||
|
// These attributes are divided into fixed-length and variable-length. //
|
|||
|
// Each object type defines whether its fixed and variable length //
|
|||
|
// attributes are stored together or separately. //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
#define SAMP_SERVER_STORED_SEPARATELY (FALSE)
|
|||
|
|
|||
|
#define SAMP_DOMAIN_STORED_SEPARATELY (TRUE)
|
|||
|
|
|||
|
#define SAMP_USER_STORED_SEPARATELY (TRUE)
|
|||
|
|
|||
|
#define SAMP_GROUP_STORED_SEPARATELY (FALSE)
|
|||
|
|
|||
|
#define SAMP_ALIAS_STORED_SEPARATELY (FALSE)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Each object type has a defined set of variable length attributes. //
|
|||
|
// These are arranged within the object as an array of offsets and //
|
|||
|
// lengths (SAMP_VARIABLE_LENGTH_ATTRIBUTE data types). //
|
|||
|
// This section defines the offset of each variable length attribute //
|
|||
|
// for each object type. //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
//
|
|||
|
// Variable length attributes common to all objects
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_OBJECT_SECURITY_DESCRIPTOR (0L)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Variable length attributes of a SERVER object
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_SERVER_SECURITY_DESCRIPTOR (SAMP_OBJECT_SECURITY_DESCRIPTOR)
|
|||
|
|
|||
|
#define SAMP_SERVER_VARIABLE_ATTRIBUTES (1L)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Variable length attributes of a DOMAIN object
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_DOMAIN_SECURITY_DESCRIPTOR (SAMP_OBJECT_SECURITY_DESCRIPTOR)
|
|||
|
#define SAMP_DOMAIN_SID (1L)
|
|||
|
#define SAMP_DOMAIN_OEM_INFORMATION (2L)
|
|||
|
#define SAMP_DOMAIN_REPLICA (3L)
|
|||
|
|
|||
|
#define SAMP_DOMAIN_VARIABLE_ATTRIBUTES (4L)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Variable length attributes of a USER object
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_USER_SECURITY_DESCRIPTOR (SAMP_OBJECT_SECURITY_DESCRIPTOR)
|
|||
|
#define SAMP_USER_ACCOUNT_NAME (1L)
|
|||
|
#define SAMP_USER_FULL_NAME (2L)
|
|||
|
#define SAMP_USER_ADMIN_COMMENT (3L)
|
|||
|
#define SAMP_USER_USER_COMMENT (4L)
|
|||
|
#define SAMP_USER_PARAMETERS (5L)
|
|||
|
#define SAMP_USER_HOME_DIRECTORY (6L)
|
|||
|
#define SAMP_USER_HOME_DIRECTORY_DRIVE (7L)
|
|||
|
#define SAMP_USER_SCRIPT_PATH (8L)
|
|||
|
#define SAMP_USER_PROFILE_PATH (9L)
|
|||
|
#define SAMP_USER_WORKSTATIONS (10L)
|
|||
|
#define SAMP_USER_LOGON_HOURS (11L)
|
|||
|
#define SAMP_USER_GROUPS (12L)
|
|||
|
#define SAMP_USER_DBCS_PWD (13L)
|
|||
|
#define SAMP_USER_UNICODE_PWD (14L)
|
|||
|
#define SAMP_USER_NT_PWD_HISTORY (15L)
|
|||
|
#define SAMP_USER_LM_PWD_HISTORY (16L)
|
|||
|
|
|||
|
#define SAMP_USER_VARIABLE_ATTRIBUTES (17L)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Variable length attributes of a GROUP object
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_GROUP_SECURITY_DESCRIPTOR (SAMP_OBJECT_SECURITY_DESCRIPTOR)
|
|||
|
#define SAMP_GROUP_NAME (1L)
|
|||
|
#define SAMP_GROUP_ADMIN_COMMENT (2L)
|
|||
|
#define SAMP_GROUP_MEMBERS (3L)
|
|||
|
|
|||
|
#define SAMP_GROUP_VARIABLE_ATTRIBUTES (4L)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Variable length attributes of an ALIAS object
|
|||
|
//
|
|||
|
|
|||
|
#define SAMP_ALIAS_SECURITY_DESCRIPTOR (SAMP_OBJECT_SECURITY_DESCRIPTOR)
|
|||
|
#define SAMP_ALIAS_NAME (1L)
|
|||
|
#define SAMP_ALIAS_ADMIN_COMMENT (2L)
|
|||
|
#define SAMP_ALIAS_MEMBERS (3L)
|
|||
|
|
|||
|
#define SAMP_ALIAS_VARIABLE_ATTRIBUTES (4L)
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// Data structures used for tracking allocated memory
|
|||
|
//
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_MEMORY {
|
|||
|
struct _SAMP_MEMORY *Next;
|
|||
|
PVOID Memory;
|
|||
|
} SAMP_MEMORY, *PSAMP_MEMORY;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// Data structures used for enumeration
|
|||
|
//
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
typedef struct _SAMP_ENUMERATION_ELEMENT {
|
|||
|
struct _SAMP_ENUMERATION_ELEMENT *Next;
|
|||
|
SAMPR_RID_ENUMERATION Entry;
|
|||
|
} SAMP_ENUMERATION_ELEMENT, *PSAMP_ENUMERATION_ELEMENT;
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// Data structures related to service administration
|
|||
|
//
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
//
|
|||
|
// SAM Service operation states.
|
|||
|
// Valid state transition diagram is:
|
|||
|
//
|
|||
|
// Initializing ----> Enabled <====> Disabled ---> Shutdown -->Terminating
|
|||
|
//
|
|||
|
|
|||
|
typedef enum _SAMP_SERVICE_STATE {
|
|||
|
SampServiceInitializing = 1,
|
|||
|
SampServiceEnabled,
|
|||
|
SampServiceDisabled,
|
|||
|
SampServiceShutdown,
|
|||
|
SampServiceTerminating
|
|||
|
} SAMP_SERVICE_STATE, *PSAMP_SERVICE_STATE;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Data structures associated with object types //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
typedef enum _SAMP_OBJECT_TYPE {
|
|||
|
SampServerObjectType = 0,
|
|||
|
SampDomainObjectType,
|
|||
|
SampGroupObjectType,
|
|||
|
SampAliasObjectType,
|
|||
|
SampUserObjectType,
|
|||
|
SampUnknownObjectType // This is used as a max index value
|
|||
|
// and so must follow the valid object types.
|
|||
|
} SAMP_OBJECT_TYPE, *PSAMP_OBJECT_TYPE;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Object type-dependent information
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SAMP_OBJECT_INFORMATION {
|
|||
|
|
|||
|
//
|
|||
|
// Generic mapping for this object type
|
|||
|
//
|
|||
|
|
|||
|
GENERIC_MAPPING GenericMapping;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Mask of access types that are not valid for
|
|||
|
// this object type when the access mask has been
|
|||
|
// mapped from generic to specific access types.
|
|||
|
//
|
|||
|
|
|||
|
ACCESS_MASK InvalidMappedAccess;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Mask of accesses representing write operations. These are
|
|||
|
// used on a BDC to determine if an operation should be allowed
|
|||
|
// or not.
|
|||
|
//
|
|||
|
|
|||
|
ACCESS_MASK WriteOperations;
|
|||
|
|
|||
|
//
|
|||
|
// Name of the object type - used for auditing.
|
|||
|
//
|
|||
|
|
|||
|
UNICODE_STRING ObjectTypeName;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The following fields provide information about the attributes
|
|||
|
// of this object and how they are stored on disk. These values
|
|||
|
// are set at SAM initialization time and are not changed
|
|||
|
// thereafter. NOTE: changing these values in the build will
|
|||
|
// result in an on-disk format change - so don't change them just
|
|||
|
// for the hell-of-it.
|
|||
|
//
|
|||
|
// FixedStoredSeparately - When TRUE indicates the fixed and
|
|||
|
// variable-length attributes of the object are stored
|
|||
|
// separately (in two registry-key-attributes). When FALSE,
|
|||
|
// indicates they are stored together (in a single
|
|||
|
// registry-key-attribute).
|
|||
|
//
|
|||
|
//
|
|||
|
// FixedAttributesOffset - Offset from the beginning of the
|
|||
|
// on-disk buffer to the beginning of the fixed-length
|
|||
|
// attributes structure.
|
|||
|
//
|
|||
|
// VariableBufferOffset - Offset from the beginning of the
|
|||
|
// on-disk buffer to the beginning of the Variable-length
|
|||
|
// data buffer. If fixed and variable-length data are
|
|||
|
// stored together, this will be zero.
|
|||
|
//
|
|||
|
// VariableArrayOffset - Offset from the beginning of the
|
|||
|
// on-disk buffer to the beginning of the array of
|
|||
|
// variable-length attributes descriptors.
|
|||
|
//
|
|||
|
// VariableDataOffset - Offset from the beginning of the
|
|||
|
// on-disk buffer to the beginning of the variable-length
|
|||
|
// attribute data.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN FixedStoredSeparately;
|
|||
|
ULONG FixedAttributesOffset,
|
|||
|
VariableBufferOffset,
|
|||
|
VariableArrayOffset,
|
|||
|
VariableDataOffset;
|
|||
|
|
|||
|
//
|
|||
|
// Indicates the length of the fixed length information
|
|||
|
// for this object type.
|
|||
|
//
|
|||
|
|
|||
|
ULONG FixedLengthSize;
|
|||
|
|
|||
|
//
|
|||
|
// Indicates the number of variable length attributes
|
|||
|
// for this object type.
|
|||
|
//
|
|||
|
|
|||
|
ULONG VariableAttributeCount;
|
|||
|
|
|||
|
|
|||
|
} SAMP_OBJECT_INFORMATION, *PSAMP_OBJECT_INFORMATION;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// The following structures represent the in-memory body of each //
|
|||
|
// object type. This is typically used to link instances of object //
|
|||
|
// types together, and track dynamic state information related to //
|
|||
|
// the object type. //
|
|||
|
// //
|
|||
|
// This information does not include the on-disk representation of //
|
|||
|
// the object data. That information is kept in a separate structure //
|
|||
|
// both on-disk and when in-memory. //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// SERVER object in-memory body //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_SERVER_OBJECT {
|
|||
|
ULONG Reserved1;
|
|||
|
} SAMP_SERVER_OBJECT, *PSAMP_SERVER_OBJECT;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// DOMAIN object in-memory body //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_DOMAIN_OBJECT {
|
|||
|
ULONG Reserved1;
|
|||
|
} SAMP_DOMAIN_OBJECT, *PSAMP_DOMAIN_OBJECT;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// USER object in-memory body //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_USER_OBJECT {
|
|||
|
ULONG Rid;
|
|||
|
BOOLEAN DomainPasswordInformationAccessible;
|
|||
|
} SAMP_USER_OBJECT, *PSAMP_USER_OBJECT;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// GROUP object in-memory body //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_GROUP_OBJECT {
|
|||
|
ULONG Rid;
|
|||
|
} SAMP_GROUP_OBJECT, *PSAMP_GROUP_OBJECT;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// ALIAS object in-memory body //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_ALIAS_OBJECT {
|
|||
|
ULONG Rid;
|
|||
|
} SAMP_ALIAS_OBJECT, *PSAMP_ALIAS_OBJECT;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// //
|
|||
|
// The following data structure is the in-memory context associated //
|
|||
|
// with an open object. //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_OBJECT {
|
|||
|
|
|||
|
//
|
|||
|
// Structure used to link this structure into lists
|
|||
|
//
|
|||
|
|
|||
|
LIST_ENTRY ContextListEntry;
|
|||
|
|
|||
|
//
|
|||
|
// Indicates the type of object stored.
|
|||
|
// This is used to access an array of object type descriptors.
|
|||
|
//
|
|||
|
|
|||
|
SAMP_OBJECT_TYPE ObjectType;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The FixedValid and VariableValid indicate whether the data in
|
|||
|
// the fixed and variable-length on-disk image buffers are valid
|
|||
|
// (i.e., were read from disk) or invalid (uninitialized).
|
|||
|
// TRUE indicates the attribute is valid, FALSE indicates it is not.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN FixedValid;
|
|||
|
BOOLEAN VariableValid;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The following flags indicate whether the fixed and/or variable
|
|||
|
// length attributes portion of this object are dirty (i.e., have
|
|||
|
// been changed since read from disk). If TRUE, then the data is
|
|||
|
// dirty and will have to be flushed upon commit. These flags are
|
|||
|
// only meaningful if the corresponding FixedValid or VariableValid
|
|||
|
// flag is TRUE.
|
|||
|
//
|
|||
|
// When attributes are read from disk, the data is said to be
|
|||
|
// "clean". If any changes are made to that data, then it is
|
|||
|
// said to be "dirty". Dirty object attributes will be flushed
|
|||
|
// to disk when the object is de-referenced at the end of a
|
|||
|
// client call.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN FixedDirty;
|
|||
|
BOOLEAN VariableDirty;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field points to the on-disk attributes of the object. This
|
|||
|
// is one of:
|
|||
|
// SAMP_ON_DISK_SERVER_OBJECT
|
|||
|
// SAMP_ON_DISK_DOMAIN_OBJECT
|
|||
|
// SAMP_ON_DISK_USER_OBJECT
|
|||
|
// SAMP_ON_DISK_GROUP_OBJECT
|
|||
|
// SAMP_ON_DISK_ALIAS_OBJECT
|
|||
|
//
|
|||
|
// The memory pointed to by this field is one allocation unit, even
|
|||
|
// if fixed and variable length attributes are stored as seperate
|
|||
|
// registry key attributes. This means that any time additions to
|
|||
|
// the variable length attributes causes a new buffer to be allocated,
|
|||
|
// both the fixed and variable length portions of the structure must
|
|||
|
// be copied to the newly allocated memory.
|
|||
|
//
|
|||
|
|
|||
|
PVOID OnDisk;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The OnDiskAllocated, OnDiskUsed, and OnDiskFree fields describe the
|
|||
|
// memory pointed to by the OnDisk field. The OnDiskAllocated field
|
|||
|
// indicates how many bytes long the block of memory is. The OnDiskUsed
|
|||
|
// field indicates how much of the allocated memory is already in use.
|
|||
|
// The variable length attributes are all packed upon any modification
|
|||
|
// so that all free space is at the end of the block. The OnDiskFree
|
|||
|
// field indicates how many bytes of the allocated block are available
|
|||
|
// for use (note that this should be Allocated minus Used ).
|
|||
|
//
|
|||
|
// NOTE: The allocated and used values will ALWAYS be rounded up to ensure
|
|||
|
// they are integral multiples of 4 bytes in length. This ensures
|
|||
|
// any use of these fields directly will be dword aligned.
|
|||
|
//
|
|||
|
// Also note that when the VariableValid flag is FALSE,
|
|||
|
// then the then OnDiskUsed OnDiskFree do NOT contain valid
|
|||
|
// values.
|
|||
|
//
|
|||
|
|
|||
|
ULONG OnDiskAllocated;
|
|||
|
ULONG OnDiskUsed;
|
|||
|
ULONG OnDiskFree;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Before a context handle may be used, it must be referenced.
|
|||
|
// This prevents the data from being deallocated from underneath it.
|
|||
|
//
|
|||
|
// Note, this count reflects one reference for the open itself, and
|
|||
|
// then another reference for each time the object is looked up or
|
|||
|
// subsequently referenced. Therefore, a handle close should
|
|||
|
// dereference the object twice - once to counter the Lookup operation
|
|||
|
// and once to represent elimination of the handle itself.
|
|||
|
//
|
|||
|
|
|||
|
ULONG ReferenceCount;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field indicates the accesses that the client has been granted
|
|||
|
// via this context.
|
|||
|
//
|
|||
|
|
|||
|
ACCESS_MASK GrantedAccess;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This handle is to the root registry key of the corresponding
|
|||
|
// object. If this value is NULL, then the corresponding
|
|||
|
// object was created in a previous call, but has not yet been
|
|||
|
// opened. This will only occur for USERS, GROUPS, and ALIASES
|
|||
|
// (and DOMAINS when we support DOMAIN creation).
|
|||
|
//
|
|||
|
|
|||
|
HANDLE RootKey;
|
|||
|
|
|||
|
//
|
|||
|
// This is the registry name of the corresponding object. It is
|
|||
|
// set when the object is created, when RootKey is null. It is
|
|||
|
// used to add the attributes changes out to the RXACT in the absence
|
|||
|
// of the RootKey. After being used once, it is deleted - because
|
|||
|
// the next time the object is used, the LookupContext() will fill
|
|||
|
// in the RootKey.
|
|||
|
//
|
|||
|
|
|||
|
UNICODE_STRING RootName;
|
|||
|
|
|||
|
//
|
|||
|
// If the object is other than a Server object, then this field
|
|||
|
// contains the index of the domain the object is in. This provides
|
|||
|
// access to things like the domain's name.
|
|||
|
//
|
|||
|
|
|||
|
ULONG DomainIndex;
|
|||
|
|
|||
|
//
|
|||
|
// This field indicates a context block is to be deleted.
|
|||
|
// Actual deallocation of the memory for the context block
|
|||
|
// will not occur until the reference count drops to zero.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN MarkedForDelete;
|
|||
|
|
|||
|
//
|
|||
|
// This field is used to indicate that the client associated with
|
|||
|
// this context block is to be fully trusted. When TRUE, no access
|
|||
|
// checks are performed against the client. This allows a single
|
|||
|
// interface to be used by both RPC clients and internal procedures.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN TrustedClient;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field indicates whether an audit generation routine must be
|
|||
|
// called when this context block is deleted (which represents a
|
|||
|
// handle being deleted).
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN AuditOnClose;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This flag is TRUE when this context is valid. It may be necessary
|
|||
|
// to invalidate before we can eliminate all references to it due to
|
|||
|
// the way RPC works. RPC will only allow you to invalidate a context
|
|||
|
// handle when called by the client using an API that has the context
|
|||
|
// handle as an OUT parameter.
|
|||
|
//
|
|||
|
// Since someone may delete a user or group object (which invalidates
|
|||
|
// all handles to that object), we must have a way of tracking handle
|
|||
|
// validity independent of RPC's method.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN Valid;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The body of each object.
|
|||
|
|
|||
|
union {
|
|||
|
|
|||
|
SAMP_SERVER_OBJECT Server;
|
|||
|
SAMP_DOMAIN_OBJECT Domain;
|
|||
|
SAMP_GROUP_OBJECT Group;
|
|||
|
SAMP_ALIAS_OBJECT Alias;
|
|||
|
SAMP_USER_OBJECT User;
|
|||
|
|
|||
|
} TypeBody;
|
|||
|
|
|||
|
} SAMP_OBJECT, *PSAMP_OBJECT;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// Data structures used to store information in the registry
|
|||
|
//
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
//
|
|||
|
// Fixed length portion of a revision 1 Server object
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SAMP_V1_FIXED_LENGTH_SERVER {
|
|||
|
|
|||
|
ULONG RevisionLevel;
|
|||
|
|
|||
|
} SAMP_V1_FIXED_LENGTH_SERVER, *PSAMP_V1_FIXED_LENGTH_SERVER;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Fixed length portion of a Domain
|
|||
|
// (previous release formats of this structure follow)
|
|||
|
//
|
|||
|
// Note: in version 1.0 of NT, the fixed length portion of
|
|||
|
// a domain was stored separate from the variable length
|
|||
|
// portion. This allows us to compare the size of the
|
|||
|
// data read from disk against the size of a V1_0A form
|
|||
|
// of the fixed length data to determine whether it is
|
|||
|
// a Version 1 format or later format.
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SAMP_V1_0A_FIXED_LENGTH_DOMAIN {
|
|||
|
|
|||
|
ULONG Revision;
|
|||
|
ULONG Unused1;
|
|||
|
|
|||
|
LARGE_INTEGER CreationTime;
|
|||
|
LARGE_INTEGER ModifiedCount;
|
|||
|
LARGE_INTEGER MaxPasswordAge;
|
|||
|
LARGE_INTEGER MinPasswordAge;
|
|||
|
LARGE_INTEGER ForceLogoff;
|
|||
|
LARGE_INTEGER LockoutDuration;
|
|||
|
LARGE_INTEGER LockoutObservationWindow;
|
|||
|
LARGE_INTEGER ModifiedCountAtLastPromotion;
|
|||
|
|
|||
|
|
|||
|
ULONG NextRid;
|
|||
|
ULONG PasswordProperties;
|
|||
|
|
|||
|
USHORT MinPasswordLength;
|
|||
|
USHORT PasswordHistoryLength;
|
|||
|
|
|||
|
USHORT LockoutThreshold;
|
|||
|
|
|||
|
DOMAIN_SERVER_ENABLE_STATE ServerState;
|
|||
|
DOMAIN_SERVER_ROLE ServerRole;
|
|||
|
|
|||
|
BOOLEAN UasCompatibilityRequired;
|
|||
|
|
|||
|
} SAMP_V1_0A_FIXED_LENGTH_DOMAIN, *PSAMP_V1_0A_FIXED_LENGTH_DOMAIN;
|
|||
|
|
|||
|
typedef struct _SAMP_V1_0_FIXED_LENGTH_DOMAIN {
|
|||
|
|
|||
|
LARGE_INTEGER CreationTime;
|
|||
|
LARGE_INTEGER ModifiedCount;
|
|||
|
LARGE_INTEGER MaxPasswordAge;
|
|||
|
LARGE_INTEGER MinPasswordAge;
|
|||
|
LARGE_INTEGER ForceLogoff;
|
|||
|
|
|||
|
ULONG NextRid;
|
|||
|
|
|||
|
DOMAIN_SERVER_ENABLE_STATE ServerState;
|
|||
|
DOMAIN_SERVER_ROLE ServerRole;
|
|||
|
|
|||
|
USHORT MinPasswordLength;
|
|||
|
USHORT PasswordHistoryLength;
|
|||
|
ULONG PasswordProperties;
|
|||
|
|
|||
|
BOOLEAN UasCompatibilityRequired;
|
|||
|
|
|||
|
} SAMP_V1_0_FIXED_LENGTH_DOMAIN, *PSAMP_V1_0_FIXED_LENGTH_DOMAIN;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Fixed length portion of a revision 1 group account
|
|||
|
//
|
|||
|
// Note: MemberCount could be treated as part of the fixed length
|
|||
|
// data, but it is more convenient to keep it with the Member RID
|
|||
|
// list in the MEMBERS key.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SAMP_V1_FIXED_LENGTH_GROUP {
|
|||
|
|
|||
|
ULONG RelativeId;
|
|||
|
ULONG Attributes;
|
|||
|
UCHAR AdminGroup;
|
|||
|
|
|||
|
} SAMP_V1_FIXED_LENGTH_GROUP, *PSAMP_V1_FIXED_LENGTH_GROUP;
|
|||
|
|
|||
|
typedef struct _SAMP_V1_0A_FIXED_LENGTH_GROUP {
|
|||
|
|
|||
|
ULONG Revision;
|
|||
|
ULONG RelativeId;
|
|||
|
ULONG Attributes;
|
|||
|
ULONG Unused1;
|
|||
|
UCHAR AdminCount;
|
|||
|
UCHAR OperatorCount;
|
|||
|
|
|||
|
} SAMP_V1_0A_FIXED_LENGTH_GROUP, *PSAMP_V1_0A_FIXED_LENGTH_GROUP;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Fixed length portion of a revision 1 alias account
|
|||
|
//
|
|||
|
// Note: MemberCount could be treated as part of the fixed length
|
|||
|
// data, but it is more convenient to keep it with the Member RID
|
|||
|
// list in the MEMBERS key.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SAMP_V1_FIXED_LENGTH_ALIAS {
|
|||
|
|
|||
|
ULONG RelativeId;
|
|||
|
|
|||
|
} SAMP_V1_FIXED_LENGTH_ALIAS, *PSAMP_V1_FIXED_LENGTH_ALIAS;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Fixed length portion of a user account
|
|||
|
// (previous release formats of this structure follow)
|
|||
|
//
|
|||
|
// Note: GroupCount could be treated as part of the fixed length
|
|||
|
// data, but it is more convenient to keep it with the Group RID
|
|||
|
// list in the GROUPS key.
|
|||
|
//
|
|||
|
// Note: in version 1.0 of NT, the fixed length portion of
|
|||
|
// a user was stored separate from the variable length
|
|||
|
// portion. This allows us to compare the size of the
|
|||
|
// data read from disk against the size of a V1_0A form
|
|||
|
// of the fixed length data to determine whether it is
|
|||
|
// a Version 1 format or later format.
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This is the fixed length user from NT3.51 QFE and SUR
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
typedef struct _SAMP_V1_0A_FIXED_LENGTH_USER {
|
|||
|
|
|||
|
ULONG Revision;
|
|||
|
ULONG Unused1;
|
|||
|
|
|||
|
LARGE_INTEGER LastLogon;
|
|||
|
LARGE_INTEGER LastLogoff;
|
|||
|
LARGE_INTEGER PasswordLastSet;
|
|||
|
LARGE_INTEGER AccountExpires;
|
|||
|
LARGE_INTEGER LastBadPasswordTime;
|
|||
|
|
|||
|
ULONG UserId;
|
|||
|
ULONG PrimaryGroupId;
|
|||
|
ULONG UserAccountControl;
|
|||
|
|
|||
|
USHORT CountryCode;
|
|||
|
USHORT CodePage;
|
|||
|
USHORT BadPasswordCount;
|
|||
|
USHORT LogonCount;
|
|||
|
USHORT AdminCount;
|
|||
|
USHORT Unused2;
|
|||
|
USHORT OperatorCount;
|
|||
|
|
|||
|
} SAMP_V1_0A_FIXED_LENGTH_USER, *PSAMP_V1_0A_FIXED_LENGTH_USER;
|
|||
|
|
|||
|
//
|
|||
|
// This is the fixed length user from NT3.5 and NT3.51
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
typedef struct _SAMP_V1_0_FIXED_LENGTH_USER {
|
|||
|
|
|||
|
ULONG Revision;
|
|||
|
ULONG Unused1;
|
|||
|
|
|||
|
LARGE_INTEGER LastLogon;
|
|||
|
LARGE_INTEGER LastLogoff;
|
|||
|
LARGE_INTEGER PasswordLastSet;
|
|||
|
LARGE_INTEGER AccountExpires;
|
|||
|
LARGE_INTEGER LastBadPasswordTime;
|
|||
|
|
|||
|
ULONG UserId;
|
|||
|
ULONG PrimaryGroupId;
|
|||
|
ULONG UserAccountControl;
|
|||
|
|
|||
|
USHORT CountryCode;
|
|||
|
USHORT CodePage;
|
|||
|
USHORT BadPasswordCount;
|
|||
|
USHORT LogonCount;
|
|||
|
USHORT AdminCount;
|
|||
|
|
|||
|
} SAMP_V1_0_FIXED_LENGTH_USER, *PSAMP_V1_0_FIXED_LENGTH_USER;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This is the fixed length user from NT3.1
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SAMP_V1_FIXED_LENGTH_USER {
|
|||
|
|
|||
|
LARGE_INTEGER LastLogon;
|
|||
|
LARGE_INTEGER LastLogoff;
|
|||
|
LARGE_INTEGER PasswordLastSet;
|
|||
|
LARGE_INTEGER AccountExpires;
|
|||
|
|
|||
|
ULONG UserId;
|
|||
|
ULONG PrimaryGroupId;
|
|||
|
ULONG UserAccountControl;
|
|||
|
|
|||
|
USHORT CountryCode;
|
|||
|
USHORT CodePage;
|
|||
|
USHORT BadPasswordCount;
|
|||
|
USHORT LogonCount;
|
|||
|
USHORT AdminCount;
|
|||
|
|
|||
|
|
|||
|
} SAMP_V1_FIXED_LENGTH_USER, *PSAMP_V1_FIXED_LENGTH_USER;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Domain account information is cached in memory in a sorted list.
|
|||
|
// This allows fast return of information to user-interactive clients.
|
|||
|
// One of these structures is part of the in-memory information for each domain.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _PSAMP_DOMAIN_DISPLAY_INFORMATION {
|
|||
|
|
|||
|
RTL_GENERIC_TABLE2 RidTable;
|
|||
|
ULONG TotalBytesInRidTable;
|
|||
|
|
|||
|
RTL_GENERIC_TABLE2 UserTable;
|
|||
|
ULONG TotalBytesInUserTable;
|
|||
|
|
|||
|
RTL_GENERIC_TABLE2 MachineTable;
|
|||
|
ULONG TotalBytesInMachineTable;
|
|||
|
|
|||
|
RTL_GENERIC_TABLE2 InterdomainTable;
|
|||
|
ULONG TotalBytesInInterdomainTable;
|
|||
|
|
|||
|
RTL_GENERIC_TABLE2 GroupTable;
|
|||
|
ULONG TotalBytesInGroupTable;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// These fields specify whether the cached information is valid.
|
|||
|
// If TRUE, the cache contains valid information
|
|||
|
// If FALSE, trees are empty.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN UserAndMachineTablesValid;
|
|||
|
BOOLEAN GroupTableValid;
|
|||
|
|
|||
|
} SAMP_DOMAIN_DISPLAY_INFORMATION, *PSAMP_DOMAIN_DISPLAY_INFORMATION;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Domain account information data structure used to pass data to the
|
|||
|
// cache manipulation routines. This structure is the union of the cached
|
|||
|
// data for all the account types that we keep in the cache. Other SAM routines
|
|||
|
// can call fill this structure in without knowing which type of account
|
|||
|
// requires which elements.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SAMP_ACCOUNT_DISPLAY_INFO {
|
|||
|
ULONG Rid;
|
|||
|
ULONG AccountControl; // Also used as Attributes for groups
|
|||
|
UNICODE_STRING Name;
|
|||
|
UNICODE_STRING Comment;
|
|||
|
UNICODE_STRING FullName;
|
|||
|
|
|||
|
} SAMP_ACCOUNT_DISPLAY_INFO, *PSAMP_ACCOUNT_DISPLAY_INFO;
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Alias Membership Lists. //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_AL_REFERENCED_DOMAIN {
|
|||
|
|
|||
|
ULONG DomainReference;
|
|||
|
PSID DomainSid;
|
|||
|
|
|||
|
} SAMP_AL_REFERENCED_DOMAIN, *PSAMP_AL_REFERENCED_DOMAIN;
|
|||
|
|
|||
|
typedef struct _SAMP_AL_REFERENCED_DOMAIN_LIST {
|
|||
|
|
|||
|
ULONG SRMaximumLength;
|
|||
|
ULONG SRUsedLength;
|
|||
|
ULONG MaximumCount;
|
|||
|
ULONG UsedCount;
|
|||
|
PSAMP_AL_REFERENCED_DOMAIN Domains;
|
|||
|
|
|||
|
} SAMP_AL_REFERENCED_DOMAIN_LIST, *PSAMP_AL_REFERENCED_DOMAIN_LIST;
|
|||
|
|
|||
|
typedef struct _SAMP_AL_SR_REFERENCED_DOMAIN {
|
|||
|
|
|||
|
ULONG Length;
|
|||
|
ULONG DomainReference;
|
|||
|
SID DomainSid;
|
|||
|
|
|||
|
} SAMP_AL_SR_REFERENCED_DOMAIN, *PSAMP_AL_SR_REFERENCED_DOMAIN;
|
|||
|
|
|||
|
typedef struct _SAMP_AL_SR_REFERENCED_DOMAIN_LIST {
|
|||
|
|
|||
|
ULONG SRMaximumLength;
|
|||
|
ULONG SRUsedLength;
|
|||
|
ULONG MaximumCount;
|
|||
|
ULONG UsedCount;
|
|||
|
SAMP_AL_SR_REFERENCED_DOMAIN Domains[ANYSIZE_ARRAY];
|
|||
|
|
|||
|
} SAMP_AL_SR_REFERENCED_DOMAIN_LIST, *PSAMP_AL_SR_REFERENCED_DOMAIN_LIST;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The Alias Membership Lists are global data structures maintained by SAM
|
|||
|
// to provide rapid retrieval of Alias membership information. There are
|
|||
|
// two types of Lists, the Alias Member List which is used to retrieve members
|
|||
|
// of Aliases and the Member Alias List which is used to retrieve the aliases
|
|||
|
// that members belong to. A pair of these lists exists for each local
|
|||
|
// SAM Domain (currently, the BUILTIN and Accounts domain are the only two)
|
|||
|
//
|
|||
|
// Currently, these lists are used as memory caches. They are generated at
|
|||
|
// system boot from the information stored in the SAM Database in the Registry
|
|||
|
// and SAM keeps them up to date when Alias memberships change. Thus SAM
|
|||
|
// API which perform lookup/read operations can use these lists instead of
|
|||
|
// accessing the Registry keys directly. At a future date, it may be possible
|
|||
|
// to back up the lists directly to the Registry and make obsolete the current
|
|||
|
// information for Alias membership stored there. Because these lists are
|
|||
|
// used as caches, they can be invalidated when the going gets tough, in which
|
|||
|
// case, API will read their information directly from the Registry.
|
|||
|
//
|
|||
|
// Alias Member List
|
|||
|
//
|
|||
|
// This is the 'Alias-to-Member' List. Given one or more Aliases, it is used to
|
|||
|
// find their members. One of these lists exists for each local SAM Domain.
|
|||
|
// The Alias Member List specifies all/ of the information describing aliases
|
|||
|
// in the local SAM Domain. It is designed for fast retrieval of alias
|
|||
|
// membership information for an account given the account's Sid.
|
|||
|
//
|
|||
|
// An Alias Member List is structured. For each Alias in the list, the accounts that
|
|||
|
// are mebers of the Alias are classified by their Referenced Domain. If an
|
|||
|
// account is a member of n aliases in the SAM Local Domain to which an Alias
|
|||
|
// List relates, there will be n entries for the account in the Alias Member List -
|
|||
|
//
|
|||
|
// are classified by domain. If an AccountSid is a member of n aliases in a given SAM
|
|||
|
// Local Domain, there are n entries for it in the Alias Member List.
|
|||
|
//
|
|||
|
// The structure of an Alias Member List consists of three levels. These are, from
|
|||
|
// the top down:
|
|||
|
//
|
|||
|
// * The Alias Member List structure (SAMP_AL_ALIAS_LIST)
|
|||
|
//
|
|||
|
// The Alias Member List structure specifies all aliases in the local SAM Domain.
|
|||
|
// One of these exists per local SAM domain. It contains a list of Alias
|
|||
|
// structures.
|
|||
|
//
|
|||
|
// * The Alias structure
|
|||
|
//
|
|||
|
// One Alias structure exists for each alias in the local SAM Domain. An
|
|||
|
// Alias structure contains an array of Domain structures.
|
|||
|
//
|
|||
|
// * The Domain structure
|
|||
|
//
|
|||
|
// The Domain structure describes a Domain which has one or more accounts
|
|||
|
// belonging to one or more aliases in the local SAM domain. The structure
|
|||
|
// contains a list of these member accounts.
|
|||
|
//
|
|||
|
// The entire Alias Member List is self relative, facilitating easy storage and
|
|||
|
// retrieval from backing storage.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SAMP_AL_DOMAIN {
|
|||
|
|
|||
|
ULONG MaximumLength;
|
|||
|
ULONG UsedLength;
|
|||
|
ULONG DomainReference;
|
|||
|
ULONG RidCount;
|
|||
|
ULONG Rids[ANYSIZE_ARRAY];
|
|||
|
|
|||
|
} SAMP_AL_DOMAIN, *PSAMP_AL_DOMAIN;
|
|||
|
|
|||
|
typedef struct _SAMP_AL_ALIAS {
|
|||
|
|
|||
|
ULONG MaximumLength;
|
|||
|
ULONG UsedLength;
|
|||
|
ULONG AliasRid;
|
|||
|
ULONG DomainCount;
|
|||
|
SAMP_AL_DOMAIN Domains[ANYSIZE_ARRAY];
|
|||
|
|
|||
|
} SAMP_AL_ALIAS, *PSAMP_AL_ALIAS;
|
|||
|
|
|||
|
typedef struct _SAMP_AL_ALIAS_MEMBER_LIST {
|
|||
|
|
|||
|
ULONG MaximumLength;
|
|||
|
ULONG UsedLength;
|
|||
|
ULONG AliasCount;
|
|||
|
ULONG DomainIndex;
|
|||
|
ULONG Enabled;
|
|||
|
SAMP_AL_ALIAS Aliases[ANYSIZE_ARRAY];
|
|||
|
|
|||
|
} SAMP_AL_ALIAS_MEMBER_LIST, *PSAMP_AL_ALIAS_MEMBER_LIST;
|
|||
|
|
|||
|
//
|
|||
|
// Member Alias List.
|
|||
|
//
|
|||
|
// This is the 'Member to Alias' List. Given one or more member account Sids,
|
|||
|
// this list is used to find all the Aliases to which one or more of the
|
|||
|
// members belongs. One Member Alias List exists for each local SAM Domain.
|
|||
|
// The list contains all of the membership relationships for aliases in the
|
|||
|
// Domain. The member accounts are grouped by sorted Rid within Domain
|
|||
|
// Sid, and for each Rid the list contains an array of the Rids of the Aliases
|
|||
|
// to which it belongs.
|
|||
|
//
|
|||
|
// This list is implemented in a Self-Relative format for easy backup and
|
|||
|
// restore. For now, the list is being used simply as a cache, which is
|
|||
|
// constructed at system load, and updated whenever membership relationships
|
|||
|
// change. When the going gets tough, we just ditch the cache. Later, it
|
|||
|
// may be desirable to save this list to a backing store (e.g. to a Registry
|
|||
|
// Key)
|
|||
|
//
|
|||
|
// The list is implemented as a 3-tier hierarchy. These are described
|
|||
|
// from the top down.
|
|||
|
//
|
|||
|
// Member Alias List (SAMP_AL_MEMBER_ALIAS_LIST)
|
|||
|
//
|
|||
|
// This top-level structure contains the list header. The list header
|
|||
|
// contains a count of the Member Domains and also the DomainIndex of the
|
|||
|
// SAM Local Domain to which the list relates.
|
|||
|
//
|
|||
|
// Member Domain
|
|||
|
//
|
|||
|
// One of these exists for each Domain that contains one or more accounts
|
|||
|
// that are members of one or more Aliases in the SAM local Domain.
|
|||
|
//
|
|||
|
// Member Account
|
|||
|
//
|
|||
|
// One of these exists for each account that is a member of one or more
|
|||
|
// Aliases in the SAM Local Domain. A Member Account structure specifies
|
|||
|
// the Rid of the member and the Rid of the Aliases to which it belongs
|
|||
|
// (only Aliases in the associated local SAM Domain are listed).
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SAMP_AL_MEMBER_ACCOUNT {
|
|||
|
|
|||
|
ULONG Signature;
|
|||
|
ULONG MaximumLength;
|
|||
|
ULONG UsedLength;
|
|||
|
ULONG Rid;
|
|||
|
ULONG AliasCount;
|
|||
|
ULONG AliasRids[ ANYSIZE_ARRAY];
|
|||
|
|
|||
|
} SAMP_AL_MEMBER_ACCOUNT, *PSAMP_AL_MEMBER_ACCOUNT;
|
|||
|
|
|||
|
typedef struct _SAMP_AL_MEMBER_DOMAIN {
|
|||
|
|
|||
|
ULONG Signature;
|
|||
|
ULONG MaximumLength;
|
|||
|
ULONG UsedLength;
|
|||
|
ULONG RidCount;
|
|||
|
SID DomainSid;
|
|||
|
|
|||
|
} SAMP_AL_MEMBER_DOMAIN, *PSAMP_AL_MEMBER_DOMAIN;
|
|||
|
|
|||
|
typedef struct _SAMP_AL_MEMBER_ALIAS_LIST {
|
|||
|
|
|||
|
ULONG Signature;
|
|||
|
ULONG MaximumLength;
|
|||
|
ULONG UsedLength;
|
|||
|
ULONG DomainIndex;
|
|||
|
ULONG DomainCount;
|
|||
|
SAMP_AL_MEMBER_DOMAIN MemberDomains[ANYSIZE_ARRAY];
|
|||
|
|
|||
|
} SAMP_AL_MEMBER_ALIAS_LIST, *PSAMP_AL_MEMBER_ALIAS_LIST;
|
|||
|
|
|||
|
//
|
|||
|
// Alias Information
|
|||
|
//
|
|||
|
// This is the top level structure which connects the Lists. One of these
|
|||
|
// appears in the SAMP_DEFINED_DOMAINS structure.
|
|||
|
//
|
|||
|
// The connection between the lists is as follows
|
|||
|
//
|
|||
|
// SAMP_DEFINED_DOMAINS Contains SAMP_AL_ALIAS_INFORMATION
|
|||
|
//
|
|||
|
// SAMP_AL_ALIAS_INFORMATION contains pointers to
|
|||
|
// SAMP_AL_ALIAS_MEMBER_LIST and SAMP_AL_MEMBER_ALIAS_LIST
|
|||
|
//
|
|||
|
// SAMP_AL_ALIAS_MEMBER_LIST and SAMP_AL_MEMBER_ALIAS_LIST contain
|
|||
|
// the DomainIndex of the SAMP_DEFINED_DOMAINS structure.
|
|||
|
//
|
|||
|
// Thus it is possible to navigate from any list to any other.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SAMP_AL_ALIAS_INFORMATION {
|
|||
|
|
|||
|
BOOLEAN Valid;
|
|||
|
UNICODE_STRING AliasMemberListKeyName;
|
|||
|
UNICODE_STRING MemberAliasListKeyName;
|
|||
|
|
|||
|
HANDLE AliasMemberListKeyHandle;
|
|||
|
HANDLE MemberAliasListKeyHandle;
|
|||
|
|
|||
|
PSAMP_AL_ALIAS_MEMBER_LIST AliasMemberList;
|
|||
|
PSAMP_AL_MEMBER_ALIAS_LIST MemberAliasList;
|
|||
|
|
|||
|
SAMP_AL_REFERENCED_DOMAIN_LIST ReferencedDomainList;
|
|||
|
|
|||
|
} SAMP_AL_ALIAS_INFORMATION, *PSAMP_AL_ALIAS_INFORMATION;
|
|||
|
|
|||
|
typedef struct _SAMP_AL_SPLIT_MEMBER_SID {
|
|||
|
|
|||
|
ULONG Rid;
|
|||
|
PSID DomainSid;
|
|||
|
PSAMP_AL_MEMBER_DOMAIN MemberDomain;
|
|||
|
|
|||
|
} SAMP_AL_SPLIT_MEMBER_SID, *PSAMP_AL_SPLIT_MEMBER_SID;
|
|||
|
|
|||
|
typedef struct _SAMP_AL_SPLIT_MEMBER_SID_LIST {
|
|||
|
|
|||
|
ULONG Count;
|
|||
|
PSAMP_AL_SPLIT_MEMBER_SID Sids;
|
|||
|
|
|||
|
} SAMP_AL_SPLIT_MEMBER_SID_LIST, *PSAMP_AL_SPLIT_MEMBER_SID_LIST;
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Information about each domain that is kept readily available in memory //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _PSAMP_DEFINED_DOMAINS {
|
|||
|
|
|||
|
//
|
|||
|
// This field contains a handle to a context open to the domain object.
|
|||
|
// This handle can be used to reference in-memory copies of all
|
|||
|
// attributes and is used when writing out changes to the object.
|
|||
|
//
|
|||
|
|
|||
|
PSAMP_OBJECT Context;
|
|||
|
|
|||
|
//
|
|||
|
// (Should keep the domain's security descriptor here)
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field contains the SID of the domain.
|
|||
|
//
|
|||
|
|
|||
|
PSID Sid;
|
|||
|
|
|||
|
//
|
|||
|
// This field contains the external name of this domain. This is the
|
|||
|
// name by which the domain is known outside SAM and is the name
|
|||
|
// recorded by the LSA in the PolicyAccountDomainInformation
|
|||
|
// information class for the Policy Object.
|
|||
|
//
|
|||
|
|
|||
|
UNICODE_STRING ExternalName;
|
|||
|
|
|||
|
//
|
|||
|
// This field contains the internal name of this domain. This is the
|
|||
|
// name by which the domain is known inside SAM. It is set at
|
|||
|
// installation and never changes.
|
|||
|
//
|
|||
|
|
|||
|
UNICODE_STRING InternalName;
|
|||
|
|
|||
|
//
|
|||
|
// These fields contain standard security descriptors for new user,
|
|||
|
// group, and alias accounts within the corresponding domain.
|
|||
|
//
|
|||
|
// The following security descriptors are prepared:
|
|||
|
//
|
|||
|
// AdminUserSD - Contains a SD appropriate for applying to
|
|||
|
// a user object that is a member of the ADMINISTRATORS
|
|||
|
// alias.
|
|||
|
//
|
|||
|
// AdminGroupSD - Contains a SD appropriate for applying to
|
|||
|
// a group object that is a member of the ADMINISTRATORS
|
|||
|
// alias.
|
|||
|
//
|
|||
|
// NormalUserSD - Contains a SD appropriate for applying to
|
|||
|
// a user object that is NOT a member of the ADMINISTRATORS
|
|||
|
// alias.
|
|||
|
//
|
|||
|
// NormalGroupSD - Contains a SD appropriate for applying to
|
|||
|
// a Group object that is NOT a member of the ADMINISTRATORS
|
|||
|
// alias.
|
|||
|
//
|
|||
|
// NormalAliasSD - Contains a SD appropriate for applying to
|
|||
|
// newly created alias objects.
|
|||
|
//
|
|||
|
//
|
|||
|
//
|
|||
|
// Additionally, the following related information is provided:
|
|||
|
//
|
|||
|
// AdminUserRidPointer
|
|||
|
// NormalUserRidPointer
|
|||
|
//
|
|||
|
// Points to the last RID of the ACE in the corresponding
|
|||
|
// SD's DACL which grants access to the user. This rid
|
|||
|
// must be replaced with the user's rid being the SD is
|
|||
|
// applied to the user object.
|
|||
|
//
|
|||
|
//
|
|||
|
//
|
|||
|
// AdminUserSDLength
|
|||
|
// AdminGroupSDLength
|
|||
|
// NormalUserSDLength
|
|||
|
// NormalGroupSDLength
|
|||
|
// NormalAliasSDLength
|
|||
|
//
|
|||
|
// The length, in bytes, of the corresponding security
|
|||
|
// descriptor.
|
|||
|
//
|
|||
|
|
|||
|
PSECURITY_DESCRIPTOR
|
|||
|
AdminUserSD,
|
|||
|
AdminGroupSD,
|
|||
|
NormalUserSD,
|
|||
|
NormalGroupSD,
|
|||
|
NormalAliasSD;
|
|||
|
|
|||
|
PULONG AdminUserRidPointer,
|
|||
|
NormalUserRidPointer;
|
|||
|
|
|||
|
ULONG AdminUserSDLength,
|
|||
|
AdminGroupSDLength,
|
|||
|
NormalUserSDLength,
|
|||
|
NormalGroupSDLength,
|
|||
|
NormalAliasSDLength;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Context blocks for open objects in this domain are kept in the
|
|||
|
// following lists. Both valid and invalid objects are kept on the
|
|||
|
// list. They are removed upon deletion.
|
|||
|
//
|
|||
|
|
|||
|
LIST_ENTRY GroupContextHead,
|
|||
|
AliasContextHead,
|
|||
|
UserContextHead;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// There are two copies of the fixed length domain information.
|
|||
|
// When a transaction is started, the "UnmodifiedFixed" field is copied
|
|||
|
// to the "CurrentFixed" field. The CurrentFixed field is the field
|
|||
|
// all operations should be performed on (like allocating new RIDs).
|
|||
|
// When a write-lock is released, the CurrentFixed information will
|
|||
|
// either be automatically written out (if the transaction is to be
|
|||
|
// committed) or discarded (if the transaction is to be rolled back).
|
|||
|
// If the transaction is committed, then the CurrentField will also be
|
|||
|
// copied to the UnmodifiedFixed field, making it available for the next
|
|||
|
// transaction.
|
|||
|
//
|
|||
|
// This allows an operation to proceed, operating on fields
|
|||
|
// (specifically, the NextRid and ModifiedCount fields) without
|
|||
|
// regard to whether the operation will ultimately be committed or
|
|||
|
// rolled back.
|
|||
|
//
|
|||
|
|
|||
|
SAMP_V1_0A_FIXED_LENGTH_DOMAIN
|
|||
|
CurrentFixed,
|
|||
|
UnmodifiedFixed;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Cached display information
|
|||
|
//
|
|||
|
|
|||
|
SAMP_DOMAIN_DISPLAY_INFORMATION DisplayInformation;
|
|||
|
|
|||
|
//
|
|||
|
// Cached Alias Information
|
|||
|
//
|
|||
|
|
|||
|
SAMP_AL_ALIAS_INFORMATION AliasInformation;
|
|||
|
|
|||
|
} SAMP_DEFINED_DOMAINS, *PSAMP_DEFINED_DOMAINS;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// This structure is used to describe where the data for //
|
|||
|
// an object's variable length attribute is. This is a //
|
|||
|
// self-relative structure, allowing it to be stored on disk //
|
|||
|
// and later retrieved and used without fixing pointers. //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
typedef struct _SAMP_VARIABLE_LENGTH_ATTRIBUTE {
|
|||
|
//
|
|||
|
// Indicates the offset of data from the address of this data
|
|||
|
// structure.
|
|||
|
//
|
|||
|
|
|||
|
LONG Offset;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Indicates the length of the data.
|
|||
|
//
|
|||
|
|
|||
|
ULONG Length;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// A 32-bit value that may be associated with each variable
|
|||
|
// length attribute. This may be used, for example, to indicate
|
|||
|
// how many elements are in the variable-length attribute.
|
|||
|
//
|
|||
|
|
|||
|
ULONG Qualifier;
|
|||
|
|
|||
|
} SAMP_VARIABLE_LENGTH_ATTRIBUTE, *PSAMP_VARIABLE_LENGTH_ATTRIBUTE;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// The following structures represent the On-Disk Structure of each //
|
|||
|
// object type. Each object has a fixed length data portion and a //
|
|||
|
// variable length data portion. Information in the object type //
|
|||
|
// descriptor indicates how many variable length attributes the object //
|
|||
|
// has and whether the fixed and variable length data are stored //
|
|||
|
// together in one registry key attribute, or, alternatively, each is //
|
|||
|
// stored in its own registry key attribute. //
|
|||
|
// //
|
|||
|
// //
|
|||
|
// //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// SERVER object on-disk structure //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_ON_DISK_SERVER_OBJECT {
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field is needed for registry i/o operations.
|
|||
|
// This marks the beginning of the i/o buffer address.
|
|||
|
//
|
|||
|
|
|||
|
KEY_VALUE_PARTIAL_INFORMATION Header1;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field contains the fixed length attributes of the object
|
|||
|
//
|
|||
|
|
|||
|
SAMP_V1_FIXED_LENGTH_SERVER V1Fixed;
|
|||
|
|
|||
|
|
|||
|
#if SAMP_SERVER_STORED_SEPARATELY
|
|||
|
|
|||
|
//
|
|||
|
// This header is needed for registry operations if fixed and
|
|||
|
// variable length attributes are stored separately. This
|
|||
|
// field marks the beginning of the i/o buffer address for
|
|||
|
// variable-length attribute i/o.
|
|||
|
//
|
|||
|
|
|||
|
KEY_VALUE_PARTIAL_INFORMATION Header2;
|
|||
|
#endif //SAMP_SERVER_STORED_SEPARATELY
|
|||
|
|
|||
|
//
|
|||
|
// Elements of this array point to variable-length attribute
|
|||
|
// values.
|
|||
|
//
|
|||
|
|
|||
|
SAMP_VARIABLE_LENGTH_ATTRIBUTE Attribute[SAMP_SERVER_VARIABLE_ATTRIBUTES];
|
|||
|
|
|||
|
|
|||
|
} SAMP_ON_DISK_SERVER_OBJECT, *PSAMP_ON_DISK_SERVER_OBJECT;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// DOMAIN object on-disk structure //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_ON_DISK_DOMAIN_OBJECT {
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field is needed for registry i/o operations.
|
|||
|
// This marks the beginning of the i/o buffer address.
|
|||
|
//
|
|||
|
|
|||
|
KEY_VALUE_PARTIAL_INFORMATION Header1;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field contains the fixed length attributes of the object
|
|||
|
//
|
|||
|
|
|||
|
SAMP_V1_0A_FIXED_LENGTH_DOMAIN V1Fixed;
|
|||
|
|
|||
|
|
|||
|
#if SAMP_DOMAIN_STORED_SEPARATELY
|
|||
|
|
|||
|
//
|
|||
|
// This header is needed for registry operations if fixed and
|
|||
|
// variable length attributes are stored separately. This
|
|||
|
// field marks the beginning of the i/o buffer address for
|
|||
|
// variable-length attribute i/o.
|
|||
|
//
|
|||
|
|
|||
|
KEY_VALUE_PARTIAL_INFORMATION Header2;
|
|||
|
#endif //SAMP_DOMAIN_STORED_SEPARATELY
|
|||
|
|
|||
|
//
|
|||
|
// Elements of this array point to variable-length attribute
|
|||
|
// values.
|
|||
|
//
|
|||
|
|
|||
|
SAMP_VARIABLE_LENGTH_ATTRIBUTE Attribute[SAMP_DOMAIN_VARIABLE_ATTRIBUTES];
|
|||
|
|
|||
|
|
|||
|
} SAMP_ON_DISK_DOMAIN_OBJECT, *PSAMP_ON_DISK_DOMAIN_OBJECT;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// USER object on-disk structure //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_ON_DISK_USER_OBJECT {
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field is needed for registry i/o operations.
|
|||
|
// This marks the beginning of the i/o buffer address.
|
|||
|
//
|
|||
|
|
|||
|
KEY_VALUE_PARTIAL_INFORMATION Header1;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field contains the fixed length attributes of the object
|
|||
|
//
|
|||
|
|
|||
|
SAMP_V1_0A_FIXED_LENGTH_USER V1Fixed;
|
|||
|
|
|||
|
|
|||
|
#if SAMP_USER_STORED_SEPARATELY
|
|||
|
|
|||
|
//
|
|||
|
// This header is needed for registry operations if fixed and
|
|||
|
// variable length attributes are stored separately. This
|
|||
|
// field marks the beginning of the i/o buffer address for
|
|||
|
// variable-length attribute i/o.
|
|||
|
//
|
|||
|
|
|||
|
KEY_VALUE_PARTIAL_INFORMATION Header2;
|
|||
|
#endif //SAMP_USER_STORED_SEPARATELY
|
|||
|
|
|||
|
//
|
|||
|
// Elements of this array point to variable-length attribute
|
|||
|
// values.
|
|||
|
//
|
|||
|
|
|||
|
SAMP_VARIABLE_LENGTH_ATTRIBUTE Attribute[SAMP_USER_VARIABLE_ATTRIBUTES];
|
|||
|
|
|||
|
|
|||
|
} SAMP_ON_DISK_USER_OBJECT, *PSAMP_ON_DISK_USER_OBJECT;
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// GROUP object on-disk structure //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_ON_DISK_GROUP_OBJECT {
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field is needed for registry i/o operations.
|
|||
|
// This marks the beginning of the i/o buffer address.
|
|||
|
//
|
|||
|
|
|||
|
KEY_VALUE_PARTIAL_INFORMATION Header1;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field contains the fixed length attributes of the object
|
|||
|
//
|
|||
|
|
|||
|
SAMP_V1_0A_FIXED_LENGTH_GROUP V1Fixed;
|
|||
|
|
|||
|
|
|||
|
#if SAMP_GROUP_STORED_SEPARATELY
|
|||
|
|
|||
|
//
|
|||
|
// This header is needed for registry operations if fixed and
|
|||
|
// variable length attributes are stored separately. This
|
|||
|
// field marks the beginning of the i/o buffer address for
|
|||
|
// variable-length attribute i/o.
|
|||
|
//
|
|||
|
|
|||
|
KEY_VALUE_PARTIAL_INFORMATION Header2;
|
|||
|
#endif //SAMP_GROUP_STORED_SEPARATELY
|
|||
|
|
|||
|
//
|
|||
|
// Elements of this array point to variable-length attribute
|
|||
|
// values.
|
|||
|
//
|
|||
|
|
|||
|
SAMP_VARIABLE_LENGTH_ATTRIBUTE Attribute[SAMP_GROUP_VARIABLE_ATTRIBUTES];
|
|||
|
|
|||
|
|
|||
|
} SAMP_ON_DISK_GROUP_OBJECT, *PSAMP_ON_DISK_GROUP_OBJECT;
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// ALIAS object on-disk structure //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef struct _SAMP_ON_DISK_ALIAS_OBJECT {
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field is needed for registry i/o operations.
|
|||
|
// This marks the beginning of the i/o buffer address.
|
|||
|
//
|
|||
|
|
|||
|
KEY_VALUE_PARTIAL_INFORMATION Header1;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// This field contains the fixed length attributes of the object
|
|||
|
//
|
|||
|
|
|||
|
SAMP_V1_FIXED_LENGTH_ALIAS V1Fixed;
|
|||
|
|
|||
|
|
|||
|
#if SAMP_ALIAS_STORED_SEPARATELY
|
|||
|
|
|||
|
//
|
|||
|
// This header is needed for registry operations if fixed and
|
|||
|
// variable length attributes are stored separately. This
|
|||
|
// field marks the beginning of the i/o buffer address for
|
|||
|
// variable-length attribute i/o.
|
|||
|
//
|
|||
|
|
|||
|
KEY_VALUE_PARTIAL_INFORMATION Header2;
|
|||
|
#endif //SAMP_ALIAS_STORED_SEPARATELY
|
|||
|
|
|||
|
//
|
|||
|
// Elements of this array point to variable-length attribute
|
|||
|
// values.
|
|||
|
//
|
|||
|
|
|||
|
SAMP_VARIABLE_LENGTH_ATTRIBUTE Attribute[SAMP_ALIAS_VARIABLE_ATTRIBUTES];
|
|||
|
|
|||
|
|
|||
|
} SAMP_ON_DISK_ALIAS_OBJECT, *PSAMP_ON_DISK_ALIAS_OBJECT;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Enumerated types for manipulating group memberships //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
typedef enum _SAMP_MEMBERSHIP_DELTA {
|
|||
|
AddToAdmin,
|
|||
|
NoChange,
|
|||
|
RemoveFromAdmin
|
|||
|
} SAMP_MEMBERSHIP_DELTA, *PSAMP_MEMBERSHIP_DELTA;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// The following prototypes are usable throughout the process that SAM //
|
|||
|
// resides in. THESE ROUTINES MUST NOT BE CALLED BY NON-SAM CODE ! //
|
|||
|
// //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
//
|
|||
|
// SAM's shutdown notification routine
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
BOOL SampShutdownNotification( DWORD dwCtrlType );
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Sub-Component initialization routines
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN SampInitializeDomainObject(VOID);
|
|||
|
|
|||
|
NTSTATUS SampInitializeRegistry ( VOID );
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampReInitializeSingleDomain(
|
|||
|
ULONG Index
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// database lock related services
|
|||
|
//
|
|||
|
|
|||
|
VOID
|
|||
|
SampAcquireReadLock(VOID);
|
|||
|
|
|||
|
VOID
|
|||
|
SampReleaseReadLock(VOID);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAcquireWriteLock( VOID );
|
|||
|
|
|||
|
VOID
|
|||
|
SampSetTransactionDomain(
|
|||
|
IN ULONG DomainIndex
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampCommitAndRetainWriteLock(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampReleaseWriteLock(
|
|||
|
IN BOOLEAN Commit
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Context block manipulation services
|
|||
|
//
|
|||
|
|
|||
|
PSAMP_OBJECT
|
|||
|
SampCreateContext(
|
|||
|
IN SAMP_OBJECT_TYPE Type,
|
|||
|
IN BOOLEAN TrustedClient
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SampDeleteContext(
|
|||
|
IN PSAMP_OBJECT Context
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampLookupContext(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ACCESS_MASK DesiredAccess,
|
|||
|
IN SAMP_OBJECT_TYPE ExpectedType,
|
|||
|
OUT PSAMP_OBJECT_TYPE FoundType
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SampReferenceContext(
|
|||
|
IN PSAMP_OBJECT Context
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampDeReferenceContext(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN BOOLEAN Commit
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SampInvalidateContextAddress(
|
|||
|
IN PSAMP_OBJECT Context
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SampInvalidateGroupContexts(
|
|||
|
IN ULONG Rid
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SampInvalidateAliasContexts(
|
|||
|
IN ULONG Rid
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SampInvalidateUserContexts(
|
|||
|
IN ULONG Rid
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SampInvalidateContextListKeys(
|
|||
|
IN PLIST_ENTRY Head,
|
|||
|
IN BOOLEAN Close
|
|||
|
);
|
|||
|
|
|||
|
#ifdef SAMP_DBG_CONTEXT_TRACKING
|
|||
|
VOID
|
|||
|
SampDumpContexts(
|
|||
|
VOID
|
|||
|
);
|
|||
|
#endif
|
|||
|
|
|||
|
//
|
|||
|
// Unicode String related services - These use MIDL_user_allocate and
|
|||
|
// MIDL_user_free so that the resultant strings can be given to the
|
|||
|
// RPC runtime.
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampInitUnicodeString(
|
|||
|
OUT PUNICODE_STRING String,
|
|||
|
IN USHORT MaximumLength
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAppendUnicodeString(
|
|||
|
IN OUT PUNICODE_STRING Target,
|
|||
|
IN PUNICODE_STRING StringToAdd
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SampFreeUnicodeString(
|
|||
|
IN PUNICODE_STRING String
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SampFreeOemString(
|
|||
|
IN POEM_STRING String
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampDuplicateUnicodeString(
|
|||
|
IN PUNICODE_STRING OutString,
|
|||
|
IN PUNICODE_STRING InString
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampUnicodeToOemString(
|
|||
|
IN POEM_STRING OutString,
|
|||
|
IN PUNICODE_STRING InString
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampBuildDomainSubKeyName(
|
|||
|
OUT PUNICODE_STRING KeyName,
|
|||
|
IN PUNICODE_STRING SubKeyName OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRetrieveStringFromRegistry(
|
|||
|
IN HANDLE ParentKey,
|
|||
|
IN PUNICODE_STRING SubKeyName,
|
|||
|
OUT PUNICODE_STRING Body
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampPutStringToRegistry(
|
|||
|
IN BOOLEAN RelativeToDomain,
|
|||
|
IN PUNICODE_STRING SubKeyName,
|
|||
|
IN PUNICODE_STRING Body
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// user, group and alias Account services
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampBuildAccountKeyName(
|
|||
|
IN SAMP_OBJECT_TYPE ObjectType,
|
|||
|
OUT PUNICODE_STRING AccountKeyName,
|
|||
|
IN PUNICODE_STRING AccountName
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampBuildAccountSubKeyName(
|
|||
|
IN SAMP_OBJECT_TYPE ObjectType,
|
|||
|
OUT PUNICODE_STRING AccountKeyName,
|
|||
|
IN ULONG AccountRid,
|
|||
|
IN PUNICODE_STRING SubKeyName OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampBuildAliasMembersKeyName(
|
|||
|
IN PSID AccountSid,
|
|||
|
OUT PUNICODE_STRING DomainKeyName,
|
|||
|
OUT PUNICODE_STRING AccountKeyName
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampValidateNewAccountName(
|
|||
|
PUNICODE_STRING NewAccountName
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampValidateAccountNameChange(
|
|||
|
IN PUNICODE_STRING NewAccountName,
|
|||
|
IN PUNICODE_STRING OldAccountName
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampIsAccountBuiltIn(
|
|||
|
ULONG Rid
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAdjustAccountCount(
|
|||
|
IN SAMP_OBJECT_TYPE ObjectType,
|
|||
|
IN BOOLEAN Increment
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRetrieveAccountCounts(
|
|||
|
OUT PULONG UserCount,
|
|||
|
OUT PULONG GroupCount,
|
|||
|
OUT PULONG AliasCount
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampEnumerateAccountNamesCommon(
|
|||
|
IN SAMPR_HANDLE DomainHandle,
|
|||
|
IN SAMP_OBJECT_TYPE ObjectType,
|
|||
|
IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext,
|
|||
|
OUT PSAMPR_ENUMERATION_BUFFER *Buffer,
|
|||
|
IN ULONG PreferedMaximumLength,
|
|||
|
IN ULONG Filter,
|
|||
|
OUT PULONG CountReturned
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampEnumerateAccountNames(
|
|||
|
IN SAMP_OBJECT_TYPE ObjectType,
|
|||
|
IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext,
|
|||
|
OUT PSAMPR_ENUMERATION_BUFFER *Buffer,
|
|||
|
IN ULONG PreferedMaximumLength,
|
|||
|
IN ULONG Filter,
|
|||
|
OUT PULONG CountReturned,
|
|||
|
IN BOOLEAN TrustedClient
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampLookupAccountRid(
|
|||
|
IN SAMP_OBJECT_TYPE ObjectType,
|
|||
|
IN PUNICODE_STRING Name,
|
|||
|
IN NTSTATUS NotFoundStatus,
|
|||
|
OUT PULONG Rid,
|
|||
|
OUT PSID_NAME_USE Use
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampLookupAccountName(
|
|||
|
IN ULONG Rid,
|
|||
|
OUT PUNICODE_STRING Name OPTIONAL,
|
|||
|
OUT PSAMP_OBJECT_TYPE ObjectType
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampOpenAccount(
|
|||
|
IN SAMP_OBJECT_TYPE ObjectType,
|
|||
|
IN SAMPR_HANDLE DomainHandle,
|
|||
|
IN ACCESS_MASK DesiredAccess,
|
|||
|
IN ULONG AccountId,
|
|||
|
IN BOOLEAN WriteLockHeld,
|
|||
|
OUT SAMPR_HANDLE *AccountHandle
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampCreateAccountContext(
|
|||
|
IN SAMP_OBJECT_TYPE ObjectType,
|
|||
|
IN ULONG AccountId,
|
|||
|
IN BOOLEAN TrustedClient,
|
|||
|
IN BOOLEAN AccountExists,
|
|||
|
OUT PSAMP_OBJECT *AccountContext
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampCreateAccountSid(
|
|||
|
PSAMP_OBJECT AccountContext,
|
|||
|
PSID *AccountSid
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRetrieveGroupV1Fixed(
|
|||
|
IN PSAMP_OBJECT GroupContext,
|
|||
|
IN PSAMP_V1_0A_FIXED_LENGTH_GROUP V1Fixed
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampReplaceGroupV1Fixed(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN PSAMP_V1_0A_FIXED_LENGTH_GROUP V1Fixed
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRetrieveUserV1aFixed(
|
|||
|
IN PSAMP_OBJECT UserContext,
|
|||
|
OUT PSAMP_V1_0A_FIXED_LENGTH_USER V1aFixed
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampReplaceUserV1aFixed(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN PSAMP_V1_0A_FIXED_LENGTH_USER V1aFixed
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRetrieveGroupMembers(
|
|||
|
IN PSAMP_OBJECT GroupContext,
|
|||
|
IN PULONG MemberCount,
|
|||
|
IN PULONG *Members OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampChangeAccountOperatorAccessToMember(
|
|||
|
IN PRPC_SID MemberSid,
|
|||
|
IN SAMP_MEMBERSHIP_DELTA ChangingToAdmin,
|
|||
|
IN SAMP_MEMBERSHIP_DELTA ChangingToOperator
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampChangeOperatorAccessToUser(
|
|||
|
IN ULONG UserRid,
|
|||
|
IN SAMP_MEMBERSHIP_DELTA ChangingToAdmin,
|
|||
|
IN SAMP_MEMBERSHIP_DELTA ChangingToOperator
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampChangeOperatorAccessToUser2(
|
|||
|
IN PSAMP_OBJECT UserContext,
|
|||
|
IN PSAMP_V1_0A_FIXED_LENGTH_USER V1aFixed,
|
|||
|
IN SAMP_MEMBERSHIP_DELTA AddingToAdmin,
|
|||
|
IN SAMP_MEMBERSHIP_DELTA AddingToOperator
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Access validation and auditing related services
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampValidateObjectAccess(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ACCESS_MASK DesiredAccess,
|
|||
|
IN BOOLEAN ObjectCreation
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SampAuditOnClose(
|
|||
|
IN PSAMP_OBJECT Context
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampCreateNullToken(
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Authenticated RPC and SPX support services
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
ULONG
|
|||
|
SampSecureRpcInit(
|
|||
|
PVOID Ignored
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
SampStartNonNamedPipeTransports(
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Notification package routines.
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampPasswordChangeNotify(
|
|||
|
PUNICODE_STRING UserName,
|
|||
|
ULONG RelativeId,
|
|||
|
PUNICODE_STRING NewPassword
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampPasswordChangeFilter(
|
|||
|
IN PUNICODE_STRING UserName,
|
|||
|
IN PUNICODE_STRING FullName,
|
|||
|
IN PUNICODE_STRING NewPassword,
|
|||
|
IN BOOLEAN SetOperation
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampLoadNotificationPackages(
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampDeltaChangeNotify(
|
|||
|
IN PSID DomainSid,
|
|||
|
IN SECURITY_DB_DELTA_TYPE DeltaType,
|
|||
|
IN SECURITY_DB_OBJECT_TYPE ObjectType,
|
|||
|
IN ULONG ObjectRid,
|
|||
|
IN PUNICODE_STRING ObjectName,
|
|||
|
IN PLARGE_INTEGER ModifiedCount,
|
|||
|
IN PSAM_DELTA_DATA DeltaData OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Security Descriptor production services
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampInitializeDomainDescriptors(
|
|||
|
ULONG Index
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetNewAccountSecurity(
|
|||
|
IN SAMP_OBJECT_TYPE ObjectType,
|
|||
|
IN BOOLEAN Admin,
|
|||
|
IN BOOLEAN TrustedClient,
|
|||
|
IN BOOLEAN RestrictCreatorAccess,
|
|||
|
IN ULONG NewAccountRid,
|
|||
|
OUT PSECURITY_DESCRIPTOR *NewDescriptor,
|
|||
|
OUT PULONG DescriptorLength
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetObjectSD(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
OUT PULONG SecurityDescriptorLength,
|
|||
|
OUT PSECURITY_DESCRIPTOR *SecurityDescriptor
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampModifyAccountSecurity(
|
|||
|
IN SAMP_OBJECT_TYPE ObjectType,
|
|||
|
IN BOOLEAN Admin,
|
|||
|
IN PSECURITY_DESCRIPTOR OldDescriptor,
|
|||
|
OUT PSECURITY_DESCRIPTOR *NewDescriptor,
|
|||
|
OUT PULONG DescriptorLength
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Group related services
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAddUserToGroup(
|
|||
|
IN ULONG GroupRid,
|
|||
|
IN ULONG UserRid
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRemoveUserFromGroup(
|
|||
|
IN ULONG GroupRid,
|
|||
|
IN ULONG UserRid
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Alias related services
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAlBuildAliasInformation(
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAlQueryAliasMembership(
|
|||
|
IN SAMPR_HANDLE DomainHandle,
|
|||
|
IN PSAMPR_PSID_ARRAY SidArray,
|
|||
|
OUT PSAMPR_ULONG_ARRAY Membership
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAlQueryMembersOfAlias(
|
|||
|
IN SAMPR_HANDLE AliasHandle,
|
|||
|
OUT PSAMPR_PSID_ARRAY MemberSids
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAlAddMembersToAlias(
|
|||
|
IN SAMPR_HANDLE AliasHandle,
|
|||
|
IN ULONG Options,
|
|||
|
IN PSAMPR_PSID_ARRAY MemberSids
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAlRemoveMembersFromAlias(
|
|||
|
IN SAMPR_HANDLE AliasHandle,
|
|||
|
IN ULONG Options,
|
|||
|
IN PSAMPR_PSID_ARRAY MemberSids
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAlLookupMembersInAlias(
|
|||
|
IN SAMPR_HANDLE AliasHandle,
|
|||
|
IN ULONG AliasRid,
|
|||
|
IN PSAMPR_PSID_ARRAY MemberSids,
|
|||
|
OUT PULONG MembershipCount
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAlDeleteAlias(
|
|||
|
IN SAMPR_HANDLE *AliasHandle
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAlRemoveAccountFromAllAliases(
|
|||
|
IN PSID AccountSid,
|
|||
|
IN BOOLEAN CheckAccess,
|
|||
|
IN SAMPR_HANDLE DomainHandle OPTIONAL,
|
|||
|
IN PULONG MembershipCount OPTIONAL,
|
|||
|
IN PULONG *Membership OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRetrieveAliasMembers(
|
|||
|
IN PSAMP_OBJECT AliasContext,
|
|||
|
IN PULONG MemberCount,
|
|||
|
IN PSID **Members OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRemoveAccountFromAllAliases(
|
|||
|
IN PSID AccountSid,
|
|||
|
IN BOOLEAN CheckAccess,
|
|||
|
IN SAMPR_HANDLE DomainHandle OPTIONAL,
|
|||
|
IN PULONG MembershipCount OPTIONAL,
|
|||
|
IN PULONG *Membership OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAlSlowQueryAliasMembership(
|
|||
|
IN SAMPR_HANDLE DomainHandle,
|
|||
|
IN PSAMPR_PSID_ARRAY SidArray,
|
|||
|
OUT PSAMPR_ULONG_ARRAY Membership
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRetrieveAliasMembership(
|
|||
|
IN PSID Account,
|
|||
|
OUT PULONG MemberCount OPTIONAL,
|
|||
|
IN OUT PULONG BufferSize OPTIONAL,
|
|||
|
OUT PULONG Buffer OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// User related services
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetPrivateUserData(
|
|||
|
PSAMP_OBJECT UserContext,
|
|||
|
OUT PULONG DataLength,
|
|||
|
OUT PVOID *Data
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampSetPrivateUserData(
|
|||
|
PSAMP_OBJECT UserContext,
|
|||
|
IN ULONG DataLength,
|
|||
|
IN PVOID Data
|
|||
|
);
|
|||
|
NTSTATUS
|
|||
|
SampRetrieveUserGroupAttribute(
|
|||
|
IN ULONG UserRid,
|
|||
|
IN ULONG GroupRid,
|
|||
|
OUT PULONG Attribute
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampAddGroupToUserMembership(
|
|||
|
IN ULONG GroupRid,
|
|||
|
IN ULONG Attributes,
|
|||
|
IN ULONG UserRid,
|
|||
|
IN SAMP_MEMBERSHIP_DELTA AdminGroup,
|
|||
|
IN SAMP_MEMBERSHIP_DELTA OperatorGroup,
|
|||
|
OUT PBOOLEAN UserActive
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampSetGroupAttributesOfUser(
|
|||
|
IN ULONG GroupRid,
|
|||
|
IN ULONG Attributes,
|
|||
|
IN ULONG UserRid
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRemoveMembershipUser(
|
|||
|
IN ULONG GroupRid,
|
|||
|
IN ULONG UserRid,
|
|||
|
IN SAMP_MEMBERSHIP_DELTA AdminGroup,
|
|||
|
IN SAMP_MEMBERSHIP_DELTA OperatorGroup,
|
|||
|
OUT PBOOLEAN UserActive
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
SampStillInLockoutObservationWindow(
|
|||
|
PSAMP_OBJECT UserContext,
|
|||
|
PSAMP_V1_0A_FIXED_LENGTH_USER V1aFixed
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Cached display information services
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampInitializeDisplayInformation (
|
|||
|
ULONG DomainIndex
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampMarkDisplayInformationInvalid (
|
|||
|
SAMP_OBJECT_TYPE ObjectType
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampUpdateDisplayInformation (
|
|||
|
PSAMP_ACCOUNT_DISPLAY_INFO OldAccountInfo OPTIONAL,
|
|||
|
PSAMP_ACCOUNT_DISPLAY_INFO NewAccountInfo OPTIONAL,
|
|||
|
SAMP_OBJECT_TYPE ObjectType
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Miscellaneous services
|
|||
|
//
|
|||
|
|
|||
|
LARGE_INTEGER
|
|||
|
SampAddDeltaTime(
|
|||
|
IN LARGE_INTEGER Time,
|
|||
|
IN LARGE_INTEGER DeltaTime
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampCreateFullSid(
|
|||
|
PSID DomainSid,
|
|||
|
ULONG Rid,
|
|||
|
PSID *AccountSid
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampSplitSid(
|
|||
|
IN PSID AccountSid,
|
|||
|
OUT PSID *DomainSid,
|
|||
|
OUT ULONG *Rid
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SampNotifyNetlogonOfDelta(
|
|||
|
IN SECURITY_DB_DELTA_TYPE DeltaType,
|
|||
|
IN SECURITY_DB_OBJECT_TYPE ObjectType,
|
|||
|
IN ULONG ObjectRid,
|
|||
|
IN PUNICODE_STRING ObjectName,
|
|||
|
IN DWORD ReplicateImmediately,
|
|||
|
IN PSAM_DELTA_DATA DeltaData OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SampWriteEventLog (
|
|||
|
IN USHORT EventType,
|
|||
|
IN USHORT EventCategory OPTIONAL,
|
|||
|
IN ULONG EventID,
|
|||
|
IN PSID UserSid OPTIONAL,
|
|||
|
IN USHORT NumStrings,
|
|||
|
IN ULONG DataSize,
|
|||
|
IN PUNICODE_STRING *Strings OPTIONAL,
|
|||
|
IN PVOID Data OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetAccountDomainInfo(
|
|||
|
PPOLICY_ACCOUNT_DOMAIN_INFO *PolicyAccountDomainInfo
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampUpgradeSamDatabase(
|
|||
|
ULONG Revision
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Old RPC stub routine definitions used in SamIFree()
|
|||
|
//
|
|||
|
|
|||
|
void _fgs__RPC_UNICODE_STRING (RPC_UNICODE_STRING * _source);
|
|||
|
void _fgs__SAMPR_RID_ENUMERATION (SAMPR_RID_ENUMERATION * _source);
|
|||
|
void _fgs__SAMPR_ENUMERATION_BUFFER (SAMPR_ENUMERATION_BUFFER * _source);
|
|||
|
void _fgs__SAMPR_SR_SECURITY_DESCRIPTOR (SAMPR_SR_SECURITY_DESCRIPTOR * _source);
|
|||
|
void _fgs__SAMPR_GET_GROUPS_BUFFER (SAMPR_GET_GROUPS_BUFFER * _source);
|
|||
|
void _fgs__SAMPR_GET_MEMBERS_BUFFER (SAMPR_GET_MEMBERS_BUFFER * _source);
|
|||
|
void _fgs__SAMPR_LOGON_HOURS (SAMPR_LOGON_HOURS * _source);
|
|||
|
void _fgs__SAMPR_ULONG_ARRAY (SAMPR_ULONG_ARRAY * _source);
|
|||
|
void _fgs__SAMPR_SID_INFORMATION (SAMPR_SID_INFORMATION * _source);
|
|||
|
void _fgs__SAMPR_PSID_ARRAY (SAMPR_PSID_ARRAY * _source);
|
|||
|
void _fgs__SAMPR_RETURNED_USTRING_ARRAY (SAMPR_RETURNED_USTRING_ARRAY * _source);
|
|||
|
void _fgs__SAMPR_DOMAIN_GENERAL_INFORMATION (SAMPR_DOMAIN_GENERAL_INFORMATION * _source);
|
|||
|
void _fgs__SAMPR_DOMAIN_GENERAL_INFORMATION2 (SAMPR_DOMAIN_GENERAL_INFORMATION2 * _source);
|
|||
|
void _fgs__SAMPR_DOMAIN_OEM_INFORMATION (SAMPR_DOMAIN_OEM_INFORMATION * _source);
|
|||
|
void _fgs__SAMPR_DOMAIN_NAME_INFORMATION (SAMPR_DOMAIN_NAME_INFORMATION * _source);
|
|||
|
void _fgs_SAMPR_DOMAIN_REPLICATION_INFORMATION (SAMPR_DOMAIN_REPLICATION_INFORMATION * _source);
|
|||
|
void _fgu__SAMPR_DOMAIN_INFO_BUFFER (SAMPR_DOMAIN_INFO_BUFFER * _source, DOMAIN_INFORMATION_CLASS _branch);
|
|||
|
void _fgu__SAMPR_GROUP_INFO_BUFFER (SAMPR_GROUP_INFO_BUFFER * _source, GROUP_INFORMATION_CLASS _branch);
|
|||
|
void _fgu__SAMPR_ALIAS_INFO_BUFFER (SAMPR_ALIAS_INFO_BUFFER * _source, ALIAS_INFORMATION_CLASS _branch);
|
|||
|
void _fgu__SAMPR_USER_INFO_BUFFER (SAMPR_USER_INFO_BUFFER * _source, USER_INFORMATION_CLASS _branch);
|
|||
|
void _fgu__SAMPR_DISPLAY_INFO_BUFFER (SAMPR_DISPLAY_INFO_BUFFER * _source, DOMAIN_DISPLAY_INFORMATION _branch);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// SAM object attribute manipulation services
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
SampInitObjectInfoAttributes();
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampStoreObjectAttributes(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN BOOLEAN UseKeyHandle
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampDeleteAttributeKeys(
|
|||
|
IN PSAMP_OBJECT Context
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetFixedAttributes(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN BOOLEAN MakeCopy,
|
|||
|
OUT PVOID *FixedData
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampSetFixedAttributes(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN PVOID FixedData
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetUnicodeStringAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN BOOLEAN MakeCopy,
|
|||
|
OUT PUNICODE_STRING UnicodeAttribute
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampSetUnicodeStringAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN PUNICODE_STRING Attribute
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetSidAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN BOOLEAN MakeCopy,
|
|||
|
OUT PSID *Sid
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampSetSidAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN PSID Attribute
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetAccessAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN BOOLEAN MakeCopy,
|
|||
|
OUT PULONG Revision,
|
|||
|
OUT PSECURITY_DESCRIPTOR *SecurityDescriptor
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampSetAccessAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN PSECURITY_DESCRIPTOR Attribute,
|
|||
|
IN ULONG Length
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetUlongArrayAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN BOOLEAN MakeCopy,
|
|||
|
OUT PULONG *UlongArray,
|
|||
|
OUT PULONG UsedCount,
|
|||
|
OUT PULONG LengthCount
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampSetUlongArrayAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN PULONG Attribute,
|
|||
|
IN ULONG UsedCount,
|
|||
|
IN ULONG LengthCount
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetLargeIntArrayAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN BOOLEAN MakeCopy,
|
|||
|
OUT PLARGE_INTEGER *LargeIntArray,
|
|||
|
OUT PULONG Count
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampSetLargeIntArrayAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN PLARGE_INTEGER Attribute,
|
|||
|
IN ULONG Count
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetSidArrayAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN BOOLEAN MakeCopy,
|
|||
|
OUT PSID *SidArray,
|
|||
|
OUT PULONG Length,
|
|||
|
OUT PULONG Count
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampSetSidArrayAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN PSID Attribute,
|
|||
|
IN ULONG Length,
|
|||
|
IN ULONG Count
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampGetLogonHoursAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN BOOLEAN MakeCopy,
|
|||
|
OUT PLOGON_HOURS LogonHours
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampSetLogonHoursAttribute(
|
|||
|
IN PSAMP_OBJECT Context,
|
|||
|
IN ULONG AttributeIndex,
|
|||
|
IN PLOGON_HOURS Attribute
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SampFreeAttributeBuffer(
|
|||
|
IN PSAMP_OBJECT Context
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRtlConvertUlongToUnicodeString(
|
|||
|
IN ULONG Value,
|
|||
|
IN ULONG Base OPTIONAL,
|
|||
|
IN ULONG DigitCount,
|
|||
|
IN BOOLEAN AllocateDestinationString,
|
|||
|
OUT PUNICODE_STRING UnicodeString
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampRtlWellKnownPrivilegeCheck(
|
|||
|
BOOLEAN ImpersonateClient,
|
|||
|
IN ULONG PrivilegeId,
|
|||
|
IN OPTIONAL PCLIENT_ID ClientId
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Functions to upgrade the SAM database and fix SAM bugs
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SampUpgradeSamDatabase(
|
|||
|
ULONG Revision
|
|||
|
);
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// 2-3 tree generic table routines //
|
|||
|
// These should be moved to RTL directory if a general need arises. //
|
|||
|
// //
|
|||
|
/////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
RtlInitializeGenericTable2 (
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PRTL_GENERIC_2_COMPARE_ROUTINE CompareRoutine,
|
|||
|
PRTL_GENERIC_2_ALLOCATE_ROUTINE AllocateRoutine,
|
|||
|
PRTL_GENERIC_2_FREE_ROUTINE FreeRoutine
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
RtlInsertElementGenericTable2 (
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PVOID Element,
|
|||
|
PBOOLEAN NewElement
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
RtlDeleteElementGenericTable2 (
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PVOID Element
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
RtlLookupElementGenericTable2 (
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PVOID Element
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
RtlEnumerateGenericTable2 (
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PVOID *RestartKey
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
RtlRestartKeyByIndexGenericTable2(
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
ULONG I,
|
|||
|
PVOID *RestartKey
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
RtlRestartKeyByValueGenericTable2(
|
|||
|
PRTL_GENERIC_TABLE2 Table,
|
|||
|
PVOID Element,
|
|||
|
PVOID *RestartKey
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
RtlNumberElementsGenericTable2(
|
|||
|
PRTL_GENERIC_TABLE2 Table
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
RtlIsGenericTable2Empty (
|
|||
|
PRTL_GENERIC_TABLE2 Table
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Shared global variables //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
extern NT_PRODUCT_TYPE SampProductType;
|
|||
|
|
|||
|
extern RTL_RESOURCE SampLock;
|
|||
|
extern BOOLEAN SampTransactionWithinDomain;
|
|||
|
extern ULONG SampTransactionDomainIndex;
|
|||
|
|
|||
|
extern SAMP_SERVICE_STATE SampServiceState;
|
|||
|
|
|||
|
extern BOOLEAN SampAccountAuditingEnabled;
|
|||
|
|
|||
|
extern HANDLE SampKey;
|
|||
|
extern PRTL_RXACT_CONTEXT SampRXactContext;
|
|||
|
|
|||
|
extern SAMP_OBJECT_INFORMATION SampObjectInformation[ SampUnknownObjectType ];
|
|||
|
|
|||
|
extern ULONG SampActiveContextCount;
|
|||
|
extern LIST_ENTRY SampContextListHead;
|
|||
|
|
|||
|
extern ULONG SampDefinedDomainsCount;
|
|||
|
extern PSAMP_DEFINED_DOMAINS SampDefinedDomains;
|
|||
|
extern UNICODE_STRING SampFixedAttributeName;
|
|||
|
extern UNICODE_STRING SampVariableAttributeName;
|
|||
|
extern UNICODE_STRING SampCombinedAttributeName;
|
|||
|
|
|||
|
extern UNICODE_STRING SampNameDomains;
|
|||
|
extern UNICODE_STRING SampNameDomainGroups;
|
|||
|
extern UNICODE_STRING SampNameDomainAliases;
|
|||
|
extern UNICODE_STRING SampNameDomainAliasesMembers;
|
|||
|
extern UNICODE_STRING SampNameDomainUsers;
|
|||
|
extern UNICODE_STRING SampNameDomainAliasesNames;
|
|||
|
extern UNICODE_STRING SampNameDomainGroupsNames;
|
|||
|
extern UNICODE_STRING SampNameDomainUsersNames;
|
|||
|
|
|||
|
extern UNICODE_STRING SampBackSlash;
|
|||
|
extern UNICODE_STRING SampNullString;
|
|||
|
extern UNICODE_STRING SampSamSubsystem;
|
|||
|
extern UNICODE_STRING SampServerObjectName;
|
|||
|
|
|||
|
|
|||
|
extern LARGE_INTEGER SampImmediatelyDeltaTime;
|
|||
|
extern LARGE_INTEGER SampNeverDeltaTime;
|
|||
|
extern LARGE_INTEGER SampHasNeverTime;
|
|||
|
extern LARGE_INTEGER SampWillNeverTime;
|
|||
|
|
|||
|
extern LM_OWF_PASSWORD SampNullLmOwfPassword;
|
|||
|
extern NT_OWF_PASSWORD SampNullNtOwfPassword;
|
|||
|
|
|||
|
extern TIME LastUnflushedChange;
|
|||
|
extern BOOLEAN FlushThreadCreated;
|
|||
|
extern BOOLEAN FlushImmediately;
|
|||
|
|
|||
|
extern LONG SampFlushThreadMinWaitSeconds;
|
|||
|
extern LONG SampFlushThreadMaxWaitSeconds;
|
|||
|
extern LONG SampFlushThreadExitDelaySeconds;
|
|||
|
|
|||
|
//
|
|||
|
// Warning: these SIDs are only defined during the first boot of setup,
|
|||
|
// when the code in bldsam3.c for building the SAM database, has been
|
|||
|
// run. On a normal build they are both NULL.
|
|||
|
//
|
|||
|
|
|||
|
extern PSID SampBuiltinDomainSid;
|
|||
|
extern PSID SampAccountDomainSid;
|
|||
|
|
|||
|
extern PSID SampWorldSid;
|
|||
|
extern PSID SampAnonymousSid;
|
|||
|
extern PSID SampAdministratorUserSid;
|
|||
|
extern PSID SampAdministratorsAliasSid;
|
|||
|
extern HANDLE SampNullSessionToken;
|
|||
|
extern BOOLEAN SampNetwareServerInstalled;
|
|||
|
extern BOOLEAN SampIpServerInstalled;
|
|||
|
extern BOOLEAN SampAppletalkServerInstalled;
|
|||
|
extern BOOLEAN SampVinesServerInstalled;
|
|||
|
|
|||
|
#if SAMP_DIAGNOSTICS
|
|||
|
|
|||
|
extern ULONG SampGlobalFlag;
|
|||
|
|
|||
|
#endif //SAMP_DIAGNOSTICS
|
|||
|
|
|||
|
#endif // _NTSAMP_
|