Merge aicom-network-fixes up to 35446.
authorArt Yerkes <art.yerkes@gmail.com>
Tue, 19 Aug 2008 06:06:43 +0000 (06:06 +0000)
committerArt Yerkes <art.yerkes@gmail.com>
Tue, 19 Aug 2008 06:06:43 +0000 (06:06 +0000)
I (arty) modified the new printing in msafd to be conditional, so as not to
be accused of causing unnecessary spew.

svn path=/trunk/; revision=35447

reactos/dll/win32/msafd/misc/dllmain.c
reactos/drivers/network/afd/afd/connect.c
reactos/drivers/network/afd/afd/info.c
reactos/drivers/network/afd/afd/listen.c
reactos/drivers/network/afd/afd/lock.c
reactos/drivers/network/afd/afd/read.c
reactos/drivers/network/afd/afd/select.c
reactos/drivers/network/afd/afd/tdi.c
reactos/include/ddk/tdikrnl.h
reactos/lib/drivers/ip/transport/datagram/datagram.c

index 4c520e1..1343c99 100644 (file)
@@ -285,10 +285,12 @@ DWORD MsafdReturnWithErrno( NTSTATUS Status, LPINT Errno, DWORD Received,
             if( ReturnedBytes ) *ReturnedBytes = Received; break;
         case STATUS_END_OF_FILE: *Errno = WSAESHUTDOWN; break;
         case STATUS_PENDING: *Errno = WSA_IO_PENDING; break;
-        case STATUS_BUFFER_OVERFLOW: *Errno = WSAEMSGSIZE; break;
-        case STATUS_INSUFFICIENT_RESOURCES: *Errno = WSA_NOT_ENOUGH_MEMORY; break;
-        case STATUS_INVALID_CONNECTION: *Errno = WSAEAFNOSUPPORT; break;
-        case STATUS_REMOTE_NOT_LISTENING: *Errno = WSAECONNRESET; break;
+       case STATUS_BUFFER_OVERFLOW: AFD_DbgPrint(MID_TRACE,("MSAFD: STATUS_BUFFER_TOO_SMALL/STATUS_BUFFER_OVERFLOW\n")); *Errno = WSAEMSGSIZE; break;
+       case STATUS_NO_MEMORY: /* Fall through to STATUS_INSUFFICIENT_RESOURCES */
+       case STATUS_INSUFFICIENT_RESOURCES: AFD_DbgPrint(MID_TRACE,("MSAFD: STATUS_NO_MEMORY/STATUS_INSUFFICIENT_RESOURCES\n")); *Errno = WSA_NOT_ENOUGH_MEMORY; break;
+       case STATUS_INVALID_CONNECTION: AFD_DbgPrint(MID_TRACE,("MSAFD: STATUS_INVALID_CONNECTION\n")); *Errno = WSAEAFNOSUPPORT; break;
+       case STATUS_REMOTE_NOT_LISTENING: AFD_DbgPrint(MID_TRACE, ("MSAFD: STATUS_REMOTE_NOT_LISTENING\n")); *Errno = WSAECONNRESET; break;
+       case STATUS_FILE_CLOSED: AFD_DbgPrint(MID_TRACE, ("MSAFD: STATUS_FILE_CLOSED\n")); *Errno = WSAENOTSOCK; break;
         default:
             DbgPrint("MSAFD: Error %x is unknown\n", Status);
             *Errno = WSAEINVAL; break;
index 77d9f0a..ff55ef8 100644 (file)
@@ -77,7 +77,7 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
 
     /* I was wrong about this before as we can have pending writes to a not
      * yet connected socket */
-    if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
+    if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED;
 
     AFD_DbgPrint(MID_TRACE,("Irp->IoStatus.Status = %x\n",
                            Irp->IoStatus.Status));
@@ -108,7 +108,10 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
     if( NT_SUCCESS(Status) ) {
        Status = MakeSocketIntoConnection( FCB );
 
-       if( !NT_SUCCESS(Status) ) return Status;
+       if( !NT_SUCCESS(Status) ) {
+           SocketStateUnlock( FCB );
+           return Status;
+       }
 
        if( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_SEND] ) ) {
            NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_SEND]);
index 5e233ef..231ce6a 100644 (file)
@@ -125,12 +125,20 @@ AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
                 }
 
                 if( SysMdl ) {
-                    MmBuildMdlForNonPagedPool( SysMdl );
+                    _SEH_TRY {
+                        MmProbeAndLockPages( SysMdl, Irp->RequestorMode, IoModifyAccess );
+                    } _SEH_HANDLE {
+                       AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
+                       Status = _SEH_GetExceptionCode();
+                    } _SEH_END;
+                } else Status = STATUS_NO_MEMORY;
+
+                if( NT_SUCCESS(Status) ) {
                     Status = TdiQueryInformation
                         ( FCB->AddressFile.Object,
                           TDI_QUERY_CONNECTION_INFO,
                           SysMdl );
-                } else Status = STATUS_NO_MEMORY;
+                }
 
                 if( NT_SUCCESS(Status) ) {
                     TransAddr =
@@ -142,14 +150,15 @@ AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
                     RtlCopyMemory( TransAddr, ConnInfo->RemoteAddress,
                                    TaLengthOfTransportAddress
                                    ( ConnInfo->RemoteAddress ) );
+                else Status = STATUS_INSUFFICIENT_RESOURCES;
 
                 if( ConnInfo ) ExFreePool( ConnInfo );
                 if( SysMdl ) IoFreeMdl( SysMdl );
                 if( TransAddr ) MmUnmapLockedPages( TransAddr, Mdl );
+                MmUnlockPages( Mdl );
+                IoFreeMdl( Mdl );
             }
-         /* MmUnlockPages( Mdl ); */
        }
-    /* IoFreeMdl( Mdl ); */
     } else {
        Status = STATUS_INSUFFICIENT_RESOURCES;
     }
index fbd73b9..0d3d26a 100644 (file)
@@ -83,20 +83,19 @@ static NTSTATUS NTAPI ListenComplete
 ( PDEVICE_OBJECT DeviceObject,
   PIRP Irp,
   PVOID Context ) {
-    NTSTATUS Status = STATUS_UNSUCCESSFUL;
+    NTSTATUS Status = STATUS_FILE_CLOSED;
     PAFD_FCB FCB = (PAFD_FCB)Context;
     PAFD_TDI_OBJECT_QELT Qelt;
 
-    if ( Irp->Cancel ) {
-       /* FIXME: is this anything else we need to do? */
-       FCB->ListenIrp.InFlightRequest = NULL;
-       return STATUS_SUCCESS;
-    }
-
     if( !SocketAcquireStateLock( FCB ) ) return Status;
 
     FCB->ListenIrp.InFlightRequest = NULL;
 
+    if( Irp->Cancel ) {
+       SocketStateUnlock( FCB );
+       return STATUS_SUCCESS;
+    }
+
     if( FCB->State == SOCKET_STATE_CLOSED ) {
        SocketStateUnlock( FCB );
        DestroySocket( FCB );
index d63fb56..9858b59 100644 (file)
@@ -262,7 +262,7 @@ NTSTATUS NTAPI UnlockAndMaybeComplete
 
 
 NTSTATUS LostSocket( PIRP Irp ) {
-    NTSTATUS Status = STATUS_INVALID_PARAMETER;
+    NTSTATUS Status = STATUS_FILE_CLOSED;
     AFD_DbgPrint(MIN_TRACE,("Called.\n"));
     Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = Status;
index 05f723b..048678c 100644 (file)
@@ -449,7 +449,7 @@ PacketSocketRecvComplete(
 
     AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
 
-    if( !SocketAcquireStateLock( FCB ) ) return STATUS_UNSUCCESSFUL;
+    if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED;
 
     FCB->ReceiveIrp.InFlightRequest = NULL;
 
index 1888340..8278812 100644 (file)
@@ -277,6 +277,10 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
        (PAFD_EVENT_SELECT_INFO)LockRequest( Irp, IrpSp );
     PAFD_FCB FCB = FileObject->FsContext;
 
+    if( !SocketAcquireStateLock( FCB ) ) {
+       return LostSocket( Irp );
+    }
+
     if ( !EventSelectInfo ) {
          return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
                                   0, NULL );
@@ -285,10 +289,6 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
                            EventSelectInfo->EventObject,
                            EventSelectInfo->Events));
 
-    if( !SocketAcquireStateLock( FCB ) ) {
-       return LostSocket( Irp );
-    }
-
     FCB->EventSelectTriggers = FCB->EventsFired = 0;
     if( FCB->EventSelect ) ObDereferenceObject( FCB->EventSelect );
     FCB->EventSelect = NULL;
@@ -325,15 +325,15 @@ AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
     AFD_DbgPrint(MID_TRACE,("Called (FCB %x)\n", FCB));
 
+    if( !SocketAcquireStateLock( FCB ) ) {
+       return LostSocket( Irp );
+    }
+
     if ( !EnumReq ) {
          return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
                                   0, NULL );
     }
 
-    if( !SocketAcquireStateLock( FCB ) ) {
-       return LostSocket( Irp );
-    }
-
     EnumReq->PollEvents = FCB->PollState;
     RtlZeroMemory( EnumReq->EventStatus, sizeof(EnumReq->EventStatus) );
 
index a80452d..c4501f1 100644 (file)
@@ -608,7 +608,7 @@ NTSTATUS TdiQueryInformation(
 
     KeInitializeEvent(&Event, NotificationEvent, FALSE);
 
-    Irp = TdiBuildInternalDeviceControlIrp(IOCTL_TCP_QUERY_INFORMATION, /* Sub function */
+    Irp = TdiBuildInternalDeviceControlIrp(TDI_QUERY_INFORMATION,       /* Sub function */
                                            DeviceObject,                /* Device object */
                                            ConnectionObject,            /* File object */
                                            &Event,                      /* Event */
index ef55f4a..b0f05dd 100644 (file)
@@ -577,7 +577,7 @@ TdiDefaultSendPossibleHandler(
   IrpSubFunction, DeviceObject,           \
   FileObject, Event, IoStatusBlock)       \
   IoBuildDeviceIoControlRequest(          \
-               0x00000003, DeviceObject,             \
+               IrpSubFunction, DeviceObject,             \
                NULL, 0, NULL, 0,                     \
                TRUE, Event, IoStatusBlock)
 
index c26c56b..0b70133 100644 (file)
@@ -177,6 +177,7 @@ VOID DGDeliverData(
     }
   else
     {
+      TcpipReleaseSpinLock(&AddrFile->Lock, OldIrql);
       TI_DbgPrint(MAX_TRACE, ("Discarding datagram.\n"));
     }