[ros-diffs] [cgutman] 40004: - Merge aicom-network-fixes up to r39995

cgutman at svn.reactos.org cgutman at svn.reactos.org
Fri Mar 13 18:25:49 CET 2009


Author: cgutman
Date: Fri Mar 13 20:25:48 2009
New Revision: 40004

URL: http://svn.reactos.org/svn/reactos?rev=40004&view=rev
Log:
 - Merge aicom-network-fixes up to r39995

Modified:
    trunk/reactos/drivers/network/afd/afd/info.c
    trunk/reactos/drivers/network/afd/afd/main.c
    trunk/reactos/drivers/network/afd/include/afd.h
    trunk/reactos/drivers/network/dd/pcnet/pcnet.c
    trunk/reactos/drivers/network/ndis/ndis/config.c

Modified: trunk/reactos/drivers/network/afd/afd/info.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/info.c?rev=40004&r1=40003&r2=40004&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] Fri Mar 13 20:25:48 2009
@@ -70,22 +70,19 @@
 }
 
 NTSTATUS NTAPI
-AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
-                      PIO_STACK_LOCATION IrpSp, BOOLEAN Local ) {
+AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
+                      PIO_STACK_LOCATION IrpSp ) {
     NTSTATUS Status = STATUS_SUCCESS;
     PFILE_OBJECT FileObject = IrpSp->FileObject;
     PAFD_FCB FCB = FileObject->FsContext;
-    PMDL Mdl = NULL, SysMdl = NULL;
-    PTDI_CONNECTION_INFORMATION ConnInfo = NULL;
-    PTRANSPORT_ADDRESS TransAddr = NULL;
-    HANDLE ProcHandle = NULL;
-    BOOLEAN UnlockSysMdl = FALSE;
-    PVOID UserSpace = NULL;
-    ULONG Length, InOutLength;
-
-    AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
+    PMDL Mdl = NULL;
 
     if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
+
+    if( FCB->AddressFile.Object == NULL && FCB->Connection.Object == NULL ) {
+	 return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0,
+	                                NULL );
+    }
 
     Mdl = IoAllocateMdl
 	( Irp->UserBuffer,
@@ -103,124 +100,69 @@
 	} _SEH2_END;
 
 	if( NT_SUCCESS(Status) ) {
-            if( Local ) {
-                if( FCB->AddressFile.Object == NULL ) {
-	            return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0,
-	                                           NULL );
-                }
-
                 Status = TdiQueryInformation
-                    ( FCB->Connection.Object ? 
-					  FCB->Connection.Object : FCB->AddressFile.Object,
+                    ( FCB->Connection.Object ? FCB->Connection.Object : FCB->AddressFile.Object,
                       TDI_QUERY_ADDRESS_INFO,
                       Mdl );
-            } else {
-                // what follows is fucked up shit.
-                // i'm not sure how to avoid it
-                // sorry
-                // -- arty
-
-                if( FCB->Connection.Object == NULL || (FCB->State != SOCKET_STATE_BOUND && FCB->State != SOCKET_STATE_CONNECTED) ) {
-	            return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0,
-	                                           NULL );
-                }
-
-                if( NT_SUCCESS
-                    ( Status = TdiBuildNullConnectionInfo
-                      ( &ConnInfo,
-                        FCB->RemoteAddress->Address[0].AddressType ) ) ) {
-
-		    Length = TaLengthOfTransportAddress
-			(ConnInfo->RemoteAddress);
-
-		    if (NT_SUCCESS(Status))
-			Status = ObOpenObjectByPointer
-			    (PsGetCurrentProcess(),
-			     0,
-			     NULL,
-			     PROCESS_ALL_ACCESS,
-			     PsProcessType,
-			     KernelMode,
-			     &ProcHandle);
-
-		    if (NT_SUCCESS(Status))
-		    {
-			InOutLength =
-			    PAGE_ROUND_UP(sizeof(TDI_CONNECTION_INFO));
-
-			Status = NtAllocateVirtualMemory
-			    (ProcHandle,
-			     (PVOID*)&UserSpace,
-			     PAGE_SHIFT,
-			     &InOutLength,
-			     MEM_COMMIT,
-			     PAGE_READWRITE);
-		    }
-
-		    if (NT_SUCCESS(Status))
-		    {
-			ExFreePool(ConnInfo);
-			ConnInfo = (PTDI_CONNECTION_INFORMATION)UserSpace;
-
-			SysMdl = IoAllocateMdl
-			    ( UserSpace, Length, FALSE, FALSE, NULL );
-		    }
-		    else
-		    {
-			ExFreePool(ConnInfo);
-			ConnInfo = NULL;
-		    }
-		}
-
-                if( SysMdl ) {
-                    _SEH2_TRY {
-                        MmProbeAndLockPages( SysMdl, Irp->RequestorMode, IoModifyAccess );
-			UnlockSysMdl = TRUE;
-                    } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
-	                AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
-	                Status = _SEH2_GetExceptionCode();
-                    } _SEH2_END;
-                } else Status = STATUS_NO_MEMORY;
-
-                if( NT_SUCCESS(Status) ) {
-                    Status = TdiQueryInformation
-                        ( FCB->Connection.Object,
-                          TDI_QUERY_CONNECTION_INFO,
-                          SysMdl );
-                }
-
-                if( NT_SUCCESS(Status) ) {
-                    TransAddr =
-                        (PTRANSPORT_ADDRESS)MmGetSystemAddressForMdlSafe( Mdl, NormalPagePriority );
-
-                    if( TransAddr )
-                        RtlCopyMemory( TransAddr, ConnInfo->RemoteAddress,
-                                       TaLengthOfTransportAddress
-                                       ( ConnInfo->RemoteAddress ) );
-                    else Status = STATUS_INSUFFICIENT_RESOURCES;
-		}
-
-		if (UnlockSysMdl)
-		    MmUnlockPages( SysMdl );
-
-                if( SysMdl ) IoFreeMdl( SysMdl );
-                if( ConnInfo )
-		    NtFreeVirtualMemory
-			( ProcHandle,
-			  (PVOID)ConnInfo,
-			  &InOutLength,
-			  MEM_RELEASE );
-		if( ProcHandle ) NtClose(ProcHandle);
-                if( TransAddr ) MmUnmapLockedPages( TransAddr, Mdl );
-                MmUnlockPages( Mdl );
-                IoFreeMdl( Mdl );
-            }
-	}
-    } else {
-    	Status = STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
+        }
+    } else
+        Status = STATUS_INSUFFICIENT_RESOURCES;
 
     return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL );
 }
+
+NTSTATUS NTAPI
+AfdGetPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
+                      PIO_STACK_LOCATION IrpSp ) {
+    NTSTATUS Status = STATUS_SUCCESS;
+    PFILE_OBJECT FileObject = IrpSp->FileObject;
+    PAFD_FCB FCB = FileObject->FsContext;
+    PMDL Mdl = NULL;
+    PTDI_CONNECTION_INFORMATION ConnInfo = NULL;
+
+
+    if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
+
+    if (FCB->RemoteAddress == NULL || FCB->Connection.Object == NULL) {
+        return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0, NULL );
+    }
+
+    if(NT_SUCCESS(Status = TdiBuildNullConnectionInfo
+                      (&ConnInfo,
+                       FCB->RemoteAddress->Address[0].AddressType)))
+    {
+        Mdl = IoAllocateMdl(ConnInfo, 
+                            sizeof(TDI_CONNECTION_INFORMATION) + 
+                                   TaLengthOfTransportAddress(ConnInfo->RemoteAddress),
+                            FALSE,
+                            FALSE,
+                            NULL);
+
+        if (Mdl)
+        {
+            _SEH2_TRY {
+               MmProbeAndLockPages(Mdl, Irp->RequestorMode, IoModifyAccess);
+            } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
+	       AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
+	       Status = _SEH2_GetExceptionCode();
+	    } _SEH2_END;
+
+            if (NT_SUCCESS(Status))
+            {
+                Status = TdiQueryInformation(FCB->Connection.Object,
+                          TDI_QUERY_CONNECTION_INFO,
+                          Mdl);
+
+                if (NT_SUCCESS(Status))
+                {
+                    RtlCopyMemory(Irp->UserBuffer, ConnInfo->RemoteAddress, TaLengthOfTransportAddress
+                                                                                  (ConnInfo->RemoteAddress));
+                }
+            }
+         }
+
+         ExFreePool(ConnInfo);
+    }
+
+    return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL );
+}

Modified: trunk/reactos/drivers/network/afd/afd/main.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/main.c?rev=40004&r1=40003&r2=40004&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/main.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/main.c [iso-8859-1] Fri Mar 13 20:25:48 2009
@@ -413,10 +413,10 @@
 	    return AfdDisconnect( DeviceObject, Irp, IrpSp );
 
 	case IOCTL_AFD_GET_SOCK_NAME:
-	    return AfdGetSockOrPeerName( DeviceObject, Irp, IrpSp, TRUE );
+	    return AfdGetSockName( DeviceObject, Irp, IrpSp );
 
         case IOCTL_AFD_GET_PEER_NAME:
-            return AfdGetSockOrPeerName( DeviceObject, Irp, IrpSp, FALSE );
+            return AfdGetPeerName( DeviceObject, Irp, IrpSp );
 
 	case IOCTL_AFD_GET_TDI_HANDLES:
 	    AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_TDI_HANDLES\n"));

Modified: trunk/reactos/drivers/network/afd/include/afd.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/include/afd.h?rev=40004&r1=40003&r2=40004&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/include/afd.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/include/afd.h [iso-8859-1] Fri Mar 13 20:25:48 2009
@@ -237,8 +237,12 @@
 	    PIO_STACK_LOCATION IrpSp );
 
 NTSTATUS NTAPI
-AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
-                      PIO_STACK_LOCATION IrpSp, BOOLEAN Local );
+AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
+                PIO_STACK_LOCATION IrpSp );
+
+NTSTATUS NTAPI
+AfdGetPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
+                PIO_STACK_LOCATION IrpSp );
 
 /* listen.c */
 NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp,

Modified: trunk/reactos/drivers/network/dd/pcnet/pcnet.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/dd/pcnet/pcnet.c?rev=40004&r1=40003&r2=40004&view=diff
==============================================================================
--- trunk/reactos/drivers/network/dd/pcnet/pcnet.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/dd/pcnet/pcnet.c [iso-8859-1] Fri Mar 13 20:25:48 2009
@@ -830,6 +830,9 @@
   PADAPTER Adapter = 0;
   NDIS_STATUS Status = NDIS_STATUS_FAILURE;
   BOOLEAN InterruptRegistered = FALSE;
+  NDIS_HANDLE ConfigurationHandle;
+  UINT *RegNetworkAddress = 0;
+  UINT RegNetworkAddressLength = 0;
 
   ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
@@ -923,6 +926,25 @@
 
       /* set up the initialization block */
       MiPrepareInitializationBlock(Adapter);
+
+      /* see if someone set a network address manually */
+      NdisOpenConfiguration(&Status, &ConfigurationHandle, WrapperConfigurationContext);
+      if (Status == NDIS_STATUS_SUCCESS)
+      {
+         NdisReadNetworkAddress(&Status, (PVOID *)&RegNetworkAddress, &RegNetworkAddressLength, ConfigurationHandle);
+         if(Status == NDIS_STATUS_SUCCESS && RegNetworkAddressLength == 6)
+         {
+             int i;
+             DPRINT("NdisReadNetworkAddress returned successfully, address %x:%x:%x:%x:%x:%x\n",
+                     RegNetworkAddress[0], RegNetworkAddress[1], RegNetworkAddress[2], RegNetworkAddress[3],
+                     RegNetworkAddress[4], RegNetworkAddress[5]);
+
+             for(i = 0; i < 6; i++)
+                 Adapter->InitializationBlockVirt->PADR[i] = RegNetworkAddress[i];
+         }
+
+         NdisCloseConfiguration(ConfigurationHandle);
+      }
 
       DPRINT("Interrupt registered successfully\n");
 

Modified: trunk/reactos/drivers/network/ndis/ndis/config.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/ndis/ndis/config.c?rev=40004&r1=40003&r2=40004&view=diff
==============================================================================
--- trunk/reactos/drivers/network/ndis/ndis/config.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/ndis/ndis/config.c [iso-8859-1] Fri Mar 13 20:25:48 2009
@@ -713,6 +713,13 @@
 
     *NetworkAddressLength = (UINT)((j/2)+0.5);
 
+    if (j == 0)
+    {
+        NDIS_DbgPrint(MIN_TRACE,("Empty NetworkAddress registry entry.\n"));
+        *Status = NDIS_STATUS_FAILURE;
+        return;
+    }
+
     IntArray = ExAllocatePool(PagedPool, (*NetworkAddressLength)*sizeof(UINT));
     if(!IntArray)
     {



More information about the Ros-diffs mailing list