Вопрос. Что будет, если к драйверу NT (ring0) прилинковать юзерскую DLL (с сишным start-up'ом) и вызвать ее функцию. DLL депендится только от kernel32.dll.
А то задача стоит — синхронно (ну назовем это так :) с постунлением строки из COM-порта, от одного девайса, запустить другой девайс, для которого есть драйаер (.sys), но к этому драйверу только интерфейс через юзерскую dll'ку (там у нее DeviceIoControl).
В принципе, я могу и реверснуть dll'ку, но может как-то можно не через проход :)?
Или мож кто кинет линк на тематический форум :) по теме nt-дравов.
F>Вопрос. Что будет, если к драйверу NT (ring0) прилинковать юзерскую DLL (с сишным start-up'ом) и вызвать ее функцию. DLL депендится только от kernel32.dll.
Что будет, не знаю, но то, что ничего хорошего это я тебе гарантирую.
F>А то задача стоит — синхронно (ну назовем это так с постунлением строки из COM-порта, от одного девайса, запустить другой девайс, для которого есть драйаер (.sys), но к этому драйверу только интерфейс через юзерскую dll'ку (там у нее DeviceIoControl).
F>В принципе, я могу и реверснуть dll'ку, но может как-то можно не через проход ?
Есть еще один метод: пишешь сервис, котырый сидит и ждет какого-то event. Этот event будет возбуждаться драйвером. По которому сервис запрашивает у драйвера класс необходимы тому информации, и соответственно возвращает ее. (Штука в том, что сервис это вообщем-то обычная user-mode программа, но он может работать даже в том случае, когда пользователь еще не вошел в систему.)
F>>В принципе, я могу и реверснуть dll'ку, но может как-то можно не через проход :)?
LD>Есть еще один метод: пишешь сервис, котырый сидит и ждет какого-то event. Этот event будет возбуждаться драйвером. По которому сервис запрашивает у драйвера класс необходимы тому информации, и соответственно возвращает ее. (Штука в том, что сервис это вообщем-то обычная user-mode программа, но он может работать даже в том случае, когда пользователь еще не вошел в систему.)
Да с event'ами можно и просто сидеть в ring3 (и COM там обрабатывать). Только по некоторым данным рассогласование между установкой event'а и реакцией на него в ring3 (возвращением из WaitForXxx) проходит от 1 до 68 мс (тред был TIME_CRITICAL). Что не очень в моей задаче подходит (ладно было б именно 68, а тут такой интервал). Поэтому и хочеться в ring0 оставаться.
F>Да с event'ами можно и просто сидеть в ring3 (и COM там обрабатывать). Только по некоторым данным рассогласование между установкой event'а и реакцией на него в ring3 (возвращением из WaitForXxx) проходит от 1 до 68 мс (тред был TIME_CRITICAL). Что не очень в моей задаче подходит (ладно было б именно 68, а тут такой интервал). Поэтому и хочеться в ring0 оставаться.
Если честно, не знал, что там настолько большой time-out.
F>Или вы думаете иначе? Хотелось бы узнать мнение.
Даже не знаю, что и сказать. Похоже действительно ваша задача решается через какой-нибудь проход.
Здравствуйте Frostbitten, Вы писали:
F>Вопрос. Что будет, если к драйверу NT (ring0) прилинковать юзерскую DLL (с сишным start-up'ом) и вызвать ее функцию. DLL депендится только от kernel32.dll.
DLL своя? почему бы ее не переписать с использованием только ntdll.dll. А то первый специфичный Win32-вызов, первое поползновение в сторону CSRSS — и будете BSOD наблюдать.
Если не удастся — уже смотреть надо, что именно там вызывается. Принципиального запрета просто загрузить образ kernel32.dll в режиме ядра нет. И даже ntdll.dll там доступна, с которой kernel32.dll слинкован. Хотя, это даже не по лезвию бритвы ходьба, а еще хуже, ручной работы столько, что проще будет переписать все на ntdll.dll, придется проверять, насколько безопасен вызов функций, которые будут использоваться.
F>А то задача стоит — синхронно (ну назовем это так с постунлением строки из COM-порта, от одного девайса, запустить другой девайс, для которого есть драйаер (.sys), но к этому драйверу только интерфейс через юзерскую dll'ку (там у нее DeviceIoControl).
Ну так ZwDeviceIoControlFile есть. Или сразу IRP кинуть. А можно и вообще процесс самому создать, прямо из ядра. Опять же если осторожно.
F>В принципе, я могу и реверснуть dll'ку, но может как-то можно не через проход ?
F>Или мож кто кинет линк на тематический форум по теме nt-дравов.
V>DLL своя? почему бы ее не переписать с использованием только ntdll.dll. А то первый специфичный Win32-вызов, первое поползновение в сторону CSRSS — и будете BSOD наблюдать.
Если бы своя! :(. К сожаление проблемма как раз в этом и состоит, что ни интерфейс драйвера (какие IRP и как обрабатывает), ни даже исходный код dll производитель открывать отказывается. Поэтому приходиться думать.
V>Если не удастся — уже смотреть надо, что именно там вызывается...
Да что там только не вызывается от LCMapString и GetEnvironmentString (понятно откуда) до HeapAlloc... В принципе dll'ка сама по себе навороченная :(, придется по частям дергать. Потому вопрос: вообще если вызвать юзерскую функцию, кот. предусматривает переключение в режим ядра уже из ядра (тотже DeviceIoControl) сразу будет BSOD или it depends.
Я понимаю, что лучший способ — это взять и попробывать :), но может кто уже топтался по этим граблям...
F>>Или мож кто кинет линк на тематический форум :) по теме nt-дравов. V>Все линки давно уже на гуглах/яндексах есть.
%)
Re: DLL'ка из ring0 ?
От:
Аноним
Дата:
07.08.02 04:51
Оценка:
У тебя ничего неполучится, длл должна быть слинкована как native, можешь сдеать из длл либину и вызывать ее функции но ты должен быть уверен что там нет критичных апи-вызовов, с другой стороны вызванные функции в любом случае выполнятся в кернеле — юзер моде (ринг 3) будет недоступен. Возможно это тебя устроит, а может нет :)
F>Или мож кто кинет линк на тематический форум :) по теме nt-дравов.