- Add cancellation support for IOCTL_AFD_SELECT
authorCameron Gutman <aicommander@gmail.com>
Sat, 3 Oct 2009 21:34:34 +0000 (21:34 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sat, 3 Oct 2009 21:34:34 +0000 (21:34 +0000)
 - Fix release build

svn path=/trunk/; revision=43275

reactos/drivers/network/afd/afd/main.c
reactos/drivers/network/afd/afd/select.c
reactos/drivers/network/afd/include/afd.h

index a20c47b..3df1fae 100644 (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;
index b78ee07..4cdbcdf 100644 (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;
index c4db601..c80b3af 100644 (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 */