mirror of
https://github.com/reactos/reactos.git
synced 2025-07-03 16:41:24 +00:00
fix CORE-18328 'FileZilla 3.8 unable to list content of a remote directory due to undue ECONNRESET' I tested to list the contents of ftp.heise.de and downloaded some files from its pub. by porting back: 0.4.15-dev-5870-g9f9b81e396
[AFD] ReceiveActivity: Don't return STATUS_FILE_CLOSED in case of FCB overread CORE-18328 (#4972) ------------- fix CORE-13067 'wget can not download' I tested to wget.exe http://download.microsoft.com/download/vc60pro/update/2/w9xnt4/en-us/vc6redistsetup_deu.exe by porting back: 0.4.9-dev-349-g9168226378
[AFD] Respond to FileFsDeviceInformation. CORE-13067 (#440) 0.4.9-dev-350-g8b84b1c6b3
[AFD] Mark the socket as named pipe, so NtWriteFile actually knows what to do with it. CORE-13067 (#440) ------------- also port back unrelated: 0.4.8-dev-233-g44e36b616a
[AFD] Zap unused TaCopyAddress() and TaCopyAddressInPlace(). partially 0.4.8-dev-589-ga2f7de7ee8
[AFD] just pick the main.c one-liner with the %p format-string and a few whitespace improvements from 0.4.8-dev'ing
This commit is contained in:
parent
e4f0ba5cae
commit
03fe564d33
13 changed files with 119 additions and 104 deletions
|
@ -87,7 +87,7 @@ AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
||||||
Irp, 0 );
|
Irp, 0 );
|
||||||
|
|
||||||
if( FCB->LocalAddress ) ExFreePool( FCB->LocalAddress );
|
if (FCB->LocalAddress) ExFreePool(FCB->LocalAddress);
|
||||||
FCB->LocalAddress = TaCopyTransportAddress( &BindReq->Address );
|
FCB->LocalAddress = TaCopyTransportAddress( &BindReq->Address );
|
||||||
|
|
||||||
if( FCB->LocalAddress )
|
if( FCB->LocalAddress )
|
||||||
|
|
|
@ -269,13 +269,13 @@ MakeSocketIntoConnection(PAFD_FCB FCB) {
|
||||||
/* Allocate the receive area and start receiving */
|
/* Allocate the receive area and start receiving */
|
||||||
if (!FCB->Recv.Window)
|
if (!FCB->Recv.Window)
|
||||||
{
|
{
|
||||||
FCB->Recv.Window = ExAllocatePool( PagedPool, FCB->Recv.Size );
|
FCB->Recv.Window = ExAllocatePool(PagedPool, FCB->Recv.Size);
|
||||||
if( !FCB->Recv.Window ) return STATUS_NO_MEMORY;
|
if( !FCB->Recv.Window ) return STATUS_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!FCB->Send.Window)
|
if (!FCB->Send.Window)
|
||||||
{
|
{
|
||||||
FCB->Send.Window = ExAllocatePool( PagedPool, FCB->Send.Size );
|
FCB->Send.Window = ExAllocatePool(PagedPool, FCB->Send.Size);
|
||||||
if( !FCB->Send.Window ) return STATUS_NO_MEMORY;
|
if( !FCB->Send.Window ) return STATUS_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,7 +434,7 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS )
|
if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS )
|
||||||
{
|
{
|
||||||
if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress );
|
if (FCB->RemoteAddress) ExFreePool(FCB->RemoteAddress);
|
||||||
FCB->RemoteAddress =
|
FCB->RemoteAddress =
|
||||||
TaCopyTransportAddress( &ConnectReq->RemoteAddress );
|
TaCopyTransportAddress( &ConnectReq->RemoteAddress );
|
||||||
|
|
||||||
|
@ -455,7 +455,7 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_CONNECT );
|
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_CONNECT );
|
||||||
|
|
||||||
case SOCKET_STATE_CREATED:
|
case SOCKET_STATE_CREATED:
|
||||||
if( FCB->LocalAddress ) ExFreePool( FCB->LocalAddress );
|
if (FCB->LocalAddress) ExFreePool(FCB->LocalAddress);
|
||||||
FCB->LocalAddress =
|
FCB->LocalAddress =
|
||||||
TaBuildNullTransportAddress( ConnectReq->RemoteAddress.Address[0].AddressType );
|
TaBuildNullTransportAddress( ConnectReq->RemoteAddress.Address[0].AddressType );
|
||||||
|
|
||||||
|
@ -473,7 +473,7 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
/* Drop through to SOCKET_STATE_BOUND */
|
/* Drop through to SOCKET_STATE_BOUND */
|
||||||
|
|
||||||
case SOCKET_STATE_BOUND:
|
case SOCKET_STATE_BOUND:
|
||||||
if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress );
|
if (FCB->RemoteAddress) ExFreePool(FCB->RemoteAddress);
|
||||||
FCB->RemoteAddress =
|
FCB->RemoteAddress =
|
||||||
TaCopyTransportAddress( &ConnectReq->RemoteAddress );
|
TaCopyTransportAddress( &ConnectReq->RemoteAddress );
|
||||||
|
|
||||||
|
|
|
@ -75,12 +75,12 @@ AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
|
return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
|
||||||
|
|
||||||
if( FCB->Context ) {
|
if( FCB->Context ) {
|
||||||
ExFreePool( FCB->Context );
|
ExFreePool(FCB->Context);
|
||||||
FCB->ContextSize = 0;
|
FCB->ContextSize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCB->Context = ExAllocatePool( PagedPool,
|
FCB->Context = ExAllocatePool(PagedPool,
|
||||||
IrpSp->Parameters.DeviceIoControl.InputBufferLength );
|
IrpSp->Parameters.DeviceIoControl.InputBufferLength);
|
||||||
|
|
||||||
if( !FCB->Context ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0 );
|
if( !FCB->Context ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0 );
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ static NTSTATUS SatisfyAccept( PAFD_DEVICE_EXTENSION DeviceExt,
|
||||||
|
|
||||||
FCB->Connection = Qelt->Object;
|
FCB->Connection = Qelt->Object;
|
||||||
|
|
||||||
if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress );
|
if (FCB->RemoteAddress) ExFreePool(FCB->RemoteAddress);
|
||||||
FCB->RemoteAddress =
|
FCB->RemoteAddress =
|
||||||
TaCopyTransportAddress( Qelt->ConnInfo->RemoteAddress );
|
TaCopyTransportAddress( Qelt->ConnInfo->RemoteAddress );
|
||||||
|
|
||||||
|
@ -138,7 +138,7 @@ static NTSTATUS NTAPI ListenComplete( PDEVICE_OBJECT DeviceObject,
|
||||||
return Irp->IoStatus.Status;
|
return Irp->IoStatus.Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Qelt = ExAllocatePool( NonPagedPool, sizeof(*Qelt) );
|
Qelt = ExAllocatePool(NonPagedPool, sizeof(*Qelt));
|
||||||
if( !Qelt ) {
|
if( !Qelt ) {
|
||||||
Status = STATUS_NO_MEMORY;
|
Status = STATUS_NO_MEMORY;
|
||||||
} else {
|
} else {
|
||||||
|
@ -372,7 +372,7 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
|
AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
|
||||||
|
|
||||||
ExFreePool( PendingConnObj );
|
ExFreePool(PendingConnObj);
|
||||||
|
|
||||||
if( !IsListEmpty( &FCB->PendingConnections ) )
|
if( !IsListEmpty( &FCB->PendingConnections ) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -204,7 +204,7 @@ PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
|
||||||
/* Copy the buffer array so we don't lose it */
|
/* Copy the buffer array so we don't lose it */
|
||||||
UINT Lock = LockAddress ? 2 : 0;
|
UINT Lock = LockAddress ? 2 : 0;
|
||||||
UINT Size = (sizeof(AFD_WSABUF) + sizeof(AFD_MAPBUF)) * (Count + Lock);
|
UINT Size = (sizeof(AFD_WSABUF) + sizeof(AFD_MAPBUF)) * (Count + Lock);
|
||||||
PAFD_WSABUF NewBuf = ExAllocatePool( PagedPool, Size );
|
PAFD_WSABUF NewBuf = ExAllocatePool(PagedPool, Size);
|
||||||
BOOLEAN LockFailed = FALSE;
|
BOOLEAN LockFailed = FALSE;
|
||||||
PAFD_MAPBUF MapBuf;
|
PAFD_MAPBUF MapBuf;
|
||||||
|
|
||||||
|
@ -230,7 +230,7 @@ PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
|
||||||
AFD_DbgPrint(MIN_TRACE,("Access violation copying buffer info "
|
AFD_DbgPrint(MIN_TRACE,("Access violation copying buffer info "
|
||||||
"from userland (%p %p)\n",
|
"from userland (%p %p)\n",
|
||||||
Buf, AddressLen));
|
Buf, AddressLen));
|
||||||
ExFreePool( NewBuf );
|
ExFreePool(NewBuf);
|
||||||
_SEH2_YIELD(return NULL);
|
_SEH2_YIELD(return NULL);
|
||||||
} _SEH2_END;
|
} _SEH2_END;
|
||||||
|
|
||||||
|
@ -265,11 +265,11 @@ PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
|
||||||
AFD_DbgPrint(MIN_TRACE,("Failed to lock pages\n"));
|
AFD_DbgPrint(MIN_TRACE,("Failed to lock pages\n"));
|
||||||
IoFreeMdl( MapBuf[i].Mdl );
|
IoFreeMdl( MapBuf[i].Mdl );
|
||||||
MapBuf[i].Mdl = NULL;
|
MapBuf[i].Mdl = NULL;
|
||||||
ExFreePool( NewBuf );
|
ExFreePool(NewBuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ExFreePool( NewBuf );
|
ExFreePool(NewBuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -295,7 +295,7 @@ VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ExFreePool( Buf );
|
ExFreePool(Buf);
|
||||||
Buf = NULL;
|
Buf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,8 +305,8 @@ PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount ) {
|
||||||
UINT i;
|
UINT i;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
PAFD_HANDLE FileObjects = ExAllocatePool
|
PAFD_HANDLE FileObjects = ExAllocatePool(NonPagedPool,
|
||||||
( NonPagedPool, HandleCount * sizeof(AFD_HANDLE) );
|
HandleCount * sizeof(AFD_HANDLE));
|
||||||
|
|
||||||
for( i = 0; FileObjects && i < HandleCount; i++ ) {
|
for( i = 0; FileObjects && i < HandleCount; i++ ) {
|
||||||
FileObjects[i].Status = 0;
|
FileObjects[i].Status = 0;
|
||||||
|
@ -346,7 +346,7 @@ VOID UnlockHandles( PAFD_HANDLE HandleArray, UINT HandleCount ) {
|
||||||
ObDereferenceObject( (PVOID)HandleArray[i].Handle );
|
ObDereferenceObject( (PVOID)HandleArray[i].Handle );
|
||||||
}
|
}
|
||||||
|
|
||||||
ExFreePool( HandleArray );
|
ExFreePool(HandleArray);
|
||||||
HandleArray = NULL;
|
HandleArray = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ void OskitDumpBuffer( PCHAR Data, UINT Len ) {
|
||||||
|
|
||||||
for( i = 0; i < Len; i++ ) {
|
for( i = 0; i < Len; i++ ) {
|
||||||
if( i && !(i & 0xf) ) DbgPrint( "\n" );
|
if( i && !(i & 0xf) ) DbgPrint( "\n" );
|
||||||
if( !(i & 0xf) ) DbgPrint( "%08x: ", (UINT)(Data + i) );
|
if( !(i & 0xf) ) DbgPrint( "%p: ", (Data + i) );
|
||||||
DbgPrint( " %02x", Data[i] & 0xff );
|
DbgPrint( " %02x", Data[i] & 0xff );
|
||||||
}
|
}
|
||||||
DbgPrint("\n");
|
DbgPrint("\n");
|
||||||
|
@ -301,6 +301,7 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
DeviceExt = DeviceObject->DeviceExtension;
|
DeviceExt = DeviceObject->DeviceExtension;
|
||||||
FileObject = IrpSp->FileObject;
|
FileObject = IrpSp->FileObject;
|
||||||
|
FileObject->Flags |= FO_NAMED_PIPE;
|
||||||
//Disposition = (IrpSp->Parameters.Create.Options >> 24) & 0xff;
|
//Disposition = (IrpSp->Parameters.Create.Options >> 24) & 0xff;
|
||||||
|
|
||||||
Irp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
|
@ -355,7 +356,7 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
FCB->TdiDeviceName.Length = ConnectInfo->SizeOfTransportName;
|
FCB->TdiDeviceName.Length = ConnectInfo->SizeOfTransportName;
|
||||||
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);
|
||||||
|
|
||||||
if( !FCB->TdiDeviceName.Buffer ) {
|
if( !FCB->TdiDeviceName.Buffer ) {
|
||||||
ExFreePool(FCB);
|
ExFreePool(FCB);
|
||||||
|
@ -388,8 +389,8 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !NT_SUCCESS(Status) ) {
|
if( !NT_SUCCESS(Status) ) {
|
||||||
if( FCB->TdiDeviceName.Buffer ) ExFreePool( FCB->TdiDeviceName.Buffer );
|
if (FCB->TdiDeviceName.Buffer) ExFreePool(FCB->TdiDeviceName.Buffer);
|
||||||
ExFreePool( FCB );
|
ExFreePool(FCB);
|
||||||
FileObject->FsContext = NULL;
|
FileObject->FsContext = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -493,41 +494,41 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
if( FCB->EventSelect )
|
if( FCB->EventSelect )
|
||||||
ObDereferenceObject( FCB->EventSelect );
|
ObDereferenceObject( FCB->EventSelect );
|
||||||
|
|
||||||
if( FCB->Context )
|
if (FCB->Context)
|
||||||
ExFreePool( FCB->Context );
|
ExFreePool(FCB->Context);
|
||||||
|
|
||||||
if( FCB->Recv.Window )
|
if (FCB->Recv.Window)
|
||||||
ExFreePool( FCB->Recv.Window );
|
ExFreePool(FCB->Recv.Window);
|
||||||
|
|
||||||
if( FCB->Send.Window )
|
if (FCB->Send.Window)
|
||||||
ExFreePool( FCB->Send.Window );
|
ExFreePool(FCB->Send.Window);
|
||||||
|
|
||||||
if( FCB->AddressFrom )
|
if (FCB->AddressFrom)
|
||||||
ExFreePool( FCB->AddressFrom );
|
ExFreePool(FCB->AddressFrom);
|
||||||
|
|
||||||
if( FCB->ConnectCallInfo )
|
if (FCB->ConnectCallInfo)
|
||||||
ExFreePool( FCB->ConnectCallInfo );
|
ExFreePool(FCB->ConnectCallInfo);
|
||||||
|
|
||||||
if( FCB->ConnectReturnInfo )
|
if (FCB->ConnectReturnInfo)
|
||||||
ExFreePool( FCB->ConnectReturnInfo );
|
ExFreePool(FCB->ConnectReturnInfo);
|
||||||
|
|
||||||
if( FCB->ConnectData )
|
if (FCB->ConnectData)
|
||||||
ExFreePool( FCB->ConnectData );
|
ExFreePool(FCB->ConnectData);
|
||||||
|
|
||||||
if( FCB->DisconnectData )
|
if (FCB->DisconnectData)
|
||||||
ExFreePool( FCB->DisconnectData );
|
ExFreePool(FCB->DisconnectData);
|
||||||
|
|
||||||
if( FCB->ConnectOptions )
|
if (FCB->ConnectOptions)
|
||||||
ExFreePool( FCB->ConnectOptions );
|
ExFreePool(FCB->ConnectOptions);
|
||||||
|
|
||||||
if( FCB->DisconnectOptions )
|
if (FCB->DisconnectOptions)
|
||||||
ExFreePool( FCB->DisconnectOptions );
|
ExFreePool(FCB->DisconnectOptions);
|
||||||
|
|
||||||
if( FCB->LocalAddress )
|
if (FCB->LocalAddress)
|
||||||
ExFreePool( FCB->LocalAddress );
|
ExFreePool(FCB->LocalAddress);
|
||||||
|
|
||||||
if( FCB->RemoteAddress )
|
if (FCB->RemoteAddress)
|
||||||
ExFreePool( FCB->RemoteAddress );
|
ExFreePool(FCB->RemoteAddress);
|
||||||
|
|
||||||
if( FCB->Connection.Object )
|
if( FCB->Connection.Object )
|
||||||
{
|
{
|
||||||
|
@ -554,7 +555,7 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( FCB->TdiDeviceName.Buffer )
|
if (FCB->TdiDeviceName.Buffer)
|
||||||
ExFreePool(FCB->TdiDeviceName.Buffer);
|
ExFreePool(FCB->TdiDeviceName.Buffer);
|
||||||
|
|
||||||
ExFreePool(FCB);
|
ExFreePool(FCB);
|
||||||
|
@ -726,9 +727,6 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
FCB->Recv.Content = 0;
|
FCB->Recv.Content = 0;
|
||||||
FCB->Recv.BytesUsed = 0;
|
FCB->Recv.BytesUsed = 0;
|
||||||
|
|
||||||
/* Mark us as overread to complete future reads with an error */
|
|
||||||
FCB->Overread = TRUE;
|
|
||||||
|
|
||||||
/* Set a successful receive status to indicate a shutdown on overread */
|
/* Set a successful receive status to indicate a shutdown on overread */
|
||||||
FCB->LastReceiveStatus = STATUS_SUCCESS;
|
FCB->LastReceiveStatus = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
@ -829,6 +827,50 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
|
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
AfdQueryFsDeviceInfo(PDEVICE_OBJECT DeviceObject, PFILE_FS_DEVICE_INFORMATION Buffer, PULONG Length)
|
||||||
|
{
|
||||||
|
if (*Length >= sizeof(FILE_FS_DEVICE_INFORMATION))
|
||||||
|
{
|
||||||
|
Buffer->Characteristics = 0;
|
||||||
|
Buffer->DeviceType = FILE_DEVICE_NAMED_PIPE;
|
||||||
|
|
||||||
|
*Length -= sizeof(FILE_FS_DEVICE_INFORMATION);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return STATUS_INFO_LENGTH_MISMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS NTAPI
|
||||||
|
AfdQueryVolumeInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
||||||
|
{
|
||||||
|
FS_INFORMATION_CLASS InfoClass;
|
||||||
|
PVOID Buffer;
|
||||||
|
ULONG Length;
|
||||||
|
NTSTATUS Status = STATUS_INVALID_INFO_CLASS;
|
||||||
|
|
||||||
|
Buffer = Irp->AssociatedIrp.SystemBuffer;
|
||||||
|
Length = IrpSp->Parameters.QueryVolume.Length;
|
||||||
|
InfoClass = IrpSp->Parameters.QueryVolume.FsInformationClass;
|
||||||
|
|
||||||
|
switch (InfoClass)
|
||||||
|
{
|
||||||
|
case FileFsDeviceInformation:
|
||||||
|
Status = AfdQueryFsDeviceInfo(DeviceObject, Buffer, &Length);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Irp->IoStatus.Status = Status;
|
||||||
|
Irp->IoStatus.Information = IrpSp->Parameters.QueryVolume.Length - Length;
|
||||||
|
IoCompleteRequest(Irp, IO_NETWORK_INCREMENT);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
static DRIVER_DISPATCH AfdDispatch;
|
static DRIVER_DISPATCH AfdDispatch;
|
||||||
static NTSTATUS NTAPI
|
static NTSTATUS NTAPI
|
||||||
AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
|
@ -870,6 +912,9 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
case IRP_MJ_READ:
|
case IRP_MJ_READ:
|
||||||
return AfdConnectedSocketReadData( DeviceObject, Irp, IrpSp, TRUE );
|
return AfdConnectedSocketReadData( DeviceObject, Irp, IrpSp, TRUE );
|
||||||
|
|
||||||
|
case IRP_MJ_QUERY_VOLUME_INFORMATION:
|
||||||
|
return AfdQueryVolumeInformation(DeviceObject, Irp, IrpSp);
|
||||||
|
|
||||||
case IRP_MJ_DEVICE_CONTROL:
|
case IRP_MJ_DEVICE_CONTROL:
|
||||||
{
|
{
|
||||||
switch( IrpSp->Parameters.DeviceIoControl.IoControlCode ) {
|
switch( IrpSp->Parameters.DeviceIoControl.IoControlCode ) {
|
||||||
|
@ -1247,6 +1292,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
|
||||||
DriverObject->MajorFunction[IRP_MJ_WRITE] = AfdDispatch;
|
DriverObject->MajorFunction[IRP_MJ_WRITE] = AfdDispatch;
|
||||||
DriverObject->MajorFunction[IRP_MJ_READ] = AfdDispatch;
|
DriverObject->MajorFunction[IRP_MJ_READ] = AfdDispatch;
|
||||||
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = AfdDispatch;
|
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = AfdDispatch;
|
||||||
|
DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = AfdDispatch;
|
||||||
DriverObject->DriverUnload = AfdUnload;
|
DriverObject->DriverUnload = AfdUnload;
|
||||||
|
|
||||||
Status = IoCreateDevice(DriverObject,
|
Status = IoCreateDevice(DriverObject,
|
||||||
|
|
|
@ -175,23 +175,15 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
|
||||||
TotalBytesCopied));
|
TotalBytesCopied));
|
||||||
UnlockBuffers( RecvReq->BufferArray,
|
UnlockBuffers( RecvReq->BufferArray,
|
||||||
RecvReq->BufferCount, FALSE );
|
RecvReq->BufferCount, FALSE );
|
||||||
if (FCB->Overread && FCB->LastReceiveStatus == STATUS_SUCCESS)
|
|
||||||
{
|
Status = FCB->LastReceiveStatus;
|
||||||
/* Overread after a graceful disconnect so complete with an error */
|
|
||||||
Status = STATUS_FILE_CLOSED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Unexpected disconnect by the remote host or initial read after a graceful disconnect */
|
|
||||||
Status = FCB->LastReceiveStatus;
|
|
||||||
}
|
|
||||||
NextIrp->IoStatus.Status = Status;
|
NextIrp->IoStatus.Status = Status;
|
||||||
NextIrp->IoStatus.Information = 0;
|
NextIrp->IoStatus.Information = 0;
|
||||||
if( NextIrp == Irp ) RetStatus = Status;
|
if( NextIrp == Irp ) RetStatus = Status;
|
||||||
if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
||||||
(void)IoSetCancelRoutine(NextIrp, NULL);
|
(void)IoSetCancelRoutine(NextIrp, NULL);
|
||||||
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
||||||
FCB->Overread = TRUE;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Kick the user that receive would be possible now */
|
/* Kick the user that receive would be possible now */
|
||||||
|
@ -409,8 +401,8 @@ SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp,
|
||||||
if (!(RecvReq->TdiFlags & TDI_RECEIVE_PEEK))
|
if (!(RecvReq->TdiFlags & TDI_RECEIVE_PEEK))
|
||||||
{
|
{
|
||||||
FCB->Recv.Content -= DatagramRecv->Len;
|
FCB->Recv.Content -= DatagramRecv->Len;
|
||||||
ExFreePool( DatagramRecv->Address );
|
ExFreePool(DatagramRecv->Address);
|
||||||
ExFreePool( DatagramRecv );
|
ExFreePool(DatagramRecv);
|
||||||
}
|
}
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Done\n"));
|
AFD_DbgPrint(MID_TRACE,("Done\n"));
|
||||||
|
@ -492,7 +484,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
return UnlockAndMaybeComplete(FCB, Status, Irp, Irp->IoStatus.Information);
|
return UnlockAndMaybeComplete(FCB, Status, Irp, Irp->IoStatus.Information);
|
||||||
}
|
}
|
||||||
else if (!(RecvReq->AfdFlags & AFD_OVERLAPPED) &&
|
else if (!(RecvReq->AfdFlags & AFD_OVERLAPPED) &&
|
||||||
((RecvReq->AfdFlags & AFD_IMMEDIATE) || (FCB->NonBlocking)))
|
((RecvReq->AfdFlags & AFD_IMMEDIATE) || (FCB->NonBlocking)))
|
||||||
{
|
{
|
||||||
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
||||||
|
@ -519,7 +511,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
Status = ReceiveActivity( FCB, Irp );
|
Status = ReceiveActivity( FCB, Irp );
|
||||||
|
|
||||||
if( Status == STATUS_PENDING &&
|
if( Status == STATUS_PENDING &&
|
||||||
!(RecvReq->AfdFlags & AFD_OVERLAPPED) &&
|
!(RecvReq->AfdFlags & AFD_OVERLAPPED) &&
|
||||||
((RecvReq->AfdFlags & AFD_IMMEDIATE) || (FCB->NonBlocking))) {
|
((RecvReq->AfdFlags & AFD_IMMEDIATE) || (FCB->NonBlocking))) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
||||||
Status = STATUS_CANT_WAIT;
|
Status = STATUS_CANT_WAIT;
|
||||||
|
@ -584,8 +576,8 @@ PacketSocketRecvComplete(
|
||||||
while( !IsListEmpty( &FCB->DatagramList ) ) {
|
while( !IsListEmpty( &FCB->DatagramList ) ) {
|
||||||
DatagramRecvEntry = RemoveHeadList(&FCB->DatagramList);
|
DatagramRecvEntry = RemoveHeadList(&FCB->DatagramList);
|
||||||
DatagramRecv = CONTAINING_RECORD(DatagramRecvEntry, AFD_STORED_DATAGRAM, ListEntry);
|
DatagramRecv = CONTAINING_RECORD(DatagramRecvEntry, AFD_STORED_DATAGRAM, ListEntry);
|
||||||
ExFreePool( DatagramRecv->Address );
|
ExFreePool(DatagramRecv->Address);
|
||||||
ExFreePool( DatagramRecv );
|
ExFreePool(DatagramRecv);
|
||||||
}
|
}
|
||||||
|
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
|
@ -604,7 +596,7 @@ PacketSocketRecvComplete(
|
||||||
return STATUS_FILE_CLOSED;
|
return STATUS_FILE_CLOSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
DatagramRecv = ExAllocatePool( NonPagedPool, DGSize );
|
DatagramRecv = ExAllocatePool(NonPagedPool, DGSize);
|
||||||
|
|
||||||
if( DatagramRecv ) {
|
if( DatagramRecv ) {
|
||||||
DatagramRecv->Len = Irp->IoStatus.Information;
|
DatagramRecv->Len = Irp->IoStatus.Information;
|
||||||
|
@ -620,7 +612,7 @@ PacketSocketRecvComplete(
|
||||||
} else Status = STATUS_NO_MEMORY;
|
} else Status = STATUS_NO_MEMORY;
|
||||||
|
|
||||||
if( !NT_SUCCESS( Status ) ) {
|
if( !NT_SUCCESS( Status ) ) {
|
||||||
if( DatagramRecv ) ExFreePool( DatagramRecv );
|
if (DatagramRecv) ExFreePool(DatagramRecv);
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
return Status;
|
return Status;
|
||||||
} else {
|
} else {
|
||||||
|
@ -765,7 +757,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
return UnlockAndMaybeComplete(FCB, Status, Irp, Irp->IoStatus.Information);
|
return UnlockAndMaybeComplete(FCB, Status, Irp, Irp->IoStatus.Information);
|
||||||
}
|
}
|
||||||
else if (!(RecvReq->AfdFlags & AFD_OVERLAPPED) &&
|
else if (!(RecvReq->AfdFlags & AFD_OVERLAPPED) &&
|
||||||
((RecvReq->AfdFlags & AFD_IMMEDIATE) || (FCB->NonBlocking)))
|
((RecvReq->AfdFlags & AFD_IMMEDIATE) || (FCB->NonBlocking)))
|
||||||
{
|
{
|
||||||
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
||||||
|
|
|
@ -68,7 +68,7 @@ VOID SignalSocket(
|
||||||
{
|
{
|
||||||
KeCancelTimer( &Poll->Timer );
|
KeCancelTimer( &Poll->Timer );
|
||||||
RemoveEntryList( &Poll->ListEntry );
|
RemoveEntryList( &Poll->ListEntry );
|
||||||
ExFreePool( Poll );
|
ExFreePool(Poll);
|
||||||
}
|
}
|
||||||
|
|
||||||
Irp->IoStatus.Status = Status;
|
Irp->IoStatus.Status = Status;
|
||||||
|
@ -228,7 +228,7 @@ AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
PAFD_ACTIVE_POLL Poll = NULL;
|
PAFD_ACTIVE_POLL Poll = NULL;
|
||||||
|
|
||||||
Poll = ExAllocatePool( NonPagedPool, sizeof(AFD_ACTIVE_POLL) );
|
Poll = ExAllocatePool(NonPagedPool, sizeof(AFD_ACTIVE_POLL));
|
||||||
|
|
||||||
if (Poll){
|
if (Poll){
|
||||||
Poll->Irp = Irp;
|
Poll->Irp = Irp;
|
||||||
|
|
|
@ -776,7 +776,7 @@ NTSTATUS TdiQueryAddress(
|
||||||
AFD_DbgPrint(MAX_TRACE, ("Called\n"));
|
AFD_DbgPrint(MAX_TRACE, ("Called\n"));
|
||||||
|
|
||||||
BufferSize = sizeof(TDIEntityID) * 20;
|
BufferSize = sizeof(TDIEntityID) * 20;
|
||||||
Entities = (TDIEntityID*)ExAllocatePool(NonPagedPool, BufferSize);
|
Entities = (TDIEntityID*)ExAllocatePool(NonPagedPool, BufferSize);
|
||||||
if (!Entities) {
|
if (!Entities) {
|
||||||
AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
|
AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
|
@ -71,26 +71,6 @@ UINT TaLengthOfTransportAddressByType(UINT AddressType)
|
||||||
return AddrLen;
|
return AddrLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID TaCopyAddressInPlace( PTA_ADDRESS Target,
|
|
||||||
PTA_ADDRESS Source ) {
|
|
||||||
UINT AddrLen = TaLengthOfAddress( Source );
|
|
||||||
RtlCopyMemory( Target, Source, AddrLen );
|
|
||||||
}
|
|
||||||
|
|
||||||
PTA_ADDRESS TaCopyAddress( PTA_ADDRESS Source ) {
|
|
||||||
UINT AddrLen = TaLengthOfAddress( Source );
|
|
||||||
PVOID Buffer;
|
|
||||||
if (!AddrLen)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
Buffer = ExAllocatePool( NonPagedPool, AddrLen );
|
|
||||||
|
|
||||||
if (Buffer)
|
|
||||||
RtlCopyMemory( Buffer, Source, AddrLen );
|
|
||||||
|
|
||||||
return Buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID TaCopyTransportAddressInPlace( PTRANSPORT_ADDRESS Target,
|
VOID TaCopyTransportAddressInPlace( PTRANSPORT_ADDRESS Target,
|
||||||
PTRANSPORT_ADDRESS Source ) {
|
PTRANSPORT_ADDRESS Source ) {
|
||||||
UINT AddrLen = TaLengthOfTransportAddress( Source );
|
UINT AddrLen = TaLengthOfTransportAddress( Source );
|
||||||
|
@ -105,7 +85,7 @@ PTRANSPORT_ADDRESS TaCopyTransportAddress( PTRANSPORT_ADDRESS OtherAddress ) {
|
||||||
if (!AddrLen)
|
if (!AddrLen)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
A = ExAllocatePool( NonPagedPool, AddrLen );
|
A = ExAllocatePool(NonPagedPool, AddrLen);
|
||||||
|
|
||||||
if( A )
|
if( A )
|
||||||
TaCopyTransportAddressInPlace( A, OtherAddress );
|
TaCopyTransportAddressInPlace( A, OtherAddress );
|
||||||
|
@ -211,8 +191,7 @@ NTSTATUS TdiBuildNullConnectionInfo
|
||||||
|
|
||||||
ConnInfo = (PTDI_CONNECTION_INFORMATION)
|
ConnInfo = (PTDI_CONNECTION_INFORMATION)
|
||||||
ExAllocatePool(NonPagedPool,
|
ExAllocatePool(NonPagedPool,
|
||||||
sizeof(TDI_CONNECTION_INFORMATION) +
|
sizeof(TDI_CONNECTION_INFORMATION) + TdiAddressSize);
|
||||||
TdiAddressSize);
|
|
||||||
if (!ConnInfo) {
|
if (!ConnInfo) {
|
||||||
*ConnectionInfo = NULL;
|
*ConnectionInfo = NULL;
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
@ -222,7 +201,7 @@ NTSTATUS TdiBuildNullConnectionInfo
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
ExFreePool( ConnInfo );
|
ExFreePool(ConnInfo);
|
||||||
ConnInfo = NULL;
|
ConnInfo = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -398,7 +398,7 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ExFreePool( TargetAddress );
|
ExFreePool(TargetAddress);
|
||||||
|
|
||||||
SocketStateUnlock(FCB);
|
SocketStateUnlock(FCB);
|
||||||
|
|
||||||
|
@ -597,7 +597,7 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
if (FCB->State == SOCKET_STATE_CREATED)
|
if (FCB->State == SOCKET_STATE_CREATED)
|
||||||
{
|
{
|
||||||
if( FCB->LocalAddress ) ExFreePool( FCB->LocalAddress );
|
if (FCB->LocalAddress) ExFreePool(FCB->LocalAddress);
|
||||||
FCB->LocalAddress =
|
FCB->LocalAddress =
|
||||||
TaBuildNullTransportAddress( ((PTRANSPORT_ADDRESS)SendReq->TdiConnection.RemoteAddress)->
|
TaBuildNullTransportAddress( ((PTRANSPORT_ADDRESS)SendReq->TdiConnection.RemoteAddress)->
|
||||||
Address[0].AddressType );
|
Address[0].AddressType );
|
||||||
|
|
|
@ -141,7 +141,7 @@ typedef struct _AFD_STORED_DATAGRAM {
|
||||||
} AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
|
} AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
|
||||||
|
|
||||||
typedef struct _AFD_FCB {
|
typedef struct _AFD_FCB {
|
||||||
BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline, TdiReceiveClosed, SendClosed;
|
BOOLEAN Locked, Critical, NonBlocking, OobInline, TdiReceiveClosed, SendClosed;
|
||||||
UINT State, Flags, GroupID, GroupType;
|
UINT State, Flags, GroupID, GroupType;
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
UINT LockCount;
|
UINT LockCount;
|
||||||
|
|
|
@ -6,8 +6,6 @@ PTRANSPORT_ADDRESS TaCopyTransportAddress( PTRANSPORT_ADDRESS OtherAddress );
|
||||||
PTRANSPORT_ADDRESS TaBuildNullTransportAddress(UINT AddressType);
|
PTRANSPORT_ADDRESS TaBuildNullTransportAddress(UINT AddressType);
|
||||||
UINT TaLengthOfAddress( PTA_ADDRESS Addr );
|
UINT TaLengthOfAddress( PTA_ADDRESS Addr );
|
||||||
UINT TaLengthOfTransportAddress( PTRANSPORT_ADDRESS Addr );
|
UINT TaLengthOfTransportAddress( PTRANSPORT_ADDRESS Addr );
|
||||||
VOID TaCopyAddressInPlace( PTA_ADDRESS Target, PTA_ADDRESS Source );
|
|
||||||
PTA_ADDRESS TaCopyAddress( PTA_ADDRESS Source );
|
|
||||||
VOID TaCopyTransportAddressInPlace( PTRANSPORT_ADDRESS Target,
|
VOID TaCopyTransportAddressInPlace( PTRANSPORT_ADDRESS Target,
|
||||||
PTRANSPORT_ADDRESS Source );
|
PTRANSPORT_ADDRESS Source );
|
||||||
UINT TdiAddressSizeFromType( UINT Type );
|
UINT TdiAddressSizeFromType( UINT Type );
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue