ReactOS 0.4.16-dev-340-g0540c21
memory.c File Reference
#include "ndissys.h"
Include dependency graph for memory.c:

Go to the source code of this file.

Functions

NDIS_STATUS EXPORT NdisAllocateMemoryWithTag (OUT PVOID *VirtualAddress, IN UINT Length, IN ULONG Tag)
 
NDIS_STATUS EXPORT NdisAllocateMemory (OUT PVOID *VirtualAddress, IN UINT Length, IN UINT MemoryFlags, IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress)
 
VOID EXPORT NdisFreeMemory (IN PVOID VirtualAddress, IN UINT Length, IN UINT MemoryFlags)
 
VOID EXPORT NdisMAllocateSharedMemory (IN NDIS_HANDLE MiniportAdapterHandle, IN ULONG Length, IN BOOLEAN Cached, OUT PVOID *VirtualAddress, OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
 
VOID NTAPI NdisMFreeSharedMemoryPassive (PDEVICE_OBJECT DeviceObject, PVOID Context)
 
VOID EXPORT NdisMFreeSharedMemory (IN NDIS_HANDLE MiniportAdapterHandle, IN ULONG Length, IN BOOLEAN Cached, IN PVOID VirtualAddress, IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
 
VOID NTAPI NdisMAllocateSharedMemoryPassive (PDEVICE_OBJECT DeviceObject, PVOID Context)
 
NDIS_STATUS EXPORT NdisMAllocateSharedMemoryAsync (IN NDIS_HANDLE MiniportAdapterHandle, IN ULONG Length, IN BOOLEAN Cached, IN PVOID Context)
 
VOID EXPORT NdisAllocateSharedMemory (IN NDIS_HANDLE NdisAdapterHandle, IN ULONG Length, IN BOOLEAN Cached, OUT PVOID *VirtualAddress, OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
 
VOID EXPORT NdisFreeSharedMemory (IN NDIS_HANDLE NdisAdapterHandle, IN ULONG Length, IN BOOLEAN Cached, IN PVOID VirtualAddress, IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
 

Function Documentation

◆ NdisAllocateMemory()

NDIS_STATUS EXPORT NdisAllocateMemory ( OUT PVOID VirtualAddress,
IN UINT  Length,
IN UINT  MemoryFlags,
IN NDIS_PHYSICAL_ADDRESS  HighestAcceptableAddress 
)

Definition at line 57 of file memory.c.

74{
75 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
76
77 if (MemoryFlags & NDIS_MEMORY_CONTIGUOUS)
78 {
79 /* Allocate contiguous memory (possibly noncached) */
84 (MemoryFlags & NDIS_MEMORY_NONCACHED) ? MmNonCached : MmCached);
85 }
86 else if (MemoryFlags & NDIS_MEMORY_NONCACHED)
87 {
88 /* Allocate noncached noncontiguous memory */
90 }
91 else
92 {
93 /* Allocate plain nonpaged memory */
95 }
96
97 if (!*VirtualAddress) {
98 NDIS_DbgPrint(MIN_TRACE, ("Allocation failed (%lx, %lx)\n", MemoryFlags, Length));
100 }
101
102 return NDIS_STATUS_SUCCESS;
103}
#define MIN_TRACE
Definition: debug.h:14
#define MAX_TRACE
Definition: debug.h:16
PVOID NTAPI MmAllocateContiguousMemorySpecifyCache(IN SIZE_T NumberOfBytes, IN PHYSICAL_ADDRESS LowestAcceptableAddress OPTIONAL, IN PHYSICAL_ADDRESS HighestAcceptableAddress, IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, IN MEMORY_CACHING_TYPE CacheType OPTIONAL)
Definition: contmem.c:574
#define NDIS_DbgPrint(_t_, _x_)
Definition: debug.h:40
#define NonPagedPool
Definition: env_spec_w32.h:307
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
NTSYSAPI ULONGLONG WINAPI RtlConvertUlongToLargeInteger(ULONG)
Definition: largeint.c:47
PVOID NTAPI MmAllocateNonCachedMemory(IN SIZE_T NumberOfBytes)
Definition: ncache.c:25
#define NDIS_MEMORY_CONTIGUOUS
Definition: ndis.h:579
#define NDIS_MEMORY_NONCACHED
Definition: ndis.h:580
#define NDIS_STATUS_FAILURE
Definition: ndis.h:465
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
_Out_ PNDIS_HANDLE _Out_ PUINT _In_ PNDIS_STRING _In_ NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
Definition: ndis.h:3230
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
_Must_inspect_result_ _In_ WDFDMATRANSACTION _In_ PFN_WDF_PROGRAM_DMA _In_ WDF_DMA_DIRECTION _In_ PMDL _In_ PVOID VirtualAddress
@ MmCached
Definition: mmtypes.h:130
@ MmNonCached
Definition: mmtypes.h:129

Referenced by MiniportInitialize(), and MiQueryResources().

◆ NdisAllocateMemoryWithTag()

NDIS_STATUS EXPORT NdisAllocateMemoryWithTag ( OUT PVOID VirtualAddress,
IN UINT  Length,
IN ULONG  Tag 
)

Definition at line 21 of file memory.c.

35{
36 PVOID Block;
37
38 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
39
41 *VirtualAddress = Block;
42
43 if (!Block) {
44 NDIS_DbgPrint(MIN_TRACE, ("Failed to allocate memory (%lx)\n", Length));
46 }
47
49}
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4065

Referenced by AddressRomRead(), AllocateTransmitBlocks(), AllocateTransmitBuffers(), DcAllocateRcb(), DcAllocateReceiveBuffers(), DcAllocateTransmitBlocks(), DcAllocateTransmitBuffers(), DcAllocateTransmitDescriptorsAndBuffers(), DcInitialize(), DcInitializeAdapterResources(), mem_alloc_nonpaged_block(), MiniportInitialize(), NvNetAddWakeUpPattern(), NvNetInitializeAdapterResources(), ParaNdis_AllocateMemory(), and SRomRead().

◆ NdisAllocateSharedMemory()

VOID EXPORT NdisAllocateSharedMemory ( IN NDIS_HANDLE  NdisAdapterHandle,
IN ULONG  Length,
IN BOOLEAN  Cached,
OUT PVOID VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS  PhysicalAddress 
)

Definition at line 379 of file memory.c.

385{
386 NdisMAllocateSharedMemory(NdisAdapterHandle,
387 Length,
388 Cached,
391}
VOID EXPORT NdisMAllocateSharedMemory(IN NDIS_HANDLE MiniportAdapterHandle, IN ULONG Length, IN BOOLEAN Cached, OUT PVOID *VirtualAddress, OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
Definition: memory.c:148
_In_ ULONG _In_ BOOLEAN Cached
Definition: ndis.h:3789
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
Definition: iotypes.h:1098

◆ NdisFreeMemory()

VOID EXPORT NdisFreeMemory ( IN PVOID  VirtualAddress,
IN UINT  Length,
IN UINT  MemoryFlags 
)

Definition at line 110 of file memory.c.

121{
122 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
123
124 if (MemoryFlags & NDIS_MEMORY_CONTIGUOUS)
125 {
126 /* Free contiguous memory (possibly noncached) */
128 Length,
129 (MemoryFlags & NDIS_MEMORY_NONCACHED) ? MmNonCached : MmCached);
130 }
131 else if (MemoryFlags & NDIS_MEMORY_NONCACHED)
132 {
133 /* Free noncached noncontiguous memory */
135 }
136 else
137 {
138 /* Free nonpaged pool */
140 }
141}
VOID NTAPI MmFreeContiguousMemorySpecifyCache(IN PVOID BaseAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType)
Definition: contmem.c:666
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
VOID NTAPI MmFreeNonCachedMemory(IN PVOID BaseAddress, IN SIZE_T NumberOfBytes)
Definition: ncache.c:172

Referenced by AddressRomRead(), AllocatePairOfBuffersOnInit(), CreateOffloadInfo5Internal(), DcFreeAdapter(), DcFreeEeprom(), DcFreeRcb(), DcInitializeAdapterResources(), mem_free_nonpaged_block(), MiniportHalt(), MiniportInitialize(), NvNetFreeAdapter(), NvNetInitializeAdapterResources(), NvNetRemoveWakeUpPattern(), OnOidSetNdis5Offload(), OnResetWorkItem(), OnSetPowerWorkItem(), ParaNdis5_CancelSendPackets(), ParaNdis5_Halt(), ParaNdis5_Initialize(), ParaNdis5_Reset(), ParaNdis5_StopSend(), ParaNdis_DoSubmitPacket(), ParaNdis_InitializeContext(), ParaNdis_OidQuery(), ParaNdis_OidQueryCopy(), ParaNdis_OnSetPower(), ParaNdis_ProcessRxPath(), ParaNdis_ProcessTx(), PrepareSendEntry(), ReadNicConfiguration(), SRomRead(), VirtIONetFreeBufferDescriptor(), and VirtIONetRelease().

◆ NdisFreeSharedMemory()

VOID EXPORT NdisFreeSharedMemory ( IN NDIS_HANDLE  NdisAdapterHandle,
IN ULONG  Length,
IN BOOLEAN  Cached,
IN PVOID  VirtualAddress,
IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress 
)

Definition at line 399 of file memory.c.

411{
412 NdisMFreeSharedMemory(NdisAdapterHandle,
413 Length,
414 Cached,
417}
VOID EXPORT NdisMFreeSharedMemory(IN NDIS_HANDLE MiniportAdapterHandle, IN ULONG Length, IN BOOLEAN Cached, IN PVOID VirtualAddress, IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
Definition: memory.c:215

◆ NdisMAllocateSharedMemory()

VOID EXPORT NdisMAllocateSharedMemory ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN ULONG  Length,
IN BOOLEAN  Cached,
OUT PVOID VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS  PhysicalAddress 
)

Definition at line 148 of file memory.c.

165{
167
168 NDIS_DbgPrint(MAX_TRACE,("Called.\n"));
169
171 {
172 KeBugCheckEx(BUGCODE_ID_DRIVER,
174 Length,
175 0,
176 1);
177 }
178
179 *VirtualAddress = Adapter->NdisMiniportBlock.SystemAdapterObject->DmaOperations->AllocateCommonBuffer(
180 Adapter->NdisMiniportBlock.SystemAdapterObject, Length, PhysicalAddress, Cached);
181}
struct _LOGICAL_ADAPTER * PLOGICAL_ADAPTER
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
_In_ NDIS_HANDLE MiniportAdapterHandle
Definition: ndis.h:4668
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
Definition: rtlcompat.c:108
NDIS_MINIPORT_BLOCK NdisMiniportBlock
Definition: miniport.h:89
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by AllocateReceiveBuffers(), AllocateReceiveDescriptors(), AllocateTransmitBuffers(), AllocateTransmitDescriptors(), DcAllocateRcb(), DcAllocateReceiveDescriptors(), DcAllocateTransmitBuffers(), DcAllocateTransmitDescriptorsAndBuffers(), mem_alloc_contiguous_pages(), MiAllocateSharedMemory(), MiniportInitialize(), NdisAllocateSharedMemory(), NICAllocateIoResources(), and ParaNdis_InitialAllocatePhysicalMemory().

◆ NdisMAllocateSharedMemoryAsync()

NDIS_STATUS EXPORT NdisMAllocateSharedMemoryAsync ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN ULONG  Length,
IN BOOLEAN  Cached,
IN PVOID  Context 
)

Definition at line 330 of file memory.c.

335{
338
339 NDIS_DbgPrint(MAX_TRACE,("Called.\n"));
340
342
343 /* Must be NonpagedPool because by definition we're at DISPATCH_LEVEL */
345
346 if(!Memory)
347 {
348 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
349 return NDIS_STATUS_FAILURE;
350 }
351
352 Memory->AdapterObject = Adapter->NdisMiniportBlock.SystemAdapterObject;
353 Memory->Length = Length;
354 Memory->Cached = Cached;
355 Memory->Adapter = &Adapter->NdisMiniportBlock;
356 Memory->Context = Context;
357
359 if (!Memory->WorkItem)
360 {
361 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
363 return NDIS_STATUS_FAILURE;
364 }
365
366 IoQueueWorkItem(Memory->WorkItem,
369 Memory);
370
371 return NDIS_STATUS_PENDING;
372}
VOID NTAPI NdisMAllocateSharedMemoryPassive(PDEVICE_OBJECT DeviceObject, PVOID Context)
Definition: memory.c:295
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
Definition: iowork.c:40
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition: iowork.c:75
#define ASSERT(a)
Definition: mode.c:44
#define NDIS_STATUS_PENDING
Definition: ndis.h:347
PDEVICE_OBJECT DeviceObject
Definition: ndis.h:2552
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG _In_ _Out_ WDFMEMORY * Memory
Definition: wdfmemory.h:169
@ DelayedWorkQueue
Definition: extypes.h:190

◆ NdisMAllocateSharedMemoryPassive()

VOID NTAPI NdisMAllocateSharedMemoryPassive ( PDEVICE_OBJECT  DeviceObject,
PVOID  Context 
)

Definition at line 295 of file memory.c.

305{
307
308 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
309
311
312 Memory->VirtualAddress = Memory->AdapterObject->DmaOperations->AllocateCommonBuffer(
313 Memory->AdapterObject, Memory->Length, &Memory->PhysicalAddress, Memory->Cached);
314
315 if (Memory->Adapter->DriverHandle->MiniportCharacteristics.AllocateCompleteHandler)
316 Memory->Adapter->DriverHandle->MiniportCharacteristics.AllocateCompleteHandler(
317 Memory->Adapter->MiniportAdapterContext, Memory->VirtualAddress,
318 &Memory->PhysicalAddress, Memory->Length, Memory->Context);
319
320 IoFreeWorkItem(Memory->WorkItem);
322}
struct _MINIPORT_SHARED_MEMORY * PMINIPORT_SHARED_MEMORY
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition: iowork.c:64

Referenced by NdisMAllocateSharedMemoryAsync().

◆ NdisMFreeSharedMemory()

VOID EXPORT NdisMFreeSharedMemory ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN ULONG  Length,
IN BOOLEAN  Cached,
IN PVOID  VirtualAddress,
IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress 
)

Definition at line 215 of file memory.c.

233{
236 PDMA_ADAPTER DmaAdapter = Adapter->NdisMiniportBlock.SystemAdapterObject;
237
238 NDIS_DbgPrint(MAX_TRACE,("Called.\n"));
239
241
242 /* Call FreeCommonBuffer synchronously if we are at PASSIVE_LEVEL */
244 {
245 /* We need this case because we free shared memory asynchronously
246 * and the miniport (and DMA adapter object) could be freed before
247 * our work item executes. Lucky for us, the scenarios where the
248 * freeing needs to be synchronous (failed init, MiniportHalt,
249 * and driver unload) are all at PASSIVE_LEVEL so we can just
250 * call FreeCommonBuffer synchronously and not have to worry
251 * about the miniport falling out from under us */
252
253 NDIS_DbgPrint(MID_TRACE,("Freeing shared memory synchronously\n"));
254
255 DmaAdapter->DmaOperations->FreeCommonBuffer(DmaAdapter,
256 Length,
259 Cached);
260 return;
261 }
262
263 /* Must be NonpagedPool because by definition we're at DISPATCH_LEVEL */
265
266 if(!Memory)
267 {
268 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
269 return;
270 }
271
272 Memory->AdapterObject = Adapter->NdisMiniportBlock.SystemAdapterObject;
273 Memory->Length = Length;
274 Memory->PhysicalAddress = PhysicalAddress;
275 Memory->VirtualAddress = VirtualAddress;
276 Memory->Cached = Cached;
277 Memory->Adapter = &Adapter->NdisMiniportBlock;
278
280 if (!Memory->WorkItem)
281 {
282 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
284 return;
285 }
286
287 IoQueueWorkItem(Memory->WorkItem,
290 Memory);
291}
#define MID_TRACE
Definition: debug.h:15
VOID NTAPI NdisMFreeSharedMemoryPassive(PDEVICE_OBJECT DeviceObject, PVOID Context)
Definition: memory.c:185
struct _DMA_OPERATIONS * DmaOperations
Definition: iotypes.h:2295
@ CriticalWorkQueue
Definition: extypes.h:189

Referenced by DcFreeAdapter(), DcFreeRcb(), MiFreeSharedMemory(), MiniportHalt(), NdisFreeSharedMemory(), NICReleaseIoResources(), NvNetFreeAdapter(), ParaNdis_CleanupContext(), and ParaNdis_FreePhysicalMemory().

◆ NdisMFreeSharedMemoryPassive()

VOID NTAPI NdisMFreeSharedMemoryPassive ( PDEVICE_OBJECT  DeviceObject,
PVOID  Context 
)

Definition at line 185 of file memory.c.

195{
197
198 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
199
201
202 Memory->AdapterObject->DmaOperations->FreeCommonBuffer(
203 Memory->AdapterObject, Memory->Length, Memory->PhysicalAddress,
204 Memory->VirtualAddress, Memory->Cached);
205
206 IoFreeWorkItem(Memory->WorkItem);
208}

Referenced by NdisMFreeSharedMemory().