Поделиться через


Имена и целевые версии Windows в МПП Version-Independent

Во многих случаях API платформы фильтрации Windows (МПП) предоставляет несколько версий функции или структуры.

Большинство имен данных и функций в API МПП заканчиваются номером версии, например "0" или "1", даже если существует только одна версия.

Сопоставление версий в fwpvi.h

Файл заголовка fwpvi.h включается начиная с SDK и WDK для Windows 7. Этот файл заголовка сопоставляет имя API без версии с версией, подходящей для использования с заданной операционной системой.

Например, ниже приведен краткий фрагмент из версии fwpvi.h, включенной в пакет SDK для Windows 8.

#define FwpmNetEventCreateEnumHandle FwpmNetEventCreateEnumHandle0
#if (NTDDI_VERSION >= NTDDI_WIN8)
#define FwpmNetEventEnum FwpmNetEventEnum2
#elif (NTDDI_VERSION >= NTDDI_WIN7)
#define FwpmNetEventEnum FwpmNetEventEnum1
#else
#define FwpmNetEventEnum FwpmNetEventEnum0
#endif

Как показано выше, существует только одна версия FwpmNetEventCreateEnumHandleFwpmNetEventCreateEnumHandle0 — поэтому любой вызов FwpmNetEventCreateEnumHandle всегда будет вызывать FwpmNetEventCreateEnumHandle0независимо от целевой операционной системы.

Однако существует три версии FwpmNetEventEnum: FwpmNetEventEnum0, FwpmNetEventEnum1и FwpmNetEventEnum2. Файл заголовка fwpvi.h гарантирует, что вызов FwpmNetEventEnum вызовет версию, наиболее подходящую для целевой операционной системы:

  • FwpmNetEventEnum2 для Windows 8 (или более поздней версии)
  • FwpmNetEventEnum1 для Windows 7 предназначен
  • FwpmNetEventEnum0 для более ранних операционных систем (таких как Windows Vista или Windows Vista с пакетом обновления 1 (SP1))

Обращение к функциям и структурам Version-Independent

Разработчикам WFP, ориентированным на конкретную операционную систему или версию WDK, рекомендуется всегда использовать макросы, независимые от версий. При этом будет автоматически выбрана последняя версия, поддерживаемая в целевой операционной системе. Рекомендуется использовать самые последние файлы заголовков, даже если используется более ранняя операционная система. Это позволяет постоянно использовать последнюю поддерживаемую версию, а также упростить обслуживание и обновление кода.

Справочная документация по API МПП описывает каждую версию нумерованного API. Если существует несколько версий, отмечается целевая операционная система. Однако разработчики обычно будут вызывать интерфейсы API, не зависящие от версии (без номера), и указывать, для какой операционной системы они предназначены (например, NTDDI_WIN6 для Windows Vista или NTDDI_WIN8 для Windows 8).

Чтобы обеспечить правильную обработку функций, которые принимают различные параметры в разных версиях, можно включить условные блоки, такие как #if (NTDDI_VERSION >= NTDDI_WIN7).