Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: LoadLibrary  (Прочитано 15416 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Dr_Michael
Гость
« : 05-11-2003 07:04 » 

Помогите, как загрузить  dll в NonPagedMemory и поставит от туда функцию на обработку прерывания
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 05-11-2003 07:43 » new

Ну ты блин спросил.
Из вопроса сразу становится ясно, что стандартный механизм тебе не подходит, так как он создает поддерживаемую файлом секцию (backed by the file).
Но можно выкрутится так- надо заблокировать страницы с кодом и данными в памяти, запретив убирать их из рабочего набора.
Тут два варианта- первый, если тебе надо загрузить dll из режима ядра, и второй, если dll уже загружена в юзерском процессе, но тебе надо заблокировать страницы в памяти.
В первом случае я бы попытался сделать так. Создать свой драйвер, к которому прилинковать эту dll, это вызовет загрузку этой dll при загрузке драйвера. По другому загрузить dll в режиме ядра будет трудно- этот процесс недокументирован, нет аналога LoadLibrary. В этом деле тебе поможет статья http://www.wd-3.com/archive/KernelDlls.htm  . Далее тебе надо или получить виртуальные адреса по которому загружена dll и заблокировать их при помощи MmProbeAndLockPages, или вызвать MmLockPagableCodeSection с любым адресом, принадлежащем загруженной dll- это может быть адрес любой ф-ции из dll, я не пробовал применять эту ф-цию для dll скомпилированных без специальных директив компилятора, отвечающих за размещение кода на страницах, но думаю что сработает.
Во втором случае тебе придется заблокировать страницы юзерского пространства, тут я не могу подсказать что либо конкретное- можешь почитать статью http://www.osronline.com/article.cfm?id=39  , но не знаю насколько это тебе поможет, у тебя все-таки код отображается, там могут быть относительные адреса к другим модулям, но в таком случае нельзя использовать такие ф-ции для обработки прерывания- оно в контексте любого процесса происходит. Да и Win32 вызывать из режима ядра нельзя. Этот метод не очень подходит.

На обработку прерывания регистрирую ф-ции при помощи IoConnectInterrupt.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 05-11-2003 07:57 » 

Проверь вот что- если ты грузишь dll из ядра, за счет линковки с драйвером,- может она сразу как nonpaged загрузится, так происходит с драйверами, если не было явно указано, что часть кода надо как pageable делать.
Записан
Dr_Michael
Гость
« Ответ #3 : 05-11-2003 08:08 » 

проблема в том что что dll нельзя приклееть к драйверу
дрв должен загружать и выгружать её по команде юзера
dll задаёт юзер
моя задача брать из неё мат.функ. и цеплять её на обработку прерывания
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #4 : 05-11-2003 11:07 » 

Вот что я нашел- функция ZwSetSystemInformation(NtSetSystemInformation) может загружать модули в пространство ядра в контексте вызвавшего процесса(но если загрузит в пространство ядра, то от переключений контекста доступность модуля зависеть не будет) и вызывать входную ф-цию. Для этого надо использовать информационный класс SystemLoadAndCallImage. Описание этой ф-ции и форматы структур есть в книге "Native API", которая есть в разделе "книги" этого сайта. Только там описание для юзер мода, но ф-ция экспортируется ядром и работать должна точно также- юзер модовская ф-ция просто переводит систему в режим ядра и вызывает ф-цию из ядра.
То есть ты можешь как из ядра так и из юзерского процесса загрузить dll, но лучше наверно из ядра, то есть драйвера, попробовать.
 Думаю для вызова этой ф-ции из пользовательского процесса, необходимо, чтобы процесс выполнялся с привилегиями админа, так как ф-ция выполняет действие по своим последствиям аналогичное загрузке драйвера.
Записан
Dr_Michael
Гость
« Ответ #5 : 09-11-2003 17:07 » 

а как земенит ф-цию GetAddress, тоесть ныйти точки входа в функции юзера,
и ещё а где взять ntdll.h c описаними native api
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #6 : 09-11-2003 17:40 » 

Цитата

а где взять ntdll.h c описаними native api

Сам файл в DDK, а описание - у нас на сайте книжка есть - раздел ФАЙЛЫ/Книги.
Записан

А птичку нашу прошу не обижать!!!
Dr_Michael
Гость
« Ответ #7 : 09-11-2003 19:19 » 

в NTDDK есть ntdll.lib x2 а ntdll.h нету!
ddk  взято с этого сайта
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #8 : 10-11-2003 06:04 » 

Цитата

в NTDDK есть ntdll.lib x2 а ntdll.h нету!
ddk взято с этого сайта


Напиши сам определения- в книге есть. Сделай свой .h файл. Или набери ntdll.h в Google.com.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #9 : 10-11-2003 12:22 » 

Dr_Michael, это как это....?
SlavaI, разве h  файла нет???
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #10 : 10-11-2003 12:27 » 

Цитата

SlavaI, разве h файла нет???


Нет его вроде. ntddk есть, а ntdll.h вроде бы не было никогда. Этот файл обычно делают сами или из инета скачивают. Там недокументированные ф-ции и структуры содержатся. Но можно и самому сделать, все структуры и ф-ции в книге есть.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #11 : 10-11-2003 13:12 » 

Интересненько Улыбаюсь
Буду иметь ввиду, а я как-то не обращал на это внимание. :oops:
Записан

А птичку нашу прошу не обижать!!!
Dr_Michael
Гость
« Ответ #12 : 10-11-2003 22:43 » 

извеняюсь за дурной вопрос но
я написал этот .h фаил
inlude его
сказал линкеру чтоб цеплял ntdll.lib
а он нинаходит ни одной ф-ции
только матерится
прототипы взял с http://undocumented.ntinternals.net
плз если есть скине какой нибудь пример который вызывает native api
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #13 : 11-11-2003 14:18 » 

Ну посмотри на сайте www.sysinternals.com исходники утилит всяких. Только там обычно получают адрес ф-ции через GetProcAddress, можешь и так сделать.
Записан
Dr_Michael
Гость
« Ответ #14 : 11-11-2003 18:10 » 

спасибо за ответы
проблема была в том что надо было дописывать extern "C"
перед прототипами а то компилятор добавлял свой суфикс к именам ф-ций
кстати для загрузки нашел LdrLoadDll (это так вдруг кому ещё понадобится)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines