5. Архитектура Windows
Введение
В этом модуле объясняется архитектура Windows и то, что происходит под капотом процессов и приложений Windows.
Архитектура Windows
Процессор внутри машины, работающей под управлением операционной системы Windows, может работать в двух разных режимах: пользовательском режиме и режиме ядра. Приложения работают в пользовательском режиме, а компоненты операционной системы работают в режиме ядра. Когда приложение хочет выполнить задачу, такую как создание файла, оно не может сделать это самостоятельно. Единственный компонент, который может выполнить задачу, - это ядро, поэтому приложения должны следовать определенному потоку вызова функций. Диаграмма ниже показывает общий уровень этого потока.

- Пользовательские процессы - программа/приложение, запущенное пользователем, такое как Notepad, Google Chrome или Microsoft Word.
- Подсистемные DLL - DLL, которые содержат API-функции, вызываемые пользовательскими процессами. Примером такой DLL может быть
kernel32.dll
, экспортирующая функцию Windows API (WinAPI) CreateFile, другие распространенные подсистемные DLL - этоntdll.dll
,advapi32.dll
иuser32.dll
.
- Ntdll.dll - системная DLL, являющаяся самым низким уровнем, доступным в пользовательском режиме. Это особая DLL, которая создает переход из пользовательского режима в режим ядра. Она часто называется Native API или NTAPI.
- Ядро Executive - это то, что известно как ядро Windows, и оно вызывает другие драйверы и модули, доступные в режиме ядра, для выполнения задач. Частично Windows kernel хранится в файле
ntoskrnl.exe
в папке «C:\Windows\System32».
Поток вызова функций
На изображении ниже показан пример приложения, которое создает файл. Оно начинается с вызова пользовательского приложения функции CreateFile
WinAPI, которая доступна в kernel32.dll
. Kernel32.dll
является критической DLL, которая предоставляет приложениям доступ к WinAPI и поэтому ее можно увидеть загруженной в большинстве приложений. Затем CreateFile
вызывает эквивалентную функцию NTAPI, NtCreateFile
, которая предоставляется через ntdll.dll
. Ntdll.dll
затем выполняет инструкцию сборки sysenter
(x86) или syscall
(x64), которая передает выполнение в режим ядра. Затем используется функция ядра NtCreateFile
, которая вызывает драйверы ядра и мод
ули для выполнения запрошенной задачи.

Пример потока вызова функций
Этот пример показывает поток вызова функций при использовании отладчика. Для этого к отладчику подключается двоичный файл, который создает файл с помощью функции CreateFileW
Windows API.
Пользовательское приложение вызывает функцию CreateFileW
WinAPI.

Прямой вызов Native API (NTAPI)
Важно отметить, что приложения могут прямо вызывать системные вызовы (то есть функции NTDLL) без необходимости использовать Windows API. Windows API просто выступает в качестве оболочки для Native API. Тем не менее, использование Native API сложнее, потому что оно не официально документировано Microsoft. Кроме того, Microsoft рекомендует не использовать функции Native API, так как они могут изменяться в любое время без предупреждения.
В будущих модулях будет рассмотрены преимущества прямого вызова Native API.