summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/CFKit/Utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/CFKit/Utils.h')
-rw-r--r--src/kernel/CFKit/Utils.h48
1 files changed, 48 insertions, 0 deletions
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