Народ, кто шарит в дровах...
Проблемка возникла такая: есть драйвер, в нем тело одной функции может изменяться во время работы драйвера, а перезапускать его нельзя (сам драйвер — легаси).
Получается, что функцию эту надо компилить отдельно от остального драйвера...
А вот во что? В dll? Или можно создать что-то типа библиотеки режима ядра?
И как вызывать эту функцию из драйвера?
З. Ы.: Использую Win DDK.
Здравствуйте, Роланд Бродяга, Вы писали:
РБ>Народ, кто шарит в дровах... РБ>Проблемка возникла такая: есть драйвер, в нем тело одной функции может изменяться во время работы драйвера, а перезапускать его нельзя (сам драйвер — легаси).
Количество вариантов фиксировано? Если да — все варианты в один драйвер.
РБ>Получается, что функцию эту надо компилить отдельно от остального драйвера... РБ>А вот во что? В dll? Или можно создать что-то типа библиотеки режима ядра?
В другой драйвер, сервис или user-mode приложение, а дальше одним из способов обмена данными организовать взаимодействие.
РБ>И как вызывать эту функцию из драйвера?
Зависит от выбранного механизма.
РБ>З. Ы.: Использую Win DDK.
А другого ничего и нет.
Здравствуйте, pva, Вы писали:
pva>Здравствуйте, Роланд Бродяга, Вы писали:
РБ>>Народ, кто шарит в дровах... РБ>>Проблемка возникла такая: есть драйвер, в нем тело одной функции может изменяться во время работы драйвера, а перезапускать его нельзя (сам драйвер — легаси). pva>Количество вариантов фиксировано? Если да — все варианты в один драйвер.
Нет, тело этой функции может быть произвольным.
РБ>>Получается, что функцию эту надо компилить отдельно от остального драйвера... РБ>>А вот во что? В dll? Или можно создать что-то типа библиотеки режима ядра? pva>В другой драйвер, сервис или user-mode приложение, а дальше одним из способов обмена данными организовать взаимодействие.
Критично время выполнения, так что только в режим ядра. Нужно сделать что-то вроде динамически подключаемой библиотеки, чтобы ее бинарник можно было менять когда угодно. Вопрос в том, возможно ли это вообще?
РБ>>И как вызывать эту функцию из драйвера? pva>Зависит от выбранного механизма.
РБ>>З. Ы.: Использую Win DDK. pva>А другого ничего и нет.
Есть такая вещь как как EXPORT DRIVER, но он работает как экспоритуремая DLL юзер моды через LIB, и соответсвенно черет таблицу экспорта, что сразу же накладывает ограничение на перезагруку новой версии. В ядре есть функция аля GetProcAddr, но только она для хала и ядра сделана. Думаю тут можно сделать следующимим методами
1 — как обычный драйвер, вызовы делать через IRP & IoCallDriver
2 — как обычный драйвер, через IRP получить адрес функции и потом уже делать вызовы напрямую
3 — как обычный драйвер, в котором сделать экспортируемую функцию, но без явной привязки, т.е. ее адрес получать динамически, с помощью разбора таблицы экспорта (функцию нахождения экспорта могу выложить если нужно)
Все это дает возможность выгружать дарйвер во время работы основного, и загружать новый.
Т.е. еще один драйвер и функция в нем?
Это вариант, при изменении исходника функции перекомпилить этот драйвер и перезагрузить его.
А можно ли перезагрузить драйвер без перезагрузки ОС? Если да, то как?
Здравствуйте, Роланд Бродяга, Вы писали:
РБ>Т.е. еще один драйвер и функция в нем? РБ>Это вариант, при изменении исходника функции перекомпилить этот драйвер и перезагрузить его. РБ>А можно ли перезагрузить драйвер без перезагрузки ОС? Если да, то как?
РБ>Народ, кто шарит в дровах... РБ>Проблемка возникла такая: есть драйвер, в нем тело одной функции может изменяться во время работы драйвера, а перезапускать его нельзя (сам драйвер — легаси). РБ>Получается, что функцию эту надо компилить отдельно от остального драйвера... РБ>А вот во что? В dll? Или можно создать что-то типа библиотеки режима ядра? РБ>И как вызывать эту функцию из драйвера? РБ>З. Ы.: Использую Win DDK.
Если нужен свой собственный лоадер: ZwCreateSection + ZwMapViewOfSection + самописный GetProcAddress (да хоть тут же на форуме)