diff --git a/reactos/boot/bootdata/txtsetup.sif b/reactos/boot/bootdata/txtsetup.sif index 1c1bcf39602..433a34313fd 100644 --- a/reactos/boot/bootdata/txtsetup.sif +++ b/reactos/boot/bootdata/txtsetup.sif @@ -49,8 +49,8 @@ Cabinet=reactos.cab [SetupData] DefaultPath = \ReactOS -OsLoadOptions = "/NOGUIBOOT /NODEBUG" -DbgOsLoadOptions = "/NOGUIBOOT /DEBUGPORT=COM1" +OsLoadOptions = "/NOGUIBOOT /NODEBUG /DEBUGPORT=COM1 /KDSERIAL" +DbgOsLoadOptions = "/NOGUIBOOT /DEBUGPORT=COM1 /KDSERIAL" ;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=SCREEN" ;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=BOCHS" diff --git a/reactos/drivers/network/afd/afd/connect.c b/reactos/drivers/network/afd/afd/connect.c index 9db0240de8c..77d9f0aa94a 100644 --- a/reactos/drivers/network/afd/afd/connect.c +++ b/reactos/drivers/network/afd/afd/connect.c @@ -33,26 +33,32 @@ NTSTATUS WarmSocketForConnection( PAFD_FCB FCB ) { } NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) { - NTSTATUS Status = STATUS_NO_MEMORY; + NTSTATUS Status; /* Allocate the receive area and start receiving */ FCB->Recv.Window = ExAllocatePool( NonPagedPool, FCB->Recv.Size ); + + if( !FCB->Recv.Window ) return STATUS_NO_MEMORY; + FCB->Send.Window = ExAllocatePool( NonPagedPool, FCB->Send.Size ); + if( !FCB->Send.Window ) { + ExFreePool( FCB->Recv.Window ); + return STATUS_NO_MEMORY; + } + FCB->State = SOCKET_STATE_CONNECTED; - if( FCB->Recv.Window ) { - Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest, - FCB->Connection.Object, - TDI_RECEIVE_NORMAL, - FCB->Recv.Window, - FCB->Recv.Size, - &FCB->ReceiveIrp.Iosb, - ReceiveComplete, - FCB ); - } + Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest, + FCB->Connection.Object, + TDI_RECEIVE_NORMAL, + FCB->Recv.Window, + FCB->Recv.Size, + &FCB->ReceiveIrp.Iosb, + ReceiveComplete, + FCB ); return Status; } @@ -102,8 +108,9 @@ static NTSTATUS NTAPI StreamSocketConnectComplete if( NT_SUCCESS(Status) ) { Status = MakeSocketIntoConnection( FCB ); - if( FCB->Send.Window && - !IsListEmpty( &FCB->PendingIrpList[FUNCTION_SEND] ) ) { + if( !NT_SUCCESS(Status) ) return Status; + + if( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_SEND] ) ) { NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_SEND]); NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry); @@ -158,7 +165,7 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, case SOCKET_STATE_CONNECTING: return LeaveIrpUntilLater( FCB, Irp, FUNCTION_CONNECT ); - case SOCKET_STATE_CREATED: { + case SOCKET_STATE_CREATED: FCB->LocalAddress = TaCopyTransportAddress( &ConnectReq->RemoteAddress ); @@ -182,7 +189,8 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, } else return UnlockAndMaybeComplete ( FCB, STATUS_NO_MEMORY, Irp, 0, NULL ); - } /* Drop through to SOCKET_STATE_BOUND */ + + /* Drop through to SOCKET_STATE_BOUND */ case SOCKET_STATE_BOUND: FCB->RemoteAddress = diff --git a/reactos/drivers/network/afd/afd/listen.c b/reactos/drivers/network/afd/afd/listen.c index edf1e502868..63d4b359f30 100644 --- a/reactos/drivers/network/afd/afd/listen.c +++ b/reactos/drivers/network/afd/afd/listen.c @@ -142,6 +142,8 @@ static NTSTATUS NTAPI ListenComplete ListEntry ) ); } + if( FCB->ListenIrp.ConnectionCallInfo ) ExFreePool( FCB->ListenIrp.ConnectionCallInfo ); + if( FCB->ListenIrp.ConnectionReturnInfo ) ExFreePool( FCB->ListenIrp.ConnectionReturnInfo ); FCB->NeedsNewListen = TRUE; /* Trigger a select return if appropriate */ @@ -182,10 +184,12 @@ NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, Status = WarmSocketForConnection( FCB ); - FCB->State = SOCKET_STATE_LISTENING; - AFD_DbgPrint(MID_TRACE,("Status from warmsocket %x\n", Status)); + if( !NT_SUCCESS(Status) ) return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL ); + + FCB->State = SOCKET_STATE_LISTENING; + TdiBuildNullConnectionInfo ( &FCB->ListenIrp.ConnectionCallInfo, FCB->LocalAddress->Address[0].AddressType ); @@ -275,7 +279,7 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp, &FCB->ListenIrp.Iosb, ListenComplete, FCB ); - } + } else return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL ); FCB->NeedsNewListen = FALSE; } diff --git a/reactos/drivers/network/afd/afd/lock.c b/reactos/drivers/network/afd/afd/lock.c index 4036a9c9ee0..43f0633614c 100644 --- a/reactos/drivers/network/afd/afd/lock.c +++ b/reactos/drivers/network/afd/afd/lock.c @@ -112,14 +112,18 @@ VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address ) { PAFD_MAPBUF Map = (PAFD_MAPBUF)(Buf + Count + Lock); UINT i; + if( !Buf ) return; + for( i = 0; i < Count + Lock; i++ ) { if( Map[i].Mdl ) { MmUnlockPages( Map[i].Mdl ); IoFreeMdl( Map[i].Mdl ); + Map[i].Mdl = NULL; } } ExFreePool( Buf ); + Buf = NULL; } /* Produce a kernel-land handle array with handles replaced by object diff --git a/reactos/drivers/network/afd/afd/main.c b/reactos/drivers/network/afd/afd/main.c index 51116743c7b..a689ce56098 100644 --- a/reactos/drivers/network/afd/afd/main.c +++ b/reactos/drivers/network/afd/afd/main.c @@ -114,9 +114,6 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, FCB->TdiDeviceName.MaximumLength = FCB->TdiDeviceName.Length; FCB->TdiDeviceName.Buffer = ExAllocatePool( NonPagedPool, FCB->TdiDeviceName.Length ); - RtlCopyMemory( FCB->TdiDeviceName.Buffer, - ConnectInfo->TransportName, - FCB->TdiDeviceName.Length ); if( !FCB->TdiDeviceName.Buffer ) { ExFreePool(FCB); @@ -126,6 +123,10 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, return STATUS_NO_MEMORY; } + RtlCopyMemory( FCB->TdiDeviceName.Buffer, + ConnectInfo->TransportName, + FCB->TdiDeviceName.Length ); + AFD_DbgPrint(MID_TRACE,("Success: %s %wZ\n", EaInfo->EaName, &FCB->TdiDeviceName)); } else { @@ -207,6 +208,8 @@ VOID DestroySocket( PAFD_FCB FCB ) { ExFreePool( FCB->AddressFrom ); if( FCB->LocalAddress ) ExFreePool( FCB->LocalAddress ); + if( FCB->RemoteAddress ) + ExFreePool( FCB->RemoteAddress ); ExFreePool(FCB->TdiDeviceName.Buffer); diff --git a/reactos/drivers/network/afd/afd/read.c b/reactos/drivers/network/afd/afd/read.c index e9efcb8708a..05f723ba9c2 100644 --- a/reactos/drivers/network/afd/afd/read.c +++ b/reactos/drivers/network/afd/afd/read.c @@ -574,14 +574,14 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags)); RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray, - RecvReq->BufferCount, + RecvReq->BufferCount, RecvReq->Address, RecvReq->AddressLength, TRUE, TRUE ); if( !RecvReq->BufferArray ) { /* access violation in userspace */ - return UnlockAndMaybeComplete - ( FCB, STATUS_ACCESS_VIOLATION, Irp, 0, NULL ); + return UnlockAndMaybeComplete + ( FCB, STATUS_ACCESS_VIOLATION, Irp, 0, NULL ); } if( !IsListEmpty( &FCB->DatagramList ) ) { @@ -602,8 +602,10 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PollReeval( FCB->DeviceExt, FCB->FileObject ); + UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE ); + return UnlockAndMaybeComplete - ( FCB, Status, Irp, RecvReq->BufferArray[0].len, NULL ); + ( FCB, Status, Irp, Irp->IoStatus.Information, NULL ); } else { Status = SatisfyPacketRecvRequest ( FCB, Irp, DatagramRecv, @@ -616,6 +618,8 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PollReeval( FCB->DeviceExt, FCB->FileObject ); + UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE ); + return UnlockAndMaybeComplete ( FCB, Status, Irp, Irp->IoStatus.Information, NULL ); } diff --git a/reactos/drivers/network/afd/afd/tdi.c b/reactos/drivers/network/afd/afd/tdi.c index 925a07277fe..a80452d2284 100644 --- a/reactos/drivers/network/afd/afd/tdi.c +++ b/reactos/drivers/network/afd/afd/tdi.c @@ -864,17 +864,12 @@ NTSTATUS TdiSend MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); } _SEH_HANDLE { AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); + IoFreeMdl(Mdl); IoFreeIrp(*Irp); *Irp = NULL; - Status = STATUS_INSUFFICIENT_RESOURCES; + _SEH_YIELD(return STATUS_INSUFFICIENT_RESOURCES); } _SEH_END; - if( !NT_SUCCESS(Status) ) { - IoFreeIrp(*Irp); - *Irp = NULL; - return Status; - } - AFD_DbgPrint(MID_TRACE,("AFD>>> Got an MDL: %x\n", Mdl)); TdiBuildSend(*Irp, /* I/O Request Packet */ @@ -952,17 +947,12 @@ NTSTATUS TdiReceive( AFD_DbgPrint(MIN_TRACE, ("probe and lock done\n")); } _SEH_HANDLE { AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); + IoFreeMdl(Mdl); IoFreeIrp(*Irp); *Irp = NULL; - Status = STATUS_INSUFFICIENT_RESOURCES; + _SEH_YIELD(return STATUS_INSUFFICIENT_RESOURCES); } _SEH_END; - if( !NT_SUCCESS(Status) ) { - IoFreeIrp(*Irp); - *Irp = NULL; - return Status; - } - AFD_DbgPrint(MID_TRACE,("AFD>>> Got an MDL: %x\n", Mdl)); TdiBuildReceive(*Irp, /* I/O Request Packet */ @@ -1055,6 +1045,7 @@ NTSTATUS TdiReceiveDatagram( MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); } _SEH_HANDLE { AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); + IoFreeMdl(Mdl); IoFreeIrp(*Irp); *Irp = NULL; _SEH_YIELD(return STATUS_INSUFFICIENT_RESOURCES); @@ -1153,6 +1144,7 @@ NTSTATUS TdiSendDatagram( MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); } _SEH_HANDLE { AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); + IoFreeMdl(Mdl); IoFreeIrp(*Irp); *Irp = NULL; _SEH_YIELD(return STATUS_INSUFFICIENT_RESOURCES); diff --git a/reactos/drivers/network/afd/afd/tdiconn.c b/reactos/drivers/network/afd/afd/tdiconn.c index 97dafd491ab..392adc8c885 100644 --- a/reactos/drivers/network/afd/afd/tdiconn.c +++ b/reactos/drivers/network/afd/afd/tdiconn.c @@ -8,6 +8,7 @@ * 20040708 Created */ #include +#include #include "debug.h" #include "tdiconn.h" @@ -126,9 +127,11 @@ NTSTATUS TdiBuildNullConnectionInfo Status = TdiBuildNullConnectionInfoInPlace( ConnInfo, Type ); - if (!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { ExFreePool( ConnInfo ); - else + *ConnectionInfo = NULL; + return Status; + } else *ConnectionInfo = ConnInfo; ConnInfo->RemoteAddress = (PTA_ADDRESS)&ConnInfo[1]; @@ -144,9 +147,13 @@ TdiBuildConnectionInfoInPlace PTRANSPORT_ADDRESS Address ) { NTSTATUS Status = STATUS_SUCCESS; - RtlCopyMemory( ConnectionInfo->RemoteAddress, - Address, - ConnectionInfo->RemoteAddressLength ); + _SEH_TRY { + RtlCopyMemory( ConnectionInfo->RemoteAddress, + Address, + ConnectionInfo->RemoteAddressLength ); + } _SEH_HANDLE { + Status = _SEH_GetExceptionCode(); + } _SEH_END; return Status; } diff --git a/reactos/drivers/network/afd/afd/write.c b/reactos/drivers/network/afd/afd/write.c index ac3dffde831..c2341e66faf 100644 --- a/reactos/drivers/network/afd/afd/write.c +++ b/reactos/drivers/network/afd/afd/write.c @@ -226,23 +226,30 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, NULL, NULL, FALSE, FALSE ); + if( !SendReq->BufferArray ) { + return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION, + Irp, 0, NULL ); + } + TdiBuildConnectionInfo( &TargetAddress, FCB->RemoteAddress ); - SocketCalloutEnter( FCB ); + if( TargetAddress ) { + SocketCalloutEnter( FCB ); - Status = TdiSendDatagram - ( &FCB->SendIrp.InFlightRequest, - FCB->AddressFile.Object, - SendReq->BufferArray[0].buf, - SendReq->BufferArray[0].len, - TargetAddress, - &FCB->SendIrp.Iosb, - PacketSocketSendComplete, - FCB ); + Status = TdiSendDatagram + ( &FCB->SendIrp.InFlightRequest, + FCB->AddressFile.Object, + SendReq->BufferArray[0].buf, + SendReq->BufferArray[0].len, + TargetAddress, + &FCB->SendIrp.Iosb, + PacketSocketSendComplete, + FCB ); - SocketCalloutLeave( FCB ); + SocketCalloutLeave( FCB ); - ExFreePool( TargetAddress ); + ExFreePool( TargetAddress ); + } else Status = STATUS_NO_MEMORY; if( Status == STATUS_PENDING ) Status = STATUS_SUCCESS; @@ -278,6 +285,11 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, NULL, NULL, FALSE, FALSE ); + if( !SendReq->BufferArray ) { + return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION, + Irp, 0, NULL ); + } + AFD_DbgPrint(MID_TRACE,("FCB->Send.BytesUsed = %d\n", FCB->Send.BytesUsed));