summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/CFKit
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/CFKit')
-rw-r--r--src/kernel/CFKit/GUIDWizard.h21
-rw-r--r--src/kernel/CFKit/GUIDWrapper.h48
-rw-r--r--src/kernel/CFKit/Property.h51
-rw-r--r--src/kernel/CFKit/Utils.h48
4 files changed, 168 insertions, 0 deletions
diff --git a/src/kernel/CFKit/GUIDWizard.h b/src/kernel/CFKit/GUIDWizard.h
new file mode 100644
index 00000000..8745a1f9
--- /dev/null
+++ b/src/kernel/CFKit/GUIDWizard.h
@@ -0,0 +1,21 @@
+/* ========================================
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
+
+======================================== */
+
+#pragma once
+
+#include <CFKit/GUIDWrapper.h>
+#include <NeKit/Array.h>
+#include <NeKit/ArrayList.h>
+#include <NeKit/Defines.h>
+#include <NeKit/ErrorOr.h>
+#include <NeKit/KString.h>
+#include <NeKit/Ref.h>
+#include <NeKit/Stream.h>
+
+namespace Kernel::CF::XRN::Version1 {
+Ref<GUIDSequence*> cf_make_sequence(const ArrayList<UInt32>& seq);
+ErrorOr<Ref<KString>> cf_try_guid_to_string(Ref<GUIDSequence*>& guid);
+} // namespace Kernel::CF::XRN::Version1
diff --git a/src/kernel/CFKit/GUIDWrapper.h b/src/kernel/CFKit/GUIDWrapper.h
new file mode 100644
index 00000000..2bf7b64e
--- /dev/null
+++ b/src/kernel/CFKit/GUIDWrapper.h
@@ -0,0 +1,48 @@
+/* ========================================
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
+
+======================================== */
+
+#pragma once
+
+#include <NeKit/Defines.h>
+#include <NeKit/Ref.h>
+#include <NeKit/Stream.h>
+
+/* GUID for C++ classes. */
+
+#define kXRNNil "@{........-....-M...-N...-............}"
+
+/// @brief eXtended Resource Namespace
+namespace Kernel::CF::XRN {
+union GUIDSequence final {
+ alignas(8) UShort fU8[16];
+ alignas(8) UShort fU16[8];
+ alignas(8) UInt fU32[4];
+ alignas(8) ULong fU64[2];
+
+ struct GUID {
+ alignas(8) UInt fMs1;
+ UShort fMs2;
+ UShort fMs3;
+ UChar fMs4[8];
+ } fUuid;
+};
+
+class GUID final {
+ public:
+ explicit GUID() = default;
+ ~GUID() = default;
+
+ public:
+ NE_COPY_DEFAULT(GUID)
+
+ public:
+ GUIDSequence& operator->() noexcept { return fUUID; }
+ GUIDSequence& Leak() noexcept { return fUUID; }
+
+ private:
+ GUIDSequence fUUID;
+};
+} // namespace Kernel::CF::XRN
diff --git a/src/kernel/CFKit/Property.h b/src/kernel/CFKit/Property.h
new file mode 100644
index 00000000..cfb8a599
--- /dev/null
+++ b/src/kernel/CFKit/Property.h
@@ -0,0 +1,51 @@
+/* ========================================
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
+
+======================================== */
+
+#ifndef CFKIT_PROPS_H
+#define CFKIT_PROPS_H
+
+#include <CFKit/GUIDWrapper.h>
+#include <NeKit/Array.h>
+#include <NeKit/Defines.h>
+#include <NeKit/Function.h>
+#include <NeKit/KString.h>
+
+#define kMaxPropLen (256U)
+
+namespace Kernel::CF {
+/// @brief handle to anything (number, ptr, string...)
+using PropertyId = UIntPtr;
+
+/// @brief Kernel property class.
+/// @example /prop/smp_max or /prop/kern_ver
+class Property {
+ public:
+ Property();
+ virtual ~Property();
+
+ public:
+ Property& operator=(const Property&) = default;
+ Property(const Property&) = default;
+
+ BOOL StringEquals(KBasicString<>& name);
+ PropertyId& GetValue();
+ KBasicString<>& GetKey();
+
+ private:
+ KString fName{kMaxPropLen};
+ PropertyId fValue{0UL};
+ Ref<XRN::GUID> fGUID{};
+};
+
+template <SizeT N>
+using PropertyArray = Array<Property, N>;
+} // namespace Kernel::CF
+
+namespace Kernel {
+using namespace Kernel::CF;
+}
+
+#endif // !CFKIT_PROPS_H
diff --git a/src/kernel/CFKit/Utils.h b/src/kernel/CFKit/Utils.h
new file mode 100644
index 00000000..247ad5fb
--- /dev/null
+++ b/src/kernel/CFKit/Utils.h
@@ -0,0 +1,48 @@
+#ifndef CFKIT_UTILS_H
+#define CFKIT_UTILS_H
+
+#include <KernelKit/MSDOS.h>
+#include <KernelKit/PE.h>
+
+/// @brief CFKit
+namespace Kernel::CF {
+/// @brief Finds the PE header inside the blob.
+inline auto ldr_find_exec_header(DosHeaderPtr ptrDos) -> LDR_EXEC_HEADER_PTR {
+ if (!ptrDos) return nullptr;
+
+ if (ptrDos->eMagic[0] != kMagMz0) return nullptr;
+
+ if (ptrDos->eMagic[1] != kMagMz1) return nullptr;
+
+#ifdef __NE_AMD64__
+ return (LDR_EXEC_HEADER_PTR) (VoidPtr) (&ptrDos->eLfanew + 1);
+#else
+ return (LDR_EXEC_HEADER_PTR) (VoidPtr) (&ptrDos->eLfanew);
+#endif
+}
+
+/// @brief Finds the PE optional header inside the blob.
+inline auto ldr_find_opt_exec_header(DosHeaderPtr ptrDos) -> LDR_OPTIONAL_HEADER_PTR {
+ if (!ptrDos) return nullptr;
+
+ auto exec = ldr_find_exec_header(ptrDos);
+
+ if (!exec) return nullptr;
+
+ return (LDR_OPTIONAL_HEADER_PTR) (VoidPtr) (&exec->Characteristics + 1);
+}
+
+/// @brief Finds the PE header inside the blob.
+/// @note overloaded function.
+inline auto ldr_find_exec_header(const Char* ptrDos) -> LDR_EXEC_HEADER_PTR {
+ return ldr_find_exec_header((DosHeaderPtr) ptrDos);
+}
+
+/// @brief Finds the PE header inside the blob.
+/// @note overloaded function.
+inline auto ldr_find_opt_exec_header(const Char* ptrDos) -> LDR_OPTIONAL_HEADER_PTR {
+ return ldr_find_opt_exec_header((DosHeaderPtr) ptrDos);
+}
+} // namespace Kernel::CF
+
+#endif // ifndef CFKIT_UTILS_H