Единый двоичный вход: 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 — это встроенная функция, которая может вызываться в 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);