From 74989188d4b3931183a9c54f509391a4f79cb46d Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 28 Apr 2009 22:30:23 +0000 Subject: [PATCH] - Wait for NdisMFreeSharedMemoryPassive to complete before returning See issue #4428 for more details. svn path=/trunk/; revision=40722 --- reactos/drivers/network/ndis/include/miniport.h | 1 + reactos/drivers/network/ndis/ndis/memory.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/reactos/drivers/network/ndis/include/miniport.h b/reactos/drivers/network/ndis/include/miniport.h index 9834f212cc9..cc0b8b7c200 100644 --- a/reactos/drivers/network/ndis/include/miniport.h +++ b/reactos/drivers/network/ndis/include/miniport.h @@ -71,6 +71,7 @@ typedef struct _MINIPORT_SHARED_MEMORY { BOOLEAN Cached; PNDIS_MINIPORT_BLOCK Adapter; PVOID Context; + PKEVENT Event; } MINIPORT_SHARED_MEMORY, *PMINIPORT_SHARED_MEMORY; /* A structure of WrapperConfigurationContext (not compatible with the diff --git a/reactos/drivers/network/ndis/ndis/memory.c b/reactos/drivers/network/ndis/ndis/memory.c index b76340ac067..194bfe5ec4b 100644 --- a/reactos/drivers/network/ndis/ndis/memory.c +++ b/reactos/drivers/network/ndis/ndis/memory.c @@ -181,6 +181,7 @@ NdisMFreeSharedMemoryPassive( */ { PMINIPORT_SHARED_MEMORY Memory = (PMINIPORT_SHARED_MEMORY)Context; + PRKEVENT Event = Memory->Event; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); @@ -191,6 +192,10 @@ NdisMFreeSharedMemoryPassive( Memory->VirtualAddress, Memory->Cached); ExFreePool(Memory); + + KeSetEvent(Event, + IO_NO_INCREMENT, + FALSE); } @@ -221,6 +226,7 @@ NdisMFreeSharedMemory( HANDLE ThreadHandle; PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; PMINIPORT_SHARED_MEMORY Memory; + KEVENT Event; NDIS_DbgPrint(MAX_TRACE,("Called.\n")); @@ -235,14 +241,24 @@ NdisMFreeSharedMemory( return; } + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Memory->AdapterObject = Adapter->NdisMiniportBlock.SystemAdapterObject; Memory->Length = Length; Memory->PhysicalAddress = PhysicalAddress; Memory->VirtualAddress = VirtualAddress; Memory->Cached = Cached; + Memory->Adapter = &Adapter->NdisMiniportBlock; + Memory->Event = &Event; PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS, 0, 0, 0, NdisMFreeSharedMemoryPassive, Memory); ZwClose(ThreadHandle); + + KeWaitForSingleObject(&Event, + Executive, + KernelMode, + FALSE, + NULL); } VOID