#include <kmem.h>

#include <debug.h>

 

 

typedef struct _DDEVOBJ_EXTENSION

{

      struct _DEVOBJ_EXTENSION;

 

      ULONG                         PowerFlags;

      PVOID                         Dope;

      ULONG                         ExtensionFlags;

      PVOID                         DeviceNode;

      PDEVICE_OBJECT               AttachedTo;

      LONG                          StartIoCount;

      LONG                          StartIoKey;

      ULONG                         StartIoFlags;

      PVPB                          Vpb;

} DDEVOBJ_EXTENSION, *PDDEVOBJ_EXTENSION;

 

 

 

VOID

GetDeviceStack(PDEVICE_OBJECT DeviceObject)

{

      // local copy

      PDEVICE_OBJECT upperDeviceObject = DeviceObject;

      PDDEVOBJ_EXTENSION deviceExtension;

      PDEVICE_OBJECT lowerDeviceObject = DeviceObject;

      LONG i=0;

 

      // lower deviceObjects

      deviceExtension = (PDDEVOBJ_EXTENSION) DeviceObject->DeviceObjectExtension;

     

      while (deviceExtension->AttachedTo != NULL)

      {

            lowerDeviceObject = deviceExtension->AttachedTo;

            deviceExtension = (PDDEVOBJ_EXTENSION) lowerDeviceObject->DeviceObjectExtension;     

            i--;

            DriverDbg(("Level(%d) - 0x%X (%wZ)\n", i, lowerDeviceObject, &lowerDeviceObject->DriverObject->DriverName));

      }

 

      i=0;

      DriverDbg(("Level(%d) - 0x%X (%wZ)\n", i, upperDeviceObject, &upperDeviceObject->DriverObject->DriverName));

 

      // upper deviceObjects

      while(upperDeviceObject->AttachedDevice)

      {

            i++;

            upperDeviceObject = upperDeviceObject->AttachedDevice;

            DriverDbg(("Level(%d) - 0x%X (%wZ)\n", i, upperDeviceObject, &upperDeviceObject->DriverObject->DriverName));

      }

 

      return;

}

 

PDEVICE_OBJECT

GetBaseDeviceObject(PDEVICE_OBJECT DeviceObject)

{

      PDEVICE_OBJECT baseDeviceObject = DeviceObject;

      PDDEVOBJ_EXTENSION deviceExtension = (PDDEVOBJ_EXTENSION) baseDeviceObject->DeviceObjectExtension;

     

      while(deviceExtension->AttachedTo != NULL)

      {

            baseDeviceObject = deviceExtension->AttachedTo;

            deviceExtension = (PDDEVOBJ_EXTENSION) baseDeviceObject->DeviceObjectExtension;

      }

     

      return baseDeviceObject;

}

 

PDEVICE_OBJECT

GetTopDeviceObject(PDEVICE_OBJECT DeviceObject)

{

      PDEVICE_OBJECT topDeviceObject = DeviceObject;

     

      while(topDeviceObject->AttachedDevice)

      {

            topDeviceObject = topDeviceObject->AttachedDevice;

      }

 

      return topDeviceObject;

}