From a9826865bc66973a3e4f5bf32e95c0e34230d0ab Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 30 May 2009 17:12:45 +0000 Subject: [PATCH] - Fix handling of nonpaged contiguous memory in NdisAllocateMemory and NdisFreeMemory svn path=/trunk/; revision=41207 --- reactos/drivers/network/ndis/ndis/memory.c | 64 ++++++++++++---------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/memory.c b/reactos/drivers/network/ndis/ndis/memory.c index 194bfe5ec4b..9dd0771a1bc 100644 --- a/reactos/drivers/network/ndis/ndis/memory.c +++ b/reactos/drivers/network/ndis/ndis/memory.c @@ -74,26 +74,26 @@ NdisAllocateMemory( { NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - if (MemoryFlags & NDIS_MEMORY_NONCACHED) - { - *VirtualAddress = MmAllocateNonCachedMemory(Length); - if(!*VirtualAddress) - return NDIS_STATUS_FAILURE; - - return NDIS_STATUS_SUCCESS; - } - if (MemoryFlags & NDIS_MEMORY_CONTIGUOUS) - { - *VirtualAddress = MmAllocateContiguousMemory(Length, HighestAcceptableAddress); - if(!*VirtualAddress) - return NDIS_STATUS_FAILURE; + { + /* Allocate contiguous memory (possibly noncached) */ + *VirtualAddress = MmAllocateContiguousMemorySpecifyCache(Length, + RtlConvertUlongToLargeInteger(0), + HighestAcceptableAddress, + RtlConvertUlongToLargeInteger(0), + (MemoryFlags & NDIS_MEMORY_NONCACHED) ? MmNonCached : MmCached); + } + else if (MemoryFlags & NDIS_MEMORY_NONCACHED) + { + /* Allocate noncached noncontiguous memory */ + *VirtualAddress = MmAllocateNonCachedMemory(Length); + } + else + { + /* Allocate plain nonpaged memory */ + *VirtualAddress = ExAllocatePool(NonPagedPool, Length); + } - return NDIS_STATUS_SUCCESS; - } - - /* Plain nonpaged memory */ - *VirtualAddress = ExAllocatePool(NonPagedPool, Length); if (!*VirtualAddress) return NDIS_STATUS_FAILURE; @@ -120,19 +120,23 @@ NdisFreeMemory( { NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - if (MemoryFlags & NDIS_MEMORY_NONCACHED) - { - MmFreeNonCachedMemory(VirtualAddress, Length); - return; - } - if (MemoryFlags & NDIS_MEMORY_CONTIGUOUS) - { - MmFreeContiguousMemory(VirtualAddress); - return; - } - - ExFreePool(VirtualAddress); + { + /* Free contiguous memory (possibly noncached) */ + MmFreeContiguousMemorySpecifyCache(VirtualAddress, + Length, + (MemoryFlags & NDIS_MEMORY_NONCACHED) ? MmNonCached : MmCached); + } + else if (MemoryFlags & NDIS_MEMORY_NONCACHED) + { + /* Free noncached noncontiguous memory */ + MmFreeNonCachedMemory(VirtualAddress, Length); + } + else + { + /* Free nonpaged pool */ + ExFreePool(VirtualAddress); + } }