- Add cancellation support for IOCTL_AFD_SELECT

- Fix release build

svn path=/trunk/; revision=43275
This commit is contained in:
Cameron Gutman 2009-10-03 21:34:34 +00:00
parent 5920b78ec2
commit 6ad0121a58
3 changed files with 43 additions and 3 deletions

View file

@ -517,6 +517,10 @@ AfdCancelHandler(PDEVICE_OBJECT DeviceObject,
PAFD_SEND_INFO SendReq;
PLIST_ENTRY CurrentEntry;
PIRP CurrentIrp;
PAFD_DEVICE_EXTENSION DeviceExt = DeviceObject->DeviceExtension;
KIRQL OldIrql;
PAFD_ACTIVE_POLL Poll;
PAFD_POLL_INFO PollReq;
IoReleaseCancelSpinLock(Irp->CancelIrql);
@ -553,9 +557,38 @@ AfdCancelHandler(PDEVICE_OBJECT DeviceObject,
Function = FUNCTION_PREACCEPT;
break;
case IOCTL_AFD_SELECT:
KeAcquireSpinLock(&DeviceExt->Lock, &OldIrql);
CurrentEntry = DeviceExt->Polls.Flink;
while (CurrentEntry != &DeviceExt->Polls)
{
Poll = CONTAINING_RECORD(CurrentEntry, AFD_ACTIVE_POLL, ListEntry);
CurrentIrp = Poll->Irp;
PollReq = CurrentIrp->AssociatedIrp.SystemBuffer;
if (CurrentIrp == Irp)
{
ZeroEvents(PollReq->Handles, PollReq->HandleCount);
SignalSocket(Poll, NULL, PollReq, STATUS_CANCELLED);
break;
}
else
{
CurrentEntry = CurrentEntry->Flink;
}
}
KeReleaseSpinLock(&DeviceExt->Lock, OldIrql);
/* IRP already completed by SignalSocket */
SocketStateUnlock(FCB);
return;
default:
ASSERT(FALSE);
break;
UnlockAndMaybeComplete(FCB, STATUS_CANCELLED, Irp, 0);
return;
}
CurrentEntry = FCB->PendingIrpList[Function].Flink;

View file

@ -43,7 +43,7 @@ static VOID CopyBackStatus( PAFD_HANDLE HandleArray,
}
}
static VOID ZeroEvents( PAFD_HANDLE HandleArray,
VOID ZeroEvents( PAFD_HANDLE HandleArray,
UINT HandleCount ) {
UINT i;
@ -55,7 +55,7 @@ static VOID ZeroEvents( PAFD_HANDLE HandleArray,
/* you must pass either Poll OR Irp */
static VOID SignalSocket(
VOID SignalSocket(
PAFD_ACTIVE_POLL Poll OPTIONAL,
PIRP _Irp OPTIONAL,
PAFD_POLL_INFO PollReq,
@ -89,6 +89,7 @@ static VOID SignalSocket(
UnlockHandles( AFD_HANDLES(PollReq), PollReq->HandleCount );
if( Irp->MdlAddress ) UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) );
AFD_DbgPrint(MID_TRACE,("Completing\n"));
(void)IoSetCancelRoutine(Irp, NULL);
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
AFD_DbgPrint(MID_TRACE,("Done\n"));
}
@ -244,6 +245,7 @@ AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
Status = STATUS_PENDING;
IoMarkIrpPending( Irp );
(void)IoSetCancelRoutine(Irp, AfdCancelHandler);
} else {
AFD_DbgPrint(MAX_TRACE, ("FIXME: do something with the IRP!\n"));
Status = STATUS_NO_MEMORY;

View file

@ -315,6 +315,11 @@ AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceObject, PFILE_OBJECT FileObject );
VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt,
PFILE_OBJECT FileObject, BOOLEAN ExclusiveOnly );
VOID ZeroEvents( PAFD_HANDLE HandleArray,
UINT HandleCount );
VOID SignalSocket(
PAFD_ACTIVE_POLL Poll OPTIONAL, PIRP _Irp OPTIONAL,
PAFD_POLL_INFO PollReq, NTSTATUS Status);
/* tdi.c */