Merge aicom-network-fixes up to 35306.

svn path=/trunk/; revision=35317
This commit is contained in:
Art Yerkes 2008-08-13 20:44:20 +00:00
parent feccdafeb8
commit 76ff523af5
9 changed files with 92 additions and 58 deletions

View file

@ -49,8 +49,8 @@ Cabinet=reactos.cab
[SetupData] [SetupData]
DefaultPath = \ReactOS DefaultPath = \ReactOS
OsLoadOptions = "/NOGUIBOOT /NODEBUG" OsLoadOptions = "/NOGUIBOOT /NODEBUG /DEBUGPORT=COM1 /KDSERIAL"
DbgOsLoadOptions = "/NOGUIBOOT /DEBUGPORT=COM1" DbgOsLoadOptions = "/NOGUIBOOT /DEBUGPORT=COM1 /KDSERIAL"
;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=SCREEN" ;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=SCREEN"
;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=BOCHS" ;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=BOCHS"

View file

@ -33,26 +33,32 @@ NTSTATUS WarmSocketForConnection( PAFD_FCB FCB ) {
} }
NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) { NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) {
NTSTATUS Status = STATUS_NO_MEMORY; NTSTATUS Status;
/* Allocate the receive area and start receiving */ /* Allocate the receive area and start receiving */
FCB->Recv.Window = FCB->Recv.Window =
ExAllocatePool( NonPagedPool, FCB->Recv.Size ); ExAllocatePool( NonPagedPool, FCB->Recv.Size );
if( !FCB->Recv.Window ) return STATUS_NO_MEMORY;
FCB->Send.Window = FCB->Send.Window =
ExAllocatePool( NonPagedPool, FCB->Send.Size ); ExAllocatePool( NonPagedPool, FCB->Send.Size );
if( !FCB->Send.Window ) {
ExFreePool( FCB->Recv.Window );
return STATUS_NO_MEMORY;
}
FCB->State = SOCKET_STATE_CONNECTED; FCB->State = SOCKET_STATE_CONNECTED;
if( FCB->Recv.Window ) { Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest, FCB->Connection.Object,
FCB->Connection.Object, TDI_RECEIVE_NORMAL,
TDI_RECEIVE_NORMAL, FCB->Recv.Window,
FCB->Recv.Window, FCB->Recv.Size,
FCB->Recv.Size, &FCB->ReceiveIrp.Iosb,
&FCB->ReceiveIrp.Iosb, ReceiveComplete,
ReceiveComplete, FCB );
FCB );
}
return Status; return Status;
} }
@ -102,8 +108,9 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
if( NT_SUCCESS(Status) ) { if( NT_SUCCESS(Status) ) {
Status = MakeSocketIntoConnection( FCB ); Status = MakeSocketIntoConnection( FCB );
if( FCB->Send.Window && if( !NT_SUCCESS(Status) ) return Status;
!IsListEmpty( &FCB->PendingIrpList[FUNCTION_SEND] ) ) {
if( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_SEND] ) ) {
NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_SEND]); NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_SEND]);
NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP,
Tail.Overlay.ListEntry); Tail.Overlay.ListEntry);
@ -158,7 +165,7 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
case SOCKET_STATE_CONNECTING: case SOCKET_STATE_CONNECTING:
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_CONNECT ); return LeaveIrpUntilLater( FCB, Irp, FUNCTION_CONNECT );
case SOCKET_STATE_CREATED: { case SOCKET_STATE_CREATED:
FCB->LocalAddress = FCB->LocalAddress =
TaCopyTransportAddress( &ConnectReq->RemoteAddress ); TaCopyTransportAddress( &ConnectReq->RemoteAddress );
@ -182,7 +189,8 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
} else } else
return UnlockAndMaybeComplete return UnlockAndMaybeComplete
( FCB, STATUS_NO_MEMORY, Irp, 0, NULL ); ( FCB, STATUS_NO_MEMORY, Irp, 0, NULL );
} /* Drop through to SOCKET_STATE_BOUND */
/* Drop through to SOCKET_STATE_BOUND */
case SOCKET_STATE_BOUND: case SOCKET_STATE_BOUND:
FCB->RemoteAddress = FCB->RemoteAddress =

View file

@ -142,6 +142,8 @@ static NTSTATUS NTAPI ListenComplete
ListEntry ) ); ListEntry ) );
} }
if( FCB->ListenIrp.ConnectionCallInfo ) ExFreePool( FCB->ListenIrp.ConnectionCallInfo );
if( FCB->ListenIrp.ConnectionReturnInfo ) ExFreePool( FCB->ListenIrp.ConnectionReturnInfo );
FCB->NeedsNewListen = TRUE; FCB->NeedsNewListen = TRUE;
/* Trigger a select return if appropriate */ /* Trigger a select return if appropriate */
@ -182,10 +184,12 @@ NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
Status = WarmSocketForConnection( FCB ); Status = WarmSocketForConnection( FCB );
FCB->State = SOCKET_STATE_LISTENING;
AFD_DbgPrint(MID_TRACE,("Status from warmsocket %x\n", Status)); 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 TdiBuildNullConnectionInfo
( &FCB->ListenIrp.ConnectionCallInfo, ( &FCB->ListenIrp.ConnectionCallInfo,
FCB->LocalAddress->Address[0].AddressType ); FCB->LocalAddress->Address[0].AddressType );
@ -275,7 +279,7 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
&FCB->ListenIrp.Iosb, &FCB->ListenIrp.Iosb,
ListenComplete, ListenComplete,
FCB ); FCB );
} } else return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL );
FCB->NeedsNewListen = FALSE; FCB->NeedsNewListen = FALSE;
} }

View file

@ -112,14 +112,18 @@ VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address ) {
PAFD_MAPBUF Map = (PAFD_MAPBUF)(Buf + Count + Lock); PAFD_MAPBUF Map = (PAFD_MAPBUF)(Buf + Count + Lock);
UINT i; UINT i;
if( !Buf ) return;
for( i = 0; i < Count + Lock; i++ ) { for( i = 0; i < Count + Lock; i++ ) {
if( Map[i].Mdl ) { if( Map[i].Mdl ) {
MmUnlockPages( Map[i].Mdl ); MmUnlockPages( Map[i].Mdl );
IoFreeMdl( Map[i].Mdl ); IoFreeMdl( Map[i].Mdl );
Map[i].Mdl = NULL;
} }
} }
ExFreePool( Buf ); ExFreePool( Buf );
Buf = NULL;
} }
/* Produce a kernel-land handle array with handles replaced by object /* Produce a kernel-land handle array with handles replaced by object

View file

@ -114,9 +114,6 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
FCB->TdiDeviceName.MaximumLength = FCB->TdiDeviceName.Length; FCB->TdiDeviceName.MaximumLength = FCB->TdiDeviceName.Length;
FCB->TdiDeviceName.Buffer = FCB->TdiDeviceName.Buffer =
ExAllocatePool( NonPagedPool, FCB->TdiDeviceName.Length ); ExAllocatePool( NonPagedPool, FCB->TdiDeviceName.Length );
RtlCopyMemory( FCB->TdiDeviceName.Buffer,
ConnectInfo->TransportName,
FCB->TdiDeviceName.Length );
if( !FCB->TdiDeviceName.Buffer ) { if( !FCB->TdiDeviceName.Buffer ) {
ExFreePool(FCB); ExFreePool(FCB);
@ -126,6 +123,10 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
return STATUS_NO_MEMORY; return STATUS_NO_MEMORY;
} }
RtlCopyMemory( FCB->TdiDeviceName.Buffer,
ConnectInfo->TransportName,
FCB->TdiDeviceName.Length );
AFD_DbgPrint(MID_TRACE,("Success: %s %wZ\n", AFD_DbgPrint(MID_TRACE,("Success: %s %wZ\n",
EaInfo->EaName, &FCB->TdiDeviceName)); EaInfo->EaName, &FCB->TdiDeviceName));
} else { } else {
@ -207,6 +208,8 @@ VOID DestroySocket( PAFD_FCB FCB ) {
ExFreePool( FCB->AddressFrom ); ExFreePool( FCB->AddressFrom );
if( FCB->LocalAddress ) if( FCB->LocalAddress )
ExFreePool( FCB->LocalAddress ); ExFreePool( FCB->LocalAddress );
if( FCB->RemoteAddress )
ExFreePool( FCB->RemoteAddress );
ExFreePool(FCB->TdiDeviceName.Buffer); ExFreePool(FCB->TdiDeviceName.Buffer);

View file

@ -574,14 +574,14 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags)); AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags));
RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray, RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray,
RecvReq->BufferCount, RecvReq->BufferCount,
RecvReq->Address, RecvReq->Address,
RecvReq->AddressLength, RecvReq->AddressLength,
TRUE, TRUE ); TRUE, TRUE );
if( !RecvReq->BufferArray ) { /* access violation in userspace */ if( !RecvReq->BufferArray ) { /* access violation in userspace */
return UnlockAndMaybeComplete return UnlockAndMaybeComplete
( FCB, STATUS_ACCESS_VIOLATION, Irp, 0, NULL ); ( FCB, STATUS_ACCESS_VIOLATION, Irp, 0, NULL );
} }
if( !IsListEmpty( &FCB->DatagramList ) ) { if( !IsListEmpty( &FCB->DatagramList ) ) {
@ -602,8 +602,10 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PollReeval( FCB->DeviceExt, FCB->FileObject ); PollReeval( FCB->DeviceExt, FCB->FileObject );
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
return UnlockAndMaybeComplete return UnlockAndMaybeComplete
( FCB, Status, Irp, RecvReq->BufferArray[0].len, NULL ); ( FCB, Status, Irp, Irp->IoStatus.Information, NULL );
} else { } else {
Status = SatisfyPacketRecvRequest Status = SatisfyPacketRecvRequest
( FCB, Irp, DatagramRecv, ( FCB, Irp, DatagramRecv,
@ -616,6 +618,8 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
PollReeval( FCB->DeviceExt, FCB->FileObject ); PollReeval( FCB->DeviceExt, FCB->FileObject );
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
return UnlockAndMaybeComplete return UnlockAndMaybeComplete
( FCB, Status, Irp, Irp->IoStatus.Information, NULL ); ( FCB, Status, Irp, Irp->IoStatus.Information, NULL );
} }

View file

@ -864,17 +864,12 @@ NTSTATUS TdiSend
MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess);
} _SEH_HANDLE { } _SEH_HANDLE {
AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
IoFreeMdl(Mdl);
IoFreeIrp(*Irp); IoFreeIrp(*Irp);
*Irp = NULL; *Irp = NULL;
Status = STATUS_INSUFFICIENT_RESOURCES; _SEH_YIELD(return STATUS_INSUFFICIENT_RESOURCES);
} _SEH_END; } _SEH_END;
if( !NT_SUCCESS(Status) ) {
IoFreeIrp(*Irp);
*Irp = NULL;
return Status;
}
AFD_DbgPrint(MID_TRACE,("AFD>>> Got an MDL: %x\n", Mdl)); AFD_DbgPrint(MID_TRACE,("AFD>>> Got an MDL: %x\n", Mdl));
TdiBuildSend(*Irp, /* I/O Request Packet */ TdiBuildSend(*Irp, /* I/O Request Packet */
@ -952,17 +947,12 @@ NTSTATUS TdiReceive(
AFD_DbgPrint(MIN_TRACE, ("probe and lock done\n")); AFD_DbgPrint(MIN_TRACE, ("probe and lock done\n"));
} _SEH_HANDLE { } _SEH_HANDLE {
AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
IoFreeMdl(Mdl);
IoFreeIrp(*Irp); IoFreeIrp(*Irp);
*Irp = NULL; *Irp = NULL;
Status = STATUS_INSUFFICIENT_RESOURCES; _SEH_YIELD(return STATUS_INSUFFICIENT_RESOURCES);
} _SEH_END; } _SEH_END;
if( !NT_SUCCESS(Status) ) {
IoFreeIrp(*Irp);
*Irp = NULL;
return Status;
}
AFD_DbgPrint(MID_TRACE,("AFD>>> Got an MDL: %x\n", Mdl)); AFD_DbgPrint(MID_TRACE,("AFD>>> Got an MDL: %x\n", Mdl));
TdiBuildReceive(*Irp, /* I/O Request Packet */ TdiBuildReceive(*Irp, /* I/O Request Packet */
@ -1055,6 +1045,7 @@ NTSTATUS TdiReceiveDatagram(
MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess);
} _SEH_HANDLE { } _SEH_HANDLE {
AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
IoFreeMdl(Mdl);
IoFreeIrp(*Irp); IoFreeIrp(*Irp);
*Irp = NULL; *Irp = NULL;
_SEH_YIELD(return STATUS_INSUFFICIENT_RESOURCES); _SEH_YIELD(return STATUS_INSUFFICIENT_RESOURCES);
@ -1153,6 +1144,7 @@ NTSTATUS TdiSendDatagram(
MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess);
} _SEH_HANDLE { } _SEH_HANDLE {
AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
IoFreeMdl(Mdl);
IoFreeIrp(*Irp); IoFreeIrp(*Irp);
*Irp = NULL; *Irp = NULL;
_SEH_YIELD(return STATUS_INSUFFICIENT_RESOURCES); _SEH_YIELD(return STATUS_INSUFFICIENT_RESOURCES);

View file

@ -8,6 +8,7 @@
* 20040708 Created * 20040708 Created
*/ */
#include <afd.h> #include <afd.h>
#include <pseh/pseh.h>
#include "debug.h" #include "debug.h"
#include "tdiconn.h" #include "tdiconn.h"
@ -126,9 +127,11 @@ NTSTATUS TdiBuildNullConnectionInfo
Status = TdiBuildNullConnectionInfoInPlace( ConnInfo, Type ); Status = TdiBuildNullConnectionInfoInPlace( ConnInfo, Type );
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status)) {
ExFreePool( ConnInfo ); ExFreePool( ConnInfo );
else *ConnectionInfo = NULL;
return Status;
} else
*ConnectionInfo = ConnInfo; *ConnectionInfo = ConnInfo;
ConnInfo->RemoteAddress = (PTA_ADDRESS)&ConnInfo[1]; ConnInfo->RemoteAddress = (PTA_ADDRESS)&ConnInfo[1];
@ -144,9 +147,13 @@ TdiBuildConnectionInfoInPlace
PTRANSPORT_ADDRESS Address ) { PTRANSPORT_ADDRESS Address ) {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
RtlCopyMemory( ConnectionInfo->RemoteAddress, _SEH_TRY {
Address, RtlCopyMemory( ConnectionInfo->RemoteAddress,
ConnectionInfo->RemoteAddressLength ); Address,
ConnectionInfo->RemoteAddressLength );
} _SEH_HANDLE {
Status = _SEH_GetExceptionCode();
} _SEH_END;
return Status; return Status;
} }

View file

@ -226,23 +226,30 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
NULL, NULL, NULL, NULL,
FALSE, FALSE ); FALSE, FALSE );
if( !SendReq->BufferArray ) {
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
Irp, 0, NULL );
}
TdiBuildConnectionInfo( &TargetAddress, FCB->RemoteAddress ); TdiBuildConnectionInfo( &TargetAddress, FCB->RemoteAddress );
SocketCalloutEnter( FCB ); if( TargetAddress ) {
SocketCalloutEnter( FCB );
Status = TdiSendDatagram Status = TdiSendDatagram
( &FCB->SendIrp.InFlightRequest, ( &FCB->SendIrp.InFlightRequest,
FCB->AddressFile.Object, FCB->AddressFile.Object,
SendReq->BufferArray[0].buf, SendReq->BufferArray[0].buf,
SendReq->BufferArray[0].len, SendReq->BufferArray[0].len,
TargetAddress, TargetAddress,
&FCB->SendIrp.Iosb, &FCB->SendIrp.Iosb,
PacketSocketSendComplete, PacketSocketSendComplete,
FCB ); FCB );
SocketCalloutLeave( FCB ); SocketCalloutLeave( FCB );
ExFreePool( TargetAddress ); ExFreePool( TargetAddress );
} else Status = STATUS_NO_MEMORY;
if( Status == STATUS_PENDING ) Status = STATUS_SUCCESS; if( Status == STATUS_PENDING ) Status = STATUS_SUCCESS;
@ -278,6 +285,11 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
NULL, NULL, NULL, NULL,
FALSE, FALSE ); FALSE, FALSE );
if( !SendReq->BufferArray ) {
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
Irp, 0, NULL );
}
AFD_DbgPrint(MID_TRACE,("FCB->Send.BytesUsed = %d\n", AFD_DbgPrint(MID_TRACE,("FCB->Send.BytesUsed = %d\n",
FCB->Send.BytesUsed)); FCB->Send.BytesUsed));