Вопрос

Я сталкиваюсь с (возможной) проблемой с DDK (довольно старая версия: 3590) для WinXP 32 бита. Мой драйвер содержит некоторые статические переменные, не интизиализированные (они должны быть назначены в раздел .bs, я полагаю) и некоторые функции в разрезе кабанового кода (помечены #pragma alloc_page (страницей, функционально)). Pageable Code собирается в отдельном объекте. Я обнаружил, что ссылка, похоже, назначает статусу и Pageable Code к той же странице в адресном пространстве ядра (т. Е. Переменная находится в 0xeffcb0a0, и функция находится в 0xeffcb600 - проверена windbg). Статические переменные используются в среде прерывания, поэтому их страницы должны быть заблокированы в памяти. Но если одна и та же страница содержит замену кода, я боюсь, что переменные могут внезапно исчезнуть. Отчеты о карте линкера правильно, что Pageable Code находится в другом разделе (странице «Страница»), но смещение («Base rva + Base») находится в середине страницы, которая содержит статус.

Как я могу заставить линкер / загрузчик назначить отдельные страницы в Pageable Code? Есть ли «#PRAGMA», чтобы заставить отделение выравнивания раздела? Я делаю что-то неправильно?

PS: погрузчик драйверов, безусловно, достаточно умный, чтобы поставить страницу, исходя из переменных, так и из кода из пула из кардана, но поскольку страница содержит переменные, она должна быть записи. Я предпочел бы, чтобы исполняемый код был на странице только для чтения. Неправильные доступа к массиву в режиме ядра, но так сложно отладить ...

PPS: Добавлено 4096 "NOP" S до и после моей функции ... Хорошо, это работает ... ничего лучше предложить?

Это было полезно?

Решение

Поместите глобалы в собственный сегмент данных:

#pragma data_seg("NONPAGE")
// declare your globals here
#pragma data_seg()

источник: MSDN Link на data_seg

По умолчанию ваш раздел будет создан с помощью флагов для чтения / записи, а не загадочными.

Вы можете указать дополнительные параметры раздела:

#pragma comment(linker, "/section:NONPAGE,ERW")

источник: MSDN Link On / раздел

или вы можете разместить варианты линкера в SOURCES файл:

LINKER_FLAGS = $(LINKER_FLAGS) /SECTION:NONPAGE,ERW

Примечание: если вы строите библиотеку, используйте LIBRARIAN_FLAGS вместо

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top