Поведение дескриптора реестра NT - PullRequest
1 голос
/ 11 марта 2011

Я занимаюсь проектом по виртуализации приложений.Поэтому я подключаю приложения на уровне NT и буду направлять вызовы реестра в мой виртуальный реестр.При запуске любого приложения, если я иду в File -> Open .. У меня есть несколько обращений к реестру, как показано ниже:

  1. ZwOpenKey(registry key path) -> оно производит дескриптор ex: (0x04e8)
  2. ZwQueryKey(0x4ea,...)

Process Monitor сообщает, что и открытие, и запрос выполняются для одного и того же ключа.Я сам проверил и подтвердил, что это тот же ключ.

Кроме того, ключ запроса дал правильный результат для API ключа запроса.Это 2-байтовое различие не для всех открытых и ключевых случаев запроса.

Как и почему приложение меняет дескриптор с 0x4e8 на 0x4ea, прежде чем оно вызовет querykey?

Я также проверил вызов ZWDuplicateObject между open и querykey, однако api duplicateobject не вызывается.

Кто-нибудь может сказать, как изменяется этот дескриптор?

1 Ответ

3 голосов
/ 11 марта 2011

Младшие два бита дескриптора не используются ядром, поэтому приложения могут устанавливать для них другие значения и / или некоторые API-интерфейсы используют их в качестве дополнительных флагов, вместо того, чтобы иметь дополнительный параметр

0x4ea & 0xffc == 0x4e8 & 0xffc

Раймонд Чен сделал серию , обсуждая возможные варианты использования этих битов:

Дескрипторы ядра всегда кратны четырем;нижние два бита доступны для использования приложениями.Но зачем приложению эти биты в любом случае?

...