[ros-diffs] [cgutman] 40790: - Implement handling for IRP_MN_QUERY_STOP_DEVICE

cgutman at svn.reactos.org cgutman at svn.reactos.org
Tue May 5 03:08:07 CEST 2009


Author: cgutman
Date: Tue May  5 05:08:06 2009
New Revision: 40790

URL: http://svn.reactos.org/svn/reactos?rev=40790&view=rev
Log:
 - Implement handling for IRP_MN_QUERY_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=40790&r1=40789&r2=40790&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:08:06 2009
@@ -55,6 +55,12 @@
     IN  PPNDIS_PACKET   PacketArray,
     IN  UINT            NumberOfPackets);
 
+NTSTATUS
+NTAPI
+NdisIPnPQueryStopDevice(
+    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=40790&r1=40789&r2=40790&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:08:06 2009
@@ -2044,6 +2044,12 @@
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
         break;
 
+      case IRP_MN_QUERY_STOP_DEVICE:
+        Status = NdisIPnPQueryStopDevice(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=40790&r1=40789&r2=40790&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:08:06 2009
@@ -21,6 +21,70 @@
 KSPIN_LOCK ProtocolListLock;
 
 #define WORKER_TEST 0
+
+PNET_PNP_EVENT
+ProSetupPnPEvent(
+    NET_PNP_EVENT_CODE EventCode,
+    PVOID              EventBuffer,
+    ULONG              EventBufferLength)
+{
+    PNET_PNP_EVENT PnPEvent;
+
+    PnPEvent = ExAllocatePool(PagedPool, sizeof(NET_PNP_EVENT));
+    if (!PnPEvent)
+        return NULL;
+
+    RtlZeroMemory(PnPEvent, sizeof(NET_PNP_EVENT));
+
+    PnPEvent->NetEvent = EventCode;
+    PnPEvent->Buffer = EventBuffer;
+    PnPEvent->BufferLength = EventBufferLength;
+
+    return PnPEvent;
+}
+
+NTSTATUS
+NTAPI
+NdisIPnPQueryStopDevice(
+    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(NetEventQueryRemoveDevice, 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);
+
+     if (Status == NDIS_STATUS_PENDING)
+     {
+         /* We don't handle this yet */
+         ASSERT(FALSE);
+     }
+     else if (Status != NDIS_STATUS_SUCCESS)
+     {
+         /* One protocol failed so we can fail the query stop device IRP */
+         return Status;
+     }
+
+     CurrentEntry = CurrentEntry->Flink;
+  }
+
+  return NDIS_STATUS_SUCCESS;
+}
 
 
 /*



More information about the Ros-diffs mailing list