а вот например начиная с w8 driver verifier также содержит часть кода во внешнем драйвере VerifierExt.sys. Я понятия не имею зачем было так сделано - никакого механизма plugins в driver verifier по прежнему не предусмотрено и имя VerifierExt.sys жестко прошито в ntoskrnl.exe
Соотв-но интересен интерфейс сопряжения между этим драйвером и ядром
Например таблицы ф-ций driver verifierа в ядре имеют примерно такой формат:
struct THUNK_ITEM
{
const char *func_name;
PVOID verifier_thunk;
PVOID unknown;
ULONG index;
PVOID *original_func;
};
Здесь интерес представляют три поля
- verifier_thunk - это собственно указатель на ф-цию, производящую разнообразные проверки параметров, уровень Irql и так далее
- original_func - указатель на указатель на оригинальную ф-цию, перехват которой осуществлен driver verifier
- index - просто некое уникальное число
Драйвер VerifierExt.sys помимо всякого предоставляет экспортируемую ф-цию
GetXdvDDIWrappers, которая возвращает примерно такую структуру:
struct ddi_wrappers
{
DWORD version; // равен 4, что проверяется в ф-ции ViXdvBindXdvDDIWrappers
DWORD tab_size;
PVOID wrappers[
tab_size];
};
Соотв-но связь между указателем на ф-цию верификации в wrappers и
набором THUNK_ITEM в ядре происходит по полю THUNK_ITEM.index
Например ф-ция валидации ExCreateCallback лежит по индексу 24 в массиве wrappers. Она же имеет index 24 в
VfXdvThunks
Список ф-ций из VerifierExt.sys: