From 6ef8bebde954f7591ea8b8501168bfb11422f9dc Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Tue, 18 Jan 2005 04:14:13 +0000 Subject: [PATCH] Browsing netreg, the http registry server works. svn path=/trunk/; revision=13111 --- reactos/drivers/net/afd/afd/connect.c | 2 +- reactos/drivers/net/afd/afd/main.c | 6 +- reactos/drivers/net/afd/afd/write.c | 8 +- reactos/drivers/net/tcpip/tcpip/dispatch.c | 152 ++++++++++++--------- 4 files changed, 96 insertions(+), 72 deletions(-) diff --git a/reactos/drivers/net/afd/afd/connect.c b/reactos/drivers/net/afd/afd/connect.c index b653fa0af5b..9073787bbe4 100644 --- a/reactos/drivers/net/afd/afd/connect.c +++ b/reactos/drivers/net/afd/afd/connect.c @@ -61,7 +61,7 @@ NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) { ReceiveComplete, FCB ); } - + return Status; } diff --git a/reactos/drivers/net/afd/afd/main.c b/reactos/drivers/net/afd/afd/main.c index 8899bd09e29..6eed0fe59e1 100644 --- a/reactos/drivers/net/afd/afd/main.c +++ b/reactos/drivers/net/afd/afd/main.c @@ -140,6 +140,7 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, VOID DestroySocket( PAFD_FCB FCB ) { UINT i; + BOOLEAN ReturnEarly = FALSE; PAFD_IN_FLIGHT_REQUEST InFlightRequest[IN_FLIGHT_REQUESTS]; AFD_DbgPrint(MIN_TRACE,("Called (%x)\n", FCB)); @@ -161,8 +162,7 @@ VOID DestroySocket( PAFD_FCB FCB ) { FCB->ListenIrp.InFlightRequest, FCB->ReceiveIrp.InFlightRequest, FCB->SendIrp.InFlightRequest)); - SocketStateUnlock( FCB ); - return; + ReturnEarly = TRUE; } /* After PoolReeval, this FCB should not be involved in any outstanding @@ -181,6 +181,8 @@ VOID DestroySocket( PAFD_FCB FCB ) { } SocketStateUnlock( FCB ); + + if( ReturnEarly ) return; if( FCB->Recv.Window ) ExFreePool( FCB->Recv.Window ); diff --git a/reactos/drivers/net/afd/afd/write.c b/reactos/drivers/net/afd/afd/write.c index bf0f7d007b3..3e7e3a2f596 100644 --- a/reactos/drivers/net/afd/afd/write.c +++ b/reactos/drivers/net/afd/afd/write.c @@ -208,6 +208,12 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, if( !(SendReq = LockRequest( Irp, IrpSp )) ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0, NULL, FALSE ); + + /* Must lock buffers before handing off user data */ + SendReq->BufferArray = LockBuffers( SendReq->BufferArray, + SendReq->BufferCount, + NULL, NULL, + FALSE, FALSE ); TdiBuildConnectionInfo( &TargetAddress, FCB->RemoteAddress ); @@ -260,7 +266,7 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, SendReq->BufferCount, NULL, NULL, FALSE, FALSE ); - + AFD_DbgPrint(MID_TRACE,("FCB->Send.BytesUsed = %d\n", FCB->Send.BytesUsed)); diff --git a/reactos/drivers/net/tcpip/tcpip/dispatch.c b/reactos/drivers/net/tcpip/tcpip/dispatch.c index dd028b3253d..4f228c820ff 100644 --- a/reactos/drivers/net/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/net/tcpip/tcpip/dispatch.c @@ -82,74 +82,6 @@ VOID DispCancelComplete( } -VOID DDKAPI DispCancelRequest( - PDEVICE_OBJECT Device, - PIRP Irp) -/* - * FUNCTION: Cancels an IRP - * ARGUMENTS: - * Device = Pointer to device object - * Irp = Pointer to an I/O request packet - */ -{ - PIO_STACK_LOCATION IrpSp; - PTRANSPORT_CONTEXT TranContext; - PFILE_OBJECT FileObject; - UCHAR MinorFunction; - NTSTATUS Status = STATUS_SUCCESS; - - TI_DbgPrint(DEBUG_IRP, ("Called.\n")); - - IrpSp = IoGetCurrentIrpStackLocation(Irp); - FileObject = IrpSp->FileObject; - TranContext = (PTRANSPORT_CONTEXT)FileObject->FsContext; - MinorFunction = IrpSp->MinorFunction; - - TI_DbgPrint(DEBUG_IRP, ("IRP at (0x%X) MinorFunction (0x%X) IrpSp (0x%X).\n", Irp, MinorFunction, IrpSp)); - -#ifdef DBG - if (!Irp->Cancel) - TI_DbgPrint(MIN_TRACE, ("Irp->Cancel is FALSE, should be TRUE.\n")); -#endif - - IoReleaseCancelSpinLock(Irp->CancelIrql); - - /* Try canceling the request */ - switch(MinorFunction) { - case TDI_SEND: - case TDI_RECEIVE: - /* FIXME: Close connection */ - break; - - case TDI_SEND_DATAGRAM: - if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) { - TI_DbgPrint(MIN_TRACE, ("TDI_SEND_DATAGRAM, but no address file.\n")); - break; - } - - /*DGCancelSendRequest(TranContext->Handle.AddressHandle, Irp);*/ - break; - - case TDI_RECEIVE_DATAGRAM: - if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) { - TI_DbgPrint(MIN_TRACE, ("TDI_RECEIVE_DATAGRAM, but no address file.\n")); - break; - } - - /*DGCancelReceiveRequest(TranContext->Handle.AddressHandle, Irp);*/ - break; - - default: - TI_DbgPrint(MIN_TRACE, ("Unknown IRP. MinorFunction (0x%X).\n", MinorFunction)); - break; - } - - if (Status != STATUS_PENDING) - DispCancelComplete(FileObject); - - TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); -} - VOID DispDataRequestComplete( PVOID Context, NTSTATUS Status, @@ -204,6 +136,90 @@ VOID DispDataRequestComplete( } +VOID DDKAPI DispCancelRequest( + PDEVICE_OBJECT Device, + PIRP Irp) +/* + * FUNCTION: Cancels an IRP + * ARGUMENTS: + * Device = Pointer to device object + * Irp = Pointer to an I/O request packet + */ +{ + PIO_STACK_LOCATION IrpSp; + PTRANSPORT_CONTEXT TranContext; + PFILE_OBJECT FileObject; + UCHAR MinorFunction; + NTSTATUS Status = STATUS_SUCCESS; + + TI_DbgPrint(DEBUG_IRP, ("Called.\n")); + + IrpSp = IoGetCurrentIrpStackLocation(Irp); + FileObject = IrpSp->FileObject; + TranContext = (PTRANSPORT_CONTEXT)FileObject->FsContext; + MinorFunction = IrpSp->MinorFunction; + + TI_DbgPrint(DEBUG_IRP, ("IRP at (0x%X) MinorFunction (0x%X) IrpSp (0x%X).\n", Irp, MinorFunction, IrpSp)); + +#ifdef DBG + if (!Irp->Cancel) + TI_DbgPrint(MIN_TRACE, ("Irp->Cancel is FALSE, should be TRUE.\n")); +#endif + + /* Try canceling the request */ + switch(MinorFunction) { + case TDI_SEND: + TCPDisconnect + ( TranContext->Handle.ConnectionContext, + TDI_DISCONNECT_RELEASE, + NULL, + NULL, + DispDataRequestComplete, + Irp ); + break; + + case TDI_RECEIVE: + TCPDisconnect + ( TranContext->Handle.ConnectionContext, + TDI_DISCONNECT_ABORT | TDI_DISCONNECT_RELEASE, + NULL, + NULL, + DispDataRequestComplete, + Irp ); + break; + + case TDI_SEND_DATAGRAM: + if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) { + TI_DbgPrint(MIN_TRACE, ("TDI_SEND_DATAGRAM, but no address file.\n")); + break; + } + + /*DGCancelSendRequest(TranContext->Handle.AddressHandle, Irp);*/ + break; + + case TDI_RECEIVE_DATAGRAM: + if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) { + TI_DbgPrint(MIN_TRACE, ("TDI_RECEIVE_DATAGRAM, but no address file.\n")); + break; + } + + /*DGCancelReceiveRequest(TranContext->Handle.AddressHandle, Irp);*/ + break; + + default: + TI_DbgPrint(MIN_TRACE, ("Unknown IRP. MinorFunction (0x%X).\n", MinorFunction)); + break; + } + + if (Status != STATUS_PENDING) + DispCancelComplete(FileObject); + else + IoReleaseCancelSpinLock(Irp->CancelIrql); + + TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); +} + + NTSTATUS DispTdiAccept( PIRP Irp) /*