Файлы инициализации. Структура файла инициализации
Страницы работы
Содержание работы
Файлы
инициализации
Файлы
инициализации (нередко называемые также INI-файлами по
причине характерного для них расширения .INI) представляют
собой последовательные текстовые файлы, которые используются для хранения
конфигурационных данных системы. Применение файлов инициализации является
наиболее распространенным способом хранения данных конфигурации отдельно от
других приложений. Кроме того, благодаря использованию файлов INI в
приложении появляется возможность сгруппировать в логическом порядке связанные
друг с другом параметры настройки.
В
интерфейсе Win32 API полностью поддерживаются все функции файлов инициализации.
Однако данные конфигурации приложений Win32 рекомендуется (и даже требуется
ради соответствия фирменному знаку) сохранять в системном реестре (функции
которого подробно рассматриваются в главе 19). Тем не менее, функции файлов
инициализации все еще остаются весьма полезными в плане сохранения и выборки
информации из текстовых файлов, в частности, файлов установки, называемых также
INF-файлами.
Структура
файла инициализации
Подразделения
INI-файла, называемые также разделами (sections), отмечены заключенными в квадратные скобки строками, называемыми
именами разделов (section
names). В разделе может храниться любое
число ключей. Ключ (key) представляет собой всего лишь поименованный параметр
настройки конфигурации, который может быть установлен или запрошен программным
путем. Строка присвоения ключу некоторого значения состоит из имени ключа (key name) или признака (tag), знака равенства и значения ключа (key value), возвращаемого системой для данного ключа. В одной строке можно
выполнить лишь одно присвоение значения ключу. Комментарии обозначаются точкой
с запятой. А вот размещение комментариев в строках имен разделов не допускается.
Ниже показан пример, как может выглядеть раздел INI-файла:
[PREFERENCES]
COLOR = BLUE ;
Комментарий
SHAPE = CIRCLE
;
Комментарий может также представлять собой отдельную строку. LETTERS=»a;b;c;d» ; Наличие точки с запитой допускается во взятом в ;
кавычки значении ключа
Между
именем ключа и знаком равенства или значением ключа и знаком равенства можно
помещать любое количество пробелов. Имена разделов и ключей сохраняются в INI-файлах
в том же регистре, в котором они записывались первоначально. Тем не менее,
поиск наименований разделов и ключей всегда выполняется без учета регистра.
Доступ
к файлам инициализации
Большинство
файлов инициализации представляет собой также приватные профильные файлы (private profile files). Этот термин первоначально был введен в Windows 3.1
с тем, чтобы провести различие между INI-файлами для приложений и
файлом WIN.INI (единственным INI-файлом,
существовавшим до появления Windows
3.1). Так, функции WritePrivateProfileString и WritePrivateProfilelnt
позволяют сохранять в приватном
профильном файле соответственно строковые и целые значения ключа. Функции GetPrivateProfileString и GetPrivateProfilelnt
позволяют выбирать из приватного
профильного файла соответственно строковые и целые значения. Функции GetPrivateProfileSection и WritePrivateProfileSectionName
позволяют выполнять чтение и запись
целых разделов INI-файла. Кроме того, в Win32 появилась функция GetPrivateProfileSectionName интерфейса API, которая возвращает имена
всех разделов, определенных в INI-файле.
Приватные
профильные файлы, как правило, хранятся в каталоге Windows либо в
том каталоге, в котором установлено соответствующее приложение. По умолчанию
поиск INI-файла в Windows осуществляется в каталоге
Windows. Однако полностью уточненное имя пути к INI-файлу
можно указать при вызове функций инициализации приватных профильных файлов,
поэтому INI-файлы на самом деле могут быть размещены где угодно.
Для
доступа к файлу WIN.INI в приложениях используется параллельный набор функций
интерфейса API. Так, функции GetProfileString и GetProfilelnt осуществляют соответственно выборку строковых и целых
значений ключей из файла WIN.INI.
Функции WriteProfileString и
WriteProfilelnt сохраняют в файле WIN.INI соответственно
строковые и целые значения. Функции GetProfileSection и WriteProfileSection допускают чтение и запись целых разделов в файл WIN.INI. Однако файл WIN.INI ничем особенным не отличается от остальных файлов
инициализации, поэтому функции интерфейса API для прватных
профильных файлов применимы и к файлу WIN.INI, если он указан в формате
имени INI-файла.
Отображение
приватных INI-файлов
В
Windows 2000 приватные профильные файлы вместо файлов
инициализации могут отображаться в системный реестр. Подобное отображение
происходит при указании файла инициализации и соответствующего раздела в
системном реестре под ключом HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsNTCurrentVersionIniFaeMapping
Отобоажение окажется вполне вероятным в
том случае, если в приложении будут видоизменены файлы инициализации
компонентов системы, в частности, файлы CONTROL.INI, SYSTEM.INI и WINFILE.INI. В подобного рода случаях функции приватных профильных
файлов воздействуют на информацию в системном реестре, а не в файле
инициализации. Для обнаружения информации об инициализации в функциях Win32,
предназначенных для профильных файлов, используется следующая процедура:
Похожие материалы
- Декомпрессия и установка файлов
- Исследование системных областей дисков
- Программирование контроллера таймера
Информация о работе
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание — внизу страницы.
Файл инициализации
- Файл инициализации
-
Редактирование файла INI с помощью англ. Initialization file) — это файл конфигурации, который содержит данные настроек для Microsoft Windows, Windows NT и некоторых приложений.
Появились с самых первых версий Windows. В версии Windows 1.01 это был только файл WIN.INI. В Windows 3.0 добавился файл SYSTEM.INI. А затем их количество начало расти быстро и бесконтрольно.
Начиная с Windows 95, INI файлы считаются устаревшими и в качестве замены им системный реестр (Registry). Тем не менее INI файлы продолжают использоваться как приложениями других прозводителей, так и компонентами ОС от Microsoft. Например, файл boot.ini используется в Windows NT4/2000/XP при загрузке для выбора из нескольких ОС.
Хотя INI файлы и приобрели популярность в Windows, они могут использоваться в любой ОС. Несложная структура этого формата позволяет легко обрабатывать их программно и имеет достаточно интуитивно понятный вид для чтения и изменения человеком. Существуют текстовые редакторы (например, подсветку синтаксиса и фолдинг для этого формата, что облегчает редактирование INI файлов вручную.
Использование секций для разделения параметров способствует систематизации данных, однако для хранения настроек большого объёма с более сложной иерархической структурой лучше подходит формат
Содержание
- 1 Формат файла
- 1.1 Соглашения
- 2 См. также
- 3 Ссылки
Формат файла
ini-файлы — это обычные текстовые файлы, которые можно редактировать и просматривать при помощи любого текстового редактора. ini-файлы имеют следующий формат:
; некоторый комментарий [Section1] ; комментарий о разделе var1 = значение_1 ; иногда допускается комментарий к отдельному параметру var2 = значение_2 [Section2] var1 = значение_1 var2 = значение_2 ; иногда позволяется перечислять несколько значений через запятую [Section3] var1 = значение_1_1, значение_1_2, значение_1_3 var2 = значение_2
INI файл может содержать:
- пустые строки;
- комментарии — от символа «;» (точка с запятой) до конца строки;
- заголовки разделов — строки, состоящие из названия раздела, заключённого в квадратные скобки «[ ]»;
- значения параметров — строки вида «имя_параметра = значение».
Соглашения
Не существует общепринятого стандарта формата файлов INI. Хотя общая структура таких файлов обычно сохраняется, многие программные продукты вводят в неё дополнительные возможности или, наоборот, ограничения.
- Комментарии. Некоторые приложения (например,
- Обратный слэш. Иногда допускается использование обратного слэша «» для объявления следующей строки продолжением этой. В таком случае они будут обработаны как одна целая строка. Иногда возможно также применять «» для ввода спецсимволов, например, ‘n’ для обозначения переноса строки.
- Одинаковые параметры. В большинстве случаев наличие двух параметров с одинаковыми именами в одной секции запрещено.
- Одинаковые имена секций. Обычно при наличии нескольких секций с одинаковыми именами в файле обрабатывается лишь последняя из них. Некоторые приложения объединяют содержимое всех таких секций в одну.
См. также
- desktop.ini
-
Ссылки
Поскольку не существует подробной официальной спецификации формата, здесь приводятся ссылки на неофициальные спецификации:
- Cloanto Implementation of INI File Format;
- 1 Формат файла
Wikimedia Foundation.
2010.
Полезное
Смотреть что такое «Файл инициализации» в других словарях:
-
файл инициализации — Специальный текстовый файл, используемый при загрузке среды и отдельных программ для начальной установки параметров. [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в … Справочник технического переводчика
-
CCleaner — CCleaner … Википедия
-
Паскаль (язык программирования) — Эта статья или раздел нуждается в переработке. В Паскале нет модулей, ООП и прочих новомодных веяний. Описание расширений должно присутствовать только в статьях о соответ … Википедия
-
Паскаль (язык) — Pascal Семантика: процедурный Тип исполнения: компилятор Появился в: 1970 г. Автор(ы): Никлаус Вирт Паскаль (англ. Pascal) высокоуровневый язык программирования общего назначения. Один из наиболее известных языков программирования, широко… … Википедия
-
Init — init (сокращение от англ. initialization инициализация) программа в UNIX и Unix подобных системах, которая запускает все остальные процессы. Работает как демон и обычно имеет PID 1. Обычно (согласно Filesystem Hierarchy… … Википедия
-
Файлообменные сети — Файлообменная сеть – собирательное название сетей для совместного использования файлов. Часто в основе файлообменных сетей лежат одноранговые компьютерные сети, основанные на равноправии участвующих в обмене файлами, то есть каждый участник … Энциклопедия ньюсмейкеров
-
udev — Тип Device node Разработчик Greg Kroah Hartman и Kay Sievers Написана на С Операционная система Linux (ядро) Первый выпуск ноябрь 2003 года Последняя версия 184 (30 мая … Википедия
-
Процесс запуска Windows NT — Процесс запуска Windows NT это процесс инициализации операционных систем Microsoft Windows NT, Windows 2000, Windows XP и Windows Server 2003. В Windows Vista процесс сильно изменён (см. Windows Vista startup process). Содержание 1 Фаза… … Википедия
-
Резидентная программа — (или TSR программа, от англ. Terminate and Stay Resident «завершиться и остаться резидентной») в операционной системе MS DOS программа, вернувшая управление оболочке операционной системы (command.com), либо надстройке над… … Википедия
-
Коды ошибок BIOS — Во время начальной загрузки компьютера при помощи программ, записанных в BIOS происходит первоначальная проверка. В случае сбоя во время проверки BIOS может выдать информацию, позволяющую выявить причину сбоя. Среди таких способов есть вывод… … Википедия
Filename extension |
.ini |
---|---|
Internet media type |
text/plain, application/textedit, zz-application/zz-winassoc-ini |
Type of format | Initialization/Configuration File |
An INI file is a configuration file for computer software that consists of a text-based content with a structure and syntax comprising key–value pairs for properties, and sections that organize the properties.[1] The name of these configuration files comes from the filename extension INI, for initialization, used in the MS-DOS operating system which popularized this method of software configuration. The format has become an informal standard in many contexts of configuration, but many applications on other operating systems use different file name extensions, such as conf and cfg.[2]
History[edit]
The primary mechanism of software configuration in Windows was originally a text file format that comprised text lines with one key–value pair per line, organized into sections. This format was used for operating system components, such as device drivers, fonts, and startup launchers. INI files were also generally used by applications to store individual settings.[3]
The format was maintained in 16-bit Microsoft Windows platforms up through Windows 3.1x. Starting with Windows 95 Microsoft favored the use of the Windows Registry and began to steer developers away from using INI files for configuration. All subsequent versions of Windows have used the Windows Registry for system configuration, but applications built on the .NET Framework use special XML .config files. The initialization-file functions are still available in Windows and developers may still use them.
Linux and Unix systems also use a similar file format for system configuration. In addition, platform-agnostic software may use this file format for configuration. It is human-readable and simple to parse, so it is a usable format for configuration files that do not require much greater complexity.
Git configuration files are similar to INI files.[4]
PHP uses the INI format for its «php.ini
» configuration file in both Windows and Linux systems.[5][6]
Desktop.ini files determine the display of directories in Windows, e.g., the icons for a directory.[7]
Example[edit]
The following example file has two sections: one for the owner of the software, and one for a payroll database connection. Comments record the last person who modified the file and the reason for modification.
; last modified 1 April 2001 by John Doe [owner] name = John Doe organization = Acme Widgets Inc. [database] ; use IP address in case network name resolution is not working server = 192.0.2.62 port = 143 file = "payroll.dat"
Format[edit]
INI is an informal format, with features that vary from parser to parser (INI dialects). Some features are more shared across different parsers than others and can be considered as the hard core of the format (e.g. square brackets for sections, newlines for delimiting different nodes, etc.). Attempts to create parsers able to support as many dialects as possible exist,[8] and in its most advanced form the INI format is able to express a tree object with a power comparable to that of other structured formats (JSON, XML) using a more relaxed syntax.
Stable features[edit]
Keys (properties)[edit]
The basic element contained in an INI file is the key or property. Every key has a name and a value, delimited by an equals sign (=). The name appears to the left of the equals sign. In the Windows implementation the equal sign and the semicolon are reserved characters and cannot appear in the key. The value can contain any character.
Leading and trailing whitespaces around the outside of the property name are ignored.
Sections[edit]
Keys may, but need not, be grouped into arbitrarily named sections. The section name appears on a line by itself, in square brackets ([ and ]). All keys after the section declaration are associated with that section. There is no explicit «end of section» delimiter; sections end at the next section declaration, or at the end of the file. Sections cannot be nested.
[section] key1 = a key2 = b
Case sensitivity[edit]
Section and property names are case insensitive.[9]
[edit]
Semicolons (;) at the beginning of the line indicate a comment. Comment lines are ignored.
Order of sections and properties[edit]
The order of properties in a section and the order of sections in a file is irrelevant.
Varying features[edit]
As the INI file format is not rigidly defined, many parsers support features beyond the basics already described. The following is a list of some common features, which may or may not be implemented in any given program.
Global properties[edit]
Optional «global» properties may also be allowed, that are declared before any section is declared.[10]
Name/value delimiter[edit]
Some implementations allow a colon (:
) as the name/value delimiter (instead of the equals sign). Whitespace is occasionally used in the Linux world.[8]
Hierarchy (section nesting)[edit]
Some parsers allow section nesting, using dots as path delimiters:
[section] domain = wikipedia.org [section.subsection] foo = bar
In some cases relative nesting is supported too, where a leading dot expresses nesting to the previous section:[8]
[section] domain = wikipedia.org [.subsection] foo = bar
Historically, ways for expressing nesting alternative to the dot have existed too (for example, IBM’s driver file for Microsoft Windows devlist.ini
, in which the backslash was used as nesting delimiter in the form of [ABC]
; or Microsoft Visual Studio’s AEMANAGR.INI
file, which used a completely different syntax in the form of [A]
and B,C,P = V
). Some parsers did not offer nesting support at all and were hierarchy-blind, but nesting could still be partially emulated by exploiting the fact that [A.B.C]
constitutes a unique identifier.
[edit]
Some software supports the use of the number sign (#) as an alternative to the semicolon for indicating comments, especially under Unix, where it mirrors shell comments. The number sign might be included in the key name in other dialects and ignored as such. For instance, the following line may be interpreted as a comment in one dialect, but create a variable named «#var» in another dialect. If the «#var» value is ignored, it would form a pseudo-implementation of a comment.
In some implementations, a comment may begin anywhere on a line after a space (inline comments), including on the same line after properties or section declarations.
var = a ; This is an inline comment foo = bar # This is another inline comment
In others, including the WinAPI function GetPrivateProfileString, comments must occur on lines by themselves.
Duplicate names[edit]
Most implementations only support having one property with a given name in a section. The second occurrence of a property name may cause an abort, it may be ignored (and the value discarded), or it may override the first occurrence (with the first value discarded). Some programs use duplicate property names to implement multi-valued properties.
Interpretation of multiple section declarations with the same name also varies. In some implementations, duplicate sections simply merge their properties, as if they occurred contiguously. Others may abort, or ignore some aspect of the INI file.
Quoted values[edit]
Some implementations allow values to be quoted, typically using double quotes and/or apostrophes. This allows for explicit declaration of whitespace, and/or for quoting of special characters (equals, semicolon, etc.). The standard Windows function GetPrivateProfileString supports this, and will remove quotation marks that surround the values.
Escape characters[edit]
Some implementations offer varying support for an escape character, typically with the backslash () following the C syntax. Some support «line continuation», where a backslash followed immediately by EOL (end-of-line) causes the line break to be ignored, and the «logical line» to be continued on the next actual line from the INI file. Implementation of various «special characters» with escape sequences is also seen.[11]
Sequence | Meaning |
---|---|
\
|
(a single backslash, escaping the escape character) |
'
|
Apostrophe |
"
|
Double quotes |
|
Null character |
a
|
Bell/Alert/Audible |
b
|
Backspace, Bell character for some applications |
t
|
Tab character |
r
|
Carriage return |
n
|
Line feed |
;
|
Semicolon |
#
|
Number sign |
=
|
Equals sign |
:
|
Colon |
x????
|
Unicode character with hexadecimal code point corresponding to ???? |
Accessing INI files[edit]
Under Windows, the Profile API is the programming interface used to read and write settings from classic Windows .ini files. For example, the GetPrivateProfileString function retrieves a string from the specified section in an initialization file. (The «private» profile is contrasted with GetProfileString
, which fetches from WIN.INI.)
The following sample C program demonstrates reading property values from the above sample INI file (let the name of configuration file be dbsettings.ini
):
#include <windows.h> int main(int argc, _TCHAR *argv[]) { _TCHAR dbserver[1000]; int dbport; GetPrivateProfileString("database", "server", "127.0.0.1", dbserver, sizeof(dbserver) / sizeof(dbserver[0]), ".\dbsettings.ini"); dbport = GetPrivateProfileInt("database", "port", 143, ".\dbsettings.ini"); // N.B. WritePrivateProfileInt() does not exist return 0; }
The third parameter of the GetPrivateProfileString function is the default value, which are «127.0.0.1» and 143 respectively in the two function calls above. If the argument supplied for this parameter is NULL, the default is an empty string, «».
Under Unix, many different configuration libraries exist to access INI files. They are often already included in frameworks and toolkits. Examples of INI parsers for Unix include GLib, iniparser and libconfini.
Comparison of INI parsers[edit]
Name | Sections support | Section nesting support | Disabled entry recognition[12] | Multi-line support[13] | Value types | Read/Write support | Platform | License | Programming language | Latest release version |
---|---|---|---|---|---|---|---|---|---|---|
ConfigParser[14][15] | Yes | Yes | No | Non-standard[16] | Boolean, Number, String | Read + Write | *BSD, Linux, macOS, Windows | PSFL | C (implementation), Python (usage) | 3.9.7[17] |
GLib[18] | Yes | Yes | No | No | Boolean, Number, String, Array | Read + Write | *BSD, Linux, macOS, Windows | LGPL | C | 2.66.7 (February 11, 2021; 23 months ago) [±][19]
[20] |
inifile[21] | Yes | No | No | No | Boolean, Number, String | Read + Write | *BSD, Linux, macOS, Windows | Apache | Go | 1.2.0[22] |
inih[23] | Yes | No | No | Non-standard[24] | Boolean, Number, String | Read | *BSD, Linux, macOS, Windows | BSD | C | 53[25] |
iniparser[26] | Yes | No | No | Yes | Boolean, Number, String | Read + Write | *BSD, Linux, macOS, Windows | MIT | C | 4.1[27] |
Java (via java.util.Properties )[28]
|
No | No | No | Yes | String | Read + Write | Platform-agnostic | Dual-license: GPL version 2 with classpath exception,[29] and a proprietary license.[30] | C (implementation), Java (usage) | 19.0.1 (October 18, 2022; 3 months ago) [±]
17.0.5 LTS (October 18, 2022; 3 months ago) [±] |
libconfini[33] | Yes | Yes | Yes | Yes | Boolean, Number, String, Array | Read | *BSD, Linux, macOS, Windows | GPL | C | 1.16.2[34] |
PHP (via parse_ini_file() )[35]
|
Yes | Yes | Yes | No | Number, String, Null | Read | Linux, macOS, Windows | PHP License v3.01[36] | C (implementation), PHP (usage) | 8.2.1[37] (5 January 2023; 25 days ago) |
PyINI[38] | Yes | No | Yes | Yes | Boolean, Number, String | Read + Write | Platform-agnostic | GPL | Python | 1.0[39] |
RudeConfig[40] | Yes | No | No | No | Boolean, Number, String | Read + Write | Linux, Windows | GPL | C++ | Discontinued – last version is 5.0.5, from November 2009[41] |
Windows API | Yes | No | No | No | Number, String, Struct | Read + Write (non-destructive) | Windows | Proprietary | C | 22H2 (10.0.22621.1194) (January 26, 2023; 4 days ago[42]) [±] |
Wine (implementation of Windows API) | Yes | No | No | No | Number, String, Struct | Read + Write (non-destructive) | Linux, macOS, Windows | LGPL | C | 8.0[43] 24 January 2023; 6 days ago |
configparser[44] | Yes | No | No | No | Boolean, Number, String | Read + Write | *BSD, Linux, macOS, Windows | MIT or LGPL v3.0+ | Rust | 3.0.2[44] 11 September 2022; 3 months ago |
java-ini-parser[45] | Yes | No | Yes | Yes | Boolean, Number, String | Read + Write | Platform-agnostic | Apache | Java | 1.4[44] 29 December 2022; 3 days ago |
Name | Sections support | Section nesting support | Disabled entry recognition | Multi-line support | Value types | Read/Write support | Platform | License | Programming language | Latest release version |
File mapping[edit]
Initialization file mapping creates a mapping between an INI file and the Registry.[46][47] It was introduced with Windows NT and Windows 95 as a way to migrate from storing settings in classic .ini files to the new Windows Registry. File mapping traps the Profile API calls and, using settings from the IniFileMapping
Registry section, directs reads and writes to appropriate places in the Registry.
Using the example below, a string call could be made to fetch the name key from the owner section from a settings file called, say, dbsettings.ini. The returned value should be the string «John Doe»:
GetPrivateProfileString("owner", "name", ... , "c:\programs\oldprogram\dbsettings.ini");
INI mapping takes this Profile API call, ignores any path in the given filename and checks to see if there is a Registry key matching the filename under the directory:
HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NT
CurrentVersionIniFileMapping
If this exists, it looks for an entry name matching the requested section. If an entry is found, INI mapping uses its value as a pointer to another part of the Registry. It then looks up the requested INI setting in that part of the Registry.
If no matching entry name is found and there is an entry under the (Default)
entry name, INI mapping uses that instead. Thus each section name does not need its own entry.
HKEY_LOCAL_MACHINESoftware…IniFileMappingdbsettings.ini | |
---|---|
(Default) |
@USR:Softwareoldprogsinisettingsall |
database |
USR:Softwareoldprogsinisettingsdb |
So, in this case the profile call for the [owner] section is mapped through to:
HKEY_CURRENT_USERSoftwareoldprogsinisettingsall | |
---|---|
name |
John Doe |
organization |
Acme Products |
where the «name
» Registry entry name is found to match the requested INI key. The value of «John Doe» is then returned to the Profile call. In this case, the @ prefix on the default prevents any reads from going to the dbsettings.ini file on disk. The result is that any settings not found in the Registry are not looked for in the INI file.
The «database
» Registry entry does not have the @ prefix on the value; thus, for the [database] section only, settings in the Registry are taken first followed by settings in the dbsettings.ini file on disk.
Alternatives[edit]
Starting with Windows 95, Microsoft began strongly promoting the use of Windows registry over the INI file.[48] INI files are typically limited to two levels (sections and properties) and do not handle binary data well. This decision however has not been immune to critiques, due to the fact that the registry is monolithic, opaque and binary, must be in sync with the filesystem, and represents a single point of failure for the operating system.[49]
Later XML-based configuration files became a popular choice for encoding configuration in text files.[citation needed] XML allows arbitrarily complex levels and nesting, and has standard mechanisms for encoding binary data.
More recently, data serialization formats, such as JSON, TOML, and YAML can serve as configuration formats. These three alternative formats can nest arbitrarily, but have a different syntax than the INI file. Among them, TOML most closely resembles INI, but the idea to make TOML deliberately compatible with a large subset of INI was rejected.[50]
The newest INI parsers however allow the same arbitrary level of nesting of XML, JSON, TOML, and YAML, offer equivalent support of typed values and Unicode, although keep the «informal status» of INI files by allowing multiple syntaxes for expressing the same thing.[51]
See also[edit]
- BOOT.INI
- MSConfig
- Sysedit
- SYSTEM.INI
- TOML, a very similar but more formally-specified configuration file format
- WIN.INI
- Amiga’s IFF files
- .DS_Store
- .properties
References[edit]
- ^ Microsoft TechNet: Configure an Ini File Item
- ^ .conf initialization files
- ^ Microsoft: Windows NT Workstation Resource Kit
- ^ «git-config CONFIGURATION FILE».
- ^
Rasmus Lerdorf, Kevin Tatroe, Peter MacIntyre.
«Programming PHP».
Sections «parse_ini_file», «Extension INI Entries», etc. - ^
Christian Wenz.
«PHP and MySQL Phrasebook».
section «Parsing INI Files».
quote: «… the INI file format … was very widely used in the Windows world, but today also drives the configuration of software products like PHP. For instance, …php.ini
« - ^ Codrut Neagu, «Why Are There Two Desktop.ini Files On My Desktop & What Do They Do?».
- ^ a b c libconfini’s Library Function Manual
- ^ This includes the Windows implementation. See «GetPrivateProfileString function». Microsoft Developer Network. Microsoft. Retrieved 2012-06-02.
- ^ Apache Documentation for org.apache.commons.configuration2.INIConfiguration, The Apache Software Foundation
- ^ Cloanto Implementation
- ^ It is a common practice among authors of INI files to «comment out» unwanted entries in order to disable them, instead of removing them completely. See the key
a
in the following example:[section]
#a=a
b=b - ^ The standard syntax for line continuation refers here to the sequence of a backslash followed by line break, as implemented by iniparser, libconfini and
java.util.Properties
- ^
Fredrik Lundh.
«Python Standard Library».
2001.
Section «The ConfigParser Module».
p. 143 - ^
«ConfigParser — Configuration file parser». - ^ Following the syntax of the language it is designed to work with (Python), to span a node over multiple lines ConfigParser requires a deeper indentation in the lines that follow, instead of the more common backslash + line break (see: configparser — Configuration file parser)
- ^ Python Documentation by Version
- ^ GLib Key–value file parser
- ^ Withnall, Philip (11 Feb 2021). «glib 2.66.7». GNOME ftp-release (Mailing list). Retrieved 12 February 2021.
- ^ Releases · GNOME/glib
- ^ inifile documentation
- ^ Releases · inifile
- ^ inih README
- ^ Using indentation, explicitly following ConfigParser’s approach (see the project’s documentation for more information)
- ^ Releases · benhoyt/inih
- ^ iniparser documentation
- ^ Releases · ndevilla/iniparser
- ^ Properties (Java Platform SE
- ^ «OpenJDK: GPLv2 + Classpath Exception». Openjdk.java.net. 1989-04-01. Retrieved 2016-02-09.
- ^ «BCL For Java SE». Oracle.com. 2013-04-02. Retrieved 2016-02-09.
- ^ «JDK Releases». Oracle Corporation. Retrieved 2022-12-09.
- ^ «JDK Releases». Oracle Corporation. Retrieved 2022-12-09.
- ^ libconfini documentation
- ^ Releases · madmurphy/libconfini
- ^ PHP. «
parse_ini_file()
— Parse a configuration file». Official PHP documentation. Retrieved 2022-07-19. - ^ PHP License v3.01[1]
- ^ «Version 8.2.1». 5 January 2023. Retrieved 30 January 2023.
- ^ PyINI
- ^ Tags · whoatemybutter / PyINI
- ^ RudeConfig documentation
- ^ Releases · RudeConfig
- ^ «January 26, 2023—KB5022360 (OS Build 22621.1194) Preview». Microsoft Support. Microsoft.
- ^ «Wine 8.0 Released». 24 January 2023. Retrieved 24 January 2023.
- ^ a b c «configparser on crates.io». crates.io. 2022-12-12. Archived from the original on 2022-12-12. Retrieved 2022-12-12.
- ^ java-ini-parser github page
- ^ Initialization Files and the Registry, Windows NT Workstation Resource Kit, Microsoft TechNet
- ^ Administering the NT Registry, Managing the Windows NT Registry, Paul Robichaux, O’Reilly Media
- ^ The System Registry
- ^ Was The Windows Registry a Good Idea? – Coding Horror
- ^ «Comment on «.INI compatibility is a worthy goal» issue on GitHub».
- ^ libconfini/README
- Infobox — http://filext.com/file-extension/INI
- Infobox — https://wikiext.com/ini
External links[edit]
- libconfini’s Library Function Manual: The particular syntax allowed by libconfini.
- Cloanto Implementation of INI File Format: The particular syntax allowed by a parser implemented by Cloanto.
- A very simple data file metaformat: INI parser tutorial in Apache Groovy.
- Microsoft’s GetPrivateProfileString() and WritePrivateProfileStringA() functions
Filename extension |
.ini |
---|---|
Internet media type |
text/plain, application/textedit, zz-application/zz-winassoc-ini |
Type of format | Initialization/Configuration File |
An INI file is a configuration file for computer software that consists of a text-based content with a structure and syntax comprising key–value pairs for properties, and sections that organize the properties.[1] The name of these configuration files comes from the filename extension INI, for initialization, used in the MS-DOS operating system which popularized this method of software configuration. The format has become an informal standard in many contexts of configuration, but many applications on other operating systems use different file name extensions, such as conf and cfg.[2]
History[edit]
The primary mechanism of software configuration in Windows was originally a text file format that comprised text lines with one key–value pair per line, organized into sections. This format was used for operating system components, such as device drivers, fonts, and startup launchers. INI files were also generally used by applications to store individual settings.[3]
The format was maintained in 16-bit Microsoft Windows platforms up through Windows 3.1x. Starting with Windows 95 Microsoft favored the use of the Windows Registry and began to steer developers away from using INI files for configuration. All subsequent versions of Windows have used the Windows Registry for system configuration, but applications built on the .NET Framework use special XML .config files. The initialization-file functions are still available in Windows and developers may still use them.
Linux and Unix systems also use a similar file format for system configuration. In addition, platform-agnostic software may use this file format for configuration. It is human-readable and simple to parse, so it is a usable format for configuration files that do not require much greater complexity.
Git configuration files are similar to INI files.[4]
PHP uses the INI format for its «php.ini
» configuration file in both Windows and Linux systems.[5][6]
Desktop.ini files determine the display of directories in Windows, e.g., the icons for a directory.[7]
Example[edit]
The following example file has two sections: one for the owner of the software, and one for a payroll database connection. Comments record the last person who modified the file and the reason for modification.
; last modified 1 April 2001 by John Doe [owner] name = John Doe organization = Acme Widgets Inc. [database] ; use IP address in case network name resolution is not working server = 192.0.2.62 port = 143 file = "payroll.dat"
Format[edit]
INI is an informal format, with features that vary from parser to parser (INI dialects). Some features are more shared across different parsers than others and can be considered as the hard core of the format (e.g. square brackets for sections, newlines for delimiting different nodes, etc.). Attempts to create parsers able to support as many dialects as possible exist,[8] and in its most advanced form the INI format is able to express a tree object with a power comparable to that of other structured formats (JSON, XML) using a more relaxed syntax.
Stable features[edit]
Keys (properties)[edit]
The basic element contained in an INI file is the key or property. Every key has a name and a value, delimited by an equals sign (=). The name appears to the left of the equals sign. In the Windows implementation the equal sign and the semicolon are reserved characters and cannot appear in the key. The value can contain any character.
Leading and trailing whitespaces around the outside of the property name are ignored.
Sections[edit]
Keys may, but need not, be grouped into arbitrarily named sections. The section name appears on a line by itself, in square brackets ([ and ]). All keys after the section declaration are associated with that section. There is no explicit «end of section» delimiter; sections end at the next section declaration, or at the end of the file. Sections cannot be nested.
[section] key1 = a key2 = b
Case sensitivity[edit]
Section and property names are case insensitive.[9]
[edit]
Semicolons (;) at the beginning of the line indicate a comment. Comment lines are ignored.
Order of sections and properties[edit]
The order of properties in a section and the order of sections in a file is irrelevant.
Varying features[edit]
As the INI file format is not rigidly defined, many parsers support features beyond the basics already described. The following is a list of some common features, which may or may not be implemented in any given program.
Global properties[edit]
Optional «global» properties may also be allowed, that are declared before any section is declared.[10]
Name/value delimiter[edit]
Some implementations allow a colon (:
) as the name/value delimiter (instead of the equals sign). Whitespace is occasionally used in the Linux world.[8]
Hierarchy (section nesting)[edit]
Some parsers allow section nesting, using dots as path delimiters:
[section] domain = wikipedia.org [section.subsection] foo = bar
In some cases relative nesting is supported too, where a leading dot expresses nesting to the previous section:[8]
[section] domain = wikipedia.org [.subsection] foo = bar
Historically, ways for expressing nesting alternative to the dot have existed too (for example, IBM’s driver file for Microsoft Windows devlist.ini
, in which the backslash was used as nesting delimiter in the form of [ABC]
; or Microsoft Visual Studio’s AEMANAGR.INI
file, which used a completely different syntax in the form of [A]
and B,C,P = V
). Some parsers did not offer nesting support at all and were hierarchy-blind, but nesting could still be partially emulated by exploiting the fact that [A.B.C]
constitutes a unique identifier.
[edit]
Some software supports the use of the number sign (#) as an alternative to the semicolon for indicating comments, especially under Unix, where it mirrors shell comments. The number sign might be included in the key name in other dialects and ignored as such. For instance, the following line may be interpreted as a comment in one dialect, but create a variable named «#var» in another dialect. If the «#var» value is ignored, it would form a pseudo-implementation of a comment.
In some implementations, a comment may begin anywhere on a line after a space (inline comments), including on the same line after properties or section declarations.
var = a ; This is an inline comment foo = bar # This is another inline comment
In others, including the WinAPI function GetPrivateProfileString, comments must occur on lines by themselves.
Duplicate names[edit]
Most implementations only support having one property with a given name in a section. The second occurrence of a property name may cause an abort, it may be ignored (and the value discarded), or it may override the first occurrence (with the first value discarded). Some programs use duplicate property names to implement multi-valued properties.
Interpretation of multiple section declarations with the same name also varies. In some implementations, duplicate sections simply merge their properties, as if they occurred contiguously. Others may abort, or ignore some aspect of the INI file.
Quoted values[edit]
Some implementations allow values to be quoted, typically using double quotes and/or apostrophes. This allows for explicit declaration of whitespace, and/or for quoting of special characters (equals, semicolon, etc.). The standard Windows function GetPrivateProfileString supports this, and will remove quotation marks that surround the values.
Escape characters[edit]
Some implementations offer varying support for an escape character, typically with the backslash () following the C syntax. Some support «line continuation», where a backslash followed immediately by EOL (end-of-line) causes the line break to be ignored, and the «logical line» to be continued on the next actual line from the INI file. Implementation of various «special characters» with escape sequences is also seen.[11]
Sequence | Meaning |
---|---|
\
|
(a single backslash, escaping the escape character) |
'
|
Apostrophe |
"
|
Double quotes |
|
Null character |
a
|
Bell/Alert/Audible |
b
|
Backspace, Bell character for some applications |
t
|
Tab character |
r
|
Carriage return |
n
|
Line feed |
;
|
Semicolon |
#
|
Number sign |
=
|
Equals sign |
:
|
Colon |
x????
|
Unicode character with hexadecimal code point corresponding to ???? |
Accessing INI files[edit]
Under Windows, the Profile API is the programming interface used to read and write settings from classic Windows .ini files. For example, the GetPrivateProfileString function retrieves a string from the specified section in an initialization file. (The «private» profile is contrasted with GetProfileString
, which fetches from WIN.INI.)
The following sample C program demonstrates reading property values from the above sample INI file (let the name of configuration file be dbsettings.ini
):
#include <windows.h> int main(int argc, _TCHAR *argv[]) { _TCHAR dbserver[1000]; int dbport; GetPrivateProfileString("database", "server", "127.0.0.1", dbserver, sizeof(dbserver) / sizeof(dbserver[0]), ".\dbsettings.ini"); dbport = GetPrivateProfileInt("database", "port", 143, ".\dbsettings.ini"); // N.B. WritePrivateProfileInt() does not exist return 0; }
The third parameter of the GetPrivateProfileString function is the default value, which are «127.0.0.1» and 143 respectively in the two function calls above. If the argument supplied for this parameter is NULL, the default is an empty string, «».
Under Unix, many different configuration libraries exist to access INI files. They are often already included in frameworks and toolkits. Examples of INI parsers for Unix include GLib, iniparser and libconfini.
Comparison of INI parsers[edit]
Name | Sections support | Section nesting support | Disabled entry recognition[12] | Multi-line support[13] | Value types | Read/Write support | Platform | License | Programming language | Latest release version |
---|---|---|---|---|---|---|---|---|---|---|
ConfigParser[14][15] | Yes | Yes | No | Non-standard[16] | Boolean, Number, String | Read + Write | *BSD, Linux, macOS, Windows | PSFL | C (implementation), Python (usage) | 3.9.7[17] |
GLib[18] | Yes | Yes | No | No | Boolean, Number, String, Array | Read + Write | *BSD, Linux, macOS, Windows | LGPL | C | 2.66.7 (February 11, 2021; 23 months ago) [±][19]
[20] |
inifile[21] | Yes | No | No | No | Boolean, Number, String | Read + Write | *BSD, Linux, macOS, Windows | Apache | Go | 1.2.0[22] |
inih[23] | Yes | No | No | Non-standard[24] | Boolean, Number, String | Read | *BSD, Linux, macOS, Windows | BSD | C | 53[25] |
iniparser[26] | Yes | No | No | Yes | Boolean, Number, String | Read + Write | *BSD, Linux, macOS, Windows | MIT | C | 4.1[27] |
Java (via java.util.Properties )[28]
|
No | No | No | Yes | String | Read + Write | Platform-agnostic | Dual-license: GPL version 2 with classpath exception,[29] and a proprietary license.[30] | C (implementation), Java (usage) | 19.0.1 (October 18, 2022; 3 months ago) [±]
17.0.5 LTS (October 18, 2022; 3 months ago) [±] |
libconfini[33] | Yes | Yes | Yes | Yes | Boolean, Number, String, Array | Read | *BSD, Linux, macOS, Windows | GPL | C | 1.16.2[34] |
PHP (via parse_ini_file() )[35]
|
Yes | Yes | Yes | No | Number, String, Null | Read | Linux, macOS, Windows | PHP License v3.01[36] | C (implementation), PHP (usage) | 8.2.1[37] (5 January 2023; 25 days ago) |
PyINI[38] | Yes | No | Yes | Yes | Boolean, Number, String | Read + Write | Platform-agnostic | GPL | Python | 1.0[39] |
RudeConfig[40] | Yes | No | No | No | Boolean, Number, String | Read + Write | Linux, Windows | GPL | C++ | Discontinued – last version is 5.0.5, from November 2009[41] |
Windows API | Yes | No | No | No | Number, String, Struct | Read + Write (non-destructive) | Windows | Proprietary | C | 22H2 (10.0.22621.1194) (January 26, 2023; 4 days ago[42]) [±] |
Wine (implementation of Windows API) | Yes | No | No | No | Number, String, Struct | Read + Write (non-destructive) | Linux, macOS, Windows | LGPL | C | 8.0[43] 24 January 2023; 6 days ago |
configparser[44] | Yes | No | No | No | Boolean, Number, String | Read + Write | *BSD, Linux, macOS, Windows | MIT or LGPL v3.0+ | Rust | 3.0.2[44] 11 September 2022; 3 months ago |
java-ini-parser[45] | Yes | No | Yes | Yes | Boolean, Number, String | Read + Write | Platform-agnostic | Apache | Java | 1.4[44] 29 December 2022; 3 days ago |
Name | Sections support | Section nesting support | Disabled entry recognition | Multi-line support | Value types | Read/Write support | Platform | License | Programming language | Latest release version |
File mapping[edit]
Initialization file mapping creates a mapping between an INI file and the Registry.[46][47] It was introduced with Windows NT and Windows 95 as a way to migrate from storing settings in classic .ini files to the new Windows Registry. File mapping traps the Profile API calls and, using settings from the IniFileMapping
Registry section, directs reads and writes to appropriate places in the Registry.
Using the example below, a string call could be made to fetch the name key from the owner section from a settings file called, say, dbsettings.ini. The returned value should be the string «John Doe»:
GetPrivateProfileString("owner", "name", ... , "c:\programs\oldprogram\dbsettings.ini");
INI mapping takes this Profile API call, ignores any path in the given filename and checks to see if there is a Registry key matching the filename under the directory:
HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NT
CurrentVersionIniFileMapping
If this exists, it looks for an entry name matching the requested section. If an entry is found, INI mapping uses its value as a pointer to another part of the Registry. It then looks up the requested INI setting in that part of the Registry.
If no matching entry name is found and there is an entry under the (Default)
entry name, INI mapping uses that instead. Thus each section name does not need its own entry.
HKEY_LOCAL_MACHINESoftware…IniFileMappingdbsettings.ini | |
---|---|
(Default) |
@USR:Softwareoldprogsinisettingsall |
database |
USR:Softwareoldprogsinisettingsdb |
So, in this case the profile call for the [owner] section is mapped through to:
HKEY_CURRENT_USERSoftwareoldprogsinisettingsall | |
---|---|
name |
John Doe |
organization |
Acme Products |
where the «name
» Registry entry name is found to match the requested INI key. The value of «John Doe» is then returned to the Profile call. In this case, the @ prefix on the default prevents any reads from going to the dbsettings.ini file on disk. The result is that any settings not found in the Registry are not looked for in the INI file.
The «database
» Registry entry does not have the @ prefix on the value; thus, for the [database] section only, settings in the Registry are taken first followed by settings in the dbsettings.ini file on disk.
Alternatives[edit]
Starting with Windows 95, Microsoft began strongly promoting the use of Windows registry over the INI file.[48] INI files are typically limited to two levels (sections and properties) and do not handle binary data well. This decision however has not been immune to critiques, due to the fact that the registry is monolithic, opaque and binary, must be in sync with the filesystem, and represents a single point of failure for the operating system.[49]
Later XML-based configuration files became a popular choice for encoding configuration in text files.[citation needed] XML allows arbitrarily complex levels and nesting, and has standard mechanisms for encoding binary data.
More recently, data serialization formats, such as JSON, TOML, and YAML can serve as configuration formats. These three alternative formats can nest arbitrarily, but have a different syntax than the INI file. Among them, TOML most closely resembles INI, but the idea to make TOML deliberately compatible with a large subset of INI was rejected.[50]
The newest INI parsers however allow the same arbitrary level of nesting of XML, JSON, TOML, and YAML, offer equivalent support of typed values and Unicode, although keep the «informal status» of INI files by allowing multiple syntaxes for expressing the same thing.[51]
See also[edit]
- BOOT.INI
- MSConfig
- Sysedit
- SYSTEM.INI
- TOML, a very similar but more formally-specified configuration file format
- WIN.INI
- Amiga’s IFF files
- .DS_Store
- .properties
References[edit]
- ^ Microsoft TechNet: Configure an Ini File Item
- ^ .conf initialization files
- ^ Microsoft: Windows NT Workstation Resource Kit
- ^ «git-config CONFIGURATION FILE».
- ^
Rasmus Lerdorf, Kevin Tatroe, Peter MacIntyre.
«Programming PHP».
Sections «parse_ini_file», «Extension INI Entries», etc. - ^
Christian Wenz.
«PHP and MySQL Phrasebook».
section «Parsing INI Files».
quote: «… the INI file format … was very widely used in the Windows world, but today also drives the configuration of software products like PHP. For instance, …php.ini
« - ^ Codrut Neagu, «Why Are There Two Desktop.ini Files On My Desktop & What Do They Do?».
- ^ a b c libconfini’s Library Function Manual
- ^ This includes the Windows implementation. See «GetPrivateProfileString function». Microsoft Developer Network. Microsoft. Retrieved 2012-06-02.
- ^ Apache Documentation for org.apache.commons.configuration2.INIConfiguration, The Apache Software Foundation
- ^ Cloanto Implementation
- ^ It is a common practice among authors of INI files to «comment out» unwanted entries in order to disable them, instead of removing them completely. See the key
a
in the following example:[section]
#a=a
b=b - ^ The standard syntax for line continuation refers here to the sequence of a backslash followed by line break, as implemented by iniparser, libconfini and
java.util.Properties
- ^
Fredrik Lundh.
«Python Standard Library».
2001.
Section «The ConfigParser Module».
p. 143 - ^
«ConfigParser — Configuration file parser». - ^ Following the syntax of the language it is designed to work with (Python), to span a node over multiple lines ConfigParser requires a deeper indentation in the lines that follow, instead of the more common backslash + line break (see: configparser — Configuration file parser)
- ^ Python Documentation by Version
- ^ GLib Key–value file parser
- ^ Withnall, Philip (11 Feb 2021). «glib 2.66.7». GNOME ftp-release (Mailing list). Retrieved 12 February 2021.
- ^ Releases · GNOME/glib
- ^ inifile documentation
- ^ Releases · inifile
- ^ inih README
- ^ Using indentation, explicitly following ConfigParser’s approach (see the project’s documentation for more information)
- ^ Releases · benhoyt/inih
- ^ iniparser documentation
- ^ Releases · ndevilla/iniparser
- ^ Properties (Java Platform SE
- ^ «OpenJDK: GPLv2 + Classpath Exception». Openjdk.java.net. 1989-04-01. Retrieved 2016-02-09.
- ^ «BCL For Java SE». Oracle.com. 2013-04-02. Retrieved 2016-02-09.
- ^ «JDK Releases». Oracle Corporation. Retrieved 2022-12-09.
- ^ «JDK Releases». Oracle Corporation. Retrieved 2022-12-09.
- ^ libconfini documentation
- ^ Releases · madmurphy/libconfini
- ^ PHP. «
parse_ini_file()
— Parse a configuration file». Official PHP documentation. Retrieved 2022-07-19. - ^ PHP License v3.01[1]
- ^ «Version 8.2.1». 5 January 2023. Retrieved 30 January 2023.
- ^ PyINI
- ^ Tags · whoatemybutter / PyINI
- ^ RudeConfig documentation
- ^ Releases · RudeConfig
- ^ «January 26, 2023—KB5022360 (OS Build 22621.1194) Preview». Microsoft Support. Microsoft.
- ^ «Wine 8.0 Released». 24 January 2023. Retrieved 24 January 2023.
- ^ a b c «configparser on crates.io». crates.io. 2022-12-12. Archived from the original on 2022-12-12. Retrieved 2022-12-12.
- ^ java-ini-parser github page
- ^ Initialization Files and the Registry, Windows NT Workstation Resource Kit, Microsoft TechNet
- ^ Administering the NT Registry, Managing the Windows NT Registry, Paul Robichaux, O’Reilly Media
- ^ The System Registry
- ^ Was The Windows Registry a Good Idea? – Coding Horror
- ^ «Comment on «.INI compatibility is a worthy goal» issue on GitHub».
- ^ libconfini/README
- Infobox — http://filext.com/file-extension/INI
- Infobox — https://wikiext.com/ini
External links[edit]
- libconfini’s Library Function Manual: The particular syntax allowed by libconfini.
- Cloanto Implementation of INI File Format: The particular syntax allowed by a parser implemented by Cloanto.
- A very simple data file metaformat: INI parser tutorial in Apache Groovy.
- Microsoft’s GetPrivateProfileString() and WritePrivateProfileStringA() functions
Расширение имени файла | .ini |
---|---|
Тип Интернет-носителя | text / plain, application / textedit, zz-application / zz-winassoc-ini |
Тип формата | Файл инициализации / конфигурации |
Файл INI — это файл конфигурации для компьютерное программное обеспечение, которое состоит из текстового содержимого со структурой и синтаксисом, состоящими из пар ключ-значение для свойств, и разделов, которые организуют свойства. Имя этих файлов конфигурации происходит от имени файла с расширением INI для инициализации, используемого в операционной системе MS-DOS, которая сделала этот метод конфигурации программного обеспечения популяризованным. Формат стал неформальным стандартом во многих контекстах конфигурации, но многие приложения в других операционных системах используют другие расширения имен файлов, такие как conf и cfg.
Содержание
- 1 История
- 2 Формат
- 2.1 Ключи (свойства)
- 2.2 Разделы
- 2.3 Чувствительность к регистру
- 2.4 Комментарии
- 2.5 Различные функции
- 2.5.1 Комментарии
- 2.5.2 Повторяющиеся имена
- 2.5.3 Escape-символы
- 2.5.4 Глобальные свойства
- 2.5.5 Иерархия
- 2.5.6 Разделитель имени / значения
- 2.5.7 Значения в кавычках
- 2.5.8 Пробел
- 2.6 Порядок разделов и свойств
- 3 Пример
- 4 Доступ к файлам INI
- 4.1 Сравнение анализаторов INI
- 5 Отображение файлов
- 6 Альтернативы
- 7 См. Также
- 8 Ссылки
- 9 Внешние ссылки
История
Основным механизмом конфигурации программного обеспечения в Windows изначально был формат текстового файла, который содержал текстовые строки с одной парой «ключ-значение» в каждой строке, организованные в разделы. Этот формат использовался для компонентов операционной системы, таких как драйверы устройств, шрифты, средства запуска. Файлы INI также обычно использовались приложениями для хранения индивидуальных настроек.
Формат поддерживался в 16-битных платформах Microsoft Windows вплоть до Windows 3.1x. Начиная с Windows 95 Microsoft одобрила использование реестра Windows и начала уводить разработчиков от использования файлов INI для конфигурации. Все последующие версии Windows использовали реестр Windows для конфигурации системы, но приложения, созданные на.NET Framework, используют специальные файлы XML.config. Функции файла инициализации по-прежнему доступны в Windows, и разработчики по-прежнему могут их использовать. Системы
Linux и Unix также используют аналогичный формат файла для конфигурации системы. Кроме того, программное обеспечение, не зависящее от платформы, может использовать этот формат файла для конфигурации. Это удобочитаемый и простой для синтаксического анализа формат, поэтому его можно использовать для файлов конфигурации, которые не требуют гораздо большей сложности.
Файлы конфигурации Git похожи на файлы INI.
Например, платформенно-независимый PHP использует формат INI для своего «php.ini
«конфигурационный файл в системах Windows и Linux. Файлы
Desktop.ini определяют отображение каталогов в Windows, например, значки для каталога.
Формат
Ключи (свойства)
Базовым элементом, содержащимся в файле INI, является ключ или свойство. У каждого ключа есть имя и значение, разделенное знаком равно (=). Имя отображается слева от знака равенства. В реализации Windows знак равенства и точка с запятой являются зарезервированными символами и не могут появляться в ключе. Значение может содержать любой символ.
name = value
Разделы
Ключи могут, но не обязательно, группироваться в разделы с произвольным названием. Имя раздела появляется в отдельной строке в квадратных скобках ([и]). Все ключи после объявления раздела связаны с этим разделом. Нет явного разделителя «конец раздела»; разделы заканчиваются объявлением следующего раздела или в конце файла. Разделы не могут быть вложенными.
[section] a = ab = b
Чувствительность к регистру
Имена разделов и свойств не чувствительны к регистру в реализации Windows, но в других приложениях может вести себя по-другому.
Комментарии
Точка с запятой (;) в начале строки обозначает комментарий. Строки комментариев игнорируются.
; текст комментария
Различные функции
Формат файла INI не является универсальным строго определенным. Многие компьютерные программы поддерживают функции, выходящие за рамки уже описанных основных функций. Ниже приводится список некоторых общих функций, которые могут быть, а могут и не быть реализованы в любой данной программе.
Комментарии
Некоторое программное обеспечение поддерживает использование знака числа (#) в качестве альтернативы точке с запятой для обозначения комментариев. Однако он может быть включен в название ключа. Например, следующая строка создает переменную с именем «#var», но не переменную с именем «var»; иногда это используется для создания псевдо-реализации комментария.
# var = a
В общем, использование знака числа непредсказуемо, как в следующих строках (обратите внимание на пробел после знака числа во второй строке). По этой причине не следует использовать знак числа в начале комментария.
# [section] # var = a
В некоторых реализациях комментарий может начинаться в любом месте строки, в том числе в той же строке после объявлений свойств или разделов. В других случаях, включая функцию WinAPI GetPrivateProfileString, комментарии должны размещаться отдельно в строках.
Повторяющиеся имена
Большинство реализаций поддерживают только одно свойство с заданным именем в разделе. Второе вхождение имени свойства может вызвать прерывание, оно может быть проигнорировано (и значение отброшено), или оно может переопределить первое вхождение (с отклонением первого значения). Некоторые программы используют повторяющиеся имена свойств для реализации многозначных свойств.
Интерпретация нескольких объявлений разделов с одним и тем же именем также различается. В некоторых реализациях повторяющиеся разделы просто объединяют свои свойства, как если бы они располагались непрерывно. Другие могут прервать или проигнорировать некоторые аспекты INI-файла.
escape-символы
Некоторые реализации также предлагают различную поддержку для escape-символа, обычно с обратной косой чертой (). Некоторые поддерживают «продолжение строки», где обратная косая черта, за которой сразу следует EOL (конец строки), приводит к игнорированию разрыва строки и продолжению «логической строки» на следующей фактической строке из INI-файла. Также наблюдается реализация различных «специальных символов» с escape-последовательностями.
Последовательность | Значение |
---|---|
\ |
(одиночная обратная косая черта, экранирующая escape-символ) |
' |
Апостроф |
" |
Двойные кавычки |
|
Нулевой символ |
a |
Bell / Alert / Audible |
b |
Backspace, Bell character для некоторых приложений |
t |
Tab знак |
r |
Возврат каретки |
n |
Перевод строки |
; |
Точка с запятой |
# |
Знак числа |
= |
Знак равенства |
: |
Двоеточие |
x ???? |
Символ Юникода с шестнадцатеричным кодовой точкой, соответствующей ???? |
Глобальные свойства
Также могут быть разрешены необязательные «глобальные» свойства, которые объявляются перед объявлением любого раздела.
Иерархия
Чаще всего файлы INI не имеют иерархия разделов внутри разделов. Однако некоторые файлы имеют иерархическое соглашение об именах. Для раздела A, подраздела B, подраздела C, свойства P и значения V они могут принимать такие записи, как [ABC]
и P = V
(Windows ‘xstart.ini
), [A B C]
и P = V
(файл драйвера IBM Windows devlist.ini
) или [A]
и B, C, P = V
(файл Microsoft Visual Studio AEMANAGR.INI
).
Неясно, являются ли это просто соглашения об именах, которые приложение использует для создания видимости иерархии, или же файл читается модулем, который фактически представляет эту иерархию программисту приложения..
Разделитель имени / значения
Некоторые реализации допускают использование двоеточия (:
) в качестве разделителя имени / значения (вместо знака равенства).
Значения в кавычках
Некоторые реализации позволяют заключать значения в кавычки, обычно с использованием двойных кавычек и / или апострофов. Это позволяет явно указывать пробелы и / или заключать в кавычки специальные символы (равно, точка с запятой и т. Д.). Стандартная функция Windows GetPrivateProfileString поддерживает это и удаляет кавычки, окружающие значения.
Пробел
Интерпретация пробела варьируется. Большинство реализаций игнорируют начальные и конечные пробелы вокруг имени свойства. Некоторые даже игнорируют пробелы в значениях (например, делая эквивалентными «имя хоста» и «имя хоста»). Некоторые реализации также игнорируют начальные и конечные пробелы вокруг значения свойства; другие считают, что все символы , следующие за знаком равенства (включая пробелы), являются частью значения.
Порядок разделов и свойств
В большинстве случаев порядок свойств в разделе и порядок разделов в файле не имеют значения, но реализации могут отличаться.
Пример
В следующем примере файла есть два раздела: один для владельца программного обеспечения, а второй — для подключения к базе данных заработной платы. В комментариях указывается последнее лицо, изменившее файл, и причина изменения.
; последнее изменение: 1 апреля 2001 г., Джон Доу [владелец] имя = Джон Доу организация = Acme Widgets Inc. [база данных]; использовать IP-адрес в случае, если разрешение сетевого имени не работает server = 192.0.2.62 port = 143 file = "payroll.dat"
Доступ к файлам INI
В Windows Profile API является программным интерфейс, используемый для чтения и записи настроек из классических файлов Windows.ini. Например, функция GetPrivateProfileString извлекает строку из указанного раздела в файле инициализации.
В следующем примере программы C демонстрируется чтение значений свойств из приведенного выше примера INI-файла (пусть имя файла конфигурации будет dbsettings.ini
):
# включить int main (int argc, _TCHAR * argv) {_TCHAR dbserver [1000]; int dbport; GetPrivateProfileString («база данных», «сервер», «127.0.0.1», dbserver, sizeof (dbserver) / sizeof (dbserver [0]), «. \ dbsettings.ini»); dbport = GetPrivateProfileInt («база данных», «порт», 143, «. \ dbsettings.ini»); // N.B. WritePrivateProfileInt () не существует return 0; }
Третий параметр функции GetPrivateProfileString — это значение по умолчанию, которое равно «127.0.0.1» и 143 соответственно в двух вызовах функций выше. Если аргумент, предоставленный для этого параметра, — ПУСТО (NULL), по умолчанию используется пустая строка «».
В Unix существует множество различных библиотек конфигурации для доступа к файлам INI. Часто они уже включены в структуры и наборы инструментов. Примеры синтаксических анализаторов INI для Unix включают GLib, iniparser и libconfini.
Сравнение анализаторов INI
Имя | Поддержка разделов | Поддержка вложения разделов | Распознавание отключенных записей | Поддержка нескольких строк | Типы значений | Поддержка чтения / записи | Платформа | Лицензия | Язык программирования | Последняя версия выпуска |
---|---|---|---|---|---|---|---|---|---|---|
Да | Нет | Нет | Нестандартный | Логический, Число, Строка | Чтение + Запись | * BSD, GNU / Linux, macOS, Windows | PSFL | C (реализация), Python (использование) | 3.8.2 | |
GLib | Да | Да | Нет | Нет | Логическое, Число, Строка, Массив | Чтение + Запись | * BSD, GNU / Linux, macOS, Windows | LGPL | C | 2.64.4 (2 июля 2020 г.; 3 месяца назад (2020-07-02)) |
Да | Нет | Нет | Нет | Логическое, Число, Строка | Чтение + запись | * BSD, GNU / Linux, macOS, Windows | Apache | Go | 1.2.0 | |
Да | Нет | Нет | Да | Логическое, Число, Строка | Чтение | * BSD, GNU / Linux, macOS, Windows | BSD | C | 48 | |
Да | Нет | Нет | Да | логическое, число, строка | чтение + запись | * BSD, GNU / Linux, macOS, Windows | MIT | C | 4.1 | |
Java (через java.util.Properties ) |
Нет | Нет | Нет | Да | Строка | Чтение + запись | Независимость от платформы | Двойная лицензия: версия GPL 2 с исключением пути к классам и проприетарной лицензией . | C (реализация), Java (использование) | 15.0.1 (20 октября 2020 г.; 4 дня назад (2020-10-20)).
11.0.9 (11 сентября 2020 г.; 43 дня назад (2020-09-11)). 8u272 (28 сентября 2020 г.; 26 дней назад (2020-09-28)) |
Да | Да | Да | Да | Логическое, Число, Строка, Массив | Чтение | * BSD, GNU / Linux, macOS, Windows | GPL | C | 1.14.0 | |
PyINI | Да | Нет | Да | Да | Логическое, Число, Строка | Чтение + запись | Независимость от платформы | GPL | Python | 1.0 |
Да | Нет | Нет | Нет | Логическое, Число, Строка | Чтение + Запись | GNU / Linux, Windows | GPL | C ++ | Снято с производства — последняя версия 5.0.5, с ноября 2009 г. | |
Windows API | Да | Нет | Нет | Нет | Число, Строка, Структура | Чтение + запись (неразрушающий) | Windows | Собственный | C | 1803 (10.0.17134.112) (июнь 12, 2018; 2 года назад (2018-06-12)) |
Wine (imp использование Windows API ) | Да | Нет | Нет | Нет | Число, Строка, Struct | чтение + запись (неразрушающий) | Linux, macOS, Windows | LGPL | C | 5.0.2 (7 августа 2020 г.; 2 месяца назад (2020-08-07)) |
Имя | Поддержка разделов | Поддержка вложенности разделов | Распознавание отключенных записей | Многострочный поддержка | Типы значений | Поддержка чтения / записи | Платформа | Лицензия | Язык программирования | Последняя версия выпуска |
Сопоставление файлов
Инициализация сопоставление файлов создает сопоставление между файлом INI и реестром . Он был представлен в Windows NT и Windows 95 как способ перехода от хранения настроек в классических файлах.ini к новому реестру Windows. Сопоставление файлов перехватывает вызовы Profile API и, используя настройки из раздела реестра IniFileMapping
, направляет чтение и запись в соответствующие места в реестре.
Используя приведенный выше пример, можно выполнить строковый вызов, чтобы получить ключ имени из раздела владельца из файла настроек, например, dbsettings.ini. Возвращаемое значение должно быть строкой «Джон Доу»:
GetPrivateProfileString («владелец», «имя»,..., «c: \ programs \ oldprogram \ dbsettings.ini»);
Отображение INI принимает этот вызов API профиля, игнорирует любой путь в данном имени файла и проверяет, есть ли ключ реестра, соответствующий имени файла в каталоге:
HKEY_LOCAL_MACHINE Software Microsoft Windows NT . CurrentVersion IniFileMapping
Если он существует, он ищет имя записи, совпадающее с запрошенным разделом. Если запись найдена, отображение INI использует ее значение как указатель на другую часть реестра. Затем он ищет запрошенную настройку INI в этой части реестра.
Если совпадающее имя записи не найдено и есть запись под именем записи (по умолчанию)
, вместо нее используется сопоставление INI. Таким образом, каждое имя раздела не требует отдельной записи.
HKEY_LOCAL_MACHINE Software … IniFileMapping dbsettings.ini | |
---|---|
(по умолчанию) |
@USR: Software oldprogs inisettings all |
база данных |
USR: Software oldprogs inisettings db |
Итак, в этом случае вызов профиля для раздела [владелец] отображается на:
HKEY_CURRENT_USER Software oldprogs inisettings all | |
---|---|
name |
John Doe |
organization |
Acme Products |
, где найдено имя записи реестра «name
», совпадающее с запрошенным ключом INI. Затем значение «John Doe» возвращается вызову Profile. В этом случае префикс @ по умолчанию препятствует чтению файла dbsettings.ini на диске. В результате любые настройки, не найденные в реестре, не ищутся в INI-файле.
Запись реестра «база данных
» не имеет префикса @ в значении; таким образом, только для раздела [database] сначала берутся настройки в реестре, а затем настройки в файле dbsettings.ini на диске.
Альтернативы
Начиная с Windows 95, Microsoft начала активно продвигать использование реестра Windows вместо INI-файла. Файлы INI обычно ограничены двумя уровнями (разделы и свойства) и плохо обрабатывают двоичные данные. Однако это решение не было защищено от критики из-за того, что реестр является монолитным, непрозрачным и двоичным, должен быть синхронизирован с файловой системой и представляет собой единую точку отказа для операционной системы.
Позже файлы конфигурации на основе XML стали популярным выбором для кодирования конфигурации в текстовых файлах. XML допускает произвольно сложные уровни и вложения и имеет стандартные механизмы для кодирования двоичных данных.
В последнее время форматы сериализации данных, такие как JSON, TOML и YAML могут служить форматами конфигурации. Эти три альтернативных формата могут размещаться произвольно, но имеют другой синтаксис, чем файл INI. Среди них TOML больше всего напоминает INI, но идея сделать TOML сознательно совместимым с большим подмножеством INI была отклонена.
Однако новейшие синтаксические анализаторы INI допускают такой же произвольный уровень вложенности XML, JSON, TOML и YAML предлагают эквивалентную поддержку типизированных значений и Unicode, хотя сохранить «неформальный статус» файлов INI, разрешив несколько синтаксисов для выражения одного и того же.
См. также
- BOOT.INI
- MSConfig
- SYSTEM.INI
- TOML, очень похожий, но более формально определенный формат файла конфигурации
- WIN.INI
- Amiga IFF файлы
- .DS Store
- .properties
Ссылки
- ink — http://filext.com/file-extension/INI
- ink — https://wikiext.com/ini
Внешние ссылки
- Руководство по функциям библиотеки libconfini : особый синтаксис, разрешенный libconfini.
- Реализация Cloanto формата файла INI : особый синтаксис, разрешенный ap arser, реализованный Cloanto.
- Очень простой метаформат файла данных : руководство по синтаксическому анализатору INI в Apache Groovy.
- Microsoft GetPrivateProfileString () и WritePrivateProfileStringA () функции
Мы продолжаем разбираться как работает ПК на примере клавиатуры и Windows 10. В этой статье поговорим о том как происходит единение софта и железа.
Старт системы
Полностью компьютер выключен когда он отключен от питания и конденсаторы на материнской плате разрядились. До эры смартфонов мобильные телефоны часто глючили и если перезагрузка не лечила проблему, то приходилось доставать батарею и ждать 10 секунд, потому что сбрасывалось программное состояние ОС, в то время как чипы на материнской плате и контроллеры устройств оставались активными сохраняя состояние, драйвера ОС к ним просто реконнектились. 10 секунд — время на разрядку конденсаторов, состояние чипов сбрасывается только при полном отключении.
Если же ПК подключен к розетке или батарее, то он находится в режиме Stand-By, это значит что по шине питания подаётся маленькое напряжения (5В) от которого запитываются некоторые чипы на материнке. Как минимум это системный контроллер, по сути это мини-компьютер запускающий большой компьютер. Получив уведомление о нажатии кнопки Power он просит блок питания/батарею подать больше напряжения и после инициализирует весь чип-сет, в том числе и процессор. Инициализация включает в себя перекачку кода и данных прошивки материнки (BIOS/UEFI) в оперативную память и настройку CPU на её исполнение.
Думать что кнопка Power это рубильник который подаёт электричество на CPU и тот начинает исполнять с заранее известного адреса прошивку BIOS неправильно. Возможно старые компьютеры так и работали. Кнопка включения находится на своей плате, вместе со светодиодами состояний и к материнке она подключается через специальный разъём. На картинке ниже видны контакты для кнопки Power, Reset, а также светодиодов с состоянием Power и чтения жёсткого диска. Нажатие кнопки включения переводится в сигнал на контакты материнки, откуда он достигает системный контроллер.
Контакты на материнке для подключения кнопки включения, светодиодов состояния Power, жёсткого диска и динамиков.
Плата ноутбука с кнопкой включения и светодиодом состояния
Cистемный контроллер обладает огромными полномочиями – включать и выключать компьютер, исполнять код в режиме ядра. Помимо него могут быть и другие чипы со сравнимыми возможностями, такие как Intel Management Engine или AMD Secure Technology (часть CPU), которые так же работают когда компьютер «выключен». Чип с Intel ME имеет в себе x86 CPU с операционной системой MINIX 3. Что он может делать:
- Включать и выключать компьютер, т.е. выполнять программы имея доступ ко всей вычислительной мощности, периферии машины и сети.
- Обходить ограничения файервола.
- Видеть все данные в CPU и RAM, что даёт доступ к запароленным файлам.
- Красть ключи шифрования и получать доступ к паролям
- Логировать нажатия клавиш и движения мыши
- Видеть что отображается на экране
- Вредоносный код в Intel ME не может быть детектирован антивирусом, потому как на такой низкий уровень он добраться не может
- И конечно же скрытно отправлять данные по сети используя свой стек для работы с сетью.
Это вызывает серьёзные вопросы безопасности, потому как он может быть хакнут или использовать в шпионских целях.
Прикладная иллюстрация как блок питания получает сигнал от материнки на включение. Если вы задумаете установить мощную видеокарту (Nvidia 2070 S) на офисный ПК, то просто вставить её недостаточно, потому как она требует питание в 600W, в то время как такой ПК имеет блок на ~500W. Первое что придёт в голову – купить новый блок питания на 650W с отдельной линией для видеокарты. Но и здесь будут разочарования, потому как разъёмы материнки будут не совпадать с разъёмами БП, а если его отдельно воткнуть в розетку и подключить к видюхе тоже ничего не будет – в блоке питания вентилятор не крутится и изображения нет. Так происходит, потому что БП должен получить сигнал от материнки на полное включение. Очевидное решение – новая материнка с совместимыми разъёмами, однако она стоит ~$300. Есть решение проще, хоть оно и вызывает опасения пожаробезопасности. Берём скрепку, разгибаем и вставляем в зелёный (PS_ON) и один из чёрных пинов (COM). Теперь всё должно работать.
Поиск загрузчика ОС
Есть два вида прошивки материнки – BIOS (Basic Input Output System) на старых машинах и UEFI (Unified Extensible Firmware Interface) на новых. Windows 10 поддерживает обе и абстрагирует различия между ними. UEFI правильней называть ОС чем прошивкой, потому как он предлагает больше возможностей, к примеру богатый графический интерфейс вместо текстового, наличие мышки, больший объём доступной памяти, улучшенная модель безопасности и валидации файлов ОС, взаимодействие с железом через API, вместо прерываний как в BIOS.
Пример экрана монитора BIOS.
Программа BIOS хранится на отдельном чипе, подключенном к Южному мосту. Этот чип можно достать и перепрошить новой программой, по факту это просто носитель памяти, а не самостоятельный микрокомпьютер.
Настройки BIOS (системное время, например), хранятся на другом чипе который как правило находится возле круглой батарейки, которая на самом деле является литиевым аккумулятором, подзаряжающимся во время работы ПК. Называется он CMOS, что означает Complementary Metal Oxide Semiconductor, а по-русски просто — КМОП, что есть комплементарная структура металл-оксид-полупроводник.
Первым делом программа BIOS выполняет проверку подсистем, эта процедура называется POST – Power On Self Test. Тест может быть сокращённый либо полный, это задаётся в настройках BIOS. Процитирую Википедию, что в себя включают эти тесты:
Сокращённый тест включает:
- Проверку целостности программ BIOS в ПЗУ, используя контрольную сумму.
- Обнаружение и инициализацию основных контроллеров, системных шин и подключённых устройств (графического адаптера, контроллеров дисководов и т. п.), а также выполнение программ, входящих в BIOS устройств и обеспечивающих их самоинициализацию.
- Определение размера оперативной памяти и тестирования первого сегмента (64 килобайт).
Полный регламент работы POST:
- Проверка всех регистров процессора;
- Проверка контрольной суммы ПЗУ;
- Проверка системного таймера и порта звуковой сигнализации (для IBM PC — ИМС i8253 или аналог);
- Тест контроллера прямого доступа к памяти;
- Тест регенератора оперативной памяти;
- Тест нижней области ОЗУ для проецирования резидентных программ в BIOS;
- Загрузка резидентных программ;
- Тест стандартного графического адаптера (VGA или PCI-E);
- Тест оперативной памяти;
- Тест основных устройств ввода (НЕ манипуляторов);
- Тест CMOS
- Тест основных портов LPT/COM;
- Тест накопителей на гибких магнитных дисках (НГМД);
- Тест накопителей на жёстких магнитных дисках (НЖМД);
- Самодиагностика функциональных подсистем BIOS;
- Передача управления загрузчику.
По результатам этого теста может быть обнаружена неисправность, к примеру нерабочая видеокарта или клавиатура. Поскольку экран монитора может не работать результаты тестов сообщаются в виде последовательности звуковых сигналов разной высоты. Что конкретно они значат надо смотреть в документации к материнской плате. Старые компьютеры часто бибикали во время старта — это программа BIOS сообщала о результатах тестов. Иногда может дополнительно использоваться индикатор, показывающий номер ошибки.
Если всё прошло успешно, BIOS начинает процесс поиска загрузчика ОС. Для этого он начинает просматривать все подключенные к материнской плате жёсткие диски. Данные на физических дисках адресуются в единицах называемых сектор, обычно он 512 байт, однако современный стандарт – 4096 байт. Установщик Windows в самый первый сектор на диске записывает специальный программный код и данные о разделах. Этот сектор называется Master Boot Record. Диск разбивается на разделы (partitions), отформатированный своей файловой системой. Максимум 4 раздела, каждый из который может быть расширенным (extended partition), такой можно рекурсивно делить на 4 раздела и теоретически их число не ограничено. Как только BIOS находит Master Boot Record он считывает оттуда код и передаёт ему управление. Этот код поочередно просматривает данные о разделах и находит тот который помечен как активный, в нём находится код загрузчика Windows (Это не раздел с C:WindowsSystem32!), этот раздел называется system partition. Как правило он занимает 100Мб и скрыт от пользователя. В первом секторе этого раздела хранится загрузочный код, которому передаётся управление. Это volume boot sector, код в нём ищет файл Bootmgr, с которого и начинается процесс загрузки Windows. Файл Bootmgr создан через соединение в один файлов Startup.com и Bootmgr.exe.
Процессор начинает свою работу в режиме который называется «Реальный». Это режим совместимости, в нём CPU работает так же как и старые 16-bit процессоры, не имевшие поддержки виртуальной памяти и работавшие напрямую с физической памятью через 20-bit шину адресов, позволявшую адресовать 1Мб памяти. Простые MS-DOS программы выполнялись в этом режиме и имели расширение .COM. Первое что делает Startup.com (Bootmgr) – переключает процессор в режим «Защищённый», где под защитой понимается защита процессов друг от друга. В этом режиме поддерживается виртуальная память и 32х битные адреса, которыми можно адресовать 4Гб оперативной памяти. Следующим этапом Bootmgr заполняет таблицу виртуальных адресов на первые 16Мб RAM и включает трансляцию с виртуальных адресов в физические. В этом режиме и работает Windows. Поскольку на этом этапе подсистемы ОС ещё не созданы, Bootmgr имеет свою простую и неполную реализацию файловой системы NTFS, благодаря которой он находит BCD файл (Boot Configuration Data), в котором хранятся настройки параметров загрузки ОС. Вы можете редактировать его через утилиту BcdEdit.exe. В этих настройках BCD может быть указано, что Windows была в состоянии гибернации, и тогда Bootmgr запустит программу WinResume.exe, которая считывает состояние из файла Hyberfil.sys в память и перезапускает драйвера. Если BCD говорит, что есть несколько ОС, то Bootmgr выведет на экран их список и попросит пользователя выбрать. Если ОС одна, то Bootmgr запускает WinLoad.exe, этот процесс и выполняет основную работу по инициализации Windows:
- Выбирает соотвествующую версию ядра Windows. Можете думать о нём как о Windows10.exe, хотя на самом деле он называется NtOsKrnl.exe. Какие есть версии? Согласно википедии:
- ntoskrnl.exe — однопроцессорное ядро Windows. без поддержки режима PAE
- ntkrnlmp.exe (англ. NT Kernel, Multi-Processor version) — многопроцессорное ядро Windows. без поддержки режима PAE
- ntkrnlpa.exe — однопроцессорное ядро Windows с поддержкой режима PAE.
- ntkrpamp.exe — многопроцессорное ядро Windows с поддержкой режима PAE.
- Загружает HAL.dll (Hardware Abstraction Layer), который абстрагирует особенности материнки и CPU.
- Загружает файл шрифтов vgaoem.fon
- Загружает файлы в которых содержится инфомрация о представлениях даты времени, форматов чисел и пр. Эта функциональность называется National Language System.
- Загружает в память реестр SYSTEM, в нём содержится информация о драйверах которые надо загрузить. Информация о всех драйверах находится в HKLMSYSTEMCurrentControlSetServices. Драйвера которые надо загрузить имеют ключ start = SERVICE_BOOT_START (0). Об устройстве реестра мы поговорим в другой статье.
- Загружает драйвер файловой системы для раздела на котором располагаются файлы драйверов.
- Загружает драйвера в память, но пока не инициализирует их из-за круговых зависимостей.
- Подготавливает регистры CPU для выполнения ядра Windows выбранного на первом шаге – NtOsKrnl.exe.
Во время загрузки драйверов WinLoad проверяет их цифровые подписи и если они не совпадают, то будет синий (BSOD) или зелёный (GSOD, для insider preview сборок) «экран смерти».
Запуск на UEFI
Пример экрана загрузки UEFI
BIOS существует больше 30 лет и в попытках исправить его недостатки компания Intel в 1998 году создала стандарт Intel Boot Initiative, позже переименованный в EFI и в 2005 году пожертвованный организации EFI Forum. Недостатки BIOS:
• Работает только в 16-битном режиме
• Может адресовать только 1Mb оперативной памяти
• Часто имеет проблемы совместимости
• MBR ограничен только четырьмя главными разделами диска
• Диск с ОС не может быть больше чем 2.2Tb.
• Имеет очень ограниченные возможности для валидации загрузчика ОС.
На смену BIOS пришёл UEFI, по сути это миниатюрная ОС которая может работать и в 32-bit и в 64-bit. Для совместимости есть опция Compatibility Support Module, которая включается в настройках и эмулирует работу BIOS.
В UEFI загрузка происходит в родной для процессора битности – 32 или 64, есть доступ ко всей памяти, поддерживается виртуальная память, включен Secure Boot и есть возможность запустить antimalware до начала загрузки ОС. Порядок загрузки ОС в UEFI:
- Инициализация и запуск Firmware, запуск чип-сета.
- POST тест, аналогично BIOS
- Загрузка EFI-драйверов и поиск диска подпадающего под требования EFI для загрузочного диска
- Поиск папки с именем EFI. Спецификация UEFI требует чтобы был раздел для EFI System Partition, отформатированный под файловую систему FAT, размером 100Мб – 1Гб или не более 1% от размера диска. Каждая установленная Windows имеет свою директорию на этом разделе – EFIMicrosoft.
- Читает из настроек UEFI сохранённых в NVRAM (энергонезависимая память) путь к файлу загрузчика.
- Находит и запускает EFI/Microsoft/Boot/BootMgrFw.efi.
- BootMgrFw.efi находит раздел реестра BCD, который хранится в отдельном файле с именем BCD. Из него он находит WinLoad.efi, который расположен в C:WindowsSystem32winload.efi.
Чтобы посмотреть содержимое раздела EFI System Partition откройте консоль с правами админа (WinKey+X => Windows PowerShell (Admin)) и выполните команды mountvol Z: /s, Z:, dir. CD — меняет директорию.
Главное отличие компонентов BootMgr и WinLoad для UEFI от своих копий для BIOS тем что они используют EFI API, вместо прерываний BIOS и форматы загрузочных разделов MBR BIOS и EFI System Partition сильно отличаются.
Инициализация ядра
Напоминаю, что мы рассматриваем загрузку ПК в контексте работы клавиатуры, поэтому не стоит заострять внимание на всех этапах. Надо понять где в этом процессе находится клавиатура, важные для понимания этапы выделены.
На предыдущем этапе был запущен компонент WinLoad.exe/WinLoad.efi, который запускает NtOsKrnl.exe указав ему параметры загрузки в глобальной переменной nt!KeLoaderBlock (память режима ядра доступна всем процессам), которые WinLoad собрал во время своей работы. Они включают:
- Пути к System (загрузчик Windows) и Boot (C:WindowsSystem32) директориям.
- Указатель на таблицы виртуальной памяти которые создал WinLoad
- Дерево с описанием подключенного hardware, оно используется для создания HKLMHARDWARE ветки реестра.
- Копия загруженного реестра HKLMSystem
- Указатель на список загруженных (но не инициализированных) драйверов участвующих в старте Windows.
- Прочая информация необходимая для загрузки.
Инициализация ядра Windows происходит в два этапа. До этого происходит инициализация Hardware Abstraction Layer, который в числе всего прочего настраивает контроллеры прерывания для каждого CPU.
На этой же стадии загружаются в память строки с сообщениями для BSOD, потому как в момент падения они могут быть недоступны или повреждены.
- Первая фаза инициализации ядра:
- Слой Executive инициализирует свои объекты состояний – глобальные объекты, списки, блокировки. Производится проверка Windows SKU (Stock Keeping Unit), примеры Windows 10 SKU — Home, Pro, Mobile, Enterprise, Education.
- Если включен Driver Verifier, то он инициализируется.
- Менеджер памяти создаёт структуры данных, необходимые для работы внутренних API для работы с памятью (memory services), резервирует память для внутреннего пользования ядром.
- Если подключен отладчик ядра (kernel debugger) ему отправляется уведомление загрузить символы для драйверов загружаемых во время старта системы.
- Инициализируется информация о версии билда Windows.
- Старт Object Manager – позволяет регистрировать именованные объекты к которым могут получать доступ по имени другие компоненты. Яркий пример – мьютекс по которому приложение позволяет запустить единственный экземпляр. Здесь же создаётся храниться handle table, по которой устанавливается соответствие к примеру между HWND и объектом описывающим окно.
- Старт Security Reference Monitor подготавливает всё необходимое для создания первого аккаунта.
- Process Manager подготавливает все списки и глобальные объекты для создания процессов и потоков. Создаются процесс Idle и System (в нём исполняется “Windows10.exe” он же NtOsKrnl.exe), они пока не исполняются, потому как прерывания выключены.
- Инициализация User-Mode Debugging Framework.
- Первая фаза инициализации Plug and Play Manager. PnP – это стандарт который реализовывается на уровне производителей периферии, материнских плат и ОС. Он позволяет получать расширенную информацию о подключенных устройствах и подключать их без перезагрузки ПК.
- Вторая фаза инициализации ядра. Она содержит 51 шаг, поэтому я пропущу многие из них:
- По завершению первой фазы главный поток процесса System (NtOsKrnl.exe) уже начал исполнение. В нём производится вторая фаза инициализации. Поток получает самый высокий приоритет – 31.
- HAL настраивает таблицу прерываний и включает прерывания.
- Показывается Windows Startup Screen, которая по умолчанию представляет из себя чёрный экран с progress bar.
- Executive слой инициализирует инфраструктуру для таких объектов синхронизации как Semaphore, Mutex, Event, Timer.
- Объекты для User-Mode Debugger проинициализированы.
- Создана symbolic link SystemRoot.
- NtDll.dll отображена в память. Она отображается во все процессы и содержит Windows APIs.
- Инициализирован драйвер файловой системы.
- Подсистема межпроцессного общения между компонентами Windows ALPC проинициализирована. Можете думать о ней как о named pipes или Windows Communication Foundation для межпроцессного общения.
- Начинается инициализация I/O Manager, который создаёт необходимые структуры данных для инициализации и хранения драйверов подключенной к компьютеру периферии. Этот процесс очень сложный.
Здесь же инициализируются компоненты Windows Management Instrumentation и Event Tracing for Windows (на него полагается Windows Performance Analyzer). После этого шага все драйвера проинициализированы. - Запускается процесс SMSS.exe (Session Manager Sub System). Он отвечает за создание режима пользователя, в котором будет создана визуальная часть Windows.
Запуск подсистем – SMSS, CSRSS, WinInit
SMSS.exe отличается от пользовательских процессов, это нативный процесс и это даёт ему дополнительные полномочия. SMSS.exe работает с ядром в обход Windows API, он использует то что называется Native API. Windows API – обёртка вокруг Native API. SMSS.exe первым делом запускает подсистему Windows (CSRSS.exe – Client Server Runtime Sub System) и заканчивает инициализацию реестра.
Процесс и потоки SMSS.exe помечены как критические, это значит что если они неожиданно завершаться, к примеру из-за ошибки, это приведёт к падению системы. Для общения с подсистемами, к примеру вызову API создающему новую сессию, SMSS создаёт ALPC-порт с именем SmApiPort. Загружаются из реестра переменные среды окружения, запускаются программы такие как Check Disk (autochk.exe, эти программы записаны в реестре HKLMSYSTEMCurrentControlSetControlSession ManagerBootExecute). SMSS.exe запускается для каждой пользовательской сессии. Глобальные переменные (очередь сообщений например) у каждой сессии своя за счёт механизма виртуальной памяти. В Windows есть контексты потока, процесса и сессии. Каждый SMSS.exe запускает свой экземпляр подсистемы, на данный момент это только CSRSS.exe (Windows), в прошлом поддерживались операционные системы OS/2 (os2ss.exe) и POSIX (psxss.exe), но эта идея была неудачной. Самый первый SMSS.exe засыпает в ожидании процесса WinInit.exe. Остальные экземпляры вместо этого создают процесс WinLogon который показывает UI для входа.
WinInit.exe инициализирует подсистемы для создания графической оболочки – Windows Station и десктопы, это не тот рабочий стол который вы видите, это иная концепция Windows. Далее он запускает процессы:
- Services.exe – Services Control Manager (SCM) запускает сервисы и драйвера помеченные как AutoStart. Сервисы запускаются в процессах svchost.exe. Есть утилита tlist.exe, которая запущенная с параметром tlist.exe -s напечатает в консоли имена сервисов в каждом из svchost.exe.
- LSASS.exe – Local System Authority.
- LSM.exe – Local Session Manager.
WinLogon.exe – загружает провайдеры аутентификации (credential providers), которые могут быть password, Smartcard, PIN, Hello Face. Он порождает процесс LogonUI.exe который и показывает пользователю интерфейс для аутентификации, а после валидирует введённые данные (логин и пароль, PIN).
Если всё прошло успешно, то WinLogon запускает процесс указанный в ключе реестра HKLMSOFTWAREMicrosoftWindows NTCurrentVersionWinLogonUserinit. По умолчанию это процесс UserInit.exe, который:
- Запускает скрипты указанные в реестрах:
- HKCUSoftwarePoliciesMicrosoftWindowsSystemScripts
- HKLMSOFTWAREPoliciesMicrosoftWindowsSystemScripts
- Если групповая политика безопасности определяет User Profile Quota, запускает %SystemRoot%System32Proquota.exe
- Запускает оболочку Windows, по умолчанию это Explorer.exe. Этот параметр конфигурируется через реестр:
- HKCUSoftwareMicrosoftWindows NTCurrentVersionWinlogonShell
- HKLMSOFTWAREMicrosoftWindows NTCurrentVersionWinlogonShell
WinLogon уведомляет Network Provider о залогинившемся пользователе, на что тот восстанавливает и подключает системные диски и принтеры сохранённые в реестре. Network Provider представляет из себя файл mpr.dll из системной папки, который хостится в процессе svchost.exe, т.е. сервис Windows.
Дерево процессов выглядит следующим образом, на нём можно увидеть кто и кого создал (показаны не все процессы, может немного отличаться от последний версий Windows).
Где здесь клавиатура?
Во время запуска ядро Windows считывает из реестра информацию о контроллере системной шины, как правило это шина PCI (реже MSI), к ней подключены контроллеры портов ввода-вывода, в том числе и USB, PS/2. Информация о нём записывается во время установки Windows. Система загружает для него драйвер и рекурсивно обходит все порты так же загружая для каждого из них свой драйвер. Драйвера могут комбинироваться в узлы (driver node), к примеру драйвер клавиатуры, будет соединён с драйвером порта PS2. А вот порт USB сложнее — сначала драйвер порта, потом драйвер для работы с протоколом HID и только потом клавиатура.
Каждый порт контроллируется своим чипом, который мониторит подключение, принимает/отправляет сигналы между CPU и устройством. Если чип-сет Южный мост не встроен в CPU, как это часто делают в ноутбуках, а существует отдельным чипом на материнке, то правильней говорить: сигнал между Южным мостом и контроллером порта. Чип контроллирующий порт имеет выделенную линию с контроллером прерываний (PIC или APIC), по которой он может попросить обратить на себя внимание CPU, к примеру считать данные от клавиатуры (порт PS/2, с USB другая история). Поскольку ОС загрузила для порта драйвер, она может отдавать ему команды, читать и отправлять данные. В нашем примере был загружен драйвер из C:WindowsSystem32i8042prt.sys. Давайте вспомним предыдущую статью. В старых компьютерах с PIC на чипе Intel 8259 было 15 линий прерываний, где клавиатура была подключена к ножке IRQ1, таймер IRQ0, а мышка к IRQ12, который на самом деле был пятой ножкой второго чипа 8259, который мультиплексировал свои прерывания через ножку IRQ2 первого контроллера. В современных PIC могут быть 255 контактов для сигналов прерываний. Во время загрузки ОС программирует APIC/PIC возвращать определённое число когда скажем пришло прерывание от порта клавиатуры или USB и по этому номеру CPU находит в таблице векторов прерываний функцию которую надо выполнить. Номер прерываний определяют HAL и Plug’n’Play Manager. Контроллер прерываний ищет сигнал на своих ножках в определённом порядке, к примеру в бесконечном цикле проверяет напряжение на ножках от 1 до MAX_PIN. Этот порядок определяет приоритет, к примеру клавиатура будет замечена раньше мышки, а таймер раньше клавиатуры. Чтобы не зависеть от особенностей работы контроллеров прерываний Windows абстрагирует концепцию IRQ (Interrupt Request) в IRQL (Interrupt Request Level). Будь у контроллера прерываний хоть 15 хоть 255 линий они все будут отображены на 32 IRQL для x86 и 15 IRQL для x64 и IA64.
Что означают приоритеты IRQL:
- High – когда происходит краш системы, обычно это вызов функции KeBugCheckEx.
- Power Fail – не используется. Изначально был придуман для Windows NT.
- Interprocessor Interrupt – нужен отправить запрос другому CPU на мультипроцессорной системе выполнить действие, например обновить TLB cache, system shutdown, system crash (BSOD).
- Clock – нужен чтобы обновлять системные часы, а так же вести статистику сколько времени потоки проводят в режиме пользователя и ядра.
- Profile – используется для real-time clock (local APIC-timer) когда механизм kernel-profiling включен.
- Device 1 … Device N – прерывания от устройств I/O. Во время прерывания данные от клавиатуры, мыши и других устройств считываются в отдельные буфера и сохраняются в объектах типа DPC (Deferred Procedure Call), чтобы обработать их позже и дать возможность устройствам переслать данные. После приоритет снижается до Dispatch DPC
- Dispatch DPC — как только данные от устройств получены можно начинать их обрабатывать.
- APC — Asynchronous Procedure Call. Через этот механизм вы можете исполнить код когда поток будет спать вызвав WaitForSingleObject, Sleep и другие.
- Passive/Low — здесь исполняются все приложения в User Mode.
Если вы всегда программировали в режиме пользователя, то никогда не слышали про IRQL, потому что все пользовательские программы выполняеются с приоритетом Passive/Low (0). Как только происходит событие с большим уровнем приоритета (событие от клавиатуры, таймер планировщика потоков), процессор сохраняет состояние прерванного потока, которое представляет из себя значения регистров CPU, и вызывает диспетчер прерываний (interrupt dispatcher, просто функция), который повышает приоритет IRQL через API KeRaiseIrql в HAL и вызывает непосредственно сам код обработчика (interrupt’s service routine). После этого IRQL CPU понижается до прежнего уровня через функцию KeLowerIrql и прерванный поток начинает обработку с того же места где его прервали. На этом механизме основан планировщик потоков. Он устанавливает таймер, который с определённым интервалом (квант времени) генерирует прерывание с приоритетом DPC/Dispatch (2) и в своей interrupt’s service routine по определённому алгоритму назначает новый поток на исполнение.
Механизм IRQL реализовывается на уровне софта в Hardware Abstraction Layer (HAL.dll), а не железа. В Windows системах есть драйвер шины (bus driver), который определяет наличие устройств подключенных к шинам – PCI, USB и др. и номера прерываний которые могут быть назначены каждому устройству. Драйвер шины сообщает эту информацию Plug and play manager, который уже решает какие номера прерываний назначить каждому устройству. Далее арбитр прерываний внутри PnP Mgr (PnP interrupt arbiter) устанавливает связи между IRQ и IRQL.
Когда приходит прерывание от клавиатуры, любой исполняемый в данный момент поток (это может быть ваша программа) назначается на его обработку. Interrupt dispatcher повышает приоритет IRQL CPU до одного из уровней Device1-DeviceN. После этого менеджер виртуальной памяти не сможет найти страницу если она не загружена в RAM (не сможет обработать Page Fault), планировщик потоков не сможет прервать выполнение, потому что они все работают с меньшим уровнем IRQL. Главная задача драйвера клавиатуры в этот момент считать полученные данные и сохранить их для дальнейшей обработки. Данные записываются в объект типа _DPC (Deferred Procedure Call), который сохраняется в список DPC потока (что-то вроде std::list<DPC>, в ядре ОС вместо массивов используются связанные списки). Как только прерывания от всех внешних устройств обработаны, IRQL потока понижается до уровня DPC в котором и производится обработка отложенных процедур (DPC). В коде обработчика DPC для клавиатуры вызывается функция из драйвера клавиатуры Kbdclass.sys:
VOID KeyboardClassServiceCallback(
_In_ PDEVICE_OBJECT DeviceObject,
_In_ PKEYBOARD_INPUT_DATA InputDataStart,
_In_ PKEYBOARD_INPUT_DATA InputDataEnd,
_Inout_ PULONG InputDataConsumed
);
Так вот, драйвер клавиатуры (kbdclass.sys) получает данные от порта (USB, PS2) через прерывание и записывает их через WriteFile, компонент внутри ядра Windows просыпается, считывает их используя API ReadFile и добавляет в очередь сообщений с клавиатуры. API для работы с файлом могут использоваться для чтения данных с драйверов. С этого момента начинается обработка данных стеком ввода Windows, об этом в следующей статье.
Если у вас есть ПК с PS2 портом и вы умеете пользоваться WinDbg в режиме ядра, то можете легко найти обработчик прерываний клавиатуры напечатав команду !idt, которая выведет на экран всю таблицу векторов прерываний. Прерывание вклинивается в ход выполнения программы, слово вектор здесь подразумевает направление, направление исполнения программы. WinDbg был сделан специально для отладки Windows, самая последняя версия называется WinDbgX. Он имеет текстовый интерфейс, который отпугивает людей привыкших к Visual Studio, однако предоставляет гораздо больше возможностей, в частности исполнение скриптов. Прерывание фиолетового порта PS2 выделено красным. Функция которая его обрабатывает называется I8042KeyboardInterruptService, которая находится в файле i8042prt.sys.
BOOLEAN
I8042KeyboardInterruptService(
IN PKINTERRUPT Interrupt,
IN PVOID Context
);
Routine Description:
This is the interrupt service routine for the keyboard device when
scan code set 1 is in use.
Arguments:
Interrupt - A pointer to the interrupt object for this interrupt.
Context - A pointer to the device object.
Return Value:
Returns TRUE if the interrupt was expected (and therefore processed);
otherwise, FALSE is returned.
Сейчас возникает вопрос, откуда у обработчика прерываний аргумент? Кто его передаёт? Ведь CPU ничего не знает о нём. Если поставите в неё breakpoint, то удивитесь ещё больше увидев несколько функций выше по стеку:
0: kd> kC
# Call Site
00 i8042prt!I8042KeyboardInterruptService
01 nt!KiCallInterruptServiceRoutine
02 nt!KiInterruptSubDispatch
03 nt!KiInterruptDispatch
04 nt!KiIdleLoop
Объяснение здесь простое – это не та функция которая сохранена в регистре IDT процессора. То что вы видите на картинке выше на самом деле объекты типа _KINTERRUPT. В таблице прерываний сохранён специальный ассемблерный код (nt!KiIdleLoop), который знает как найти объект описывающий прерывание в памяти. Что же интересного есть в нём?
- Указатель на объект представляющий драйвер в памяти.
- Указатель на функцию i8042prt!I8042KeyboardInterruptService, которая и вызывает код считывающий данные из порта PS2 через ассемблерную команду IN AL, 0x60 – сохранить значение из порта номер 0x60 в регистре AL.
- Функция dispatcher – ей передаётся указатель функцию из пункта №2 и она вызывает её.
- Состояние регистров CPU. Перед вызовом прерывания состояние CPU будет сохранено сюда, и отсюда же будет восстановлено.
- Приоритет прерывания. Не тот который определяет контроллер прерываний, а тот который Windows считает нужным. Это IRQL (Interrupt Request Level) – абстракция над IRQ.
Как только обработчик прерываний клавиатуры будет вызван, он уведомит драйвер клавиатуры о полученных данных, после чего будет уведомлено ядро ОС, которое обработав данные отправит их дальше по стеку ввода, где они могут быть доставлены приложению, которое на них отреагирует, или перед этим в обработчик языков (азиатские иероглифы, автокоррекция, автозаполнение).
Ядро ОС напрямую не взаимодействует с драйвером клавиатуры, для этих целей используется Plug’n’Play Manager. Этот компонент предоставляет API IoRegisterPlugPlayNotification, который вызовет предоставленную callback-функцию когда устройство будет добавлено или удалено.
Пару слов о USB
Ознакомление с работой порта USB потребовало бы отдельной статьи описывающей его работу и плюс описание обработки данных HID на Windows. Это очень сильно усложнило бы материал, к тому же уже есть хорошие статьи по теме, поэтому PS2 идеальный пример из-за своей простоты.
USB создавался как универсальный порт для всех устройств, будь то клавиатура, фотоаппарат, сканнер, игровой руль с педалями, принтер и пр. Вдобавок он поддерживает вложенность портов – USB материнки => монитор с USB => клавиатура с USB к которой подключена мышка, флешка и USB-hub к которому подключен жёсткий диск. Взглянув на контакты USB 2.0 вы увидите что они не заточены под передачу каких-то определённых данных, как у PS2. Их всего четыре – витая пара для передачи битов данных, плюс и минус питания.
Провода кабеля USB 2.0
USB 3.0 быстрее за счёт дополнительных пяти контактов. Как видите там нету линии CLOCK для синхронизации, поэтому логика передачи данных сложнее. Слева USB 2.0 и справа USB 3.0 для сравнения.
Все данные передаются через протокол HID (Human Interface Device), который описывает форматы, порядок взаимодействия и передачи данных и всё остальное. Стандарт USB 2.0 занимает 650 страниц, документ HID Class Specification, описывающий работу устройств (мыши, клавиатуры и пр) – 97 страниц, их рекомендуется изучить если вы работаете с USB.
Первым делом подключенное устройство должно рассказать о себе, для этого оно отправляет несколько структур данных, в которых указывается ID устройства и ID производителя по которым Plug’n’Play manager может найти в реестре информацию, загрузить и соединить драйвера. USB устройства пассивны, т.е. хост должен сам с определённым интервалом проверять наличие данных. Частота опроса и размер пакета данных задаются в одном из дескрипторов устройства USB. Максимальный размер пакета – 64 байта, что для информации о нажатых клавишах более чем достаточно.
В Windows есть встроенная поддержка HID, она не такая простая как связь драйвера порта PS2 с драйвером клавиатуры, потому что драйвер HID должен уметь обрабатывать все поддерживаемые протоколом сценарии. Вне зависимости от провайдера данных — порты PS2, USB или Remote Desktop или виртуальная машина – на самом верху driver node будет находится Kbdclass, от которого ядро ОС и будет получать информацию. Уведомление о подсоединении клавиатуры будет обрабатываться через Plug’n’Play Manager, так что для ядра Windows не имеет значение какой порт или источник данных от устройства используется.
ч.1 — Основы ОС и компьютера
ч.2 — Как работает материнская плата и клавиатура через порт PS2
Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 23:47, 31 октября 2017.
Расширение файла |
.ini |
---|---|
Тип кода | текстовый файл |
Разработчик | Microsoft Windows |
Начальная версия | 20 November 1985 года; 37 years ago |
Последний релиз |
начиная с Windows 95 замещается Реестром Windows |
Тип формата | текстовый файл |
Содержится | Microsoft Windows |
Открытый формат? | Yes |
ini-файл (англ. Initialization file) — это файл конфигурации, который содержит данные настроек для Microsoft Windows, Microsoft Windows NT и некоторых приложений.
Формат файла «INI» является неофициальным стандартом для файлов конфигурации для некоторых платформ или программного обеспечения. Файлы INI представляют собой простые текстовые файлы с базовой структурой, состоящей из разделов, свойств и значений[Источник 1].
В MS-DOS и 16-разрядных Windows-платформах под Windows ME файл INI служил основным механизмом для настройки операционной системы и установленных функций приложений, таких как драйверы устройств, шрифты, конфигурации запуска и параметры, которые было необходимо инициализировать в Загрузки Windows. Файлы INI также обычно используются приложениями для хранения своих индивидуальных настроек.[Источник 2]
В Windows NT Microsoft представила реестр и начала отучать разработчиков от использования файлов INI для настройки. Все последующие версии Windows использовали системный реестр Windows, а приложения, созданные на платформе .NET Framework, использовали специальные XML-файлы .config. Однако API все еще существуют в Windows, и разработчики все еще могут их использовать.
Имя «INI-файл» происходит от обычно используемого расширения имени файла .INI
, что означает «инициализация». Другими распространенными расширениями файлов инициализации являются .CFG
, .conf
,и .TXT
, особенно «config.txt».
Системы Linux и Unix также используют одинаковый формат файлов для настройки системы. Кроме того, программное обеспечение, ориентированное на платформу, может использовать этот формат для конфигурации. Он удобочитаемый и простой для разбора, поэтому он является удобным форматом для файлов конфигурации, которые не требуют значительно большей сложности.
Содержание
- 1 Формат
- 1.1 Ключи (свойства)
- 1.2 Sections
- 1.3 Нечувствительность к регистру
- 1.4 Комментарии
- 1.5 Различные особенности
- 1.5.1 Пустые строки
- 1.5.2 Комментарии
- 1.5.3 Повторяющиеся имена
- 1.5.4 Глобальные свойства
- 1.5.5 Иерархия
- 1.5.6 Наименование/значение разделителя
- 1.5.7 Цитированные значения
- 1.5.8 Пробелы
- 1.6 Порядок разделов и свойств
- 2 Пример
- 3 Доступ к INI файлам
- 3.1 UNIX
- 4 Отображение файла в память
- 5 Альтернативы
- 6 Источники
Формат
Ключи (свойства)
Основной элемент, содержащийся в ini файл — «ключ» или «значение». Каждый ключ имеет имя и значение, разделенные на знак равенства (=
). Имя отображается слева от знака равенства.
Sections
Ключи могут (но не обязательно) быть сгруппированы в произвольно названные «разделы». Название раздела отображается на отдельной строке в квадратных скобках ([
и ]
). Все ключи после объявления раздела связаны с этим разделом. Нет явного «конца раздела»; разделы заканчиваются в следующей декларации раздела или в конце файла. Разделы не могут быть вложенными.
Нечувствительность к регистру
Имена разделов и свойств не зависят от регистра в Windows[Источник 3].
Комментарии
Точка с запятой (;
) в начале строки означают комментарий. Строки комментариев игнорируются.
Различные особенности
Формат файла INI не достаточно определенный. Многие программы поддерживают функции, выходящие за рамки описанных выше основ. Ниже приведен список некоторых общих функций, которые могут или не могут быть реализованы в любой заданной программе
Пустые строки
Некоторые устаревшие программы не позволяют иметь пустые строки. Поэтому каждая строка должна быть заголовком раздела, свойством или комментарием.
Комментарии
Некоторые программы поддерживают использование знака (#
) в качестве альтернативы точки с запятой для указания комментариев. Практически говоря, использование его для начала строки может эффективно изменить имя переменной в этой строке. Например, следующая строка создает переменную с именем «#var», но не с именем «var»; Это иногда используется для создания псевдореализации комментария.
В более общем плане использование знака числа непредсказуемо, как в следующих строках (обратите внимание на пробел после знака числа во второй строке). По этой причине знак «#» не следует использовать для запуска комментариев.
В некоторых реализациях, комментарий может начинаться в любом месте на линии, в том числе на той же строке после свойства или объявления. В другие, в том числе по WinAPI функция GetPrivateProfileString
, комментариев должна происходить на отдельной линии .
Повторяющиеся имена
Большинство реализаций поддерживают только одно свойство с заданным именем в разделе. Второе вхождение имени свойства может вызвать прерывание, оно может быть проигнорировано (и значение сброшено), или оно может переопределить первый вариант (с отброшенным первым значением). Некоторые программы используют повторяющиеся имена свойств для реализации многозначных свойств.
Интерпретация объявлений с несколькими разделами с одинаковым именем также различается. В некоторых реализациях дублированные разделы просто объединяют свои свойства вместе, как если бы они происходили соприкасаясь. Другие могут прервать или игнорировать некоторые аспекты INI-файла.
Глобальные свойства
Необязательные «глобальные» свойства также могут быть разрешены, которые объявляются перед объявлением любого раздела[Источник 4].
Иерархия
Чаще всего, ini-файлы не имеют иерархии разделов в разделах.
Наименование/значение разделителя
Некоторые реализации допускают использование двоеточия (:
) в качестве разделителя имени / значения (вместо знака равенства).
Цитированные значения
Некоторые реализации позволяют указывать значения, используя двойные кавычки и/или апострофы. Это позволяет явно объявлять пробелы и / или цитирование специальных символов (равно, точка с запятой и т.д.). Стандартная функция Windows GetPrivateProfileString поддерживает это и удаляет кавычки, которые окружают значения.
Пробелы
Интерпретация пробелов различна. Большинство реализаций игнорируют начальные и конечные пробелы вокруг имени свойства. Некоторые даже игнорируют пробелы в значениях (например, эквивалент имен «host name» и «hostname»). В некоторых реализациях также игнорируются начальные и конечные пробелы вокруг значения свойства; Другие считают, что все символы, следующие за знаком равенства (включая пробелы), являются частью значения.
Порядок разделов и свойств
В большинстве случаев порядок свойств в разделе и порядок секций в файле значения не имеет, но реализации могут отличаться.
Пример
Ниже приведен пример файла INI для мнимой программы. Он состоит из двух разделов: один для владельца программного обеспечения и один для подключения базы данных расчета заработной платы. Заметьте, что кто модифицировал последний файл и почему вместо IP-адреса используется DNS имя.
; last modified 1 April 2001 by John Doe [owner] name=John Doe organization=Acme Widgets Inc. [database] ; use IP address in case network name resolution is not working server=192.0.2.62 port=143 file="payroll.dat"
Доступ к INI файлам
В Windows, «API профиль» — это программный интерфейс, используемый для чтения и записи параметров из классических файлов .ini в Windows. Например, функция GetPrivateProfileString извлекает строку из указанного раздела в файле инициализации.
Следующий пример программы на языке C демонстрирует чтение значений свойств из вышеупомянутого образца файла INI (пусть имя файла конфигурации будет dbsettings.ini
).
#include <windows.h> int main(int argc, _TCHAR *argv[]) { _TCHAR dbserver[1000]; int dbport; GetPrivateProfileString("database", "server", "127.0.0.1", dbserver, sizeof(dbserver) / sizeof(dbserver[0]), ".\dbsettings.ini"); dbport = GetPrivateProfileInt("database", "port", 143, ".\dbsettings.ini"); // N.B. WritePrivateProfileInt() does not exist return 0; }
UNIX
В Unix существует множество различных конфигурационных библиотек для доступа к файлам INI. Они часто уже включены в рамки и инструментальные средства. Примеры парсеров INI для UNIX включают iniparserи libconfiniи Elektra Initiative.
Отображение файла в память
Отображение файла в память.[Источник 5] создает сопоставление между файлом INI и реестром. Оно было представлено в Windows NT и Windows 95 в качестве способа перехода от сохранения настроек в классических .ini-файлах к новому реестру Windows. Ловушка отображения файла в памяти Профиля API и, используя параметры из раздела реестра IniFileMapping
, направляет чтение и запись в соответствующие места в реестре.
Используя вышеприведенный пример, можно было бы сделать строковый вызов для извлечения ключа name из раздела owner» из файла настроек, называемого, скажем, dbsettings.ini . Возвращаемое значение должно быть строкой «John Doe»:
GetPrivateProfileString("owner", "name", ... , "c:\programs\oldprogram\dbsettings.ini");
INI сопоставление принимает этот вызов API профиля, игнорирует любой путь в указанном имени файла и проверяет, есть ли ключ реестра, соответствующий имени файла в:
HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NT
CurrentVersionIniFileMapping
Если он существует, он ищет имя записи, соответствующее запрашиваемому разделу. Если запись найдена, INI сопоставление использует ее значение как указатель на другую часть реестра. Затем он ищет запрошенный параметр INI в той части реестра.
Если подходящее имя записи не найдено и есть запись под названием (Default)
, INI сопоставление использует последнее. Таким образом, каждое имя секции не нуждается в отдельной записи.
HKEY_LOCAL_MACHINESoftware…IniFileMappingdbsettings.ini | |
---|---|
(Default) |
@USR:Softwareoldprogsinisettingsall |
database |
USR:Softwareoldprogsinisettingsdb |
Таким образом, в этом случае вызов профиля для раздела [owner] отображается на:
HKEY_CURRENT_USERSoftwareoldprogsinisettingsall | |
---|---|
name |
John Doe |
organization |
Acme Products |
где найденное имя записи « name
» в соответствует запрошенному ключу INI. Значение «John Doe» затем возвращается к вызову Profile. В этом случае префикс @ по умолчанию запрещает какие-либо чтения обращаться к файлу dbsettings.ini на диске. Результатом является то, что любые настройки, не найденные в реестре, не просматриваются в файле INI.
Запись « database
» в реестре не имеет префикса @ для значения; Таким образом, для раздела [database] only сначала выполняются параметры в реестре, а затем параметры в файле dbsettings.ini на диске.
Альтернативы
Начиная с Windows 95, Microsoft начала активно продвигать использование реестра Windows в файле INI. .[Источник 6]Файлы INI обычно ограничены двумя уровнями (разделами и свойствами) и не обрабатывают двоичные данные хорошо
Позднее конфигурационные файлы на основе XML стали популярным выбором для настройки кодировки в текстовых файлах. XML допускает произвольные сложные уровни и вложенность и имеет стандартные механизмы для кодирования двоичных данных.
Совсем недавно, форматы данных сериализации, таких как JSON, TOML и YAML могут служить в качестве формата конфигурации. Эти три альтернативных формата могут встраиваться произвольно, но имеют более мощный синтаксис, чем INI-файл.
Источники
- ↑ Configure an Ini File Item // Microsoft. URL: http://technet.microsoft.com/en-us/library/cc731332.aspx (Дата обращения: 20.05.2017)
- ↑ Windows NT Workstation Resource Kit // Microsoft. URL: https://www.microsoft.com/resources/documentation/windowsnt/4/workstation/reskit/en-us/26_ini.mspx (Дата обращения: 20.05.2017)
- ↑ GetPrivateProfileString function // Microsoft . URL: http://msdn.microsoft.com/en-us/library/ms724353.aspx (Дата обращения: 20.05.2017)
- ↑ INIConfiguration // The Apache Software Foundation. URL: http://msdn.microsoft.com/en-us/library/ms724353.aspx (Дата обращения: 20.05.2017)
- ↑ Windows NT Workstation Resource Kit // Microsoft. URL: http://msdn.microsoft.com/en-us/library/ms724353.aspx (Дата обращения: 20.05.2017)
- ↑ The System Registry 1996г. // Microsoft. URL: https://msdn.microsoft.com/en-us/library/ms970651.aspx (Дата обращения: 20.05.2017)
На чтение 5 мин. Просмотров 985 Опубликовано 01.08.2019
Содержание
- Почему программы используют файлы INI и как их просматривать
- Как открыть и редактировать файлы INI
- Как структурируется INI-файл
- Дополнительная информация о файлах INI
- Как конвертировать файл INI
Почему программы используют файлы INI и как их просматривать
Файл с расширением INI является файлом инициализации Windows. Эти файлы представляют собой обычные текстовые файлы, которые содержат параметры, которые определяют, как должно работать что-то другое, часто программа.
Различные программы имеют свои собственные файлы INI, но все они служат одной и той же цели. CCleaner – один из примеров программы, которая может использовать INI-файл для хранения различных опций, которые программа должна была включить или отключить. Этот конкретный INI-файл хранится под именем ccleaner.ini в папке установки CCleaner, обычно в C: Program Files CCleaner .
Распространенный INI-файл в Windows, называемый desktop.ini , представляет собой скрытый файл, в котором хранится информация о том, как должны выглядеть папки и файлы.
Как открыть и редактировать файлы INI
Обычные пользователи не часто открывают или редактируют файлы INI, но их можно открывать и изменять в любом текстовом редакторе. Если дважды щелкнуть INI-файл, он автоматически откроется в приложении «Блокнот» в Windows.
Смотрите наш список лучших бесплатных текстовых редакторов, чтобы найти альтернативные текстовые редакторы, которые могут открывать файлы INI.
Как структурируется INI-файл
INI-файлы могут содержать ключи (также называемые свойствами ), а некоторые имеют дополнительные разделы для группировки ключей. Ключ должен иметь имя и значение, разделенные знаком равенства, например:
Язык = 1033
Важно понимать, что не все файлы INI работают одинаково, потому что они созданы специально для использования в конкретной программе. Некоторые INI-файлы действительно крошечные (несколько килобайт) с одной или двумя строками информации, а другие могут быть очень длинными (несколько мегабайт) с большим количеством настраиваемых параметров.
В этом примере CCleaner определяет английский язык со значением 1033 . Поэтому, когда открывается CCleaner, он читает INI-файл, чтобы определить, на каком языке отображать текст программы. Хотя для обозначения английского языка используется 1033 , программа также поддерживает и другие языки, что означает, что вы можете изменить его на 1034 , чтобы вместо него использовать испанский.
То же самое можно сказать и о всех других языках, которые поддерживает программное обеспечение, но вы должны просмотреть его документацию, чтобы понять, какие цифры означают другие языки.
Если этот ключ существует в разделе, он может выглядеть так:
[Параметры]
Language = 1033
Этот конкретный пример находится в INI-файле, который использует CCleaner. Вы можете изменить этот INI-файл самостоятельно, чтобы добавить дополнительные параметры в программу, поскольку он ссылается на этот INI-файл, чтобы определить, что должно быть удалено с компьютера. Эта конкретная программа достаточно популярна, так что вы можете загрузить инструмент под названием CCEnhancer, который обновляет INI-файл с множеством различных опций, которые по умолчанию не встроены.
Дополнительная информация о файлах INI
Некоторые файлы INI могут иметь точку с запятой в тексте. Они просто указывают на комментарий, чтобы что-то описать пользователю, если он просматривает INI-файл. Ничто после комментария не интерпретируется программой, которая его использует.
Имена и разделы ключей не чувствительны к регистру, по крайней мере, в Windows. Это означает, что тот же эффект создается в INI-файле, в котором используются заглавные буквы, а в строчных.
Общий файл с именем boot.ini используется в Windows XP для подробного описания конкретного места установки Windows XP. Если проблемы возникают с этим файлом, см. Как восстановить или заменить Boot.ini в Windows XP.
Общий вопрос, касающийся файлов INI, заключается в том, можете ли вы удалять файлы desktop.ini . Хотя это совершенно безопасно, Windows просто заново создаст файл и применит к нему значения по умолчанию. Так, если вы, например, применили пользовательский значок к папке, а затем удалили файл desktop.ini , папка просто вернется к значку по умолчанию.
INI-файлы широко использовались в ранних версиях Windows, прежде чем Microsoft начала поощрять переход к использованию реестра Windows для хранения настроек приложения. Теперь, хотя многие программы все еще используют формат INI, XML используется для той же цели.
Если вы получаете сообщения «Отказано в доступе» при попытке отредактировать INI-файл, это означает, что у вас нет необходимых административных прав для его изменения. Обычно это можно исправить, открыв редактор INI с правами администратора (щелкните его правой кнопкой мыши и выберите запуск от имени администратора). Другой вариант – скопировать файл на рабочий стол, внести в него изменения, а затем вставить этот файл рабочего стола поверх оригинала.
Некоторые другие файлы инициализации, которые вы можете встретить, которые не используют расширение файла INI, являются файлами CFG и CONF. Некоторые программы даже придерживаются TXT.
Как конвертировать файл INI
Нет никакой реальной причины преобразовывать файл INI в другой формат файла. Программа или операционная система, использующая файл, распознает его только под определенным именем и расширением файла, которое использует.
Однако, поскольку файлы INI являются обычными текстовыми файлами, вы можете использовать программу, например Notepad ++, чтобы сохранить ее в другом текстовом формате, таком как HTM/HTML или TXT.