2025-04-27 07:49:33 -04:00

188 lines
5.4 KiB
C++

// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 2000
//
// File: aucatalog.cpp
//
// Purpose: AU catalog file using IU
//
// Creator: WeiW
//
// History: 08-15-01 first created
//
//--------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
HANDLE ghMutex;
HRESULT AUBaseCatalog::PrepareIU(BOOL fOnline)
{
HRESULT hr = S_OK;
Reset();
// all IU function pointers are initialized
DEBUGMSG("PrepareIU() starts");
#ifdef DBG
DWORD dwStart = GetTickCount();
#endif
m_hIUCtl = LoadLibraryFromSystemDir(_T("iuctl.dll"));
if (NULL == m_hIUCtl)
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to load iuctl.dll");
goto end;
}
if (NULL == (m_pfnCtlLoadIUEngine = (PFN_LoadIUEngine) GetProcAddress(m_hIUCtl, "LoadIUEngine")))
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to GetProcAddress for LoadIUEngine");
goto end;
}
if (NULL == (m_pfnCtlUnLoadIUEngine = (PFN_UnLoadIUEngine) GetProcAddress(m_hIUCtl, "UnLoadIUEngine")))
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to getprocaddress for UnloadIUEngine");
goto end;
}
if (NULL == (m_pfnCtlCancelEngineLoad = (PFN_CtlCancelEngineLoad) GetProcAddress(m_hIUCtl, "CtlCancelEngineLoad")))
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() fail to get procaddress for CtlCancelEngineLoad");
goto end;
}
if (NULL == (m_hIUEng = m_pfnCtlLoadIUEngine(TRUE, !fOnline))) //synchronous mode, selfupdate IU engine if required
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to call LoadIUEngine");
goto end;
}
m_fEngineLoaded = TRUE;
if (NULL == (m_pfnGetSystemSpec = (PFN_GetSystemSpec) GetProcAddress(m_hIUEng, "EngGetSystemSpec")))
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to getprocaddress for GetSystemSpec");
goto end;
}
if (NULL == (m_pfnGetManifest = (PFN_GetManifest) GetProcAddress(m_hIUEng, "EngGetManifest")))
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to getprocaddress for GetManifest");
goto end;
}
if (NULL == (m_pfnDetect = (PFN_Detect)GetProcAddress(m_hIUEng, "EngDetect")))
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to getprocaddress for Detect");
goto end;
}
if (NULL == (m_pfnInstall = (PFN_Install)GetProcAddress(m_hIUEng, "EngInstall")))
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to getprocaddress for Install");
goto end;
}
if (NULL == (m_pfnSetOperationMode = (PFN_SetOperationMode)GetProcAddress(m_hIUEng, "EngSetOperationMode")))
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to getprocaddress for SetOperationMode");
goto end;
}
if (NULL == (m_pfnCreateEngUpdateInstance = (PFN_CreateEngUpdateInstance)GetProcAddress(m_hIUEng, "CreateEngUpdateInstance")))
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to getprocaddress for CreateEngUpdateInstance");
goto end;
}
if (NULL == (m_pfnDeleteEngUpdateInstance = (PFN_DeleteEngUpdateInstance)GetProcAddress(m_hIUEng, "DeleteEngUpdateInstance")))
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to getprocaddress for DeleteEngUpdateInstance");
goto end;
}
if (NULL == (m_hIUEngineInst = m_pfnCreateEngUpdateInstance()))
{
hr = E_FAIL;
DEBUGMSG("AUBaseCatalog:PrepareIU() Fail to call CreateEngUpdateInstance");
goto end;
}
end:
if (FAILED(hr))
{
FreeIU();
}
#ifdef DBG
DEBUGMSG("PrepareIU() take %d msecs", GetTickCount() - dwStart);
#endif
DEBUGMSG("PrepareIU() done");
return hr;
}
// could be called even if without PrepareIU() being called first
void AUBaseCatalog::FreeIU()
{
DEBUGMSG("AUCatalog::FreeIU() starts");
#ifdef DBG
DWORD dwStart = GetTickCount();
#endif
if (NULL != m_hIUEng)
{
if (NULL != m_pfnDeleteEngUpdateInstance)
{
DEBUGMSG("calling DeleteEngUpdateInstance ....");
m_pfnDeleteEngUpdateInstance(m_hIUEngineInst);
}
if (NULL != m_pfnCtlUnLoadIUEngine)
{
DEBUGMSG("calling ctlunloadIUengine ....");
m_pfnCtlUnLoadIUEngine(m_hIUEng);
}
}
if (NULL != m_hIUCtl)
{
FreeLibrary(m_hIUCtl);
}
Reset();
#ifdef DBG
DEBUGMSG("FreeIU() take %d msecs", GetTickCount() - dwStart);
#endif
DEBUGMSG("AUCatalog::FreeIU() done");
}
HRESULT AUBaseCatalog::CancelNQuit(void)
{
HRESULT hr = S_OK;
DEBUGMSG("AUBaseCatalog::CancelNQuit() starts");
if (!m_fEngineLoaded && NULL != m_pfnCtlCancelEngineLoad)
{
DEBUGMSG("IU Engine not loaded. Cancel loading if so");
hr = m_pfnCtlCancelEngineLoad();
}
else if (m_fEngineLoaded && NULL != m_pfnSetOperationMode)
{
DEBUGMSG("IU Engine loaded. Cancel any IU operation");
hr = m_pfnSetOperationMode(m_hIUEngineInst, NULL, UPDATE_COMMAND_CANCEL);
}
DEBUGMSG("AUBaseCatalog::CancelNQuit() ends");
return hr;
}
AUBaseCatalog::~AUBaseCatalog(void)
{
// DEBUGMSG("AUBaseCatalog::~AUBaseCatalog() starts");
if (NULL != ghMutex) //client don't need this
{
WaitForSingleObject(ghMutex, INFINITE); //If CancelNQuit is being called, wait until it is done
ReleaseMutex(ghMutex);
}
// DEBUGMSG("AUBaseCatalog::~AUBaseCatalog() ends");
}