#include #include #include #include #include #include #include typedef HRESULT (*CallFunc)( void ); UINT RegisterDLL( MSIHANDLE hInstall, const char *DllName ) { #if 0 CHAR DbgMessage[ MAX_PATH ]; sprintf( DbgMessage, "ProcessId %u, ThreadId %u", GetCurrentProcessId(), GetCurrentThreadId() ); MessageBoxA( NULL, DbgMessage, NULL, MB_OK ); #endif ASSERT( MsiGetMode( hInstall, MSIRUNMODE_SCHEDULED ) || MsiGetMode( hInstall, MSIRUNMODE_ROLLBACK ) ); HRESULT CoInitHr; CoInitHr = CoInitialize( NULL ); if ( FAILED( CoInitHr ) && ( RPC_E_CHANGED_MODE != CoInitHr ) ) return (UINT)CoInitHr; HMODULE hModule = NULL; HRESULT Hr = S_OK; hModule = LoadLibrary( DllName ); if ( !hModule ) { Hr = HRESULT_FROM_WIN32( GetLastError() ); goto exit; } CallFunc RegisterFunc = (CallFunc)GetProcAddress( hModule, "DllRegisterServer" ); Hr = (*RegisterFunc)(); FreeLibrary( hModule ); hModule = NULL; exit: if ( RPC_E_CHANGED_MODE != CoInitHr ) CoUninitialize(); SetLastError( Hr ); return SUCCEEDED(Hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; } UINT UnregisterDLL( MSIHANDLE hInstall, char *DllName ) { ASSERT( MsiGetMode( hInstall, MSIRUNMODE_SCHEDULED ) || MsiGetMode( hInstall, MSIRUNMODE_ROLLBACK ) ); HRESULT CoInitHr; CoInitHr = CoInitialize( NULL ); if ( FAILED( CoInitHr ) && ( RPC_E_CHANGED_MODE != CoInitHr ) ) return (UINT)CoInitHr; HMODULE hModule = NULL; HRESULT Hr = S_OK; hModule = LoadLibrary( DllName ); if ( !hModule ) { DbgPrint( "Unable to load %s, error 0x%8.8X", DllName, GetLastError() ); } else { CallFunc RegisterFunc = (CallFunc)GetProcAddress( hModule, "DllUnregisterServer" ); if ( !RegisterFunc ) { DbgPrint( "Unable to load %s!DllRegisterServer, error 0x%8.8X", DllName, GetLastError() ); } else { Hr = (*RegisterFunc)(); FreeLibrary( hModule ); hModule = NULL; if ( FAILED( Hr ) ) goto exit; } } FreeLibrary( hModule ); hModule = NULL; exit: if ( RPC_E_CHANGED_MODE == CoInitHr ) return Hr; CoUninitialize(); return SUCCEEDED(Hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; } UINT DllInstallBITSMgr( MSIHANDLE hInstall ) { return RegisterDLL( hInstall, "bitsmgr.dll" ); } UINT DllUninstallBITSMgr( MSIHANDLE hInstall ) { return UnregisterDLL( hInstall, "bitsmgr.dll" ); } UINT DllInstallBITSIsapi( MSIHANDLE hInstall ) { return RegisterDLL( hInstall, "bitssrv.dll" ); } UINT DllUninstallBITSIsapi( MSIHANDLE hInstall ) { return UnregisterDLL( hInstall, "bitssrv.dll" ); }