mirror of
https://github.com/reactos/reactos.git
synced 2024-07-11 15:15:27 +00:00
Call ExFreePoolWithTag with 0 tag from ExFreePool instead of vice versa, bugcheck system, when Block is not inside any pool.
svn path=/trunk/; revision=39927
This commit is contained in:
parent
0533a9d290
commit
26593d0ac7
|
@ -14,6 +14,7 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
extern PVOID MiNonPagedPoolStart;
|
||||||
extern ULONG MiNonPagedPoolLength;
|
extern ULONG MiNonPagedPoolLength;
|
||||||
extern ULONG MmTotalPagedPoolQuota;
|
extern ULONG MmTotalPagedPoolQuota;
|
||||||
extern ULONG MmTotalNonPagedPoolQuota;
|
extern ULONG MmTotalNonPagedPoolQuota;
|
||||||
|
@ -234,18 +235,7 @@ ExAllocatePoolWithQuotaTag (IN POOL_TYPE PoolType,
|
||||||
VOID NTAPI
|
VOID NTAPI
|
||||||
ExFreePool(IN PVOID Block)
|
ExFreePool(IN PVOID Block)
|
||||||
{
|
{
|
||||||
if (Block >= MmPagedPoolBase && (char*)Block < ((char*)MmPagedPoolBase + MmPagedPoolSize))
|
ExFreePoolWithTag(Block, 0);
|
||||||
{
|
|
||||||
if (KeGetCurrentIrql() > APC_LEVEL)
|
|
||||||
KeBugCheckEx(BAD_POOL_CALLER, 0x09, KeGetCurrentIrql(), PagedPool, (ULONG_PTR)Block);
|
|
||||||
ExFreePagedPool(Block);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (KeGetCurrentIrql() > DISPATCH_LEVEL)
|
|
||||||
KeBugCheckEx(BAD_POOL_CALLER, 0x09, KeGetCurrentIrql(), NonPagedPool, (ULONG_PTR)Block);
|
|
||||||
ExFreeNonPagedPool(Block);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -253,23 +243,62 @@ ExFreePool(IN PVOID Block)
|
||||||
*/
|
*/
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
ExFreePoolWithTag(IN PVOID Block,
|
ExFreePoolWithTag(
|
||||||
|
IN PVOID Block,
|
||||||
IN ULONG Tag)
|
IN ULONG Tag)
|
||||||
{
|
{
|
||||||
ULONG BlockTag;
|
/* Check for paged pool */
|
||||||
|
if (Block >= MmPagedPoolBase &&
|
||||||
if (Tag != 0)
|
(char*)Block < ((char*)MmPagedPoolBase + MmPagedPoolSize))
|
||||||
{
|
{
|
||||||
if (Block >= MmPagedPoolBase && (char*)Block < ((char*)MmPagedPoolBase + MmPagedPoolSize))
|
/* Validate tag */
|
||||||
BlockTag = EiGetPagedPoolTag(Block);
|
if (Tag != 0 && Tag != EiGetPagedPoolTag(Block))
|
||||||
else
|
KeBugCheckEx(BAD_POOL_CALLER,
|
||||||
BlockTag = EiGetNonPagedPoolTag(Block);
|
0x0a,
|
||||||
|
(ULONG_PTR)Block,
|
||||||
|
EiGetPagedPoolTag(Block),
|
||||||
|
Tag);
|
||||||
|
|
||||||
if (BlockTag != Tag)
|
/* Validate IRQL */
|
||||||
KeBugCheckEx(BAD_POOL_CALLER, 0x0a, (ULONG_PTR)Block, BlockTag, Tag);
|
if (KeGetCurrentIrql() > APC_LEVEL)
|
||||||
|
KeBugCheckEx(BAD_POOL_CALLER,
|
||||||
|
0x09,
|
||||||
|
KeGetCurrentIrql(),
|
||||||
|
PagedPool,
|
||||||
|
(ULONG_PTR)Block);
|
||||||
|
|
||||||
|
/* Free from paged pool */
|
||||||
|
ExFreePagedPool(Block);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExFreePool(Block);
|
/* Check for non-paged pool */
|
||||||
|
else if (Block >= MiNonPagedPoolStart &&
|
||||||
|
(char*)Block < ((char*)MiNonPagedPoolStart + MiNonPagedPoolLength))
|
||||||
|
{
|
||||||
|
/* Validate tag */
|
||||||
|
if (Tag != 0 && Tag != EiGetNonPagedPoolTag(Block))
|
||||||
|
KeBugCheckEx(BAD_POOL_CALLER,
|
||||||
|
0x0a,
|
||||||
|
(ULONG_PTR)Block,
|
||||||
|
EiGetNonPagedPoolTag(Block),
|
||||||
|
Tag);
|
||||||
|
|
||||||
|
/* Validate IRQL */
|
||||||
|
if (KeGetCurrentIrql() > DISPATCH_LEVEL)
|
||||||
|
KeBugCheckEx(BAD_POOL_CALLER,
|
||||||
|
0x09,
|
||||||
|
KeGetCurrentIrql(),
|
||||||
|
NonPagedPool,
|
||||||
|
(ULONG_PTR)Block);
|
||||||
|
|
||||||
|
/* Free from non-paged pool */
|
||||||
|
ExFreeNonPagedPool(Block);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Block was not inside any pool! */
|
||||||
|
KeBugCheckEx(BAD_POOL_CALLER, 0x42, (ULONG_PTR)Block, 0, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue