PAFD_ACTIVE_POLL Poll OPTIONAL,
PIRP _Irp OPTIONAL,
PAFD_POLL_INFO PollReq,
- NTSTATUS Status
+ NTSTATUS Status,
+ KSPIN_LOCK Lock,
+ KIRQL OldIrql
)
{
UINT i;
}
UnlockHandles( AFD_HANDLES(PollReq), PollReq->HandleCount );
if( Irp->MdlAddress ) UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) );
+ AFD_DbgPrint(MID_TRACE,("Completing\n"));
+ KeReleaseSpinLock(&Lock, OldIrql);
+ IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
+ KeAcquireSpinLock(&Lock, &OldIrql);
AFD_DbgPrint(MID_TRACE,("Done\n"));
}
ZeroEvents( PollReq->Handles, PollReq->HandleCount );
KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql );
- SignalSocket( Poll, NULL, PollReq, STATUS_TIMEOUT );
+ SignalSocket( Poll, NULL, PollReq, STATUS_TIMEOUT, DeviceExt->Lock, OldIrql );
KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
- IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
-
AFD_DbgPrint(MID_TRACE,("Timeout\n"));
}
if( (PVOID)HandleArray[i].Handle == FileObject &&
(!OnlyExclusive || (OnlyExclusive && Poll->Exclusive)) ) {
ZeroEvents( PollReq->Handles, PollReq->HandleCount );
- SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS );
- KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
- IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
- KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql );
+ SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS, DeviceExt->Lock, OldIrql );
}
}
}
if( Signalled ) {
Status = STATUS_SUCCESS;
Irp->IoStatus.Status = Status;
- SignalSocket( NULL, Irp, PollReq, Status );
- KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
- IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
- return Status;
+ SignalSocket( NULL, Irp, PollReq, Status, DeviceExt->Lock, OldIrql );
} else {
PAFD_ACTIVE_POLL Poll = NULL;
if( UpdatePollWithFCB( Poll, FileObject ) ) {
ThePollEnt = ThePollEnt->Flink;
AFD_DbgPrint(MID_TRACE,("Signalling socket\n"));
- SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS );
- KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
- IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
- KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql );
+ SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS, DeviceExt->Lock, OldIrql );
} else
ThePollEnt = ThePollEnt->Flink;
}