Чтение онлайн

ЖАНРЫ

Недокументированные и малоизвестные возможности Windows XP

Клименко Роман

Шрифт:

 • 0x00000000 — тип REG_SZ.

 • 0x00000001 — REG_BINARY.

 • 0x00010000 — REG_MULTI_SZ.

 • 0x00020000 — REG_EXPAND_SZ.

 • 0x00010001 — DWORD.

 • 0x00020001 — NONE.

 • 0x00000002 — если изменяемый параметр уже существует в реестре, то изменять его значение запрещено.

 • 0x00000004 — удалить раздел или параметр из реестра. Иными словами, в INF-файле можно обойтись даже без специального ключевого слова для описания блока удаления, который будет рассмотрен далее. Удалить параметр можно и с помощью блока редактирования параметров.

 • 0x00000008 — только для параметров REG_MULTI_SZ-типа. Указанное

в строке редактирования параметра значение не заменяет существующее значение, а добавляется к существующему значению параметра.

 • 0x00000010 — создать раздел, но игнорировать создание или редактирование указанного в строке параметра. Вообще, если посмотреть на возможные значения данного флага, то можно подумать, что Microsoft намеревается создать целый язык сценария с условными значениями и переменными для INF-файла. Иначе зачем вообще нужны два только что рассмотренных значения флага, если аналогичные действия можно выполнить и без их использования?

 • 0x00000020 — изменить значение параметра, только если данный параметр уже существует в реестре.

■ Значение параметра — определяет новое значение параметра.

Теперь рассмотрим пример INF-файла, добавляющего в реестр значения параметров. Пример, отображенный в листинге 15.2, является частью стандартного INF-файла Windows XP, предназначенного для настройки отключения автозапуска дисков для разных типов приводов компакт-дисков. В примере параметру Autorun присваивается значение только в том случае, если он не существует в реестре. А значение параметра AutoRunAlwaysDisable, имеющего тип REG_MULTI_SZ, формируется в несколько приемов, чтобы обеспечить хранение значений параметра в разных строках.

Листинг 15.2. Пример использования флагов для редактирования параметров реестра

[version]

Signature="$CHICAGO$"

[DefaultInstall]

AddReg=autorun_addreg

[autorun_addreg]

HKLM,"System\CurrentControlSet\Services\cdrom","AutoRun",0x00010003,1

HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "NEC MBR-7 "

HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "NEC MBR-7.4 "

HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "PIONEER CHANGR DRM-1804X"

HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "PIONEER CD-ROM DRM-6324X"

HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "PIONEER CD-ROM DRM-624X "

HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "TORiSAN CD-ROM CDR_C36"

Удаление ветвей реестра

Параметр или ветвь реестра можно не только добавить в реестр, но и удалить из него. Для этого применяется ключевое слово DelReg, указывающее на блок INF-файла, содержащий сведения о ветвях реестра и параметрах, которые нужно удалить. Несмотря на то, что флаг для редактирования параметров позволяет

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

Рассмотрим пример удаления параметра. В этом примере из реестра удаляется ветвь HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\Shares, чтобы отключить все пользовательские общедоступные папки. При этом сначала нужно удалить все расположенные в данной ветви разделы, чтобы можно было удалить саму ветвь реестра. Как правило, ветвь для хранения сведений об общедоступных папках содержит только один раздел — Security.

ПРИМЕЧАНИЕ

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

Листинг 15.3. Удаление сведений об общедоступных папках

[version]

Signature="$CHICAGO$"

[DefaultInstall]

DelReg=shared_del

[shared_del]

HKLM,"SYSTEM\CURRENTCONTROLSET\SERVICES\LANMANSERVER\SHARES\Security"

HKLM,"SYSTEM\CURRENTCONTROLSET\SERVICES\LANMANSERVER\SHARES"

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

«корневой раздел», «ветвь реестра», «параметр», «флаг операции удаления», «пример для удаления»
 

■ Корневой раздел — указывает на корневой раздел, в котором расположен удаляемый параметр или ветвь реестра.

■ Ветвь реестра — определяет удаляемую ветвь реестра или ветвь, в которой хранится удаляемый параметр.

■ Параметр — определяет название удаляемого параметра. Если параметр отсутствует, то предполагается, что удаляться будет конечный раздел указанной ветви реестра.

■ Флаг операции удаления — может принимать следующие значения:

 • 0x00002000 — удалить весь конечный раздел указанной ветви;

 • 0x00004000 — произвести указанные изменения в 32-разрядном реестре;

 • 0x00018002 — удаляет из параметра все строки, соответствующие примеру для удаления.

■ Пример для удаления — определяет строку значения параметра, имеющего REG_MULTI_SZ-тип, все соответствия которой должны быть удалены из параметра.

Редактирование отдельных битов значения параметра

Это довольно интересная и, можно сказать, уникальная возможность, с помощью которой можно изменить отдельный бит параметра, не изменяя другие его биты. Для реализации этой возможности применяется ключевое слово BitReg, указывающее на блок INF-файла, содержащий сведения об изменяемых битах параметров. При этом блок INF-файла должен включать в себя строки следующего формата:

«корневой раздел», «ветвь реестра», «параметр», «флаг операции», «маска операции», «номер байта параметра»

Поделиться с друзьями: