Author: cmihail Date: Fri Jun 10 09:24:29 2011 New Revision: 52170 URL: http://svn.reactos.org/svn/reactos?rev=52170&view=rev Log: [AFD, TCPIP] Bind issue seems solved now. Server app can be restarted without failing at binding. More information is at r52166. Patch by cgutman.
Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/bind.c branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/listen.c branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/lock.c branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/main.c branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/write.c branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/dispatch.c branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/fileobjs.c branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/main.c Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/bind.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/bind.c?rev=52170&r1=52169&r2=52170&view=diff ============================================================================== --- branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/bind.c [iso-8859-1] (original) +++ branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/bind.c [iso-8859-1] Fri Jun 10 09:24:29 2011 @@ -65,6 +65,7 @@ PAFD_BIND_DATA BindReq; AFD_DbgPrint(MID_TRACE,("Called\n")); + DbgPrint("[AFD, AfdBindSocket] Called\n"); if ( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp ); @@ -109,6 +110,8 @@ if (NT_SUCCESS(Status)) FCB->State = SOCKET_STATE_BOUND; + DbgPrint("[AFD, AfdBindSocket] Leaving\n"); + /* MSAFD relies on us returning the address file handle in the IOSB */ return UnlockAndMaybeComplete( FCB, Status, Irp, (ULONG_PTR)FCB->AddressFile.Handle ); } Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/listen.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/listen.c?rev=52170&r1=52169&r2=52170&view=diff ============================================================================== --- branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/listen.c [iso-8859-1] (original) +++ branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/listen.c [iso-8859-1] Fri Jun 10 09:24:29 2011 @@ -114,22 +114,22 @@ NTSTATUS Status = STATUS_SUCCESS; PAFD_FCB FCB = (PAFD_FCB)Context; PAFD_TDI_OBJECT_QELT Qelt; - PLIST_ENTRY NextIrpEntry, QeltEntry; + PLIST_ENTRY NextIrpEntry; PIRP NextIrp; DbgPrint("[AFD, ListenComplete] Called\n"); - if( !SocketAcquireStateLock( FCB ) ) + if ( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED; FCB->ListenIrp.InFlightRequest = NULL; DbgPrint("[AFD, ListenComplete] FCB->State = 0x%x (should be 0x%x)\n", FCB->State, SOCKET_STATE_CLOSED); - if( FCB->State == SOCKET_STATE_CLOSED ) + if ( FCB->State == SOCKET_STATE_CLOSED ) { /* Cleanup our IRP queue because the FCB is being destroyed */ - while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_PREACCEPT] ) ) + while ( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_PREACCEPT] ) ) { NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_PREACCEPT]); NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry); @@ -140,13 +140,6 @@ IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT ); } - /* Free all pending connections */ - while( !IsListEmpty( &FCB->PendingConnections ) ) { - QeltEntry = RemoveHeadList(&FCB->PendingConnections); - Qelt = CONTAINING_RECORD(QeltEntry, AFD_TDI_OBJECT_QELT, ListEntry); - ExFreePool(Qelt); - } - /* Free ConnectionReturnInfo and ConnectionCallInfo */ if (FCB->ListenIrp.ConnectionReturnInfo) { @@ -165,7 +158,13 @@ } AFD_DbgPrint(MID_TRACE,("Completing listen request.\n")); - AFD_DbgPrint(MID_TRACE,("IoStatus was %x\n", FCB->ListenIrp.Iosb.Status)); + AFD_DbgPrint(MID_TRACE,("IoStatus was %x\n", Irp->IoStatus.Status)); + + if (Irp->IoStatus.Status != STATUS_SUCCESS) + { + SocketStateUnlock(FCB); + return Irp->IoStatus.Status; + } DbgPrint("[AFD, ListenComplete] Completing listen request.\n"); DbgPrint("[AFD, ListenComplete] IoStatus was %x\n", FCB->ListenIrp.Iosb.Status); @@ -202,7 +201,7 @@ } /* Satisfy a pre-accept request if one is available */ - if( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_PREACCEPT] ) && + if ( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_PREACCEPT] ) && !IsListEmpty( &FCB->PendingConnections ) ) { PLIST_ENTRY PendingIrp = @@ -240,7 +239,7 @@ } /* Trigger a select return if appropriate */ - if( !IsListEmpty( &FCB->PendingConnections ) ) + if ( !IsListEmpty( &FCB->PendingConnections ) ) { FCB->PollState |= AFD_EVENT_ACCEPT; FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS; Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/lock.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/lock.c?rev=52170&r1=52169&r2=52170&view=diff ============================================================================== --- branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/lock.c [iso-8859-1] (original) +++ branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/lock.c [iso-8859-1] Fri Jun 10 09:24:29 2011 @@ -252,10 +252,38 @@ } NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function ) { + NTSTATUS Status; + + /* Add the IRP to the queue in all cases (so AfdCancelHandler will work properly) */ InsertTailList( &FCB->PendingIrpList[Function], - &Irp->Tail.Overlay.ListEntry ); - IoMarkIrpPending(Irp); - (void)IoSetCancelRoutine(Irp, AfdCancelHandler); + &Irp->Tail.Overlay.ListEntry ); + + /* Acquire the cancel spin lock and check the cancel bit */ + IoAcquireCancelSpinLock(&Irp->CancelIrql); + if (!Irp->Cancel) + { + /* We are not cancelled; we're good to go so + * set the cancel routine, release the cancel spin lock, + * mark the IRP as pending, and + * return STATUS_PENDING to the caller + */ + (void)IoSetCancelRoutine(Irp, AfdCancelHandler); + IoReleaseCancelSpinLock(Irp->CancelIrql); + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; + } + else + { + /* We were already cancelled before we were able to register our cancel routine + * so we are to call the cancel routine ourselves right here to cancel the IRP + * (which handles all the stuff we do above) and return STATUS_CANCELLED to the caller + */ + AfdCancelHandler(IoGetCurrentIrpStackLocation(Irp)->DeviceObject, + Irp); + Status = STATUS_CANCELLED; + } + SocketStateUnlock( FCB ); - return STATUS_PENDING; -} + + return Status; +} Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/main.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/main.c?rev=52170&r1=52169&r2=52170&view=diff ============================================================================== --- branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/main.c [iso-8859-1] (original) +++ branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/main.c [iso-8859-1] Fri Jun 10 09:24:29 2011 @@ -258,7 +258,7 @@ AFD_DbgPrint(MID_TRACE, ("AfdCreate(DeviceObject %p Irp %p)\n", DeviceObject, Irp)); - DbgPrint("[AfdCreate] Created socket\n"); + DbgPrint("[AFD, AfdCreate] Called\n"); DeviceExt = DeviceObject->DeviceExtension; FileObject = IrpSp->FileObject; @@ -368,6 +368,8 @@ Irp->IoStatus.Status = Status; IoCompleteRequest( Irp, IO_NETWORK_INCREMENT ); + DbgPrint("[AFD, AfdCreate] Leaving. Status = 0x%x\n"); + return Status; } @@ -383,10 +385,12 @@ DbgPrint("[AFD, AfdCleanupSocket] Called\n"); - if( !SocketAcquireStateLock( FCB ) ) return LostSocket(Irp); + if ( !SocketAcquireStateLock( FCB ) ) + return LostSocket(Irp); for (Function = 0; Function < MAX_FUNCTIONS; Function++) { + /* Cancel IRPs from MSAFD to AFD (pending IRPs) */ CurrentEntry = FCB->PendingIrpList[Function].Flink; while (CurrentEntry != &FCB->PendingIrpList[Function]) { @@ -415,15 +419,18 @@ PAFD_FCB FCB = FileObject->FsContext; UINT i; PAFD_IN_FLIGHT_REQUEST InFlightRequest[IN_FLIGHT_REQUESTS]; + PAFD_TDI_OBJECT_QELT Qelt; + PLIST_ENTRY QeltEntry; + AFD_DbgPrint(MID_TRACE, ("AfdClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp)); - DbgPrint("[AfdCloseSocket] Called\n"); + DbgPrint("[AFD, AfdCloseSocket] Called\n"); if( !SocketAcquireStateLock( FCB ) ) return STATUS_FILE_CLOSED; - DbgPrint("[AfdCloseSocket] Setting closed state\n"); + DbgPrint("[AFD, AfdCloseSocket] Setting closed state\n"); FCB->State = SOCKET_STATE_CLOSED; FCB->PollState = AFD_EVENT_CLOSE; @@ -435,7 +442,8 @@ InFlightRequest[2] = &FCB->SendIrp; InFlightRequest[3] = &FCB->ConnectIrp; - /* Cancel our pending requests */ + /* Cancel our pending _In Flight_ IRPs + That is IRPs from AFD -> tcpip*/ for( i = 0; i < IN_FLIGHT_REQUESTS; i++ ) { if( InFlightRequest[i]->InFlightRequest ) @@ -448,6 +456,24 @@ KillSelectsForFCB( FCB->DeviceExt, FileObject, FALSE ); + ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_CONNECT])); + ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_SEND])); + ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_RECV])); + ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_PREACCEPT])); + + while (!IsListEmpty(&FCB->PendingConnections)) + { + QeltEntry = RemoveHeadList(&FCB->PendingConnections); + Qelt = CONTAINING_RECORD(QeltEntry, AFD_TDI_OBJECT_QELT, ListEntry); + + /* We have to close all pending connections or the listen won't get closed */ + TdiDisassociateAddressFile(Qelt->Object.Object); + ObDereferenceObject(Qelt->Object.Object); + ZwClose(Qelt->Object.Handle); + + ExFreePool(Qelt); + } + SocketStateUnlock( FCB ); if( FCB->EventSelect ) @@ -489,7 +515,7 @@ if( FCB->Connection.Object ) { TdiDisassociateAddressFile(FCB->Connection.Object); - ObDereferenceObject(FCB->Connection.Object); + ObDereferenceObject(FCB->Connection.Object); } if( FCB->AddressFile.Object ) @@ -499,7 +525,7 @@ { if (ZwClose(FCB->AddressFile.Handle) == STATUS_INVALID_HANDLE) { - DbgPrint("[AfdCloseSocket] INVALID ADDRESS FILE HANDLE VALUE: %x %x\n", FCB->AddressFile.Handle, FCB->AddressFile.Object); + DbgPrint("[AFD, AfdCloseSocket] INVALID ADDRESS FILE HANDLE VALUE: %x %x\n", FCB->AddressFile.Handle, FCB->AddressFile.Object); } } @@ -507,7 +533,7 @@ { if (ZwClose(FCB->Connection.Handle) == STATUS_INVALID_HANDLE) { - DbgPrint("[AfdCloseSocket] INVALID CONNECTION HANDLE VALUE: %x %x\n", FCB->Connection.Handle, FCB->Connection.Object); + DbgPrint("[AFD, AfdCloseSocket] INVALID CONNECTION HANDLE VALUE: %x %x\n", FCB->Connection.Handle, FCB->Connection.Object); } } @@ -521,7 +547,7 @@ IoCompleteRequest(Irp, IO_NETWORK_INCREMENT); AFD_DbgPrint(MID_TRACE, ("Returning success.\n")); - DbgPrint("[AfdCloseSocket] Leaving\n"); + DbgPrint("[AFD, AfdCloseSocket] Leaving\n"); return STATUS_SUCCESS; } @@ -793,6 +819,33 @@ return (Status); } +VOID +CleanupPendingIrp(PIRP Irp, PIO_STACK_LOCATION IrpSp, PAFD_ACTIVE_POLL Poll) +{ + PAFD_RECV_INFO RecvReq; + PAFD_SEND_INFO SendReq; + PAFD_POLL_INFO PollReq; + + if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_RECV || + IrpSp->MajorFunction == IRP_MJ_READ) + { + RecvReq = IrpSp->Parameters.DeviceIoControl.Type3InputBuffer; + UnlockBuffers(RecvReq->BufferArray, RecvReq->BufferCount, FALSE); + } + else if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_SEND || + IrpSp->MajorFunction == IRP_MJ_WRITE) + { + SendReq = IrpSp->Parameters.DeviceIoControl.Type3InputBuffer; + UnlockBuffers(SendReq->BufferArray, SendReq->BufferCount, FALSE); + } + else if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_SELECT) + { + PollReq = Irp->AssociatedIrp.SystemBuffer; + ZeroEvents(PollReq->Handles, PollReq->HandleCount); + SignalSocket(Poll, NULL, PollReq, STATUS_CANCELLED); + } +} + VOID NTAPI AfdCancelHandler(PDEVICE_OBJECT DeviceObject, PIRP Irp) @@ -800,39 +853,46 @@ PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - UINT Function; - PAFD_RECV_INFO RecvReq; - PAFD_SEND_INFO SendReq; + ULONG Function, IoctlCode; + PIRP CurrentIrp; PLIST_ENTRY CurrentEntry; - PIRP CurrentIrp; PAFD_DEVICE_EXTENSION DeviceExt = DeviceObject->DeviceExtension; KIRQL OldIrql; PAFD_ACTIVE_POLL Poll; - PAFD_POLL_INFO PollReq; IoReleaseCancelSpinLock(Irp->CancelIrql); - + if (!SocketAcquireStateLock(FCB)) return; - - ASSERT(IrpSp->MajorFunction == IRP_MJ_DEVICE_CONTROL); - - switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) + + switch (IrpSp->MajorFunction) + { + case IRP_MJ_DEVICE_CONTROL: + IoctlCode = IrpSp->Parameters.DeviceIoControl.IoControlCode; + break; + + case IRP_MJ_READ: + IoctlCode = IOCTL_AFD_RECV; + break; + + case IRP_MJ_WRITE: + IoctlCode = IOCTL_AFD_SEND; + break; + + default: + ASSERT(FALSE); + SocketStateUnlock(FCB); + return; + } + + switch (IoctlCode) { case IOCTL_AFD_RECV: - RecvReq = IrpSp->Parameters.DeviceIoControl.Type3InputBuffer; - UnlockBuffers(RecvReq->BufferArray, RecvReq->BufferCount, FALSE); - /* Fall through */ - case IOCTL_AFD_RECV_DATAGRAM: Function = FUNCTION_RECV; break; case IOCTL_AFD_SEND: - SendReq = IrpSp->Parameters.DeviceIoControl.Type3InputBuffer; - UnlockBuffers(SendReq->BufferArray, SendReq->BufferCount, FALSE); - /* Fall through */ - case IOCTL_AFD_SEND_DATAGRAM: Function = FUNCTION_SEND; break; @@ -852,14 +912,13 @@ while (CurrentEntry != &DeviceExt->Polls) { Poll = CONTAINING_RECORD(CurrentEntry, AFD_ACTIVE_POLL, ListEntry); - CurrentIrp = Poll->Irp; - PollReq = CurrentIrp->AssociatedIrp.SystemBuffer; - - if (CurrentIrp == Irp) + + if (Irp == Poll->Irp) { - ZeroEvents(PollReq->Handles, PollReq->HandleCount); - SignalSocket(Poll, NULL, PollReq, STATUS_CANCELLED); - break; + CleanupPendingIrp(Irp, IrpSp, Poll); + KeReleaseSpinLock(&DeviceExt->Lock, OldIrql); + SocketStateUnlock(FCB); + return; } else { @@ -869,8 +928,9 @@ KeReleaseSpinLock(&DeviceExt->Lock, OldIrql); - /* IRP already completed by SignalSocket */ SocketStateUnlock(FCB); + + DbgPrint("WARNING!!! IRP cancellation race could lead to a process hang! (IOCTL_AFD_SELECT)\n"); return; default: @@ -887,7 +947,9 @@ if (CurrentIrp == Irp) { RemoveEntryList(CurrentEntry); - break; + CleanupPendingIrp(Irp, IrpSp, NULL); + UnlockAndMaybeComplete(FCB, STATUS_CANCELLED, Irp, 0); + return; } else { @@ -895,7 +957,9 @@ } } - UnlockAndMaybeComplete(FCB, STATUS_CANCELLED, Irp, 0); + SocketStateUnlock(FCB); + + DbgPrint("WARNING!!! IRP cancellation race could lead to a process hang! (Function: %d)\n", Function); } static VOID NTAPI Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/write.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/write.c?rev=52170&r1=52169&r2=52170&view=diff ============================================================================== --- branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/write.c [iso-8859-1] (original) +++ branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/write.c [iso-8859-1] Fri Jun 10 09:24:29 2011 @@ -185,9 +185,12 @@ FCB->SendIrp.InFlightRequest = NULL; /* Request is not in flight any longer */ - FCB->PollState |= AFD_EVENT_SEND; - FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS; - PollReeval( FCB->DeviceExt, FCB->FileObject ); + if (Irp->IoStatus.Status == STATUS_SUCCESS) + { + FCB->PollState |= AFD_EVENT_SEND; + FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS; + PollReeval( FCB->DeviceExt, FCB->FileObject ); + } if( FCB->State == SOCKET_STATE_CLOSED ) { /* Cleanup our IRP queue because the FCB is being destroyed */ Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/dispatch.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/dispatch.c?rev=52170&r1=52169&r2=52170&view=diff ============================================================================== --- branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] (original) +++ branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/dispatch.c [iso-8859-1] Fri Jun 10 09:24:29 2011 @@ -647,21 +647,22 @@ * when a new connection arrives. */ /* The important thing to note here is that the irp we'll complete belongs * to the socket to be accepted onto, not the listener */ - if( NT_SUCCESS(Status) && !Connection->AddressFile->Listener ) + if ( NT_SUCCESS(Status) && !Connection->AddressFile->Listener ) { Connection->AddressFile->Listener = TCPAllocateConnectionEndpoint( NULL ); - if( !Connection->AddressFile->Listener ) + if ( !Connection->AddressFile->Listener ) Status = STATUS_NO_MEMORY; - if( NT_SUCCESS(Status) ) { + if ( NT_SUCCESS(Status) ) + { Connection->AddressFile->Listener->AddressFile = Connection->AddressFile; - Status = TCPSocket( Connection->AddressFile->Listener, - Connection->AddressFile->Family, - SOCK_STREAM, - Connection->AddressFile->Protocol ); + Status = TCPSocket( Connection->AddressFile->Listener, + Connection->AddressFile->Family, + SOCK_STREAM, + Connection->AddressFile->Protocol ); } if ( NT_SUCCESS(Status) ) Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/fileobjs.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/fileobjs.c?rev=52170&r1=52169&r2=52170&view=diff ============================================================================== --- branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/fileobjs.c [iso-8859-1] (original) +++ branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/fileobjs.c [iso-8859-1] Fri Jun 10 09:24:29 2011 @@ -239,6 +239,7 @@ PADDRESS_FILE AddrFile; TI_DbgPrint(MID_TRACE, ("Called (Proto %d).\n", Protocol)); + DbgPrint("[TCPIP, FileOpenAddress] Called. Proto %d\n", Protocol); AddrFile = ExAllocatePoolWithTag(NonPagedPool, sizeof(ADDRESS_FILE), ADDR_FILE_TAG); @@ -359,6 +360,7 @@ &AddressFileListLock); TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); + DbgPrint("[TCPIP, FileOpenAddress] Leaving\n"); return STATUS_SUCCESS; } @@ -376,6 +378,8 @@ { PADDRESS_FILE AddrFile = Request->Handle.AddressHandle; KIRQL OldIrql; + + DbgPrint("[TCPIP, FileCloseAddress] Called\n"); if (!Request->Handle.AddressHandle) return STATUS_INVALID_PARAMETER; @@ -393,6 +397,7 @@ DereferenceObject(AddrFile); TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); + DbgPrint("[TCPIP, FileCloseAddress] Leaving\n"); return STATUS_SUCCESS; } Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/main.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/main.c?rev=52170&r1=52169&r2=52170&view=diff ============================================================================== --- branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/main.c [iso-8859-1] (original) +++ branches/GSoC_2011/TcpIpDriver/drivers/network/tcpip/tcpip/main.c [iso-8859-1] Fri Jun 10 09:24:29 2011 @@ -260,43 +260,50 @@ PDEVICE_OBJECT DeviceObject, PIRP Irp) { - PIO_STACK_LOCATION IrpSp; - PTRANSPORT_CONTEXT Context; - TDI_REQUEST Request; - NTSTATUS Status; - - IrpSp = IoGetCurrentIrpStackLocation(Irp); - Context = IrpSp->FileObject->FsContext; - if (!Context) { - TI_DbgPrint(MIN_TRACE, ("Parameters are invalid.\n")); - return STATUS_INVALID_PARAMETER; - } - - switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) { - case TDI_TRANSPORT_ADDRESS_FILE: - Request.Handle.AddressHandle = Context->Handle.AddressHandle; - Status = FileCloseAddress(&Request); - break; - - case TDI_CONNECTION_FILE: - Request.Handle.ConnectionContext = Context->Handle.ConnectionContext; - Status = FileCloseConnection(&Request); - break; - - case TDI_CONTROL_CHANNEL_FILE: - Request.Handle.ControlChannel = Context->Handle.ControlChannel; - Status = FileCloseControlChannel(&Request); - break; - - default: - DbgPrint("Unknown type %d\n", (ULONG_PTR)IrpSp->FileObject->FsContext2); - Status = STATUS_INVALID_PARAMETER; - break; - } - - Irp->IoStatus.Status = Status; - - return Irp->IoStatus.Status; + PIO_STACK_LOCATION IrpSp; + PTRANSPORT_CONTEXT Context; + TDI_REQUEST Request; + NTSTATUS Status; + + DbgPrint("[TCPIP, TiCloseFileObject] Called\n"); + + IrpSp = IoGetCurrentIrpStackLocation(Irp); + Context = IrpSp->FileObject->FsContext; + if (!Context) + { + TI_DbgPrint(MIN_TRACE, ("Parameters are invalid.\n")); + return STATUS_INVALID_PARAMETER; + } + + switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) + { + case TDI_TRANSPORT_ADDRESS_FILE: + DbgPrint("[TCPIP, TiCloseFileObject] Closing address file\n"); + Request.Handle.AddressHandle = Context->Handle.AddressHandle; + Status = FileCloseAddress(&Request); + break; + + case TDI_CONNECTION_FILE: + Request.Handle.ConnectionContext = Context->Handle.ConnectionContext; + Status = FileCloseConnection(&Request); + break; + + case TDI_CONTROL_CHANNEL_FILE: + Request.Handle.ControlChannel = Context->Handle.ControlChannel; + Status = FileCloseControlChannel(&Request); + break; + + default: + DbgPrint("Unknown type %d\n", (ULONG_PTR)IrpSp->FileObject->FsContext2); + Status = STATUS_INVALID_PARAMETER; + break; + } + + Irp->IoStatus.Status = Status; + + DbgPrint("[TCPIP, TiCloseFileObject] Leaving. Status = 0x%x\n", Status); + + return Irp->IoStatus.Status; }