Files
yttrium-virtio-gpu/NetKVM/Common/ParaNdis-Util.cpp
T
Sameeh Jubran 30bec9cfd1 NetKVM: Clean variables after calling Dtor
Clearing the variables is important as calling the Dotr twice on the
same object will cause BSODs as a result of a double free for example.

Signed-off-by: Sameeh Jubran <[email protected]>
2018-04-16 13:12:51 +03:00

111 lines
2.1 KiB
C++

#include "ParaNdis-Util.h"
#include "ndis56common.h"
#include "Trace.h"
#ifdef NETKVM_WPP_ENABLED
#include "ParaNdis-Util.tmh"
#endif
#ifdef DBG
void NetKvmAssert(bool Statement, ULONG Code)
{
if (!Statement)
{
KeBugCheckEx(0x0ABCDEF0,
0x0ABCDEF0,
Code,
NDIS_MINIPORT_MAJOR_VERSION,
NDIS_MINIPORT_MINOR_VERSION);
}
}
#endif
bool CNdisSharedMemory::Allocate(ULONG Size, bool IsCached)
{
m_Size = Size;
m_IsCached = IsCached;
NdisMAllocateSharedMemory(m_DrvHandle, Size, m_IsCached, &m_VA, &m_PA);
return m_VA != nullptr;
}
CNdisSharedMemory::~CNdisSharedMemory()
{
if(m_VA != nullptr)
{
NdisMFreeSharedMemory(m_DrvHandle, m_Size, m_IsCached, m_VA, m_PA);
m_VA = nullptr;
}
}
//Generic delete operators
//Must never be called
void __CRTDECL operator delete(void *) throw()
{
NETKVM_ASSERT(FALSE);
#ifdef DBG
KeBugCheck(100);
#endif
}
void __CRTDECL operator delete(void *, UINT64) throw()
{
ASSERT(FALSE);
#ifdef DBG
KeBugCheck(100);
#endif
}
void __CRTDECL operator delete(void *, unsigned int) throw()
{
ASSERT(FALSE);
#ifdef DBG
KeBugCheck(100);
#endif
}
void __CRTDECL operator delete[](void *) throw()
{
NETKVM_ASSERT(FALSE);
#ifdef DBG
KeBugCheck(100);
#endif
}
#ifdef RW_LOCK_62
bool CNdisRWLock::Create(NDIS_HANDLE miniportHandle) {
m_pLock = NdisAllocateRWLock(miniportHandle);
return m_pLock != 0;
}
#endif
ULONG ParaNdis_GetIndexFromAffinity(KAFFINITY affinity)
{
DWORD index = 0;
BOOLEAN result;
#ifdef _WIN64
result = BitScanForward64(&index, affinity);
#else
result = BitScanForward(&index, affinity);
#endif
if (result && ((KAFFINITY)1 << index) == affinity)
{
return index;
}
return INVALID_PROCESSOR_INDEX;
}
ULONG ParaNdis_GetSystemCPUCount()
{
ULONG nProcessors;
#if NDIS_SUPPORT_NDIS620
nProcessors = NdisGroupActiveProcessorCount(ALL_PROCESSOR_GROUPS);
#elif NDIS_SUPPORT_NDIS6
nProcessors = NdisSystemProcessorCount();
#else
#error not supported
#endif
return nProcessors;
}