Index: trunk/include/VBox/sup.h
===================================================================
--- trunk/include/VBox/sup.h	(revision 64276)
+++ trunk/include/VBox/sup.h	(revision 64281)
@@ -272,5 +272,5 @@
     /** CPU group number (always zero, except on windows). */
     uint16_t                iCpuGroup;
-    /** CPU group number (same as iCpuSet, except on windows). */
+    /** CPU group member number (same as iCpuSet, except on windows). */
     uint16_t                iCpuGroupMember;
     /** The APIC ID of this CPU. */
@@ -289,4 +289,24 @@
 typedef SUPGIPCPU *PSUPGIPCPU;
 
+/**
+ * CPU group information.
+ * @remarks Windows only.
+ */
+typedef struct SUPGIPCPUGROUP
+{
+    /** Current number of CPUs in this group. */
+    uint16_t volatile       cMembers;
+    /** Maximum number of CPUs in the group. */
+    uint16_t                cMaxMembers;
+    /** The CPU set index of the members. This table has cMaxMembers entries.
+     * @note For various reasons, entries from cMembers and up to cMaxMembers are
+     *       may change as the host OS does set dynamic assignments during CPU
+     *       hotplugging. */
+    int16_t                 aiCpuSetIdxs[1];
+} SUPGIPCPUGROUP;
+/** Pointer to a GIP CPU group structure. */
+typedef SUPGIPCPUGROUP *PSUPGIPCPUGROUP;
+/** Pointer to a const GIP CPU group structure. */
+typedef SUPGIPCPUGROUP const *PCSUPGIPCPUGROUP;
 
 /**
@@ -358,4 +378,11 @@
 /** @} */
 
+/** @def SUPGIP_MAX_CPU_GROUPS
+ * Maximum number of CPU groups.  */
+#if RTCPUSET_MAX_CPUS >= 256
+# define SUPGIP_MAX_CPU_GROUPS 256
+#else
+# define SUPGIP_MAX_CPU_GROUPS 256
+#endif
 
 /**
@@ -419,7 +446,9 @@
     /** CPU set index to CPU table index. */
     uint16_t            aiCpuFromCpuSetIdx[RTCPUSET_MAX_CPUS];
-    /** Table indexed by CPU group index to get the CPU set index of the first
-     *  CPU. */
-    uint16_t            aiFirstCpuSetIdxFromCpuGroup[RTCPUSET_MAX_CPUS];
+    /** Table indexed by CPU group to containing offsets to SUPGIPCPUGROUP
+     * structures, invalid entries are set to UINT16_MAX.  The offsets are relative
+     * to the start of this structure.
+     * @note Windows only. The other hosts sets all entries to UINT16_MAX! */
+    uint16_t            aoffCpuGroup[SUPGIP_MAX_CPU_GROUPS];
 
     /** Array of per-cpu data.
@@ -450,5 +479,5 @@
  * Upper 16 bits is the major version. Major version is only changed with
  * incompatible changes in the GIP. */
-#define SUPGLOBALINFOPAGE_VERSION   0x00070000
+#define SUPGLOBALINFOPAGE_VERSION   0x00080000
 
 /**
Index: trunk/include/iprt/mangling.h
===================================================================
--- trunk/include/iprt/mangling.h	(revision 64276)
+++ trunk/include/iprt/mangling.h	(revision 64281)
@@ -1303,4 +1303,6 @@
 # define RTMpGetCurFrequency                            RT_MANGLER(RTMpGetCurFrequency)
 # define RTMpGetDescription                             RT_MANGLER(RTMpGetDescription)
+# define RTMpGetCpuGroupCounts                          RT_MANGLER(RTMpGetCpuGroupCounts)
+# define RTMpGetMaxCpuGroupCount                        RT_MANGLER(RTMpGetMaxCpuGroupCount)
 # define RTMpGetMaxCpuId                                RT_MANGLER(RTMpGetMaxCpuId)
 # define RTMpGetMaxFrequency                            RT_MANGLER(RTMpGetMaxFrequency)
@@ -1326,4 +1328,5 @@
 # define RTMpOnSpecific                                 RT_MANGLER(RTMpOnSpecific)             /* r0drv */
 # define RTMpPokeCpu                                    RT_MANGLER(RTMpPokeCpu)                /* r0drv */
+# define RTMpSetIndexFromCpuGroupMember                 RT_MANGLER(RTMpSetIndexFromCpuGroupMember)
 # define RTMsgError                                     RT_MANGLER(RTMsgError)
 # define RTMsgErrorExit                                 RT_MANGLER(RTMsgErrorExit)
Index: trunk/include/iprt/mp.h
===================================================================
--- trunk/include/iprt/mp.h	(revision 64276)
+++ trunk/include/iprt/mp.h	(revision 64281)
@@ -88,4 +88,35 @@
  */
 RTDECL(RTCPUID) RTMpCpuIdFromSetIndex(int iCpu);
+
+/**
+ * Translates an NT process group member to a CPU set index.
+ *
+ * @returns CPU set index, -1 if not valid.
+ * @param   idxGroup        The CPU group.
+ * @param   idxMember       The CPU group member number.
+ *
+ * @remarks Only available on Windows.
+ */
+RTDECL(int) RTMpSetIndexFromCpuGroupMember(uint32_t idxGroup, uint32_t idxMember);
+
+/**
+ * Gets the member numbers for a CPU group.
+ *
+ * @returns Maximum number of group members.
+ * @param   idxGroup        The CPU group.
+ * @param   pcActive        Where to return the number of active members.
+ *
+ * @remarks Only available on Windows.
+ */
+RTDECL(uint32_t) RTMpGetCpuGroupCounts(uint32_t idxGroup, uint32_t *pcActive);
+
+/**
+ * Get the maximum number of CPU groups.
+ *
+ * @returns Maximum number of CPU groups.
+ *
+ * @remarks Only available on Windows.
+ */
+RTDECL(uint32_t) RTMpGetMaxCpuGroupCount(void);
 
 /**
Index: trunk/include/iprt/nt/nt.h
===================================================================
--- trunk/include/iprt/nt/nt.h	(revision 64276)
+++ trunk/include/iprt/nt/nt.h	(revision 64281)
@@ -2454,4 +2454,6 @@
 typedef  ULONG   (NTAPI *PFNKEQUERYMAXIMUMPROCESSORCOUNTEX)(USHORT GroupNumber);
 typedef  USHORT  (NTAPI *PFNKEQUERYMAXIMUMGROUPCOUNT)(VOID);
+typedef  ULONG   (NTAPI *PFNKEQUERYACTIVEPROCESSORCOUNT)(KAFFINITY *pfActiveProcessors);
+typedef  ULONG   (NTAPI *PFNKEQUERYACTIVEPROCESSORCOUNTEX)(USHORT GroupNumber);
 typedef  NTSTATUS (NTAPI *PFNKEQUERYLOGICALPROCESSORRELATIONSHIP)(PROCESSOR_NUMBER *pProcNumber,
                                                                   LOGICAL_PROCESSOR_RELATIONSHIP RelationShipType,
