Я не указал, что перед этой ф-цией у него стоит директива:
Код: (C++)
#pragma LOCKEDCODE
чем по идее и обеспечивается невыгружаемость; но, похоже, сути дела это не меняет.На самом деле эта ф-ция, говоря простым языком, – обработчик IOCTL'ов и вызывается, как я понимаю, на уровне PASSIVE_LEVEL.
Т. е. с одной стороны когда управление "проходит" по этому (PAGED_CODE) макросу – IRQL не слишком высокий, но ненадолго повысится вдальнейшем внутри этой ф-ции.
(Похоже что, почти нашёл почти ошибку у самого Они.)
Как я понял по вашим ссылкам, по-умолчанию ф-ция и так размещается в неперемещаемой памяти, если не указывать чего-то вроде:
Код: (C)
#pragma alloc_text(PAGE, DispatchControl)
Правда у меня возникла небольшая параноя:
Если переменная oldirql (в которой сохраняется старый IRQL) объявлена как локальная в этой (DispatchControl) ф-ции (а где бы ей ещё быть?), так вот, если она объявлена как локальная, то может ли так получиться, что на момент вызова
Код: (C++)
KeReleaseSpinLock(..., oldirql);
она (переменная) будет выгружена из памяти?Т. е. сама ф-ция вроде бы помещается в .text который будет гарантированно в невыгружаемой памяти. А есть ли гарантия, что её локальные данные также будут в невыгружаемой памяти? (Ведь на момент вызова KeReleaseSpinLock – IRQL должен быть DISPATCH_LEVEL.)