You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
9.4 KiB
280 lines
9.4 KiB
// %%Includes: ---------------------------------------------------------------
|
|
#include "precomp.hxx"
|
|
|
|
#include <initguid.h>
|
|
|
|
#include <imd.h>
|
|
#include <mb.hxx>
|
|
#include <iadm.h>
|
|
#include "coiadm.hxx"
|
|
#include "admacl.hxx"
|
|
|
|
extern ULONG g_dwRefCount;
|
|
extern COpenHandle g_ohMasterRootHandle;
|
|
|
|
#ifdef _M_IX86
|
|
static BYTE SP3Sig[] = {0xbd, 0x9f, 0x13, 0xc5, 0x92, 0x12, 0x2b, 0x72,
|
|
0x4a, 0xba, 0xb6, 0x2a, 0xf9, 0xfc, 0x54, 0x46,
|
|
0x6f, 0xa1, 0xb4, 0xbb, 0x43, 0xa8, 0xfe, 0xf8,
|
|
0xa8, 0x23, 0x7d, 0xd1, 0x85, 0x84, 0x22, 0x6e,
|
|
0xb4, 0x58, 0x00, 0x3e, 0x0b, 0x19, 0x83, 0x88,
|
|
0x6a, 0x8d, 0x64, 0x02, 0xdf, 0x5f, 0x65, 0x7e,
|
|
0x3b, 0x4d, 0xd4, 0x10, 0x44, 0xb9, 0x46, 0x34,
|
|
0xf3, 0x40, 0xf4, 0xbc, 0x9f, 0x4b, 0x82, 0x1e,
|
|
0xcc, 0xa7, 0xd0, 0x2d, 0x22, 0xd7, 0xb1, 0xf0,
|
|
0x2e, 0xcd, 0x0e, 0x21, 0x52, 0xbc, 0x3e, 0x81,
|
|
0xb1, 0x1a, 0x86, 0x52, 0x4d, 0x3f, 0xfb, 0xa2,
|
|
0x9d, 0xae, 0xc6, 0x3d, 0xaa, 0x13, 0x4d, 0x18,
|
|
0x7c, 0xd2, 0x28, 0xce, 0x72, 0xb1, 0x26, 0x3f,
|
|
0xba, 0xf8, 0xa6, 0x4b, 0x01, 0xb9, 0xa4, 0x5c,
|
|
0x43, 0x68, 0xd3, 0x46, 0x81, 0x00, 0x7f, 0x6a,
|
|
0xd7, 0xd1, 0x69, 0x51, 0x47, 0x25, 0x14, 0x40,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
#else // other than _M_IX86
|
|
static BYTE SP3Sig[] = {0x8a, 0x06, 0x01, 0x6d, 0xc2, 0xb5, 0xa2, 0x66,
|
|
0x12, 0x1b, 0x9c, 0xe4, 0x58, 0xb1, 0xf8, 0x7d,
|
|
0xad, 0x17, 0xc1, 0xf9, 0x3f, 0x87, 0xe3, 0x9c,
|
|
0xdd, 0xeb, 0xcc, 0xa8, 0x6b, 0x62, 0xd0, 0x72,
|
|
0xe7, 0xf2, 0xec, 0xd6, 0xd6, 0x36, 0xab, 0x2d,
|
|
0x28, 0xea, 0x74, 0x07, 0x0e, 0x6c, 0x6d, 0xe1,
|
|
0xf8, 0x17, 0x97, 0x13, 0x8d, 0xb1, 0x8b, 0x0b,
|
|
0x33, 0x97, 0xc5, 0x46, 0x66, 0x96, 0xb4, 0xf7,
|
|
0x03, 0xc5, 0x03, 0x98, 0xf7, 0x91, 0xae, 0x9d,
|
|
0x00, 0x1a, 0xc6, 0x86, 0x30, 0x5c, 0xc8, 0xc7,
|
|
0x05, 0x47, 0xed, 0x2d, 0xc2, 0x0b, 0x61, 0x4b,
|
|
0xce, 0xe5, 0xb7, 0xd7, 0x27, 0x0c, 0x9e, 0x2f,
|
|
0xc5, 0x25, 0xe3, 0x81, 0x13, 0x9d, 0xa2, 0x67,
|
|
0xb2, 0x26, 0xfc, 0x99, 0x9d, 0xce, 0x0e, 0xaf,
|
|
0x30, 0xf3, 0x30, 0xec, 0xa3, 0x0a, 0xfe, 0x16,
|
|
0xb6, 0xda, 0x16, 0x90, 0x9a, 0x9a, 0x74, 0x7a,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
#endif // _M_IX86
|
|
|
|
DWORD g_dwComRegisterW;
|
|
DWORD g_bInitialized = FALSE;
|
|
IMDCOM3 *g_pcCom = NULL;
|
|
|
|
STDAPI
|
|
InitComAdmindata()
|
|
{
|
|
|
|
HRESULT hr = S_OK;
|
|
DWORD dwError;
|
|
CADMCOMSrvFactoryW *pADMClassFactoryW = NULL;
|
|
|
|
CREATE_DEBUG_PRINT_OBJECT( "coadmin" );
|
|
LOAD_DEBUG_FLAGS_FROM_REG_STR( "System\\CurrentControlSet\\Services\\iisadmin\\Parameters", 0 );
|
|
|
|
INITIALIZE_PLATFORM_TYPE();
|
|
|
|
CADMCOMW::InitObjectList();
|
|
|
|
hr = g_ohMasterRootHandle.Init( METADATA_MASTER_ROOT_HANDLE,
|
|
L"",
|
|
L"");
|
|
DBG_ASSERT( SUCCEEDED( hr ) );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[InitComAdmindata] g_ohMasterRootHandle.Init failed, hr 0x%8x\n",
|
|
hr ));
|
|
goto exit;
|
|
}
|
|
|
|
// Cache the pids of this process and the process hosting RpcSs
|
|
hr = CADMCOMW::GetPids();
|
|
if( FAILED( hr ) )
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[InitComAdmindata] CADMCOMW::GetPids failed, hr 0x%08x\n",
|
|
hr ));
|
|
goto exit;
|
|
}
|
|
|
|
hr = CoCreateInstance( GETMDCLSID( TRUE ),
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IMDCOM3,
|
|
(void**) &g_pcCom );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
goto exit;
|
|
}
|
|
|
|
hr = g_pcCom->ComMDInitialize();
|
|
if( FAILED( hr ) )
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[InitComAdmindata] Error initialize MDCOM object. hr = %x\n",
|
|
hr ));
|
|
goto exit;
|
|
}
|
|
|
|
pADMClassFactoryW = new CADMCOMSrvFactoryW;
|
|
if ( pADMClassFactoryW == NULL )
|
|
{
|
|
dwError = GetLastError();
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[InitComAdmindata] CADMCOMSrvFactoryW failed, error %lx\n",
|
|
GetLastError() ));
|
|
hr = HRESULT_FROM_WIN32( dwError );
|
|
goto exit;
|
|
}
|
|
|
|
pADMClassFactoryW->AddRef();
|
|
|
|
// register the class-object with OLE
|
|
hr = CoRegisterClassObject( GETAdminBaseCLSIDW( TRUE ),
|
|
pADMClassFactoryW,
|
|
CLSCTX_SERVER,
|
|
REGCLS_MULTIPLEUSE,
|
|
&g_dwComRegisterW );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[InitComAdmindata] CoRegisterClassObject failed, error %lx\n",
|
|
GetLastError() ));
|
|
goto exit;
|
|
}
|
|
|
|
exit:
|
|
if ( pADMClassFactoryW )
|
|
{
|
|
pADMClassFactoryW->Release();
|
|
}
|
|
|
|
if ( FAILED( hr ) )
|
|
{
|
|
AdminAclDisableAclCache();
|
|
AdminAclFlushCache();
|
|
|
|
if ( g_dwComRegisterW != 0 )
|
|
{
|
|
CoRevokeClassObject( g_dwComRegisterW );
|
|
g_dwComRegisterW = 0;
|
|
}
|
|
|
|
if ( g_pcCom != NULL )
|
|
{
|
|
g_pcCom->ComMDSendShutdownNotifications();
|
|
g_pcCom->ComMDStopEWR();
|
|
}
|
|
|
|
CADMCOMW::ShutDownObjects();
|
|
CADMCOMW::TerminateObjectList();
|
|
|
|
if ( g_pcCom != NULL )
|
|
{
|
|
g_pcCom->ComMDShutdown();
|
|
g_pcCom->ComMDTerminate(FALSE);
|
|
g_pcCom->Release();
|
|
g_pcCom = NULL;
|
|
}
|
|
}
|
|
|
|
g_bInitialized = SUCCEEDED( hr );
|
|
|
|
return hr;
|
|
} // main
|
|
|
|
STDAPI
|
|
TerminateComAdmindata()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
int i;
|
|
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Terminating ABO.\n" ));
|
|
|
|
if ( !g_bInitialized )
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Not initialized!\n" ));
|
|
goto exit;
|
|
}
|
|
|
|
g_bInitialized = FALSE;
|
|
|
|
// Go ahead and flush the acl cache, since it holds
|
|
// references to the CMDCOM object. If users come in
|
|
// after this and recreate the acls, they will be created
|
|
// again and we will just wait the 7 seconds below.
|
|
AdminAclDisableAclCache();
|
|
AdminAclFlushCache();
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Disabled the ACL cache.\n" ));
|
|
|
|
if ( g_dwComRegisterW != 0 )
|
|
{
|
|
hr = CoRevokeClassObject( g_dwComRegisterW );
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Revoked the ABO class factory %d with hr = 0x%08x.\n",
|
|
g_dwComRegisterW,
|
|
hr ));
|
|
g_dwComRegisterW = 0;
|
|
}
|
|
|
|
if ( g_pcCom != NULL )
|
|
{
|
|
hr = g_pcCom->ComMDSendShutdownNotifications();
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Sent shutdown notifications with hr = 0x%08x.\n",
|
|
hr ));
|
|
hr = g_pcCom->ComMDStopEWR();
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Stopped EWR with hr = 0x%08x.\n",
|
|
hr ));
|
|
}
|
|
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Terminating all ABO objects.\n" ));
|
|
CADMCOMW::ShutDownObjects();
|
|
|
|
// Wait for remaining accesses to the factory to complete
|
|
// Do this after ShutDownObject to avoid extra waiting
|
|
for ( i = 0; (g_dwRefCount > 0) && (i < 5); i++ )
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Waiting on factory shutdown, i = %d\n",
|
|
i ));
|
|
Sleep( 1000 );
|
|
}
|
|
|
|
// Just in case another object was allocated came through
|
|
// while we were waiting
|
|
CADMCOMW::ShutDownObjects();
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Terminated all ABO objects.\n" ));
|
|
|
|
AdminAclDisableAclCache();
|
|
AdminAclFlushCache();
|
|
|
|
CADMCOMW::TerminateObjectList();
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Terminated ABO ROT.\n" ));
|
|
|
|
if ( g_pcCom != NULL )
|
|
{
|
|
hr = g_pcCom->ComMDShutdown();
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Shutdown metadata with hr = 0x%08x.\n",
|
|
hr ));
|
|
hr = g_pcCom->ComMDTerminate(FALSE);
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Terminated metadata with hr = 0x%08x.\n",
|
|
hr ));
|
|
g_pcCom->Release();
|
|
g_pcCom = NULL;
|
|
}
|
|
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[TerminateComAdmindata] Done with hr = 0x%08x.\n",
|
|
hr ));
|
|
|
|
#ifndef _NO_TRACING_
|
|
DELETE_DEBUG_PRINT_OBJECT();
|
|
#endif
|
|
|
|
exit:
|
|
return hr;
|
|
}
|