if (PreviousEntry->BlockSize != Entry->PreviousSize)
{
/* Otherwise, someone corrupted one of the sizes */
+ DPRINT1("PreviousEntry BlockSize %lu, tag %.4s. Entry PreviousSize %lu, tag %.4s\n",
+ PreviousEntry->BlockSize, (char *)&PreviousEntry->PoolTag,
+ Entry->PreviousSize, (char *)&Entry->PoolTag);
KeBugCheckEx(BAD_POOL_HEADER,
5,
(ULONG_PTR)PreviousEntry,
if (!Entry->BlockSize)
{
/* Someone must've corrupted this field */
+ if (Entry->PreviousSize)
+ {
+ PreviousEntry = POOL_PREV_BLOCK(Entry);
+ DPRINT1("PreviousEntry tag %.4s. Entry tag %.4s\n",
+ (char *)&PreviousEntry->PoolTag,
+ (char *)&Entry->PoolTag);
+ }
+ else
+ {
+ DPRINT1("Entry tag %.4s\n",
+ (char *)&Entry->PoolTag);
+ }
KeBugCheckEx(BAD_POOL_HEADER,
8,
0,
if (NextEntry->PreviousSize != Entry->BlockSize)
{
/* Otherwise, someone corrupted the field */
+ DPRINT1("Entry BlockSize %lu, tag %.4s. NextEntry PreviousSize %lu, tag %.4s\n",
+ Entry->BlockSize, (char *)&Entry->PoolTag,
+ NextEntry->PreviousSize, (char *)&NextEntry->PoolTag);
KeBugCheckEx(BAD_POOL_HEADER,
5,
(ULONG_PTR)NextEntry,
// Finally, AND with the bucket mask to generate a valid index/bucket into
// the table
//
- ULONGLONG Result = 40543 * Tag;
+ ULONGLONG Result = (ULONGLONG)40543 * Tag;
return (ULONG)BucketMask & ((ULONG)Result ^ (Result >> 32));
}
//
// Free the "Generic DPC" temporary buffer, return the buffer length and status
//
- ExFreePool(Buffer);
+ ExFreePoolWithTag(Buffer, 'ofnI');
if (ReturnLength) *ReturnLength = CurrentLength;
return Status;
}
//
i = (USHORT)((NumberOfBytes + sizeof(POOL_HEADER) + (POOL_BLOCK_SIZE - 1))
/ POOL_BLOCK_SIZE);
+ ASSERT(i < POOL_LISTS_PER_PAGE);
//
// Handle lookaside list optimization for both paged and nonpaged pool
// Try again!
//
ExUnlockPool(PoolDesc, OldIrql);
- ListHead++;
continue;
}
BlockSize * POOL_BLOCK_SIZE,
Entry->PoolType - 1);
+ //
+ // Check block tag
+ //
+ if (TagToFree && TagToFree != Tag)
+ {
+ DPRINT1("Freeing pool - invalid tag specified: %.4s != %.4s\n", (char*)&TagToFree, (char*)&Tag);
+ KeBugCheckEx(BAD_POOL_CALLER, 0x0A, (ULONG_PTR)P, Tag, TagToFree);
+ }
+
//
// Is this allocation small enough to have come from a lookaside list?
//
//
OldIrql = ExLockPool(PoolDesc);
- //
- // Check block tag
- //
- if (TagToFree && TagToFree != Entry->PoolTag)
- {
- DPRINT1("Freeing pool - invalid tag specified: %.4s != %.4s\n", (char*)&TagToFree, (char*)&Entry->PoolTag);
- KeBugCheckEx(BAD_POOL_CALLER, 0x0A, (ULONG_PTR)P, Entry->PoolTag, TagToFree);
- }
-
//
// Check if the next allocation is at the end of the page
//