Author: pschweitzer
Date: Sat Jan 3 03:35:10 2009
New Revision: 38523
URL:
http://svn.reactos.org/svn/reactos?rev=38523&view=rev
Log:
- Implemeted Io(p)GetRelatedTargetDevice
- Fixed FsRtlNotifyVolumeEvent
Modified:
branches/pierre-fsd/ntoskrnl/fsrtl/pnp.c
branches/pierre-fsd/ntoskrnl/include/internal/io.h
branches/pierre-fsd/ntoskrnl/io/iomgr/device.c
Modified: branches/pierre-fsd/ntoskrnl/fsrtl/pnp.c
URL:
http://svn.reactos.org/svn/reactos/branches/pierre-fsd/ntoskrnl/fsrtl/pnp.c…
==============================================================================
--- branches/pierre-fsd/ntoskrnl/fsrtl/pnp.c [iso-8859-1] (original)
+++ branches/pierre-fsd/ntoskrnl/fsrtl/pnp.c [iso-8859-1] Sat Jan 3 03:35:10 2009
@@ -43,8 +43,7 @@
PDEVICE_OBJECT DeviceObject = NULL;
TARGET_DEVICE_CUSTOM_NOTIFICATION Notification;
- /* FIXME: We should call IoGetRelatedTargetDevice here */
- DeviceObject = IoGetRelatedDeviceObject(FileObject);
+ IoGetRelatedTargetDevice(FileObject, &DeviceObject);
if (DeviceObject)
{
Notification.Version = 1;
Modified: branches/pierre-fsd/ntoskrnl/include/internal/io.h
URL:
http://svn.reactos.org/svn/reactos/branches/pierre-fsd/ntoskrnl/include/int…
==============================================================================
--- branches/pierre-fsd/ntoskrnl/include/internal/io.h [iso-8859-1] (original)
+++ branches/pierre-fsd/ntoskrnl/include/internal/io.h [iso-8859-1] Sat Jan 3 03:35:10
2009
@@ -669,6 +669,12 @@
IN BOOLEAN ForceUnload
);
+NTSTATUS
+NTAPI
+IoGetRelatedTargetDevice(IN PFILE_OBJECT FileObject,
+ OUT PDEVICE_OBJECT *DeviceObject
+);
+
//
// IRP Routines
//
Modified: branches/pierre-fsd/ntoskrnl/io/iomgr/device.c
URL:
http://svn.reactos.org/svn/reactos/branches/pierre-fsd/ntoskrnl/io/iomgr/de…
==============================================================================
--- branches/pierre-fsd/ntoskrnl/io/iomgr/device.c [iso-8859-1] (original)
+++ branches/pierre-fsd/ntoskrnl/io/iomgr/device.c [iso-8859-1] Sat Jan 3 03:35:10 2009
@@ -552,6 +552,49 @@
}
}
+NTSTATUS
+NTAPI
+IopGetRelatedTargetDevice(IN PFILE_OBJECT FileObject,
+ OUT PDEVICE_NODE *DeviceNode)
+{
+ NTSTATUS Status;
+ IO_STACK_LOCATION Stack;
+ IO_STATUS_BLOCK IoStatusBlock;
+ PDEVICE_RELATIONS DeviceRelations;
+ PDEVICE_OBJECT DeviceObject = NULL;
+
+ ASSERT(FileObject);
+
+ /* Get DeviceObject related to given FileObject */
+ DeviceObject = IoGetRelatedDeviceObject(FileObject);
+ if (!DeviceObject)
+ {
+ return STATUS_NO_SUCH_DEVICE;
+ }
+
+ /* Call the driver to query all the relations (IRP_MJ_PNP) */
+ Status = IopInitiatePnpIrp(DeviceObject, &IoStatusBlock,
+ IRP_MN_QUERY_DEVICE_RELATIONS, &Stack);
+ if (NT_SUCCESS(Status))
+ {
+ DeviceRelations = (PDEVICE_RELATIONS)IoStatusBlock.Information;
+ ASSERT(DeviceRelations);
+ ASSERT(DeviceRelations->Count == 1);
+
+ /* We finally get the device node */
+ *DeviceNode =
(PDEVICE_NODE)((PEXTENDED_DEVOBJ_EXTENSION)DeviceRelations->Objects[0]->DeviceObjectExtension)->DeviceNode;
+ if (!*DeviceNode)
+ {
+ Status = STATUS_NO_SUCH_DEVICE;
+ }
+
+ /* Free the DEVICE_RELATIONS structure, we don't need it anymore */
+ ExFreePool(DeviceRelations);
+ }
+
+ return Status;
+}
+
/* PUBLIC FUNCTIONS ***********************************************************/
/*
@@ -1205,6 +1248,26 @@
/* Return the DO we found */
return DeviceObject;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IoGetRelatedTargetDevice(IN PFILE_OBJECT FileObject,
+ OUT PDEVICE_OBJECT *DeviceObject)
+{
+ NTSTATUS Status;
+ PDEVICE_NODE DeviceNode = NULL;
+
+ /* We call the internal function to do all the work */
+ Status = IopGetRelatedTargetDevice(FileObject, &DeviceNode);
+ if (NT_SUCCESS(Status) && DeviceNode)
+ {
+ *DeviceObject = DeviceNode->PhysicalDeviceObject;
+ }
+ return Status;
}
/*