You can/should use IopGetDeviceNode instead of the ugly (but
necessary) triple-casting you have.
  +        *DeviceNode = (PDEVICE_NODE)
 ((PEXTENDED_DEVOBJ_EXTENSION)DeviceRelations->Objects[0]-
 >DeviceObjectExtension)->DeviceNode; 
Also, I believe there is a bug in Nt/IoQuery/SetVolumeInformation --
we call IoGetRelatedDeviceObject instead of IoGetRelatedTargetDevice,
because the function was missing.
Good job!
On 3-Jan-09, at 4:35 AM, pschweitzer(a)svn.reactos.org wrote:
> 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;
> }
>
> /*
>
Best regards,
Alex Ionescu