mirror of
https://github.com/reactos/reactos.git
synced 2025-08-07 01:03:16 +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]
|
[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"
|
||||||
|
|
||||||
|
|
|
@ -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 =
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue