template <POOL_TYPE PoolType> class CAllocator { public: void* operator new(unsigned int size) { return ExAllocatePoolWithTag(PoolType, size, OSNTAG); } void* operator new[](unsigned int size) { return ExAllocatePoolWithTag(PoolType, size, OSNTAG); } PVOID operator new (size_t Size, void *addr) { return addr; } VOID operator delete(PVOID pMemory) { if(pMemory!=NULL) ExFreePool(pMemory); } VOID operator delete[](PVOID pMemory) { if(pMemory!=NULL) ExFreePool(pMemory); } }; typedef CAllocator<NonPagedPool> CNPAllocator; typedef CAllocator<PagedPool> CPAllocator;