адрес DeviceObject

Тема в разделе "WASM.WIN32", создана пользователем JNT, 30 авг 2005.

  1. JNT

    JNT New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2005
    Сообщения:
    7
    Адрес:
    Russia
    Как можно получить адресса нижестоящийх в стеке deviceObject'ов?

    Заранее спасибо.
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Если ты открыл какой-то девайс, то имеешь указатель на FileObject.

    FileObject->DeviceObject это самый нижний девайс в стеке, DeviceObject->AttachedDevice это следующий, и так до последнего, у которого AttachedDevice = NULL.

    Раскручивай стек и ищи тот девайс, который тебе нужен.
     
  3. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Если сверху-вниз, но под ХР+ есть IoGetLowerDeviceObject, которая, впрочем, легко эмулируется руками.
     
  4. JNT

    JNT New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2005
    Сообщения:
    7
    Адрес:
    Russia
    А если не XP+, как ее можно сэмулировать?
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    pDeviceObject->DeviceObjectExtension->AttachedTo;



    А для гурманов вот:


    Код (Text):
    1. ////////////////////////////////////////////////////////////////////// ///////
    2. //
    3. //  Undocumented definition of DEVOBJ_EXTENSION
    4. //
    5.  
    6. struct  _DEVICE_OBJECT_POWER_EXTENSION;
    7.  
    8. typedef struct _DEVOBJ_EXTENSION_EX {
    9.  
    10.     CSHORT          Type;
    11.     USHORT          Size;
    12.     PDEVICE_OBJECT  DeviceObject;
    13.     ULONG           PowerFlags;
    14.     struct          _DEVICE_OBJECT_POWER_EXTENSION  *Dope;
    15.     ULONG           ExtensionFlags;
    16.     PVOID           DeviceNode;
    17.     PDEVICE_OBJECT  AttachedTo;
    18.     LIST_ENTRY      FileObjectList;
    19.  
    20. } DEVOBJ_EXTENSION_EX, *PDEVOBJ_EXTENSION_EX;
    21.  
    22. //
    23. //  Undocumented definition of ExtensionFlags
    24. //
    25.  
    26. #ifndef DOE_UNLOAD_PENDING
    27. #define DOE_UNLOAD_PENDING      0x00000001
    28. #define DOE_DELETE_PENDING      0x00000002
    29. #define DOE_REMOVE_PENDING      0x00000004
    30. #define DOE_REMOVE_PROCESSED    0x00000008
    31. #define DOE_START_PENDING       0x00000010
    32. #endif
    33.  
    34.  
    35. ////////////////////////////////////////////////////////////////////// ///////
    36. //  GetNextLowerDeviceObject
    37. ////////////////////////////////////////////////////////////////////// ///////
    38.  
    39. PDEVICE_OBJECT
    40.   GetNextLowerDeviceObject(
    41.     IN PDEVICE_OBJECT  i_pDeviceObject
    42.     )
    43. /*++
    44.  
    45.   Routine Description:
    46.  
    47.     This routine returns a pointer to the next-lower-level
    48.     device object on the driver stack.
    49.  
    50.   Parameters:
    51.  
    52.     i_pDeviceObject - Pointer to the device object in the stack
    53.                       for which the next-lower-level device object
    54.                       is to be returned.
    55.  
    56.   Return Value:
    57.  
    58.     A pointer to the next-lower-level device object on the device stack.
    59.  
    60.   Comments:
    61.  
    62.     THIS CODE WORKS FINE BUT SHOULD BE USED UNDER W2K ONLY.
    63.     ON XP OR LATER SYSTEMS THERE IS DOCUMENTED IoGetLowerDeviceObject.
    64.  
    65.     This routine increments the reference count on the next-lower-level
    66.     device object.  Thus every successful call to it must be matched
    67.     by a subsequent call ObDereferenceObject.
    68.  
    69. --*/
    70. {
    71.  
    72.     PDEVOBJ_EXTENSION_EX    pdoex;
    73.     PDEVICE_OBJECT          r_pNextLowerDO = NULL;
    74.  
    75.     ASSERT( i_pDeviceObject  &&  i_pDeviceObject->Type == IO_TYPE_DEVICE );
    76.     if ( i_pDeviceObject  &&  i_pDeviceObject->Type == IO_TYPE_DEVICE ) {
    77.  
    78.         pdoex = (PDEVOBJ_EXTENSION_EX) i_pDeviceObject->DeviceObjectExtension;
    79.  
    80.         ASSERT( pdoex->Type == IO_TYPE_DEVICE_OBJECT_EXTENSION );
    81.  
    82.         if ( 0 == (pdoex->ExtensionFlags & (DOE_UNLOAD_PENDING | DOE_DELETE_PENDING | \
    83.                                             DOE_REMOVE_PENDING | DOE_REMOVE_PROCESSED)) ) {
    84.  
    85.             r_pNextLowerDO = pdoex->AttachedTo;
    86.  
    87.             if ( r_pNextLowerDO  &&  r_pNextLowerDO->Type == IO_TYPE_DEVICE ) {
    88.  
    89.                 //
    90.                 //  This routine should bahave exactly like IoGetLowerDeviceObject,
    91.                 //  because the caller will use IoGetLowerDeviceObject under XP or later.
    92.                 //  So we must increment the reference count on the next-lower-level
    93.                 //  device object.  Thus every successful call to this routine must be
    94.                 //  matched by a subsequent call ObDereferenceObject.
    95.                 //
    96.  
    97.                 ObReferenceObject( r_pNextLowerDO );
    98.                 return r_pNextLowerDO;
    99.             }
    100.         }
    101.     }
    102.  
    103.     return NULL;
    104. }
     
  6. JNT

    JNT New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2005
    Сообщения:
    7
    Адрес:
    Russia
    Не понятно, ведь это все работает на основе :

    "pDeviceObject->DeviceObjectExtension->AttachedTo"

    Но структура расширения устройства для каждого драйвера индивидуальна.(ИМХО) Как я понял из доков... Этого мембера может и вовсе не быть или он может иметь совсем другое имя. У меня например "NextDriver".



    Или "AttachedTo" - это что-то другое?
     
  7. JNT

    JNT New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2005
    Сообщения:
    7
    Адрес:
    Russia
    Сори за невнимательность... Теперь все получилось.



    Еще раз спасибо за подробый ответ.