mirror of https://github.com/infosecn1nja/C3.git
Add PointerTupleConverter
parent
34b15bef69
commit
59ab19d75e
|
@ -389,4 +389,68 @@ namespace FSecure
|
||||||
return ByteVector::Size(ByteConverter<T>::Convert(obj));
|
return ByteVector::Size(ByteConverter<T>::Convert(obj));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// @brief Class providing simple way of generating ByteConverter listing only necessary members once.
|
||||||
|
/// ByteConverter can use this functionality by inheriting from PointerTupleConverter and providing
|
||||||
|
/// public static std::tuple<T::*...> MemberPointers() method.
|
||||||
|
/// Use std::make_tuple to create return value out of member list.
|
||||||
|
/// ByteVector can declare its own versions of To/From/Size methods if it needs dedicated logic to serialize type.
|
||||||
|
/// @tparam T Type for serialization.
|
||||||
|
template <typename T>
|
||||||
|
struct PointerTupleConverter : TupleConverter<T>
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/// @brief Class applying pointers to members to object.
|
||||||
|
/// Compatible with std::apply.
|
||||||
|
/// Creates TupleConverter<T>::ConvertType object.
|
||||||
|
class ReferenceMembers
|
||||||
|
{
|
||||||
|
T const& m_Obj;
|
||||||
|
public:
|
||||||
|
ReferenceMembers(T const& obj) : m_Obj{ obj } {}
|
||||||
|
|
||||||
|
template <typename ... Ts>
|
||||||
|
auto operator () (Ts T::*...ts) const
|
||||||
|
{
|
||||||
|
return Utils::MakeConversionTuple(m_Obj.*ts ...);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @brief Function assigning object members with tuple of values using tuple member pointers.
|
||||||
|
/// @tparam PtrTpl Tuple of pointers to members type.
|
||||||
|
/// @tparam ValueTpl Tuple of values type.
|
||||||
|
/// @tparam Is Index sequence used to match tuples one to one.
|
||||||
|
/// @param obj Object to be assigned.
|
||||||
|
/// @param ptrTpl Tuple of pointers to members.
|
||||||
|
/// @param valueTpl Tuple of values.
|
||||||
|
template <typename PtrTpl, typename ValueTpl, size_t ...Is>
|
||||||
|
static void AssignToMembers(T& obj, PtrTpl const& ptrTpl, ValueTpl valueTpl, std::index_sequence<Is...>)
|
||||||
|
{
|
||||||
|
((obj.*(std::get<Is>(ptrTpl)) = std::move(std::get<Is>(valueTpl))), ...);
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// @brief Default implementation of Convert method used by TupleConverter for serialization.
|
||||||
|
/// Function uses ByteConverter<T>::MemberPointers() to reference T object members.
|
||||||
|
/// @param obj object to be serialized.
|
||||||
|
/// @return TupleConverter<T>::ConvertType values to be serialized.
|
||||||
|
static auto Convert(T const& obj)
|
||||||
|
{
|
||||||
|
auto ptrTpl = ByteConverter<T>::MemberPointers();
|
||||||
|
return std::apply(ReferenceMembers{ obj }, ptrTpl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Shadowed TupleConverter<T>::From initalizing only selected members, skipped ones will be default initialized.
|
||||||
|
/// @note T must have default constructor.
|
||||||
|
/// @param bv. Buffer with serialized data.
|
||||||
|
/// @return constructed type.
|
||||||
|
static T From(ByteView& bv)
|
||||||
|
{
|
||||||
|
auto ret = T{};
|
||||||
|
auto ptrTpl = ByteConverter<T>::MemberPointers();
|
||||||
|
auto valueTpl = TupleConverter<T>::Convert(bv);
|
||||||
|
AssignToMembers(ret, ptrTpl, std::move(valueTpl), std::make_index_sequence<std::tuple_size<decltype(ptrTpl)>::value>{});
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,43 +36,24 @@ namespace FSecure
|
||||||
|
|
||||||
/// overload ByteConverter for RTL_OSVERSIONINFOEXW. szCSDVersion and wSuiteMask are omitted.
|
/// overload ByteConverter for RTL_OSVERSIONINFOEXW. szCSDVersion and wSuiteMask are omitted.
|
||||||
template<>
|
template<>
|
||||||
struct ByteConverter<RTL_OSVERSIONINFOEXW> : TupleConverter<RTL_OSVERSIONINFOEXW>
|
struct ByteConverter<RTL_OSVERSIONINFOEXW> : PointerTupleConverter<RTL_OSVERSIONINFOEXW>
|
||||||
{
|
{
|
||||||
/// Serialization of RTL_OSVERSIONINFOEXW type to/from ByteVector.
|
/// Serialization of RTL_OSVERSIONINFOEXW type to/from ByteVector.
|
||||||
/// @param obj. Object to be serialized.
|
/// @param obj. Object to be serialized.
|
||||||
static auto Convert(RTL_OSVERSIONINFOEXW const& obj)
|
static auto MemberPointers()
|
||||||
{
|
{
|
||||||
return Utils::MakeConversionTuple(
|
using T = RTL_OSVERSIONINFOEXW;
|
||||||
obj.dwOSVersionInfoSize,
|
return std::make_tuple(
|
||||||
obj.dwMajorVersion,
|
&T::dwOSVersionInfoSize,
|
||||||
obj.dwMinorVersion,
|
&T::dwMajorVersion,
|
||||||
obj.dwBuildNumber,
|
&T::dwMinorVersion,
|
||||||
obj.dwPlatformId,
|
&T::dwBuildNumber,
|
||||||
obj.wServicePackMajor,
|
&T::dwPlatformId,
|
||||||
obj.wServicePackMinor,
|
&T::wServicePackMajor,
|
||||||
obj.wProductType
|
&T::wServicePackMinor,
|
||||||
|
&T::wProductType
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Deserialize from ByteView.
|
|
||||||
/// Special version of From must be provided, because some of not important members are omitted at serialization.
|
|
||||||
/// @param bv. Buffer with serialized data.
|
|
||||||
/// @return RTL_OSVERSIONINFOEXW.
|
|
||||||
static RTL_OSVERSIONINFOEXW From(ByteView& bv)
|
|
||||||
{
|
|
||||||
RTL_OSVERSIONINFOEXW obj = {0,};
|
|
||||||
ByteReader{ bv }.Read(
|
|
||||||
obj.dwOSVersionInfoSize,
|
|
||||||
obj.dwMajorVersion,
|
|
||||||
obj.dwMinorVersion,
|
|
||||||
obj.dwBuildNumber,
|
|
||||||
obj.dwPlatformId,
|
|
||||||
obj.wServicePackMajor,
|
|
||||||
obj.wServicePackMinor,
|
|
||||||
obj.wProductType
|
|
||||||
);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// overload ByteConverter for HostInfo
|
/// overload ByteConverter for HostInfo
|
||||||
|
|
Loading…
Reference in New Issue