diff options
| author | Yang You (UU) <[email protected]> | 2025-12-02 13:37:13 -0800 |
|---|---|---|
| committer | Yang You (UU) <[email protected]> | 2025-12-02 13:37:13 -0800 |
| commit | 83019ae0c63454b2835f8fc245c7505351cee677 (patch) | |
| tree | 0814d281b100265f0dc819b336c4ae2e0c312b40 /network/netadaptercx/netvadapterlibrary/code/memory.cpp | |
| parent | ee5cca45e2b748ca92e902e876840986fd3d7f18 (diff) | |
Have the NetVAdapter Lib buildable with EWDK for both UM and KM
Diffstat (limited to 'network/netadaptercx/netvadapterlibrary/code/memory.cpp')
| -rw-r--r-- | network/netadaptercx/netvadapterlibrary/code/memory.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/network/netadaptercx/netvadapterlibrary/code/memory.cpp b/network/netadaptercx/netvadapterlibrary/code/memory.cpp new file mode 100644 index 00000000..6d23f3bc --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/memory.cpp @@ -0,0 +1,77 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#include "pch.hpp" +#include "memory.h" +#include <netadaptercx.h> +#include "trace.h" +#include "memory.tmh" + +NTSTATUS +Memory::Initialize( + NETMEMORYCOLLECTION MemoryCollection, + size_t BufferSize +) +{ + m_memoryCollection = MemoryCollection; + + for (size_t i = 0; i < PREALLOCATED_BUFFERS_COUNT; i++) + { + NET_MEMORY_CONFIG memoryConfig{}; + NET_MEMORY_CONFIG_INIT( + &memoryConfig, + m_buffers[i].VirtualAddress, + BufferSize); + + RETURN_IF_NOT_STATUS_SUCCESS( + NetMemoryCreate( + MemoryCollection, + &memoryConfig, + &m_buffers[i].MemoryId + )); + + m_buffersReadyToUse[i] = &m_buffers[i]; + } + + m_lastBufferToUse = PREALLOCATED_BUFFERS_COUNT; + return STATUS_SUCCESS; +} + +void +Memory::ReleaseAllMappings( + void +) +{ + for (size_t i = 0; i < PREALLOCATED_BUFFERS_COUNT; i++) + { + NetMemoryDestroy(m_memoryCollection, m_buffers[i].MemoryId); + } + + m_lastBufferToUse = 0; + RtlZeroMemory(m_buffersReadyToUse, sizeof(m_buffersReadyToUse)); +} + +MemoryBuffer* +Memory::PopAvailableBuffer( + void +) +{ + KAcquireSpinLock lock{ m_spinLock }; + + if (m_lastBufferToUse == 0) + { + return nullptr; + } + + return m_buffersReadyToUse[--m_lastBufferToUse]; +} + +void +Memory::ReturnBuffer( + MemoryBuffer* Buffer +) +{ + KAcquireSpinLock lock{ m_spinLock }; + + NT_FRE_ASSERT(m_lastBufferToUse < PREALLOCATED_BUFFERS_COUNT); + + m_buffersReadyToUse[m_lastBufferToUse++] = Buffer; +} |
