DLL'ка из ring0 ?
От: Frostbitten Россия  
Дата: 06.08.02 09:47
Оценка:
Вопрос. Что будет, если к драйверу NT (ring0) прилинковать юзерскую DLL (с сишным start-up'ом) и вызвать ее функцию. DLL депендится только от kernel32.dll.

А то задача стоит — синхронно (ну назовем это так :) с постунлением строки из COM-порта, от одного девайса, запустить другой девайс, для которого есть драйаер (.sys), но к этому драйверу только интерфейс через юзерскую dll'ку (там у нее DeviceIoControl).

В принципе, я могу и реверснуть dll'ку, но может как-то можно не через проход :)?

Или мож кто кинет линк на тематический форум :) по теме nt-дравов.
Re: DLL'ка из ring0 ?
От: Lonely Dog Россия  
Дата: 06.08.02 10:09
Оценка:
F>Вопрос. Что будет, если к драйверу NT (ring0) прилинковать юзерскую DLL (с сишным start-up'ом) и вызвать ее функцию. DLL депендится только от kernel32.dll.

Что будет, не знаю, но то, что ничего хорошего это я тебе гарантирую.

F>А то задача стоит — синхронно (ну назовем это так с постунлением строки из COM-порта, от одного девайса, запустить другой девайс, для которого есть драйаер (.sys), но к этому драйверу только интерфейс через юзерскую dll'ку (там у нее DeviceIoControl).



F>В принципе, я могу и реверснуть dll'ку, но может как-то можно не через проход ?


Есть еще один метод: пишешь сервис, котырый сидит и ждет какого-то event. Этот event будет возбуждаться драйвером. По которому сервис запрашивает у драйвера класс необходимы тому информации, и соответственно возвращает ее. (Штука в том, что сервис это вообщем-то обычная user-mode программа, но он может работать даже в том случае, когда пользователь еще не вошел в систему.)
Re[2]: DLL'ка из ring0 ?
От: Frostbitten Россия  
Дата: 06.08.02 11:57
Оценка:
F>>В принципе, я могу и реверснуть dll'ку, но может как-то можно не через проход :)?

LD>Есть еще один метод: пишешь сервис, котырый сидит и ждет какого-то event. Этот event будет возбуждаться драйвером. По которому сервис запрашивает у драйвера класс необходимы тому информации, и соответственно возвращает ее. (Штука в том, что сервис это вообщем-то обычная user-mode программа, но он может работать даже в том случае, когда пользователь еще не вошел в систему.)


Да с event'ами можно и просто сидеть в ring3 (и COM там обрабатывать). Только по некоторым данным рассогласование между установкой event'а и реакцией на него в ring3 (возвращением из WaitForXxx) проходит от 1 до 68 мс (тред был TIME_CRITICAL). Что не очень в моей задаче подходит (ладно было б именно 68, а тут такой интервал). Поэтому и хочеться в ring0 оставаться.

Или вы думаете иначе? Хотелось бы узнать мнение.
Re[3]: DLL'ка из ring0 ?
От: Lonely Dog Россия  
Дата: 06.08.02 12:06
Оценка:
F>Да с event'ами можно и просто сидеть в ring3 (и COM там обрабатывать). Только по некоторым данным рассогласование между установкой event'а и реакцией на него в ring3 (возвращением из WaitForXxx) проходит от 1 до 68 мс (тред был TIME_CRITICAL). Что не очень в моей задаче подходит (ладно было б именно 68, а тут такой интервал). Поэтому и хочеться в ring0 оставаться.

Если честно, не знал, что там настолько большой time-out.

F>Или вы думаете иначе? Хотелось бы узнать мнение.


Даже не знаю, что и сказать. Похоже действительно ваша задача решается через какой-нибудь проход.
Re: DLL'ка из ring0 ?
От: vasketsov Россия http://ntprog.by.ru
Дата: 06.08.02 16:33
Оценка:
Здравствуйте 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-дравов.


Все линки давно уже на гуглах/яндексах есть.
Васкецов Сергей
http://registry.km.ru
Re[2]: DLL'ка из ring0 ?
От: Frostbitten Россия  
Дата: 06.08.02 20:41
Оценка:
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-дравов.


http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&group=comp.os.ms-windows.programmer.nt.kernel-mode


Удачи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.