Вопрос про PagedPool, я смотрю часто есть код buf=ExAllocatePool(PagedPool,...) memcpy(buf,...); Мне не ясно, а разве между этими вызовами не должен стоять лок чтобы память не скинуло в файл подкачки. И еще. Рано или поздно эта память окажется на харде как мне тады ее подгрузить для работы чтобы не было bsod'a
Если код выполняется на PASSIVE_LEVEL, то система сама позаботится о подгрузке сброшенных в файл подкачки данных. Чтобы не возникло вопросов, что такое PASSIVE_LEVEL, IRQL и т.п. - читайте книжки. Того же Руссиновича. Статьи на васме. И т.п. Вверху тема прикреплена для таких случаев. ЗЫ. Админы, снесите тему.
Сие зависит от уровня прерываний (IRQL), на котором выполняется код. Если уровень достаточно низок (<2), то подгрузка страниц произойдёт прозрачно и ты этого скорее всего даже не заметишь. Если же уровень выше критического (>=2), то возможны два варианта: 1. Страница таки окажется в памяти и ничего плохого не произойдёт. 2. Нужной страницы не окажется в памяти и тогда ядро свалит систему (BSOD), потому что не будет иметь возможности подгрузить недостающие страницы. Короче говоря, запомни простое правило: не обращаться к выгружаемой памяти когда нет уверенности, что код всегда будет выполняться на уровне irql<2. Иногда лучше выделить невыгружаемой памяти побольше, чем рисковать. С другой стороны, иногда имеет смысл перепланировать архитектуру драйвера так, чтобы выгружаемая память использовалась только там, где это безопасно. Всё таки Windows - современная операционная системы, и я очень рад, что мне довелось использовать именно её. Подобные вещи ядро Windows выполняет прозрачно для кода, об этом позаботится обработчик соответствующего прерывания.
Спасибо, прекрасно объяснил. Наконец все встало на свои места. Тему можно закрывать. P.S. Как раз недавно на твой блог заходил, я смотрю ты там не особо часто пишеш _