- Implement handling for IRP_MN_CANCEL_STOP_DEVICE
authorCameron Gutman <aicommander@gmail.com>
Tue, 5 May 2009 01:24:30 +0000 (01:24 +0000)
committerCameron Gutman <aicommander@gmail.com>
Tue, 5 May 2009 01:24:30 +0000 (01:24 +0000)
svn path=/trunk/; revision=40791

reactos/drivers/network/ndis/include/protocol.h
reactos/drivers/network/ndis/ndis/miniport.c
reactos/drivers/network/ndis/ndis/protocol.c

index 2742f29..4737f21 100644 (file)
@@ -61,6 +61,12 @@ NdisIPnPQueryStopDevice(
     IN PDEVICE_OBJECT DeviceObject,
     PIRP Irp);
 
+NTSTATUS
+NTAPI
+NdisIPnPCancelStopDevice(
+    IN PDEVICE_OBJECT DeviceObject,
+    PIRP Irp);
+
 #endif /* __PROTOCOL_H */
 
 /* EOF */
index ab7decd..b179881 100644 (file)
@@ -2050,6 +2050,12 @@ NdisIDispatchPnp(
         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);
index 807fe3e..d0b88b0 100644 (file)
@@ -77,12 +77,53 @@ NdisIPnPQueryStopDevice(
      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;
 }