Поведение на дръжката на системния регистър на NT

Правя проект за виртуализация на приложение. Така че закачам приложения на ниво NT и ще насоча извикванията на регистъра към моя виртуален регистър. При стартиране на което и да е приложение, ако отида на File -> Open.. Имам няколко извиквания на системния регистър като по-долу:

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

Process Monitor казва, че отварянето и заявката се изпълняват на един и същи ключ. Аз самият тествах и потвърдих, че това е същият ключ.

Освен това ключът за заявка даде правилния резултат за API на querykey. Тази разлика от 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
Деймиън, научавам връзките. Благодаря ви много за такава добра насока. Ще се опитам да разбера това за моя случай. Между другото имате ли опит в боравенето с 2-та бита. - person Muthukumar Palaniappan; 11.03.2011