diff --git a/ntoskrnl/mm/ARM3/expool.c b/ntoskrnl/mm/ARM3/expool.c
index 73a229d..d105257 100644
--- a/ntoskrnl/mm/ARM3/expool.c
+++ b/ntoskrnl/mm/ARM3/expool.c
@@ -460,6 +460,89 @@ ExpComputePartialHashForAddress(IN PVOID BaseAddress)
     return (Result >> 24) ^ (Result >> 16) ^ (Result >> 8) ^ Result;
 }
 
+FORCEINLINE
+BOOLEAN
+ExpTagAllowPrint(CHAR Tag)
+{
+    if ((Tag >= 'a' && Tag <= 'z') ||
+        (Tag >= 'A' && Tag <= 'Z') ||
+        Tag == ' ')
+    {
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+VOID
+MiDumpNonPagedPoolConsumers(VOID)
+{
+    USHORT i;
+
+    DPRINT1("---------------------\n");
+    DPRINT1("Out of memory dumper!\n");
+
+    //
+    // We'll extract allocations for all the pool lists
+    //
+    for (i = 0; i < POOL_LISTS_PER_PAGE; ++i)
+    {
+        PLIST_ENTRY Entry;
+
+        //
+        // And we'll browse every list associated with non pool
+        //
+        for (Entry = ExpDecodePoolLink(NonPagedPoolDescriptor.ListHeads[i].Flink);
+             Entry != &NonPagedPoolDescriptor.ListHeads[i];
+             Entry = ExpDecodePoolLink(Entry->Flink))
+        {
+            PPOOL_HEADER Header;
+
+            //
+            // Get the associated pool header
+            //
+            Header = POOL_ENTRY(Entry);
+
+            //
+            // We only care about non paged, should always be true
+            //
+            if ((Header->PoolType & BASE_POOL_TYPE_MASK) == NonPagedPool)
+            {
+                //
+                // If there's a tag, attempt to do a pretty print
+                //
+                if (Header->PoolTag != 0)
+                {
+                    CHAR Tag[4];
+
+                    //
+                    // Extract each 'component' and check whether they are printable
+                    //
+                    Tag[0] = Header->PoolTag & 0xFF;
+                    Tag[1] = Header->PoolTag >> 8 & 0xFF;
+                    Tag[2] = Header->PoolTag >> 16 & 0xFF;
+                    Tag[3] = Header->PoolTag >> 24 & 0xFF;
+
+                    if (ExpTagAllowPrint(Tag[0]) && ExpTagAllowPrint(Tag[1]) && ExpTagAllowPrint(Tag[2]) && ExpTagAllowPrint(Tag[3]))
+                    {
+                        DPRINT1("Tag: '%c%c%c%c', Size: %ld\n", Tag[0], Tag[1], Tag[2], Tag[3], Header->BlockSize);
+                    }
+                    else
+                    {
+                        DPRINT1("Tag: %x, Size: %ld\n", Header->PoolTag, Header->BlockSize);
+                    }
+                }
+                else
+                {
+                    DPRINT1("Anon, Size: %ld\n", Header->BlockSize);
+                }
+            }
+        }
+    }
+
+    DPRINT1("---------------------\n");
+}
+
 /* PRIVATE FUNCTIONS **********************************************************/
 
 VOID
@@ -1642,6 +1725,14 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType,
         if (!Entry)
         {
             //
+            // If non paged backed, display current consumption
+            //
+            if ((OriginalType & BASE_POOL_TYPE_MASK) == NonPagedPool)
+            {
+                MiDumpNonPagedPoolConsumers();
+            }
+
+            //
             // Must succeed pool is deprecated, but still supported. These allocation
             // failures must cause an immediate bugcheck
             //
@@ -1968,6 +2059,14 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType,
     if (!Entry)
     {
         //
+        // If non paged backed, display current consumption
+        //
+        if ((OriginalType & BASE_POOL_TYPE_MASK) == NonPagedPool)
+        {
+            MiDumpNonPagedPoolConsumers();
+        }
+
+        //
         // Must succeed pool is deprecated, but still supported. These allocation
         // failures must cause an immediate bugcheck
         //
