windows-nt/Source/XPSP1/NT/ds/published/dload/ntdsa.c
2020-09-26 16:20:57 +08:00

927 lines
14 KiB
C

#include "dspch.h"
#pragma hdrstop
#include <ntdsa.h>
#include <wxlpc.h>
#include <drs.h>
#include <scache.h>
#include <dbglobal.h>
#include <mdglobal.h>
#include <mappings.h>
//
// Notes on stub behavior
//
//
// Whenever possible, STATUS_PROCEDURE_NOT_FOUHD, ERROR_PROC_NOT_FOUND, NULL,
// or FALSE is returned.
//
//
// Some of the functions below require the caller to look at an OUT
// parameter to determine whether the results of the function (in addition
// or independent of the return value). Since these are private functions
// there is no need in shipping code to check for the validity of the OUT
// parameter (typically a pointer). These values should always be present
// in RTM versions.
//
//
// Some functions don't return a status and were designed to never fail
// (for example, functions that effectively do a table lookup). For these
// functions there is no reasonable return value. However, this is not
// a practical issue since these API's would only be called after the DS
// initialized which means that API would have already been "snapped" in via
// GetProcAddress().
//
// Of course, it is possible to rewrite these routines to return errors,
// however, as above, this will have no practical effect.
//
#define NTDSA_STUB_NO_REASONABLE_DEFAULT 0xFFFFFFFF
//
// Most Dir functions return 0 on success and simply a non zero on failure.
// The error space can be from the DB layer or sometimes from the Jet layer.
// To extract the real error, the caller looks at an OUT parameter. In
// these cases we return a standard failure value.
//
#define NTDSA_STUB_GENERAL_FAILURE (!0)
static
unsigned
AppendRDN(
DSNAME *pDNBase,
DSNAME *pDNNew,
ULONG ulBufSize,
WCHAR *pRDNVal,
ULONG RDNlen,
ATTRTYP AttId
)
{
return NTDSA_STUB_GENERAL_FAILURE;
}
static
ULONG
DirAddEntry (
ADDARG * pAddArg,
ADDRES ** ppAddRes
)
{
*ppAddRes = NULL;
return NTDSA_STUB_GENERAL_FAILURE;
}
static
NTSTATUS
DirErrorToNtStatus(
IN DWORD DirError,
IN COMMRES *CommonResult
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
DWORD
DirErrorToWinError(
IN DWORD DirError,
IN COMMRES *CommonResult
)
{
return ERROR_PROC_NOT_FOUND;
}
static
ULONG
DirFindEntry(
FINDARG *pFindArg,
FINDRES ** ppFindRes
)
{
*ppFindRes = NULL;
return NTDSA_STUB_GENERAL_FAILURE;
}
static
DWORD
DirGetDomainHandle(
DSNAME *pDomainDN
)
{
return NTDSA_STUB_GENERAL_FAILURE;
}
static
ULONG
DirModifyDN(
MODIFYDNARG * pModifyDNArg,
MODIFYDNRES ** ppModifyDNRes
)
{
*ppModifyDNRes = NULL;
return NTDSA_STUB_GENERAL_FAILURE;
}
static
ULONG
DirModifyEntry (
MODIFYARG * pModifyArg,
MODIFYRES ** ppModifyRes
)
{
*ppModifyRes = NULL;
return NTDSA_STUB_GENERAL_FAILURE;
}
static
ULONG
DirNotifyRegister(
SEARCHARG *pSearchArg,
NOTIFYARG *pNotifyArg,
NOTIFYRES **ppNotifyRes
)
{
*ppNotifyRes = NULL;
return NTDSA_STUB_GENERAL_FAILURE;
}
static
ULONG
DirNotifyUnRegister(
DWORD hServer,
NOTIFYRES **pNotifyRes
)
{
*pNotifyRes = NULL;
return NTDSA_STUB_GENERAL_FAILURE;
}
static
ULONG
DirOperationControl(
OPARG * pOpArg,
OPRES ** ppOpRes
)
{
*ppOpRes= NULL;
return NTDSA_STUB_GENERAL_FAILURE;
}
static
ULONG
DirProtectEntry(
IN DSNAME *pObj
)
{
return NTDSA_STUB_GENERAL_FAILURE;
}
static
ULONG
DirRead (
READARG FAR * pReadArg,
READRES ** ppReadRes
)
{
*ppReadRes = NULL;
return NTDSA_STUB_GENERAL_FAILURE;
}
static
ULONG
DirRemoveEntry (
REMOVEARG * pRemoveArg,
REMOVERES ** ppRemoveRes
)
{
*ppRemoveRes = NULL;
return NTDSA_STUB_GENERAL_FAILURE;
}
static
ULONG
DirSearch (
SEARCHARG * pSearchArg,
SEARCHRES ** ppSearchRes
)
{
*ppSearchRes = NULL;
return NTDSA_STUB_GENERAL_FAILURE;
}
static
NTSTATUS
DsChangeBootOptions(
WX_AUTH_TYPE BootOption,
ULONG Flags,
PVOID NewKey,
ULONG cbNewKey
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
BOOL
DsCheckConstraint(
IN ATTRTYP attID,
IN ATTRVAL *pAttVal,
IN BOOL fVerifyAsRDN
)
{
return FALSE;
}
static
WX_AUTH_TYPE
DsGetBootOptions(
VOID
)
{
return WxNone;
}
static
NTSTATUS
DsInitialize(
ULONG Flags,
IN PDS_INSTALL_PARAM InParams OPTIONAL,
OUT PDS_INSTALL_RESULT OutParams OPTIONAL
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
NTSTATUS
DsUninitialize(
BOOL fExternalOnly
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
BOOLEAN
DsaWaitUntilServiceIsRunning(
CHAR *ServiceName
)
{
return FALSE;
}
static
ENTINF *
GCVerifyCacheLookup(
DSNAME *pDSName
)
{
return NULL;
}
static
DWORD
GetConfigParam(
char * parameter,
void * value,
DWORD dwSize
)
{
return ERROR_PROC_NOT_FOUND;
}
static
DWORD
GetConfigParamAllocW(
IN PWCHAR parameter,
OUT PVOID *value,
OUT PDWORD pdwSize
)
{
return ERROR_PROC_NOT_FOUND;
}
static
DWORD
GetConfigParamW(
WCHAR * parameter,
void * value,
DWORD dwSize
)
{
return ERROR_PROC_NOT_FOUND;
}
static
NTSTATUS
GetConfigurationName(
DWORD which,
DWORD *pcbName,
DSNAME *pName
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
unsigned
GetRDNInfoExternal(
const DSNAME *pDN,
WCHAR *pRDNVal,
ULONG *pRDNlen,
ATTRTYP *pRDNtype
)
{
return NTDSA_STUB_GENERAL_FAILURE;
}
static
DWORD
ImpersonateAnyClient(
void
)
{
return ERROR_PROC_NOT_FOUND;
}
static
VOID
InitCommarg(
COMMARG *pCommArg
)
{
return;
}
static
int
NameMatched(
const DSNAME *pDN1,
const DSNAME *pDN2
)
{
return !0;
}
static
unsigned
QuoteRDNValue(
const WCHAR * pVal,
unsigned ccVal,
WCHAR * pQuote,
unsigned ccQuoteBufMax
)
{
return NTDSA_STUB_GENERAL_FAILURE;
}
static
BOOLEAN
SampAddLoopbackTask(
IN PVOID NotifyInfo
)
{
return FALSE;
}
static
BOOL
SampAmIGC()
{
return FALSE;
}
static
NTSTATUS
SampComputeGroupType(
ULONG ObjectClass,
ULONG GroupType,
NT4_GROUP_TYPE *pNT4GroupType,
NT5_GROUP_TYPE *pNT5GroupType,
BOOLEAN *pSecurityEnabled
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
ULONG
SampDeriveMostBasicDsClass(
ULONG DerivedClass
)
{
return DerivedClass;
}
static
ULONG
SampDsAttrFromSamAttr(
SAMP_OBJECT_TYPE ObjectType,
ULONG SamAttr
)
{
return NTDSA_STUB_NO_REASONABLE_DEFAULT;
}
static
ULONG
SampDsClassFromSamObjectType(
ULONG SamObjectType
)
{
return NTDSA_STUB_NO_REASONABLE_DEFAULT;
}
static
BOOL
SampExistsDsLoopback(
DSNAME **ppLoopbackName
)
{
return FALSE;
}
static
BOOL
SampExistsDsTransaction()
{
return FALSE;
}
static
NTSTATUS
SampGCLookupNames(
IN ULONG cNames,
IN UNICODE_STRING *rNames,
OUT ENTINF **rEntInf
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
NTSTATUS
SampGCLookupSids(
IN ULONG cSid,
IN PSID *rpSid,
OUT PDS_NAME_RESULTW *Results
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
NTSTATUS
SampGetAccountCounts(
DSNAME * DomainObjectName,
BOOLEAN GetApproximateCount,
int * UserCount,
int * GroupCount,
int * AliasCount
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
NTSTATUS
SampGetClassAttribute(
IN ULONG ClassId,
IN ULONG Attribute,
OUT PULONG attLen,
OUT PVOID pattVal
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
NTSTATUS
SampGetDisplayEnumerationIndex (
IN DSNAME *DomainName,
IN DOMAIN_DISPLAY_INFORMATION DisplayInformation,
IN PRPC_UNICODE_STRING Prefix,
OUT PULONG Index,
OUT PRESTART *RestartToReturn
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
ULONG
SampGetDsAttrIdByName(
UNICODE_STRING AttributeIdentifier
)
{
return NTDSA_STUB_NO_REASONABLE_DEFAULT;
}
static
VOID
SampGetEnterpriseSidList(
IN PULONG pcSids,
IN OPTIONAL PSID * rgSids
)
{
*pcSids = 0;
if (rgSids) {
*rgSids = NULL;
}
return;
}
static
NTSTATUS
SampGetGroupsForToken(
IN DSNAME * pObjName,
IN ULONG Flags,
OUT ULONG *pcSids,
OUT PSID **prpSids
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
VOID
SampGetLoopbackObjectClassId(
PULONG ClassId
)
{
*ClassId = NTDSA_STUB_NO_REASONABLE_DEFAULT;
return;
}
static
NTSTATUS
SampGetMemberships(
IN PDSNAME *rgObjNames,
IN ULONG cObjNames,
IN OPTIONAL DSNAME *pLimitingDomain,
IN REVERSE_MEMBERSHIP_OPERATION_TYPE OperationType,
OUT ULONG *pcDsNames,
OUT PDSNAME **prpDsNames,
OUT PULONG *Attributes OPTIONAL,
OUT PULONG pcSidHistory OPTIONAL,
OUT PSID **rgSidHistory OPTIONAL
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
NTSTATUS
SampGetQDIRestart(
IN PDSNAME DomainName,
IN DOMAIN_DISPLAY_INFORMATION DisplayInformation,
IN ULONG LastObjectDNT,
OUT PRESTART *ppRestart
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
NTSTATUS
SampGetServerRoleFromFSMO(
DOMAIN_SERVER_ROLE *ServerRole
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
BOOLEAN
SampIsSecureLdapConnection(
VOID
)
{
return FALSE;
}
static
BOOL
SampIsWriteLockHeldByDs()
{
return FALSE;
}
static
NTSTATUS
SampMaybeBeginDsTransaction(
SAMP_DS_TRANSACTION_CONTROL ReadOrWrite
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
NTSTATUS
SampMaybeEndDsTransaction(
SAMP_DS_TRANSACTION_CONTROL CommitOrAbort
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
NTSTATUS
SampNetlogonPing(
IN ULONG DomainHandle,
IN PUNICODE_STRING AccountName,
OUT PBOOLEAN AccountExists,
OUT PULONG UserAccountControl
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
ULONG
SampSamAttrFromDsAttr(
SAMP_OBJECT_TYPE ObjectType,
ULONG DsAttr
)
{
return NTDSA_STUB_NO_REASONABLE_DEFAULT;
}
static
ULONG
SampSamObjectTypeFromDsClass(
ULONG DsClass
)
{
return NTDSA_STUB_NO_REASONABLE_DEFAULT;
}
static
VOID
SampSetDsa(
BOOLEAN DsaFlag
)
{
return;
}
static
NTSTATUS
SampSetIndexRanges(
ULONG IndexTypeToUse,
ULONG LowLimitLength1,
PVOID LowLimit1,
ULONG LowLimitLength2,
PVOID LowLimit2,
ULONG HighLimitLength1,
PVOID HighLimit1,
ULONG HighLimitLength2,
PVOID HighLimit2,
BOOL RootOfSearchIsNcHead
)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
static
VOID
SampSetSam(
IN BOOLEAN fSAM
)
{
return;
}
static
VOID
SampSignalStart(
VOID
)
{
return;
}
static
ULONG
SampVerifySids(
ULONG cSid,
PSID *rpSid,
DSNAME ***prpDSName
)
{
return NTDSA_STUB_GENERAL_FAILURE;
}
static
void *
THAlloc(
DWORD size
)
{
return NULL;
}
static
VOID
THClearErrors()
{
return;
}
static
ULONG
THCreate(
DWORD x
)
{
return NTDSA_STUB_GENERAL_FAILURE;
}
static
ULONG
THDestroy(
void
)
{
return NTDSA_STUB_GENERAL_FAILURE;
}
static
void
THFree(
void *buff
)
{
return;
}
static
BOOL
THQuery(
void
)
{
return FALSE;
}
static
VOID
THRestore(
PVOID x
)
{
return;
}
static
PVOID
THSave()
{
return NULL;
}
static
BOOL
TrimDSNameBy(
DSNAME *pDNSrc,
ULONG cava,
DSNAME *pDNDst
)
{
return FALSE;
}
static
VOID
UnImpersonateAnyClient(
void
)
{
return;
}
static
VOID
UpdateDSPerfStats(
IN DWORD dwStat,
IN DWORD dwOperation,
IN DWORD dwChange
)
{
return;
}
static
BOOL
fNullUuid(
const UUID *pUuid
)
{
return FALSE;
}
//
// !! WARNING !! The entries below must be in alphabetical order, and are CASE SENSITIVE (eg lower case comes last!)
//
DEFINE_PROCNAME_ENTRIES(ntdsa)
{
DLPENTRY(AppendRDN)
DLPENTRY(DirAddEntry)
DLPENTRY(DirErrorToNtStatus)
DLPENTRY(DirErrorToWinError)
DLPENTRY(DirFindEntry)
DLPENTRY(DirGetDomainHandle)
DLPENTRY(DirModifyDN)
DLPENTRY(DirModifyEntry)
DLPENTRY(DirNotifyRegister)
DLPENTRY(DirNotifyUnRegister)
DLPENTRY(DirOperationControl)
DLPENTRY(DirProtectEntry)
DLPENTRY(DirRead)
DLPENTRY(DirRemoveEntry)
DLPENTRY(DirSearch)
DLPENTRY(DsChangeBootOptions)
DLPENTRY(DsCheckConstraint)
DLPENTRY(DsGetBootOptions)
DLPENTRY(DsInitialize)
DLPENTRY(DsUninitialize)
DLPENTRY(DsaWaitUntilServiceIsRunning)
DLPENTRY(GCVerifyCacheLookup)
DLPENTRY(GetConfigParam)
DLPENTRY(GetConfigParamAllocW)
DLPENTRY(GetConfigParamW)
DLPENTRY(GetConfigurationName)
DLPENTRY(GetRDNInfoExternal)
DLPENTRY(ImpersonateAnyClient)
DLPENTRY(InitCommarg)
DLPENTRY(NameMatched)
DLPENTRY(QuoteRDNValue)
DLPENTRY(SampAddLoopbackTask)
DLPENTRY(SampAmIGC)
DLPENTRY(SampComputeGroupType)
DLPENTRY(SampDeriveMostBasicDsClass)
DLPENTRY(SampDsAttrFromSamAttr)
DLPENTRY(SampDsClassFromSamObjectType)
DLPENTRY(SampExistsDsLoopback)
DLPENTRY(SampExistsDsTransaction)
DLPENTRY(SampGCLookupNames)
DLPENTRY(SampGCLookupSids)
DLPENTRY(SampGetAccountCounts)
DLPENTRY(SampGetClassAttribute)
DLPENTRY(SampGetDisplayEnumerationIndex)
DLPENTRY(SampGetDsAttrIdByName)
DLPENTRY(SampGetEnterpriseSidList)
DLPENTRY(SampGetGroupsForToken)
DLPENTRY(SampGetLoopbackObjectClassId)
DLPENTRY(SampGetMemberships)
DLPENTRY(SampGetQDIRestart)
DLPENTRY(SampGetServerRoleFromFSMO)
DLPENTRY(SampIsSecureLdapConnection)
DLPENTRY(SampIsWriteLockHeldByDs)
DLPENTRY(SampMaybeBeginDsTransaction)
DLPENTRY(SampMaybeEndDsTransaction)
DLPENTRY(SampNetlogonPing)
DLPENTRY(SampSamAttrFromDsAttr)
DLPENTRY(SampSamObjectTypeFromDsClass)
DLPENTRY(SampSetDsa)
DLPENTRY(SampSetIndexRanges)
DLPENTRY(SampSetSam)
DLPENTRY(SampSignalStart)
DLPENTRY(SampVerifySids)
DLPENTRY(THAlloc)
DLPENTRY(THClearErrors)
DLPENTRY(THCreate)
DLPENTRY(THDestroy)
DLPENTRY(THFree)
DLPENTRY(THQuery)
DLPENTRY(THRestore)
DLPENTRY(THSave)
DLPENTRY(TrimDSNameBy)
DLPENTRY(UnImpersonateAnyClient)
DLPENTRY(UpdateDSPerfStats)
DLPENTRY(fNullUuid)
};
DEFINE_PROCNAME_MAP(ntdsa)