mirror of
https://github.com/reactos/reactos.git
synced 2025-06-10 04:14:53 +00:00
- Implement a DispatchCleanup routine and properly separate cleanup from close
svn path=/trunk/; revision=40366
This commit is contained in:
parent
9f0ebd0b54
commit
a2e1f4928f
1 changed files with 67 additions and 34 deletions
|
@ -167,9 +167,8 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID DestroySocket( PAFD_FCB FCB ) {
|
VOID CleanupSocket( PAFD_FCB FCB ) {
|
||||||
UINT i;
|
UINT i;
|
||||||
BOOLEAN ReturnEarly = FALSE;
|
|
||||||
PAFD_IN_FLIGHT_REQUEST InFlightRequest[IN_FLIGHT_REQUESTS];
|
PAFD_IN_FLIGHT_REQUEST InFlightRequest[IN_FLIGHT_REQUESTS];
|
||||||
|
|
||||||
AFD_DbgPrint(MIN_TRACE,("Called (%x)\n", FCB));
|
AFD_DbgPrint(MIN_TRACE,("Called (%x)\n", FCB));
|
||||||
|
@ -188,46 +187,60 @@ VOID DestroySocket( PAFD_FCB FCB ) {
|
||||||
if( InFlightRequest[i]->InFlightRequest ) {
|
if( InFlightRequest[i]->InFlightRequest ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Cancelling in flight irp %d (%x)\n",
|
AFD_DbgPrint(MID_TRACE,("Cancelling in flight irp %d (%x)\n",
|
||||||
i, InFlightRequest[i]->InFlightRequest));
|
i, InFlightRequest[i]->InFlightRequest));
|
||||||
if (!IoCancelIrp(InFlightRequest[i]->InFlightRequest))
|
IoCancelIrp(InFlightRequest[i]->InFlightRequest);
|
||||||
ReturnEarly = TRUE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FCB->State = SOCKET_STATE_CREATED;
|
||||||
|
|
||||||
|
if( FCB->EventSelect ) {
|
||||||
|
ObDereferenceObject( FCB->EventSelect );
|
||||||
|
FCB->EventSelect = NULL;
|
||||||
|
}
|
||||||
|
if( FCB->Context ) {
|
||||||
|
ExFreePool( FCB->Context );
|
||||||
|
FCB->Context = NULL;
|
||||||
|
}
|
||||||
|
if( FCB->Recv.Window ) {
|
||||||
|
ExFreePool( FCB->Recv.Window );
|
||||||
|
FCB->Recv.Window = NULL;
|
||||||
|
}
|
||||||
|
if( FCB->Send.Window ) {
|
||||||
|
ExFreePool( FCB->Send.Window );
|
||||||
|
FCB->Send.Window = NULL;
|
||||||
|
}
|
||||||
|
if( FCB->AddressFrom ) {
|
||||||
|
ExFreePool( FCB->AddressFrom );
|
||||||
|
FCB->AddressFrom = NULL;
|
||||||
|
}
|
||||||
|
if( FCB->LocalAddress ) {
|
||||||
|
ExFreePool( FCB->LocalAddress );
|
||||||
|
FCB->LocalAddress = NULL;
|
||||||
|
}
|
||||||
|
if( FCB->RemoteAddress ) {
|
||||||
|
ExFreePool( FCB->RemoteAddress );
|
||||||
|
FCB->RemoteAddress = NULL;
|
||||||
|
}
|
||||||
|
if( FCB->Connection.Object ) {
|
||||||
|
NtClose(FCB->Connection.Handle);
|
||||||
|
ObDereferenceObject(FCB->Connection.Object);
|
||||||
|
FCB->Connection.Object = NULL;
|
||||||
|
}
|
||||||
|
if( FCB->AddressFile.Object ) {
|
||||||
|
NtClose(FCB->AddressFile.Handle);
|
||||||
|
ObDereferenceObject(FCB->AddressFile.Object);
|
||||||
|
FCB->AddressFile.Object = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
|
}
|
||||||
|
|
||||||
if( ReturnEarly )
|
VOID DestroySocket( PAFD_FCB FCB ) {
|
||||||
return;
|
|
||||||
|
|
||||||
if( FCB->Context )
|
|
||||||
ExFreePool(FCB->Context);
|
|
||||||
if( FCB->Recv.Window )
|
|
||||||
ExFreePool( FCB->Recv.Window );
|
|
||||||
if( FCB->Send.Window )
|
|
||||||
ExFreePool( FCB->Send.Window );
|
|
||||||
if( FCB->AddressFrom )
|
|
||||||
ExFreePool( FCB->AddressFrom );
|
|
||||||
if( FCB->LocalAddress )
|
|
||||||
ExFreePool( FCB->LocalAddress );
|
|
||||||
if( FCB->RemoteAddress )
|
|
||||||
ExFreePool( FCB->RemoteAddress );
|
|
||||||
if( FCB->TdiDeviceName.Buffer )
|
if( FCB->TdiDeviceName.Buffer )
|
||||||
ExFreePool(FCB->TdiDeviceName.Buffer);
|
ExFreePool(FCB->TdiDeviceName.Buffer);
|
||||||
|
|
||||||
if (FCB->Connection.Object)
|
|
||||||
{
|
|
||||||
NtClose(FCB->Connection.Handle);
|
|
||||||
ObDereferenceObject(FCB->Connection.Object);
|
|
||||||
}
|
|
||||||
if (FCB->AddressFile.Object)
|
|
||||||
{
|
|
||||||
NtClose(FCB->AddressFile.Handle);
|
|
||||||
ObDereferenceObject(FCB->AddressFile.Object);
|
|
||||||
}
|
|
||||||
|
|
||||||
ExFreePool(FCB);
|
ExFreePool(FCB);
|
||||||
AFD_DbgPrint(MIN_TRACE,("Deleted (%x)\n", FCB));
|
AFD_DbgPrint(MIN_TRACE,("Deleted (%x)\n", FCB));
|
||||||
|
|
||||||
AFD_DbgPrint(MIN_TRACE,("Leaving\n"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS NTAPI
|
static NTSTATUS NTAPI
|
||||||
|
@ -244,12 +257,6 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("FCB %x\n", FCB));
|
AFD_DbgPrint(MID_TRACE,("FCB %x\n", FCB));
|
||||||
|
|
||||||
FCB->PollState |= AFD_EVENT_CLOSE;
|
|
||||||
PollReeval( FCB->DeviceExt, FileObject );
|
|
||||||
KillSelectsForFCB( FCB->DeviceExt, FileObject, FALSE );
|
|
||||||
|
|
||||||
if( FCB->EventSelect ) ObDereferenceObject( FCB->EventSelect );
|
|
||||||
|
|
||||||
FileObject->FsContext = NULL;
|
FileObject->FsContext = NULL;
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
|
|
||||||
|
@ -264,6 +271,28 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NTSTATUS NTAPI
|
||||||
|
AfdCleanupSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
PIO_STACK_LOCATION IrpSp)
|
||||||
|
{
|
||||||
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
|
|
||||||
|
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
||||||
|
|
||||||
|
CleanupSocket( FCB );
|
||||||
|
|
||||||
|
KillSelectsForFCB( FCB->DeviceExt, FileObject, FALSE );
|
||||||
|
|
||||||
|
SocketStateUnlock( FCB );
|
||||||
|
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
IoCompleteRequest(Irp, IO_NETWORK_INCREMENT);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS NTAPI
|
static NTSTATUS NTAPI
|
||||||
AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PIO_STACK_LOCATION IrpSp) {
|
PIO_STACK_LOCATION IrpSp) {
|
||||||
|
@ -344,6 +373,9 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
/* Ditto the borrowing */
|
/* Ditto the borrowing */
|
||||||
return AfdCloseSocket(DeviceObject, Irp, IrpSp);
|
return AfdCloseSocket(DeviceObject, Irp, IrpSp);
|
||||||
|
|
||||||
|
case IRP_MJ_CLEANUP:
|
||||||
|
return AfdCleanupSocket(DeviceObject, Irp, IrpSp);
|
||||||
|
|
||||||
/* write data */
|
/* write data */
|
||||||
case IRP_MJ_WRITE:
|
case IRP_MJ_WRITE:
|
||||||
return AfdConnectedSocketWriteData( DeviceObject, Irp, IrpSp, TRUE );
|
return AfdConnectedSocketWriteData( DeviceObject, Irp, IrpSp, TRUE );
|
||||||
|
@ -519,6 +551,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
|
||||||
/* register driver routines */
|
/* register driver routines */
|
||||||
DriverObject->MajorFunction[IRP_MJ_CLOSE] = AfdDispatch;
|
DriverObject->MajorFunction[IRP_MJ_CLOSE] = AfdDispatch;
|
||||||
DriverObject->MajorFunction[IRP_MJ_CREATE] = AfdDispatch;
|
DriverObject->MajorFunction[IRP_MJ_CREATE] = AfdDispatch;
|
||||||
|
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = AfdDispatch;
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue