Внутреннее устройство реестра Windows.

Тема в разделе "WASM.WIN32", создана пользователем ManWithNoName, 13 май 2006.

  1. ManWithNoName

    ManWithNoName New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2005
    Сообщения:
    31
    Адрес:
    Москва
    Наткнулся я на такую фразу:

    The configuration manager has an involved data structure arranged around (in-core) hives and cells in the hives. The CM defines it's own NT-Object type, Object-Key, which interfaces the hive to the operating system. Outside of the kernel, the registry looks like a network of Key's. However, Key's are only pointers into the hive. A symptom of this is that a key opened twice will yield two distinct Key-Objects.

    И подумалось мне, зачем? Зачем создавать на каждое открытие отдельный объект? Я вообще раньше про это не думал, но вот озадачился. Почему не обойтись одним объектом на один и тот же ключ? Зачем такая странная архитектура?

    Кстати, если рассмотреть файл: там с этим как обстоят дела ?
     
  2. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Ну на диске ключ один, но виртуальных несколько, и всё из-за многозадачности, также как открытие файла провоцирует создание отдельного дескриптора на каждое открытие. Так что и причины те же, что с файлами, ведь каждый процесс открывает ключ с определёнными правами на доступ к нему.

    А есть ещё ключи, которые не попадают в файл - volatile ключи. Один из таких - "HKEY_CURRENT_USER\Volatile Environment", создаётся в памяти системой на время работы текущего пользователя. Ну и т.д., структура реестра очень сложна.
     
  3. ManWithNoName

    ManWithNoName New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2005
    Сообщения:
    31
    Адрес:
    Москва
    Так что и причины те же, что с файлами, ведь каждый процесс открывает ключ с определёнными правами на доступ к нему - ты открыл мне глаза ;) Я как-то и не придал значения наличию SecurityDescriptor'а в OBJECT_HEADER'е... Спасибо.

    А ещё: зачем тогда нужен HandleCount в хедере? Если мы на каждое открытие создаём отдельный объект... (Может быть для DuplicateHandle это используется?)
     
  4. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Приведи хедер, ибо у меня его нет. Вообще с ходу сказать сложно. Попробуй ещё, например, открыть один экземпляр, затем второй, третий одного и того же ключа, и проанализировать его значение.
     
  5. ManWithNoName

    ManWithNoName New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2005
    Сообщения:
    31
    Адрес:
    Москва
    Ну, вот например:



    kd> !object e15dc528

    Object: e15dc528 Type: (812c3e70) Key

    ObjectHeader: e15dc510

    HandleCount: 1 PointerCount: 2

    Directory Object: 00000000 Name: \REGISTRY\USER\.DEFAULT\NEW KEY #2



    kd> !object e158eba0

    Object: e158eba0 Type: (812c3e70) Key

    ObjectHeader: e158eb88

    HandleCount: 1 PointerCount: 2

    Directory Object: 00000000 Name: \REGISTRY\USER\.DEFAULT\CONTROL PANEL\ACCESSIBILITY\BLIND ACCESS



    итд... Везде где я встречал HandleCount был 1...





    Кстати, если интересно: NtDuplicateObject вызывает ObpIncrementHandleCount. Ещё инремент вызывается в ObpCreateHandle и ObDupHandleProcedure и вроде как всё...
     
  6. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Единственное, что можно предположить, что такое имеет смысл, если несколько дескрипторов укажут на один объект, в случае с ключом реестра такое возможно только через NtDuplicateObject. Так как Microsoft не особо жаждет раскрывать свои секреты, то найти в интернете на эту тему проблемно (показывает лишь на этот топик).

    Попробуй открыть его через DuplicateHandle. Ничего определённого сказать не могу, хоть бы Ms-Rem помог, он ж там вроде тоже недокументированные структуры изучает.