mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 09:50:02 +00:00
Merge aicom-network-fixes up to 35306.
svn path=/trunk/; revision=35317
This commit is contained in:
parent
feccdafeb8
commit
76ff523af5
9 changed files with 92 additions and 58 deletions
|
@ -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"
|
||||
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
* 20040708 Created
|
||||
*/
|
||||
#include <afd.h>
|
||||
#include <pseh/pseh.h>
|
||||
#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;
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
Loading…
Reference in a new issue