Нужно реализовать аналог GetProcAddress для kernel-mode. Почитал описание pe-формата, набросал код. Нахожу в памяти ntoskrnl.exe, далее в нем ищу PIMAGE_EXPORT_DIRECTORY, нахожу индекс функции по ее имени через AddressOfNames, нахожу ее RVA по индексу через AddressOfFunctions и полученный индекс. Для части функций получаю что-то не то (MyGetProc("Func") != Func). В чем грабли?
Все, откопал. По индексу из таблицы имен нужно еще найти ординал функции, который уже является индексом адреса функции в таблице AddressOfFunctions. В pe.txt этот момент не очень понятно освящался
Начиная с 2000 есть MmGetSystemRoutineAddress, котороя сабж в ядре делает, но только для двух модулей: ntoskrnl и hal.
Самое забавное то, что на практике она не подходит. Часто требуется писать драйвер, совместимый начиная с NT4, где ее как раз и нету!!! Однако В w2k очень много вкусных изменений, которых нету в NT4. Если пишешь совместимый с NT4 драйвер, то их не используешь, что получается очень глупо: на подавляющем количестве случаев драйвер будет работать в w2k и выше... Посему рано или поздно приходишь к динамическому поиску адресов... Правда по началу начал было писать kal.sys (kernel abstraction layer, export driver), но понял что GetProc удобнее