msix-packaging/MsixCore/msixmgr/CIMProvider.cpp

118 строки
3.2 KiB
C++

#include "MSIXWindows.hpp"
#include "CIMProvider.hpp"
#include "ApplyACLsProvider.hpp"
#include "msixmgrLogger.hpp"
#include "..\msixmgrLib\GeneralUtil.hpp"
#include <string>
#include <iostream>
#include <vector>
#include <TraceLoggingProvider.h>
#include "InstallUI.hpp"
using namespace MsixCoreLib;
using namespace std;
namespace MsixCoreLib
{
class CreateCIMDll
{
public:
CreateCIMDll::CreateCIMDll()
{
}
CreateCIMDll::~CreateCIMDll()
{
if (module != nullptr)
{
FreeLibrary(module);
}
}
HRESULT load()
{
module = LoadLibrary(L"createcim.dll");
if (module == nullptr)
{
std::wcout << std::endl;
std::wcout << "Failed to load createcim.dll. Please confirm the dll is next to this exe." << std::endl;
std::wcout << std::endl;
return HRESULT_FROM_WIN32(ERROR_MOD_NOT_FOUND);
}
return S_OK;
}
HMODULE get()
{
return module;
}
private:
HMODULE module;
};
HRESULT CreateAndAddToCIM(
_In_ std::wstring cimPath,
_In_ std::wstring sourcePath,
_In_ std::wstring rootDirectory)
{
CreateCIMDll createCIM;
RETURN_IF_FAILED(createCIM.load());
typedef HRESULT(STDMETHODCALLTYPE *CREATEANDADDTOCIMFILE)(
std::wstring cimFilePath,
std::wstring sourceRootPath,
std::wstring imageRootPath);
CREATEANDADDTOCIMFILE CreateAndAddToCimFileFunc =
reinterpret_cast<CREATEANDADDTOCIMFILE>
(GetProcAddress(createCIM.get(), "CreateAndAddToCIMFile"));
RETURN_IF_FAILED(CreateAndAddToCimFileFunc(cimPath, sourcePath, rootDirectory));
return S_OK;
}
HRESULT MountCIM(
std::wstring cimFilePath,
std::wstring& volumeId)
{
CreateCIMDll createCIM;
RETURN_IF_FAILED(createCIM.load());
typedef HRESULT(STDMETHODCALLTYPE *MOUNTCIM)(
std::wstring cimFilePath,
std::wstring& volumeId);
MOUNTCIM MountCIMFunc =
reinterpret_cast<MOUNTCIM>
(GetProcAddress(createCIM.get(), "MountCIM"));
RETURN_IF_FAILED(MountCIMFunc(cimFilePath, volumeId));
return S_OK;
}
HRESULT UnmountCIM(
_In_opt_ std::wstring cimFilePath,
_In_opt_ std::wstring volumeIdString)
{
CreateCIMDll createCIM;
RETURN_IF_FAILED(createCIM.load());
typedef HRESULT(STDMETHODCALLTYPE *UNMOUNTCIM)(
std::wstring cimFilePath,
std::wstring volumeIdString);
UNMOUNTCIM UnmountCIMFunc =
reinterpret_cast<UNMOUNTCIM>
(GetProcAddress(createCIM.get(), "UnmountCIM"));
RETURN_IF_FAILED(UnmountCIMFunc(cimFilePath, volumeIdString));
return S_OK;
}
}