Index: trunk/src/VBox/Debugger/DBGPlugInLinuxModuleCodeTmpl.cpp.h
===================================================================
--- trunk/src/VBox/Debugger/DBGPlugInLinuxModuleCodeTmpl.cpp.h	(revision 90407)
+++ trunk/src/VBox/Debugger/DBGPlugInLinuxModuleCodeTmpl.cpp.h	(revision 90408)
@@ -71,4 +71,8 @@
     LNX_PTR_T           uPtrDriverDir;  /**< Points to struct kobject. */
 #  endif
+#  if LNX_VER >= LNX_MK_VER(4,5,0)
+    LNX_PTR_T           uPtrMp;
+    LNX_PTR_T           uPtrCompletion; /**< Points to struct completion. */
+#  endif
 } RT_CONCAT(LNXMODKOBJECT,LNX_SUFFIX);
 #endif
@@ -80,4 +84,61 @@
 
 
+#if LNX_VER >= LNX_MK_VER(4,5,0)
+/**
+ * Red black tree node.
+ */
+typedef struct RT_CONCAT(LNXRBNODE,LNX_SUFFIX)
+{
+    LNX_ULONG_T         uRbParentColor;
+    LNX_PTR_T           uPtrRbRight;
+    LNX_PTR_T           uPtrRbLeft;
+} RT_CONCAT(LNXRBNODE,LNX_SUFFIX);
+
+
+/**
+ * Latch tree node.
+ */
+typedef struct RT_CONCAT(LNXLATCHTREENODE,LNX_SUFFIX)
+{
+    RT_CONCAT(LNXRBNODE,LNX_SUFFIX) aNode[2];
+} RT_CONCAT(LNXLATCHTREENODE,LNX_SUFFIX);
+
+
+/**
+ * Module tree node.
+ */
+typedef struct RT_CONCAT(LNXMODTREENODE,LNX_SUFFIX)
+{
+    LNX_PTR_T                              uPtrKMod;
+    RT_CONCAT(LNXLATCHTREENODE,LNX_SUFFIX) Node;
+} RT_CONCAT(LNXMODTREENODE,LNX_SUFFIX);
+
+
+/**
+ * Module layout.
+ */
+typedef struct RT_CONCAT(LNXKMODLAYOUT,LNX_SUFFIX)
+{
+    LNX_PTR_T                               uPtrBase; /**< Base pointer to text and data. */
+    uint32_t                                cb;       /**< Size of the module. */
+    uint32_t                                cbText;   /**< Size of the text section. */
+    uint32_t                                cbRo;     /**< Size of the readonly portion (text + ro data). */
+    RT_CONCAT(LNXMODTREENODE,LNX_SUFFIX)    ModTreeNd; /**< Only available when CONFIG_MODULES_TREE_LOOKUP is set (default). */
+} RT_CONCAT(LNXKMODLAYOUT,LNX_SUFFIX);
+
+
+/**
+ * Mutex.
+ */
+typedef struct RT_CONCAT(LNXMUTEX,LNX_SUFFIX)
+{
+    LNX_ULONG_T                             uOwner;
+    uint32_t                                wait_lock; /**< Actually spinlock_t */
+    PAD32ON64(0)
+    LNX_PTR_T                               uWaitLstPtrNext;
+    LNX_PTR_T                               uWaitLstPtrPrev;
+} RT_CONCAT(LNXMUTEX,LNX_SUFFIX);
+#endif
+
 
 /**
@@ -86,5 +147,70 @@
 typedef struct RT_CONCAT(LNXKMODULE,LNX_SUFFIX)
 {
-#if LNX_VER >= LNX_MK_VER(2,5,48)
+#if LNX_VER >= LNX_MK_VER(4,5,0)
+    /* Completely new layout to not feed the spaghetti dragons further. */
+    int32_t                             state;
+    PAD32ON64(0)
+    LNX_PTR_T                           uPtrNext;
+    LNX_PTR_T                           uPtrPrev;
+    char                                name[64 - sizeof(LNX_PTR_T)];
+
+    RT_CONCAT(LNXMODKOBJECT,LNX_SUFFIX) mkobj;
+    LNX_PTR_T                           uPtrModInfoAttrs;   /**< Points to struct module_attribute. */
+    LNX_PTR_T                           uPtrVersion;        /**< String pointers. */
+    LNX_PTR_T                           uPtrSrcVersion;     /**< String pointers. */
+    LNX_PTR_T                           uPtrHolderDir;      /**< Points to struct kobject. */
+
+    /** @name Exported Symbols
+     * @{ */
+    LNX_PTR_T                           uPtrSyms;           /**< Array of struct kernel_symbol. */
+    LNX_PTR_T                           uPtrCrcs;           /**< unsigned long array */
+    uint32_t                            num_syms;
+    /** @} */
+
+    /** @name Kernel parameters
+     * @{ */
+    RT_CONCAT(LNXMUTEX,LNX_SUFFIX)      Mtx;                /**< Mutex. */
+    LNX_PTR_T                           uPtrKp;             /**< Points to struct kernel_param */
+    uint32_t                            num_kp;
+    /** @} */
+
+    /** @name GPL Symbols
+     * @{ */
+    uint32_t                            num_gpl_syms;
+    LNX_PTR_T                           uPtrGplSyms;        /**< Array of struct kernel_symbol. */
+    LNX_PTR_T                           uPtrGplCrcs;        /**< unsigned long array */
+    /** @} */
+
+    /** @name Unused symbols
+     * @{ */
+    LNX_PTR_T                           uPtrUnusedSyms;     /**< Array of struct kernel_symbol. */
+    LNX_PTR_T                           uPtrUnusedCrcs;     /**< unsigned long array */
+    uint32_t                            num_unused_syms;
+    uint32_t                            num_unused_gpl_syms;
+    LNX_PTR_T                           uPtrUnusedGplSyms;  /**< Array of struct kernel_symbol. */
+    LNX_PTR_T                           uPtrUnusedGplCrcs;  /**< unsigned long array */
+    /** @} */
+
+    uint8_t                             sig_ok;
+    uint8_t                             async_probe_requested;
+
+    /** @name Future GPL Symbols
+     * @{ */
+    LNX_PTR_T                           uPtrGplFutureSyms;  /**< Array of struct kernel_symbol. */
+    LNX_PTR_T                           uPtrGplFutureCrcs;  /**< unsigned long array */
+    uint32_t                            num_gpl_future_syms;
+    /** @} */
+
+    /** @name Exception table.
+     * @{ */
+    uint32_t                            num_exentries;
+    LNX_PTR_T                           uPtrEntries;        /**< struct exception_table_entry array. */
+    /** @} */
+
+    LNX_PTR_T                           pfnInit;
+    RT_CONCAT(LNXKMODLAYOUT,LNX_SUFFIX) CoreLayout;         /**< Should be aligned on a cache line. */
+    RT_CONCAT(LNXKMODLAYOUT,LNX_SUFFIX) InitLayout;
+
+#elif LNX_VER >= LNX_MK_VER(2,5,48)
     /*
      * This first part is mostly always the same.
@@ -284,8 +410,15 @@
      * Create a simple module for it.
      */
-    LogRelFunc((" %#RX64: %#RX64 LB %#RX64 %s\n", pAddrModule->FlatPtr, Module.uPtrModuleCore, Module.cbCore, pszName));
+#if LNX_VER >= LNX_MK_VER(4,5,0)
+    LNX_PTR_T uPtrModuleCore = Module.CoreLayout.uPtrBase;
+    uint32_t cbCore          = Module.CoreLayout.cb;
+#else
+    LNX_PTR_T uPtrModuleCore = Module.uPtrModuleCore;
+    uint32_t cbCore          = (uint32_t)Module.cbCore;
+#endif
+    LogRelFunc((" %#RX64: %#RX64 LB %#RX32 %s\n", pAddrModule->FlatPtr, uPtrModuleCore, cbCore, pszName));
 
     RTDBGMOD hDbgMod;
-    rc = RTDbgModCreate(&hDbgMod, pszName, Module.cbCore, 0 /*fFlags*/);
+    rc = RTDbgModCreate(&hDbgMod, pszName, cbCore, 0 /*fFlags*/);
     if (RT_SUCCESS(rc))
     {
@@ -294,5 +427,5 @@
         {
             RTDBGAS hAs = DBGFR3AsResolveAndRetain(pUVM, DBGF_AS_KERNEL);
-            rc = RTDbgAsModuleLink(hAs, hDbgMod, Module.uPtrModuleCore, RTDBGASLINK_FLAGS_REPLACE /*fFlags*/);
+            rc = RTDbgAsModuleLink(hAs, hDbgMod, uPtrModuleCore, RTDBGASLINK_FLAGS_REPLACE /*fFlags*/);
             RTDbgAsRelease(hAs);
         }
Index: trunk/src/VBox/Debugger/DBGPlugInLinuxModuleVerTmpl.cpp.h
===================================================================
--- trunk/src/VBox/Debugger/DBGPlugInLinuxModuleVerTmpl.cpp.h	(revision 90407)
+++ trunk/src/VBox/Debugger/DBGPlugInLinuxModuleVerTmpl.cpp.h	(revision 90408)
@@ -19,4 +19,8 @@
  * Newest first so the list walker can select the right instance.
  */
+
+#define LNX_VER     LNX_MK_VER(4,5,0)
+#define LNX_SUFFIX  RT_CONCAT(_4_5_0,LNX_BIT_SUFFIX)
+#include LNX_TEMPLATE_HEADER
 
 #define LNX_VER     LNX_MK_VER(2,6,27)
