From d158ab5aa32c55bed707ec042563af1e663d7e8f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 6 Sep 2008 22:21:56 +0000 Subject: [PATCH] - Merge aicom-network-fixes up to r36009 svn path=/trunk/; revision=36010 --- reactos/drivers/network/ndis/ndis/miniport.c | 24 ++++++++++++------- reactos/drivers/network/ndis/ndis/protocol.c | 6 +++-- reactos/drivers/network/ndis/ndis/stubs.c | 3 --- reactos/drivers/network/tcpip/include/ports.h | 6 ++--- reactos/drivers/network/tcpip/tcpip/buffer.c | 6 ++--- reactos/drivers/network/tcpip/tcpip/iinfo.c | 2 +- reactos/drivers/network/tcpip/tcpip/main.c | 24 +++++++++++++++---- reactos/lib/drivers/ip/network/ports.c | 4 +++- reactos/lib/drivers/ip/transport/tcp/tcp.c | 6 ++++- reactos/lib/drivers/ip/transport/udp/udp.c | 6 ++++- 10 files changed, 58 insertions(+), 29 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index 8537cd7a898..d499f285ff7 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -1293,8 +1293,7 @@ NdisIPnPStartDevice( * NdisMQueryAdapterResources. */ - if (Stack->Parameters.StartDevice.AllocatedResources != NULL && - Stack->Parameters.StartDevice.AllocatedResourcesTranslated != NULL) + if (Stack->Parameters.StartDevice.AllocatedResources != NULL) { ResourceCount = Stack->Parameters.StartDevice.AllocatedResources->List[0]. PartialResourceList.Count; @@ -1310,24 +1309,31 @@ NdisIPnPStartDevice( return STATUS_INSUFFICIENT_RESOURCES; } + RtlCopyMemory(Adapter->NdisMiniportBlock.AllocatedResources, + Stack->Parameters.StartDevice.AllocatedResources, + ResourceListSize); + } + + if (Stack->Parameters.StartDevice.AllocatedResourcesTranslated != NULL) + { + ResourceCount = Stack->Parameters.StartDevice.AllocatedResources->List[0]. + PartialResourceList.Count; + ResourceListSize = + FIELD_OFFSET(CM_RESOURCE_LIST, List[0].PartialResourceList. + PartialDescriptors[ResourceCount]); + Adapter->NdisMiniportBlock.AllocatedResourcesTranslated = ExAllocatePool(PagedPool, ResourceListSize); if (Adapter->NdisMiniportBlock.AllocatedResourcesTranslated == NULL) { - ExFreePool(Adapter->NdisMiniportBlock.AllocatedResources); - Adapter->NdisMiniportBlock.AllocatedResources = NULL; ExInterlockedRemoveEntryList( &Adapter->ListEntry, &AdapterListLock ); return STATUS_INSUFFICIENT_RESOURCES; } - RtlCopyMemory(Adapter->NdisMiniportBlock.AllocatedResources, - Stack->Parameters.StartDevice.AllocatedResources, - ResourceListSize); - RtlCopyMemory(Adapter->NdisMiniportBlock.AllocatedResourcesTranslated, Stack->Parameters.StartDevice.AllocatedResourcesTranslated, ResourceListSize); - } + } /* * Store the Bus Type, Bus Number and Slot information. It's used by diff --git a/reactos/drivers/network/ndis/ndis/protocol.c b/reactos/drivers/network/ndis/ndis/protocol.c index e2ac8bb649f..b9fa3729792 100644 --- a/reactos/drivers/network/ndis/ndis/protocol.c +++ b/reactos/drivers/network/ndis/ndis/protocol.c @@ -805,10 +805,11 @@ NdisRegisterProtocol( NtStatus = ZwQueryValueKey(DriverKeyHandle, &ValueName, KeyValuePartialInformation, KeyInformation, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + ResultLength, &ResultLength); + ZwClose(DriverKeyHandle); + if(!NT_SUCCESS(NtStatus)) { NDIS_DbgPrint(MIN_TRACE, ("Unable to query the Bind value\n")); - ZwClose(DriverKeyHandle); ExFreePool(KeyInformation); ExFreePool(Protocol); *Status = NDIS_STATUS_FAILURE; @@ -893,7 +894,8 @@ NdisRegisterProtocol( */ } - *Status = NDIS_STATUS_SUCCESS; + ExFreePool(KeyInformation); + *Status = NDIS_STATUS_SUCCESS; } diff --git a/reactos/drivers/network/ndis/ndis/stubs.c b/reactos/drivers/network/ndis/ndis/stubs.c index 907dd402d0b..ea6380b82ab 100644 --- a/reactos/drivers/network/ndis/ndis/stubs.c +++ b/reactos/drivers/network/ndis/ndis/stubs.c @@ -322,9 +322,6 @@ NdisOpenFile( 0, // PVOID EaBuffer 0 ); // ULONG EaLength - //if ( !NT_SUCCESS(*Status) ) - // goto cleanup; - cleanup: if ( FullFileName.Buffer != NULL ) { diff --git a/reactos/drivers/network/tcpip/include/ports.h b/reactos/drivers/network/tcpip/include/ports.h index bc20f34e17e..aac05aa7a7a 100644 --- a/reactos/drivers/network/tcpip/include/ports.h +++ b/reactos/drivers/network/tcpip/include/ports.h @@ -20,9 +20,9 @@ typedef struct _PORT_SET { FAST_MUTEX Mutex; } PORT_SET, *PPORT_SET; -VOID PortsStartup( PPORT_SET PortSet, - UINT StartingPort, - UINT PortsToManage ); +NTSTATUS PortsStartup( PPORT_SET PortSet, + UINT StartingPort, + UINT PortsToManage ); VOID PortsShutdown( PPORT_SET PortSet ); VOID DeallocatePort( PPORT_SET PortSet, ULONG Port ); BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ); diff --git a/reactos/drivers/network/tcpip/tcpip/buffer.c b/reactos/drivers/network/tcpip/tcpip/buffer.c index 4379ae2eebe..35b2d1f555f 100644 --- a/reactos/drivers/network/tcpip/tcpip/buffer.c +++ b/reactos/drivers/network/tcpip/tcpip/buffer.c @@ -319,11 +319,11 @@ NDIS_STATUS PrependPacket( PNDIS_PACKET Packet, PCHAR Data, UINT Length, if( Copy ) { NewBuf = ExAllocatePool( NonPagedPool, Length ); - if( !NewBuf ) return STATUS_NO_MEMORY; + if( !NewBuf ) return NDIS_STATUS_RESOURCES; RtlCopyMemory( NewBuf, Data, Length ); } else NewBuf = Data; - NdisAllocateBuffer( &Status, &Buffer, GlobalBufferPool, Data, Length ); + NdisAllocateBuffer( &Status, &Buffer, GlobalBufferPool, NewBuf, Length ); if( Status != NDIS_STATUS_SUCCESS ) return Status; NdisChainBufferAtFront( Packet, Buffer ); @@ -351,7 +351,7 @@ NDIS_STATUS AllocatePacketWithBufferX( PNDIS_PACKET *NdisPacket, PCHAR NewData; NewData = ExAllocatePool( NonPagedPool, Len ); - if( !NewData ) return NDIS_STATUS_NOT_ACCEPTED; // XXX + if( !NewData ) return NDIS_STATUS_RESOURCES; TrackWithTag(EXALLOC_TAG, NewData, File, Line); if( Data ) RtlCopyMemory(NewData, Data, Len); diff --git a/reactos/drivers/network/tcpip/tcpip/iinfo.c b/reactos/drivers/network/tcpip/tcpip/iinfo.c index 2bed180272d..92ee6608f6a 100644 --- a/reactos/drivers/network/tcpip/tcpip/iinfo.c +++ b/reactos/drivers/network/tcpip/tcpip/iinfo.c @@ -29,7 +29,7 @@ TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID, (PIFENTRY)ExAllocatePool( NonPagedPool, sizeof(IFENTRY) + MAX_IFDESCR_LEN ); - if( !OutData ) return TDI_INVALID_REQUEST; /* Out of memory */ + if( !OutData ) return TDI_NO_RESOURCES; /* Out of memory */ RtlZeroMemory( OutData, sizeof(IFENTRY) + MAX_IFDESCR_LEN ); diff --git a/reactos/drivers/network/tcpip/tcpip/main.c b/reactos/drivers/network/tcpip/tcpip/main.c index a7ef85812df..d7bf8553f89 100644 --- a/reactos/drivers/network/tcpip/tcpip/main.c +++ b/reactos/drivers/network/tcpip/tcpip/main.c @@ -711,8 +711,8 @@ DriverEntry( /* Setup network layer and transport layer entities */ KeInitializeSpinLock(&EntityListLock); EntityList = ExAllocatePool(NonPagedPool, sizeof(TDIEntityID) * MAX_TDI_ENTITIES ); - if (!NT_SUCCESS(Status)) { - TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + if (!EntityList) { + TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); TiUnload(DriverObject); return STATUS_INSUFFICIENT_RESOURCES; } @@ -760,9 +760,23 @@ DriverEntry( IPStartup(RegistryPath); /* Initialize transport level protocol subsystems */ - RawIPStartup(); - UDPStartup(); - TCPStartup(); + Status = RawIPStartup(); + if( !NT_SUCCESS(Status) ) { + TiUnload(DriverObject); + return Status; + } + + Status = UDPStartup(); + if( !NT_SUCCESS(Status) ) { + TiUnload(DriverObject); + return Status; + } + + Status = TCPStartup(); + if( !NT_SUCCESS(Status) ) { + TiUnload(DriverObject); + return Status; + } /* Initialize the lan worker */ LANStartup(); diff --git a/reactos/lib/drivers/ip/network/ports.c b/reactos/lib/drivers/ip/network/ports.c index e78c00af65f..04ec39946c4 100644 --- a/reactos/lib/drivers/ip/network/ports.c +++ b/reactos/lib/drivers/ip/network/ports.c @@ -10,7 +10,7 @@ #include "precomp.h" -VOID PortsStartup( PPORT_SET PortSet, +NTSTATUS PortsStartup( PPORT_SET PortSet, UINT StartingPort, UINT PortsToManage ) { PortSet->StartingPort = StartingPort; @@ -19,11 +19,13 @@ VOID PortsStartup( PPORT_SET PortSet, PortSet->PortsToOversee - 1; PortSet->ProtoBitBuffer = PoolAllocateBuffer( (PortSet->PortsToOversee + 7) / 8 ); + if(!PortSet->ProtoBitBuffer) return STATUS_INSUFFICIENT_RESOURCES; RtlInitializeBitMap( &PortSet->ProtoBitmap, PortSet->ProtoBitBuffer, PortSet->PortsToOversee ); RtlClearAllBits( &PortSet->ProtoBitmap ); ExInitializeFastMutex( &PortSet->Mutex ); + return STATUS_SUCCESS; } VOID PortsShutdown( PPORT_SET PortSet ) { diff --git a/reactos/lib/drivers/ip/transport/tcp/tcp.c b/reactos/lib/drivers/ip/transport/tcp/tcp.c index c6657fd0407..33a47c356d8 100644 --- a/reactos/lib/drivers/ip/transport/tcp/tcp.c +++ b/reactos/lib/drivers/ip/transport/tcp/tcp.c @@ -455,7 +455,11 @@ NTSTATUS TCPStartup(VOID) return Status; } - PortsStartup( &TCPPorts, 1, 0xfffe ); + Status = PortsStartup( &TCPPorts, 1, 0xfffe ); + if( !NT_SUCCESS(Status) ) { + TCPMemShutdown(); + return Status; + } RegisterOskitTCPEventHandlers( &EventHandlers ); InitOskitTCP(); diff --git a/reactos/lib/drivers/ip/transport/udp/udp.c b/reactos/lib/drivers/ip/transport/udp/udp.c index 1dba3035179..b666c5410fd 100644 --- a/reactos/lib/drivers/ip/transport/udp/udp.c +++ b/reactos/lib/drivers/ip/transport/udp/udp.c @@ -302,8 +302,12 @@ NTSTATUS UDPStartup( #ifdef __NTDRIVER__ RtlZeroMemory(&UDPStats, sizeof(UDP_STATISTICS)); #endif + + NTSTATUS Status; - PortsStartup( &UDPPorts, 1, 0xfffe ); + Status = PortsStartup( &UDPPorts, 1, 0xfffe ); + + if( !NT_SUCCESS(Status) ) return Status; /* Register this protocol with IP layer */ IPRegisterProtocol(IPPROTO_UDP, UDPReceive);