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

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

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

ru
Offline Offline

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

Ну ты блин спросил.
Из вопроса сразу становится ясно, что стандартный механизм тебе не подходит, так как он создает поддерживаемую файлом секцию (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