/*++ 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 #include #include #include #include #include #include #define NTDSSET_ALLOCATE // Cause extern allocations to happen here #include "loadfn.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // 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; }