Наткнулся я на такую фразу: 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. И подумалось мне, зачем? Зачем создавать на каждое открытие отдельный объект? Я вообще раньше про это не думал, но вот озадачился. Почему не обойтись одним объектом на один и тот же ключ? Зачем такая странная архитектура? Кстати, если рассмотреть файл: там с этим как обстоят дела ?
Ну на диске ключ один, но виртуальных несколько, и всё из-за многозадачности, также как открытие файла провоцирует создание отдельного дескриптора на каждое открытие. Так что и причины те же, что с файлами, ведь каждый процесс открывает ключ с определёнными правами на доступ к нему. А есть ещё ключи, которые не попадают в файл - volatile ключи. Один из таких - "HKEY_CURRENT_USER\Volatile Environment", создаётся в памяти системой на время работы текущего пользователя. Ну и т.д., структура реестра очень сложна.
Так что и причины те же, что с файлами, ведь каждый процесс открывает ключ с определёнными правами на доступ к нему - ты открыл мне глаза Я как-то и не придал значения наличию SecurityDescriptor'а в OBJECT_HEADER'е... Спасибо. А ещё: зачем тогда нужен HandleCount в хедере? Если мы на каждое открытие создаём отдельный объект... (Может быть для DuplicateHandle это используется?)
Приведи хедер, ибо у меня его нет. Вообще с ходу сказать сложно. Попробуй ещё, например, открыть один экземпляр, затем второй, третий одного и того же ключа, и проанализировать его значение.
Ну, вот например: 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 и вроде как всё...
Единственное, что можно предположить, что такое имеет смысл, если несколько дескрипторов укажут на один объект, в случае с ключом реестра такое возможно только через NtDuplicateObject. Так как Microsoft не особо жаждет раскрывать свои секреты, то найти в интернете на эту тему проблемно (показывает лишь на этот топик). Попробуй открыть его через DuplicateHandle. Ничего определённого сказать не могу, хоть бы Ms-Rem помог, он ж там вроде тоже недокументированные структуры изучает.