Одно двоичное согласие: 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);