Операция загрузчика набора API

Важно!

Сведения в этом разделе относятся ко всем версиям Windows 10 и более поздним версиям. Здесь мы будем ссылаться на эти версии как "Windows", вызывая все исключения при необходимости.

Наборы API используют поддержку ОС в загрузчике библиотеки, чтобы эффективно внедрить перенаправление пространства имен модуля в процесс привязки библиотеки. Имя контракта набора API используется загрузчиком библиотеки для перенаправления ссылки на целевой двоичный файл узла, который содержит соответствующую реализацию набора API.

Когда загрузчик сталкивается с зависимостью от набора API во время выполнения, загрузчик обращается к данным конфигурации на изображении, чтобы определить двоичный файл узла для набора API. Эти данные конфигурации называются схемой набора API. Схема собирается как свойство ОС, а сопоставление между наборами API и двоичными файлами может отличаться в зависимости от того, какие двоичные файлы включены в данное устройство. Схема позволяет импортированной функции в одном двоичном файле правильно направляться на разных устройствах, даже если имена модулей двоичного узла были переименованы или полностью рефакторингированы на разных устройствах Windows.

Windows поддерживает два стандартных метода использования и интерфейса с наборами API: прямой пересылки и обратной пересылки.

Прямая пересылка

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

Импортированный набор API: api-feature1-l1-1-0.dll

  • Windows PC ->feature1.dll
  • HoloLens ->feature1_holo.dll
  • IoT ->feature1_iot.dll

Так как сопоставления хранятся в пользовательском репозитории данных схемы, это означает, что имя набора API, которое заканчивается .dll не ссылается непосредственно на файл на диске. .dll часть имени набора API является только соглашением, необходимым для загрузчика. Имя набора API больше похоже на псевдоним или виртуальное имя физического DLL-файла. Это делает имя переносимым по всему диапазону устройств Windows.

Обратная переадресация

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

Для обеспечения такой совместимости система пересылки предоставляется на всех устройствах Windows, охватывающих подмножество поверхности API Win32. Эти серверы пересылки используют имена модулей, представленные на компьютерах с Windows, и используют систему набора API для обеспечения совместимости на всех устройствах Windows.

Операция загрузчика выполняется следующим образом:

  1. На устройстве, отличном от компьютера с Windows, загрузчик отображает устаревшую зависимость имени модуля windows, которая отсутствует на устройстве.
  2. Загрузчик находит средство пересылки наборов API для этого модуля и загружает его в память.
  3. Средство пересылки имеет сопоставление для набора API для вызываемой функции.
  4. Загрузчик находит соответствующий двоичный файл узла для данного устройства.

Концептуально сопоставление выглядит следующим образом:

Импортированная БИБЛИОТЕКА DLL: feature1.dll

  • Windows PC ->feature1.dll
  • HoloLens ->feature1.dll пересылки ->api-feature1-l1-1-0.dll ->feature1_holo.dll
  • IoT ->feature1.dll пересылка ->api-feature1-l1-1-0.dll ->feature1_iot.dll

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

Примечание.

Обратная пересылка обеспечивает покрытие только для подмножества поверхности API Win32. Это не позволяет приложениям, предназначенным для настольных версий Windows, работать на всех устройствах с Windows.