[ros-diffs] [cgutman] 40791: - Implement handling for IRP_MN_CANCEL_STOP_DEVICE

cgutman at svn.reactos.org cgutman at svn.reactos.org
Tue May 5 03:24:31 CEST 2009


Author: cgutman
Date: Tue May  5 05:24:30 2009
New Revision: 40791

URL: http://svn.reactos.org/svn/reactos?rev=40791&view=rev
Log:
 - Implement handling for IRP_MN_CANCEL_STOP_DEVICE

Modified:
    trunk/reactos/drivers/network/ndis/include/protocol.h
    trunk/reactos/drivers/network/ndis/ndis/miniport.c
    trunk/reactos/drivers/network/ndis/ndis/protocol.c

Modified: trunk/reactos/drivers/network/ndis/include/protocol.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/ndis/include/protocol.h?rev=40791&r1=40790&r2=40791&view=diff
==============================================================================
--- trunk/reactos/drivers/network/ndis/include/protocol.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/ndis/include/protocol.h [iso-8859-1] Tue May  5 05:24:30 2009
@@ -61,6 +61,12 @@
     IN PDEVICE_OBJECT DeviceObject,
     PIRP Irp);
 
+NTSTATUS
+NTAPI
+NdisIPnPCancelStopDevice(
+    IN PDEVICE_OBJECT DeviceObject,
+    PIRP Irp);
+
 #endif /* __PROTOCOL_H */
 
 /* EOF */

Modified: trunk/reactos/drivers/network/ndis/ndis/miniport.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/ndis/ndis/miniport.c?rev=40791&r1=40790&r2=40791&view=diff
==============================================================================
--- trunk/reactos/drivers/network/ndis/ndis/miniport.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/ndis/ndis/miniport.c [iso-8859-1] Tue May  5 05:24:30 2009
@@ -2050,6 +2050,12 @@
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
         break;
 
+      case IRP_MN_CANCEL_STOP_DEVICE:
+        Status = NdisIPnPCancelStopDevice(DeviceObject, Irp);
+        Irp->IoStatus.Status = Status;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        break;
+
       default:
         IoSkipCurrentIrpStackLocation(Irp);
         Status = IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);

Modified: trunk/reactos/drivers/network/ndis/ndis/protocol.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/ndis/ndis/protocol.c?rev=40791&r1=40790&r2=40791&view=diff
==============================================================================
--- trunk/reactos/drivers/network/ndis/ndis/protocol.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/ndis/ndis/protocol.c [iso-8859-1] Tue May  5 05:24:30 2009
@@ -77,11 +77,52 @@
      else if (Status != NDIS_STATUS_SUCCESS)
      {
          /* One protocol failed so we can fail the query stop device IRP */
+         ExFreePool(PnPEvent);
          return Status;
      }
 
      CurrentEntry = CurrentEntry->Flink;
   }
+
+  ExFreePool(PnPEvent);
+
+  return NDIS_STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+NdisIPnPCancelStopDevice(
+    IN PDEVICE_OBJECT DeviceObject,
+    PIRP Irp)
+{
+  PLIST_ENTRY CurrentEntry;
+  PADAPTER_BINDING AdapterBinding;
+  PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
+  PNET_PNP_EVENT PnPEvent;
+  NDIS_STATUS Status;
+
+  PnPEvent = ProSetupPnPEvent(NetEventCancelRemoveDevice, NULL, 0);
+  if (!PnPEvent)
+      return NDIS_STATUS_RESOURCES;
+
+  CurrentEntry = Adapter->ProtocolListHead.Flink;
+
+  while (CurrentEntry != &Adapter->ProtocolListHead)
+  {
+     AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
+
+     Status = (*AdapterBinding->ProtocolBinding->Chars.PnPEventHandler)(
+      AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
+      PnPEvent);
+
+     /* A protocol should always succeed NetEventCancelRemoveDevice */
+
+     ASSERT(Status == NDIS_STATUS_SUCCESS);
+
+     CurrentEntry = CurrentEntry->Flink;
+  }
+
+  ExFreePool(PnPEvent);
 
   return NDIS_STATUS_SUCCESS;
 }



More information about the Ros-diffs mailing list