+#if defined(NPOOL_REDZONE_CHECK) || defined(NPOOL_REDZONE_CHECK_FULL)
+void check_redzone_header(HDR_USED* hdr)
+{
+ PBYTE LoZone = (PBYTE)((ULONG_PTR)hdr + HDR_USED_SIZE - NPOOL_REDZONE_SIZE);
+ PBYTE HiZone = (PBYTE)((ULONG_PTR)hdr + HDR_USED_SIZE + hdr->UserSize);
+ BOOL LoOK = TRUE;
+ BOOL HiOK = TRUE;
+ ULONG i;
+ CHAR c[5];
+
+ for (i = 0; i < NPOOL_REDZONE_SIZE; i++)
+ {
+ if (LoZone[i] != NPOOL_REDZONE_LOVALUE)
+ {
+ LoOK = FALSE;
+ }
+ if (HiZone[i] != NPOOL_REDZONE_HIVALUE)
+ {
+ HiOK = FALSE;
+ }
+ }
+
+ if (!HiOK || !LoOK)
+ {
+ c[0] = (CHAR)((hdr->Tag >> 24) & 0xFF);
+ c[1] = (CHAR)((hdr->Tag >> 16) & 0xFF);
+ c[2] = (CHAR)((hdr->Tag >> 8) & 0xFF);
+ c[3] = (CHAR)(hdr->Tag & 0xFF);
+ c[4] = 0;
+
+ if (!isprint(c[0]) || !isprint(c[1]) || !isprint(c[2]) || !isprint(c[3]))
+ {
+ c[0] = 0;
+ }
+
+ if (!LoOK)
+ {
+ DbgPrint("NPOOL: Low-side redzone overwritten, Block %x, Size %d, Tag %x(%s), Caller %x\n",
+ (ULONG_PTR)hdr + HDR_USED_SIZE, hdr->UserSize, hdr->Tag, c, hdr->Caller);
+ }
+ if (!HiOK)
+ {
+ DbgPrint("NPPOL: High-side redzone overwritten, Block %x, Size %d, Tag %x(%s), Caller %x\n",
+ (ULONG_PTR)hdr + HDR_USED_SIZE, hdr->UserSize, hdr->Tag, c, hdr->Caller);
+ }
+ KEBUGCHECK(0);
+ }
+}
+#endif
+
+#ifdef NPOOL_REDZONE_CHECK_FULL
+void check_redzone_list(void)
+{
+ PLIST_ENTRY current_entry;
+
+ current_entry = UsedBlockListHead.Flink;
+ while (current_entry != &UsedBlockListHead)
+ {
+ check_redzone_header(CONTAINING_RECORD(current_entry, HDR_USED, ListEntry));
+ current_entry = current_entry->Flink;
+ }
+}
+#endif
+
+