#include "wdmmem.h"

#pragma PAGEDCODE
CMemory* CWDMMemory::create(VOID)
{ return new (NonPagedPool) CWDMMemory; }

#pragma PAGEDCODE
VOID*	CWDMMemory::allocate(IN POOL_TYPE PoolType,IN SIZE_T NumberOfBytes)
{
	if(!NumberOfBytes) return NULL;
	//return ::ExAllocatePool(PoolType,NumberOfBytes);
	return ::ExAllocatePoolWithTag(PoolType,NumberOfBytes,'_GRU');
}

#pragma PAGEDCODE
VOID	CWDMMemory::zero(IN PVOID pMem,IN SIZE_T size)
{
	::RtlZeroMemory(pMem,size);
}

#pragma PAGEDCODE
VOID	CWDMMemory::free(IN PVOID pMem)
{
	::ExFreePool((PVOID)pMem);
}

#pragma PAGEDCODE
VOID	CWDMMemory::copy(IN VOID UNALIGNED *Destination,IN CONST VOID UNALIGNED *Source, IN SIZE_T Length)
{
	::RtlCopyMemory(Destination,Source,Length);
}

#pragma PAGEDCODE
PVOID CWDMMemory::mapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress,IN SIZE_T NumberOfBytes,IN MEMORY_CACHING_TYPE CacheType)
{
	return ::MmMapIoSpace(PhysicalAddress,NumberOfBytes,CacheType);
}

#pragma PAGEDCODE
VOID CWDMMemory::unmapIoSpace(IN PVOID BaseAddress,IN SIZE_T NumberOfBytes)
{
	::MmUnmapIoSpace (BaseAddress,NumberOfBytes);
}

#pragma PAGEDCODE
VOID	CWDMMemory::set(IN VOID UNALIGNED *Destination,IN SIZE_T Length,LONG Fill)
{
	::RtlFillMemory(Destination,Length,(UCHAR)Fill);
}