Одно двоичное согласие: POOL_NX_OPTIN

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

Чтобы использовать этот механизм согласия, сделайте следующее:

  • Определите POOL_NX_OPTIN = 1 для всех исходных файлов, на которые вы хотите согласиться. Для этого добавьте следующее определение препроцессора на соответствующую страницу свойств для проекта драйвера:

    C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

  • В подпрограмме DriverEntry (или эквивалентной) включите следующий вызов функции:

    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);

    Этот вызов должен выполняться до того, как драйвер выполняет какие-либо выделения, использующие тип пула NonPagedPool , или выполняет какие-либо вызовы подпрограммы ExInitializeNPagedLookasideList . ExInitializeDriverRuntime — это встроенная функция force, которая может вызываться в Windows 8 или более поздних версиях Windows.

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

Сведения о реализации

POOL_NX_OPTIN работает путем замены NonPagedPool глобальной переменной POOL_TYPE , ExDefaultNonPagedPoolTypeкоторая инициализирована как NonPagedPoolNx (для Windows 8 и более поздних версий Windows) или NonPagedPoolExecute (для более ранних версий Windows). Этот механизм согласия позволяет драйверу в режиме ядра запускаться как в Windows 8, с усиленной защитой пула NX, так и в более ранних версиях Windows, которые не поддерживают пул NX. Макрос, преобразующий экземпляры имени константы NonPagedPool в NonPagedPoolNx , также преобразует экземпляры NonPagedPoolCacheAligned в NonPagedPoolNxCacheAligned.

Поддержка статических библиотек (проекты LIB)

Вы можете использовать механизм POOL_NX_OPTIN согласия для проекта LIB, но проекты, ссылающиеся на lib, обычно также должны использовать POOL_NX_OPTIN. Как минимум проект, реализующий подпрограмму DriverEntry , должен содержать следующий вызов функции:

ExInitializeDriverRuntime(DrvRtPoolNxOptIn);