» Что нужно знать для работы с реестром

Что нужно знать для работы с реестром

Работа с реестром заключается в редактировании значений параметров реестра, которые чаще всего представлены в виде строки, а также чисел в десятичной и других системах счисления. Кроме того, вам пригодятся знания идентификаторов безопасности, глобальных идентификаторов реестра и некоторых других объектов.

Системы счисления

Помимо известной нам со школы десятичной системы счисления существуют также двоичная, использующая только две цифры — 0 и 1, восьмеричная (цифры от 0 до 7) и шестнадцатеричная. В реестре Windows активно используются только две: десятичная и шестнадцатеричная. С первой системой мы все знакомы, тогда как вторая, вероятно, нуждается в некоторых пояснениях.

В десятичной системе используются десять цифр: от 0 до 9, поэтому она и называется десятичной. Если вы не прогуливали уроки математики в школе, то должны знать, что любое N-значное десятичное число можно представить следующим образом:

А = А, х 10N + А2 х 10N2 + ... + AN x 10°.

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

А = А, х BN- + А2 х BN2 + ... + An х В°,

где В (от base) — это основа системы счисления. В случае с десятичной системой В = 10.

Например, число 123 можно представить так:

453 = 4 х 10: + 5 х 101 + 3 х 10°= 4 х 100 + 5 х 10 + 3 х 1 = 400 + 50 + 3 = 453.

Теперь поговорим о шестнадцатеричной системе. В этой системе шестнадцать цифр:

0, 1, 2, 3, 4, 5. 6. 7, 8, 9, А, В, С, D, E, F.

Цифры А, В, С, D, Е и F соответствуют числам 10, 11, 12, 13, 14 и 15 десятичной системы.

Вернемся к приведенной выше формуле, позволяющей представить число в любой системе счисления. Используя ее, вы можете с легкостью преобразовывать шестнадцатеричные числа в десятичные. Рассмотрим, например, преобразование в десятичную систему числа AF:

А х 16 + F х 16°- 10 х 16 + 15 = 175.

Проверку можно выполнить при помощи обычного калькулятора Windows, для запуска которого выполните команду Вид, Инженерный. Установите переключатель системы счисления в положение Hex (шестнадцатеричная), с помощью кнопок калькулятора или клавиш клавиатуры введите число AF, после чего установите переключатель системы в положение Dec (десятичная). В результате выполненных действий получаем 175.

Шестнадцатеричные числа часто записываются так: Ох-число. Например, запись 0x77 означает, что число 77 записано в шестнадцатеричной системе. Очевидно, что оно не равно числу 77 в десятичной системе: после преобразования 0x77 в десятичную систему получим число 119. Иногда для указания того, что число записано в шестнадцатеричной системе, вместо префикса Ох добавляют суффикс h: 77h.

Рассмотрим теперь порядок следования байтов в шестнадцатеричном числе. Для числа OxAlFF OxAl — это старший байт, a OxFF — младший байт. Левый байт называется старшим, поскольку вы умножаете его цифры на более высокие степени 16.

Одни программы хранят числа в прямом порядке байтов (в англоязычной литературе он называется Little-Endian), а другие — в обратном порядке (Big-Endian). Если используется обратный порядок, то первыми сохраняются старшие байты, а потом — младшие. Предположим, что нам нужно сохранить в памяти число 0x010203. Если используется обратный порядок записи байтов, оно будет сохранено в памяти таким образом: 0x010x02 0x03

Очень удобно с точки зрения обычного человека, однако процессоры фирмы Intel, например, работают с прямым порядком следования байтов, в котором сначала сохраняются младшие байты, а потом — старшие. Следовательно, наше число 0x010203 будет сохранено в памяти так: 0x03 0x02 0x01

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

Идентификаторы безопасности

Уникальное имя какого-нибудь объекта называется идентификатором. С помощью идентификаторов можно однозначно выделить объект из массы ему подобных. Например, идентификатором может быть имя пользователя. Зная имя пользователя, например, Денис (в данном случае строка Денис — идентификатор), вы сможете произвести операции именно с этим пользователем, выделив его из числа других пользователей системы. В Windows имена пользователей, компьютеров сети, групп пользователей и других объектов подчиняются правилам безопасности. Для однозначного определения этих правил используются идентификаторы безопасности — SED (Security Identifier).

При каждом создании правила безопасности Windows генерирует SID. Локальные SID (локальные идентификаторы, относящиеся только к этому компьютеру) генерируются локальными средствами защиты (LSA, Local Security Authority) и хранятся в локальной базе данных. Кроме локальных средств защиты, есть еще средства защиты домена (Domain Security Authority). DSA генерируют идентификаторы безопасности для домена и сохраняют их не в локальной базе данных, а в Active Directory (службе каталогов) на контроллере домена сети.

Понятно, что локальные SID уникальны в пределах компьютера (в пределах локальной базы данных), a SED домена уникальны в пределах домена (базы данных Active Directory). Понятно также, что локальные SED на разных компьютерах сети могут совпадать, так же как в разных доменах могут быть одинаковые SED домена. SID никогда не повторяются. Предположим, в системе зарегистрирован пользователь Денис. Его учетной записи будет сопоставлен какой-то SED. Если вы удалите эту учетную запись, а затем создадите новую учетную запись с таким же именем, то SID у этой учетной записи будет другой.

К учетной записи в Windows можно обратиться как по ее имени, так и по SID, поскольку SID однозначно идентифицирует учетную запись. Но обраищться по SED к учетной записи крайне неудобно, поскольку выражения SID достаточно громоздки: S-1-5-21-2052111302-436374069-1343024091-1003

Очевидно, намного проще запомнить имя Den, чем приведенный SID, однако формат SID все равно нужно знать. SID всегда начинается с буквы S, после которой следует номер версии SID, обычно 1. Далее обычно стоит число 5, что означает систему NT (NT authority). Все последующие числа (21-2052111302-436374069-1343024091) являются идентификатором домена, а последнее число (1003) — идентификатором группы пользователя.

Помимо персональных учетных записей пользователей в Windows есть постоянные или короткие SED: они одинаковы на всех компьютерах. Знать эти SID просто необходимо, поскольку они часто встречаются в реестре.

Глобальные идентификаторы

Полное название глобальных идентификаторов — глобальные уникальные идентификаторы (Global Unique Identifier, GUID). GUID — это число, однозначно идентифицирующее какой-либо объект: компьютер, другое устройство, программный компонент. GUID жестко привязывается к объекту: имя объекта можно изменить, a GUID нет. GUID очень похожи на SID, но выполняют несколько другую роль: GUID никак не связаны с безопасностью и правами доступа.

Формат GUID, в отличие от формата SID, одинаковый для всех объектов. GUID — это 16-байтное шестнадцатеричное число, разбитое на группы из 8, 4, 4, 4 и 12 шестнадцатеричных цифр. Каждая групп разделена дефисами, а весь GUID заключен в фигурные скобки, например: {645FF040-5081-101B-9FO8-O0AA002F954E}

Данный GUID соответствует объекту Корзина. Вот еще несколько важных GUID:

- {20D04FE0-3AEA-1069-A2D8-O8002B30309D} — .Мой компьютер;

- {450D8FBA-AD25-11D0-98A8-0800361B1103} — Мои документы;

- {208D2C60-3AEA-1069-A2D7-08002B30309D} —Сетевое окружение.

Для создания GUID используется утилита guidgen.exe. Microsoft гарантирует, что сгенерированный GUID будет уникальным в пределах системы. Прочитать о том, как использовать guidgen.exe, можно по адресу: http://msdn2.niicrosoft.com/en-us/Iibran7ms24] 442(VS.80).aspx.

Битовые маски

Сейчас вам придется вспомнить школьный курс информатики. Как мы знаем, один символ — это один байт. Таким образом, слово байт занимает 4 байта (4 символа). В одном байте восемь битов, каждый из которых может принимать значение 0 или 1. Пойдем дальше. Возьмем любой символ, например, 1. В ASCII-таблице этому символу соответствует код 49. Переведем 49 в двоичную систему и получим вот такое число: 0011 0001

Зачем нам это все нужно знать? Дело в том, что некоторые простые настройки в реестре Windows хранятся в виде одного байта. Рассмотрим следующее число: 0000 011J

Первые четыре бита не используются, остальные, очевидно, используются для каких-то настроек: 0 — функция выключена, а 1 — включена. Хранить настройки в виде одного байта очень экономно: если нам нужно хранить четыре параметра, которые могут принимать только значения 0 или 1, то намного проще хранить их в виде одного байта. Такое решение позволяет экономить до 7 байтов (при условии, что используются все восемь параметров).

Но есть небольшая проблема. Наше число 0111 будет просто отображаться как число 7. Как же установить определенный бит нашего байта с настройками? Можно, конечно, преобразовать число 7 в двоичную систему, получить число 0000 0111, затем установить какой-то бит этого числа, а новое число (пусть это будет 1000 0111) преобразовать обратно в десятичную систему (получится 135) и записать его в реестр. Но, согласитесь, это не очень удобно. Намного проще использовать битовые маски, позволяющие выделить из байта бит, соответствующий маске. Разряды двоичного числа нумеруются справа.

Битовая маска определяет, какой бит нужно установить (1) или, наоборот, снять. В этой книге вы можете встретить инструкцию, которая требует с помощью битовой маски 0x80 установить значение бита в 0. Битовая маска 0x80 соответствует седьмому биту. Если мы сбросим этот бит, то наше число превратится обратно в число 7 (0000 0111).

Кодировки

В знакогенераторы первых персональных компьютеров была загружена кодировка ASCII (American Standard Code,for Information Interchange). В этой кодировке один символ занимал один байт (8 битов), следовательно, максимально возможное число символов для этой кодировки было ограничено 256-ю. Кодировка ASCII содержала специальные (управляющие) символы, цифры, символы пунктуации, символы латиницы, псевдографические символы, а также специальные символы некоторых европейских языков. Понятно, что 256 знакомест не позволяло использовать символы всех европейских языков. Отечественные программисты разрабатывали русификаторы, загружающие в знакогенератор символы русского алфавита, перезаписывая уже существующие там символы.

Международная организация по стандартизации (ISO) разработала кодировку ISO Latin-1, которая несколько расширила ASCII, убрав из нее неиспользуемые символы и добавив некоторые национальные символы. Microsoft переработала Latin-] и назвала ее ANSI. Но ANSI по-прежнему была 8-битной кодировкой, поэтому ограничение в 256 символов не было снято.

Тогда компании Apple, ШМ и Microsoft создали некоммерческий консорциум, целью которого было создание универсальной кодировки, которая смогла бы содержать символы всех языков мира. Такой кодировкой стала Unicode, которая поддерживает 65 536 уникальных символов (один символ в этой кодировке занимает 16 битов). Такого количества знакомест хватило не только для представления символов всех используемых в мире алфавитов, но и для различных математических, географических символов, символов забытых языков (санскрит) и др.

Unicode является родной кодировкой для Windows XP/Vista, но XP/Vista по-прежнему поддерживает ANSI для совместимости с предыдущими версиями Windows. Имена объектов, файлов, каталогов, вся внутренняя информация Windows XP/Vista представлена в Unicode.

Реклама

Реклама