windows-nt/Source/XPSP1/NT/ds/security/dsrole/server/loadfn.c
2020-09-26 16:20:57 +08:00

315 lines
7.7 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
setutl.c
Abstract:
Miscellaneous helper functions
Author:
Mac McLain (MacM) Feb 10, 1997
Environment:
User Mode
Revision History:
--*/
#include <setpch.h>
#include <dssetp.h>
#include <lsarpc.h>
#include <samrpc.h>
#include <samisrv.h>
#include <db.h>
#include <confname.h>
#define NTDSSET_ALLOCATE // Cause extern allocations to happen here
#include "loadfn.h"
#include <ntdsa.h>
#include <dsconfig.h>
#include <attids.h>
#include <dsp.h>
#include <lsaisrv.h>
#include <malloc.h>
#include <dsgetdc.h>
#include <lmcons.h>
#include <lmaccess.h>
#include <lmapibuf.h>
#include <lmerr.h>
#include <netsetp.h>
#include <winsock2.h>
#include <nspapi.h>
#include <dsgetdcp.h>
#include <lmremutl.h>
#include <spmgr.h> // For SetupPhase definition
#include "secure.h"
//
// Global data
//
HANDLE NtDsSetupDllHandle = NULL;
HANDLE SceSetupDllHandle = NULL;
HANDLE NtfrsApiDllHandle = NULL;
HANDLE W32TimeDllHandle = NULL;
#define DSROLE_LOAD_FPTR( status, handle, fbase ) \
if ( status == ERROR_SUCCESS ) { \
\
Dsr##fbase = ( DSR_##fbase)GetProcAddress( handle, #fbase ); \
\
if ( Dsr##fbase == NULL ) { \
\
status = ERROR_PROC_NOT_FOUND; \
} \
}
DWORD
DsRolepLoadSetupFunctions(
VOID
)
/*++
Routine Description:
This function will load all of the function pointers as utilized from Ntdsetup.dll
N.B. This routine must be called when the global op handle lock is held.
Arguments:
VOID
Returns:
ERROR_SUCCESS - Success
--*/
{
DWORD Win32Err = ERROR_SUCCESS;
HANDLE DllHandle = NULL;
ASSERT( DsRolepCurrentThreadOwnsLock() );
if ( NtDsSetupDllHandle == NULL ) {
DllHandle = LoadLibraryA( "Ntdsetup" );
if ( DllHandle == NULL ) {
DsRolepLogPrint(( DEB_ERROR, "Failed to load NTDSETUP.DLL\n" ));
Win32Err = ERROR_MOD_NOT_FOUND;
} else {
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtdsInstall );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtdsInstallShutdown );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtdsInstallUndo );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtdsGetDefaultDnsName );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtdsPrepareForDemotion );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtdsPrepareForDemotionUndo );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtdsDemote );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtdsSetReplicaMachineAccount );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtdsInstallCancel );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtdsInstallReplicateFull );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtdsFreeDnsRRInfo );
NtDsSetupDllHandle = DllHandle;
}
//
// Load the ones for secsetup
//
if ( Win32Err == ERROR_SUCCESS ) {
DllHandle = LoadLibraryA( "scecli" );
if ( DllHandle == NULL ) {
DsRolepLogPrint(( DEB_ERROR, "Failed to load SCECLI.DLL\n" ));
Win32Err = ERROR_MOD_NOT_FOUND;
} else {
DSROLE_LOAD_FPTR( Win32Err, DllHandle, SceDcPromoteSecurityEx );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, SceDcPromoCreateGPOsInSysvolEx );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, SceSetupSystemByInfName );
SceSetupDllHandle = DllHandle;
}
}
//
// Load the ones for ntfrsapi
//
if ( Win32Err == ERROR_SUCCESS ) {
DllHandle = LoadLibraryA( "ntfrsapi" );
if ( DllHandle == NULL ) {
DsRolepLogPrint(( DEB_ERROR, "Failed to load NTFRSAPI.DLL\n" ));
Win32Err = ERROR_MOD_NOT_FOUND;
} else {
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtFrsApi_PrepareForPromotionW );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtFrsApi_PrepareForDemotionW );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtFrsApi_PrepareForDemotionUsingCredW );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtFrsApi_StartPromotionW );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtFrsApi_StartDemotionW );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtFrsApi_WaitForPromotionW );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtFrsApi_WaitForDemotionW );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtFrsApi_CommitPromotionW );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtFrsApi_CommitDemotionW );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtFrsApi_AbortPromotionW );
DSROLE_LOAD_FPTR( Win32Err, DllHandle, NtFrsApi_AbortDemotionW );
NtfrsApiDllHandle = DllHandle;
}
}
if ( Win32Err == ERROR_SUCCESS ) {
DllHandle = LoadLibraryA( "w32time" );
if ( DllHandle == NULL ) {
DsRolepLogPrint(( DEB_ERROR, "Failed to load W32TIME.DLL\n" ));
Win32Err = ERROR_MOD_NOT_FOUND;
} else {
DSROLE_LOAD_FPTR( Win32Err, DllHandle, W32TimeDcPromo );
W32TimeDllHandle = DllHandle;
}
}
}
if ( Win32Err != ERROR_SUCCESS ) {
DsRolepUnloadSetupFunctions();
}
ASSERT( DsRolepCurrentThreadOwnsLock() );
return( Win32Err );
}
VOID
DsRolepUnloadSetupFunctions(
VOID
)
/*++
Routine Description:
This function will unload the dll handles loaded by DsRolepLoadSetupFunctions
N.B. This routine must be called when the global op handle lock is held.
Arguments:
VOID
Returns:
VOID
--*/
{
DWORD Win32Err = ERROR_SUCCESS;
ASSERT( DsRolepCurrentThreadOwnsLock() );
if ( NtDsSetupDllHandle != NULL ) {
FreeLibrary( NtDsSetupDllHandle );
NtDsSetupDllHandle = NULL;
}
if ( SceSetupDllHandle != NULL ) {
FreeLibrary( SceSetupDllHandle );
SceSetupDllHandle = NULL;
}
if ( NtfrsApiDllHandle != NULL ) {
FreeLibrary( NtfrsApiDllHandle );
NtfrsApiDllHandle = NULL;
}
if ( W32TimeDllHandle != NULL ) {
FreeLibrary( W32TimeDllHandle );
W32TimeDllHandle = NULL;
}
DsRolepInitSetupFunctions();
ASSERT( DsRolepCurrentThreadOwnsLock() );
return;
}
VOID
DsRolepInitSetupFunctions(
VOID
)
/*++
Routine Description:
This function will initialize the setup function pointers to NULL
Arguments:
VOID
Returns:
VOID
--*/
{
DsrNtdsInstall = NULL;
DsrNtdsInstallShutdown = NULL;
DsrNtdsInstallUndo = NULL;
DsrNtdsGetDefaultDnsName = NULL;
DsrNtdsPrepareForDemotion = NULL;
DsrNtdsPrepareForDemotionUndo = NULL;
DsrNtdsDemote = NULL;
DsrNtdsSetReplicaMachineAccount = NULL;
DsrNtdsInstallCancel = NULL;
DsrNtdsFreeDnsRRInfo = NULL;
DsrSceDcPromoteSecurityEx = NULL;
DsrSceDcPromoCreateGPOsInSysvolEx = NULL;
DsrNtFrsApi_PrepareForPromotionW = NULL;
DsrNtFrsApi_PrepareForDemotionW = NULL;
DsrNtFrsApi_StartPromotionW = NULL;
DsrNtFrsApi_StartDemotionW = NULL;
DsrNtFrsApi_WaitForPromotionW = NULL;
DsrNtFrsApi_WaitForDemotionW = NULL;
DsrNtFrsApi_CommitPromotionW = NULL;
DsrNtFrsApi_CommitDemotionW = NULL;
DsrNtFrsApi_AbortPromotionW = NULL;
DsrNtFrsApi_AbortDemotionW = NULL;
DsrW32TimeDcPromo = NULL;
}