From efaf3a892adc643b7cf50beeccdf4d0ea1e95394 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 28 Mar 2009 17:49:27 +0000 Subject: [PATCH] - Implement NdisMAllocateSharedMemoryAsync - Zero the entire packet in NdisAllocatePacket svn path=/trunk/; revision=40270 --- .../drivers/network/ndis/include/miniport.h | 12 ++-- reactos/drivers/network/ndis/ndis/50stubs.c | 19 +----- reactos/drivers/network/ndis/ndis/buffer.c | 2 +- reactos/drivers/network/ndis/ndis/memory.c | 68 +++++++++++++++++++ 4 files changed, 78 insertions(+), 23 deletions(-) diff --git a/reactos/drivers/network/ndis/include/miniport.h b/reactos/drivers/network/ndis/include/miniport.h index 074397bdc6e..c41751b52b7 100644 --- a/reactos/drivers/network/ndis/include/miniport.h +++ b/reactos/drivers/network/ndis/include/miniport.h @@ -58,11 +58,13 @@ typedef struct _MINIPORT_BUGCHECK_CONTEXT { /* a miniport's shared memory */ typedef struct _MINIPORT_SHARED_MEMORY { - PDMA_ADAPTER AdapterObject; - ULONG Length; - PHYSICAL_ADDRESS PhysicalAddress; - PVOID VirtualAddress; - BOOLEAN Cached; + PDMA_ADAPTER AdapterObject; + ULONG Length; + PHYSICAL_ADDRESS PhysicalAddress; + PVOID VirtualAddress; + BOOLEAN Cached; + PNDIS_MINIPORT_BLOCK Adapter; + PVOID Context; } MINIPORT_SHARED_MEMORY, *PMINIPORT_SHARED_MEMORY; /* A structure of WrapperConfigurationContext (not compatible with the diff --git a/reactos/drivers/network/ndis/ndis/50stubs.c b/reactos/drivers/network/ndis/ndis/50stubs.c index 8e283579dc3..e46f577c36e 100644 --- a/reactos/drivers/network/ndis/ndis/50stubs.c +++ b/reactos/drivers/network/ndis/ndis/50stubs.c @@ -661,23 +661,6 @@ NdisMDeregisterIoPortRange( UNIMPLEMENTED } - -/* - * @unimplemented - */ -NDIS_STATUS -EXPORT -NdisMAllocateSharedMemoryAsync( - IN NDIS_HANDLE MiniportAdapterHandle, - IN ULONG Length, - IN BOOLEAN Cached, - IN PVOID Context) -{ - UNIMPLEMENTED - - return NDIS_STATUS_FAILURE; -} - /* * @unimplemented */ @@ -701,6 +684,8 @@ NdisCopyBuffer( * Length = Number of bytes to copy */ { + UNIMPLEMENTED + *Status = NDIS_STATUS_FAILURE; } diff --git a/reactos/drivers/network/ndis/ndis/buffer.c b/reactos/drivers/network/ndis/ndis/buffer.c index e5caccee517..6499e4e9238 100644 --- a/reactos/drivers/network/ndis/ndis/buffer.c +++ b/reactos/drivers/network/ndis/ndis/buffer.c @@ -424,7 +424,7 @@ NdisAllocatePacket( KeReleaseSpinLock(&Pool->SpinLock.SpinLock, OldIrql); - RtlZeroMemory(&Temp->Private, sizeof(NDIS_PACKET_PRIVATE)); + RtlZeroMemory(Temp, sizeof(NDIS_PACKET)); Temp->Private.Pool = Pool; *Packet = Temp; diff --git a/reactos/drivers/network/ndis/ndis/memory.c b/reactos/drivers/network/ndis/ndis/memory.c index d6586912d04..822b98fdf69 100644 --- a/reactos/drivers/network/ndis/ndis/memory.c +++ b/reactos/drivers/network/ndis/ndis/memory.c @@ -245,6 +245,74 @@ NdisMFreeSharedMemory( ZwClose(ThreadHandle); } +VOID +NTAPI +NdisMAllocateSharedMemoryPassive( + PVOID Context) +/* + * FUNCTION: Allocate a common buffer + * ARGUMENTS: + * Context: Pointer to a miniport shared memory context + * NOTES: + * - Called by NdisMAllocateSharedMemoryAsync to do the actual work + */ +{ + PMINIPORT_SHARED_MEMORY Memory = (PMINIPORT_SHARED_MEMORY)Context; + + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + + ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); + + Memory->VirtualAddress = Memory->AdapterObject->DmaOperations->AllocateCommonBuffer( + Memory->AdapterObject, Memory->Length, &Memory->PhysicalAddress, Memory->Cached); + + if (Memory->Adapter->DriverHandle->MiniportCharacteristics.AllocateCompleteHandler) + Memory->Adapter->DriverHandle->MiniportCharacteristics.AllocateCompleteHandler( + Memory->Adapter, Memory->VirtualAddress, &Memory->PhysicalAddress, Memory->Length, Memory->Context); + + ExFreePool(Memory); +} + + +/* + * @implemented + */ +NDIS_STATUS +EXPORT +NdisMAllocateSharedMemoryAsync( + IN NDIS_HANDLE MiniportAdapterHandle, + IN ULONG Length, + IN BOOLEAN Cached, + IN PVOID Context) +{ + HANDLE ThreadHandle; + PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; + PMINIPORT_SHARED_MEMORY Memory; + + NDIS_DbgPrint(MAX_TRACE,("Called.\n")); + + ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); + + /* Must be NonpagedPool because by definition we're at DISPATCH_LEVEL */ + Memory = ExAllocatePool(NonPagedPool, sizeof(MINIPORT_SHARED_MEMORY)); + + if(!Memory) + { + NDIS_DbgPrint(MID_TRACE, ("Insufficient resources\n")); + return NDIS_STATUS_FAILURE; + } + + Memory->AdapterObject = Adapter->NdisMiniportBlock.SystemAdapterObject; + Memory->Length = Length; + Memory->Cached = Cached; + Memory->Adapter = &Adapter->NdisMiniportBlock; + Memory->Context = Context; + + PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS, 0, 0, 0, NdisMAllocateSharedMemoryPassive, Memory); + ZwClose(ThreadHandle); + + return NDIS_STATUS_PENDING; +} /* * @implemented