Author: fireball Date: Sun Jan 4 03:35:35 2009 New Revision: 38550
URL: http://svn.reactos.org/svn/reactos?rev=38550&view=rev Log: - Merge IoGetRelatedTargetDevice implementation by Pierre Schweitzer (pierre-fsd branch), with my modifications.
Modified: trunk/reactos/ntoskrnl/include/internal/io.h trunk/reactos/ntoskrnl/io/iomgr/device.c trunk/reactos/ntoskrnl/io/iomgr/iofunc.c
Modified: trunk/reactos/ntoskrnl/include/internal/io.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/i... ============================================================================== --- trunk/reactos/ntoskrnl/include/internal/io.h [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/include/internal/io.h [iso-8859-1] Sun Jan 4 03:35:35 2009 @@ -709,6 +709,12 @@ IN BOOLEAN ForceUnload );
+NTSTATUS +NTAPI +IoGetRelatedTargetDevice(IN PFILE_OBJECT FileObject, + OUT PDEVICE_OBJECT *DeviceObject +); + // // IRP Routines //
Modified: trunk/reactos/ntoskrnl/io/iomgr/device.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/device.c?... ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/device.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/iomgr/device.c [iso-8859-1] Sun Jan 4 03:35:35 2009 @@ -552,6 +552,51 @@ } }
+NTSTATUS +NTAPI +IopGetRelatedTargetDevice(IN PFILE_OBJECT FileObject, + OUT PDEVICE_NODE *DeviceNode) +{ + NTSTATUS Status; + IO_STACK_LOCATION Stack = {0}; + 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; + + /* Define input parameters */ + Stack.Parameters.QueryDeviceRelations.Type = TargetDeviceRelation; + Stack.FileObject = FileObject; + + /* Call the driver to query all relations (IRP_MJ_PNP) */ + Status = IopInitiatePnpIrp(DeviceObject, + &IoStatusBlock, + IRP_MN_QUERY_DEVICE_RELATIONS, + &Stack); + if (!NT_SUCCESS(Status)) return Status; + + /* Get returned pointer to DEVICE_RELATIONS */ + DeviceRelations = (PDEVICE_RELATIONS)IoStatusBlock.Information; + + /* Make sure it's not NULL and contains only one object */ + ASSERT(DeviceRelations); + ASSERT(DeviceRelations->Count == 1); + + /* Finally get the device node */ + *DeviceNode = IopGetDeviceNode(DeviceRelations->Objects[0]); + if (!*DeviceNode) Status = STATUS_NO_SUCH_DEVICE; + + /* Free the DEVICE_RELATIONS structure, it's not needed anymore */ + ExFreePool(DeviceRelations); + + return Status; +} + /* PUBLIC FUNCTIONS ***********************************************************/
/* @@ -1205,6 +1250,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; + + /* Call the internal helper function */ + Status = IopGetRelatedTargetDevice(FileObject, &DeviceNode); + if (NT_SUCCESS(Status) && DeviceNode) + { + *DeviceObject = DeviceNode->PhysicalDeviceObject; + } + return Status; }
/*
Modified: trunk/reactos/ntoskrnl/io/iomgr/iofunc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/iofunc.c?... ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/iofunc.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/iomgr/iofunc.c [iso-8859-1] Sun Jan 4 03:35:35 2009 @@ -3307,7 +3307,8 @@ }
/* Get the device object */ - DeviceObject = IoGetRelatedDeviceObject(FileObject); + Status = IoGetRelatedTargetDevice(FileObject, &DeviceObject); + if (!NT_SUCCESS(Status)) return Status;
/* Clear File Object event */ KeClearEvent(&FileObject->Event);