Поведение дескриптора реестра NT

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

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

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

Также ключ запроса дал правильный результат для API запроса. Эта разница в 2 байта не для всех случаев открытия и запроса ключей.

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

Я также протестировал вызов ZWDuplicateObject между open и querykey, однако API-интерфейс дублирующего объекта не вызывается.

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


person Muthukumar Palaniappan    schedule 11.03.2011    source источник


Ответы (1)


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

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

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

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

person Damien_The_Unbeliever    schedule 11.03.2011
comment
Дэмиен, я изучаю ссылки. Большое спасибо за такое хорошее направление. Я постараюсь решить это для моего случая. Между тем, есть ли у вас опыт работы с двумя битами. - person Muthukumar Palaniappan; 11.03.2011