Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2009, 19:17   #1
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию Есть ли у LoadLibrary и FreeLibrary побочный эффект?

Такой вопросец: допустим при старте ОС загружается "kernel32.dll", и я могу добраться до её функций с помощью GetModuleHandle и GetProcAddress.

Но вот есть некая стандартная dll, и неизвестно - загруженна она в память или нет. Почему-то мне помнится (а откуда - непомнится), что вызов LoadLibrary приводит к:
- Загрузке библиотеки, если она не загружена
- А если загружена - побочного эффекта (перезагрузки) не происходит.

А FreeLibrary:
- Если ни один процесс не использует бтблтотеку, она выгружается
- Если ещё кто-то использует - то нет. Опять же без побочного эффекта.

Это так? Память не утекает? Можно не делать проверку на наличие в памяти модуля?
BaronTreep вне форума Ответить с цитированием
Старый 23.08.2009, 19:34   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от BaronTreep Посмотреть сообщение
Но вот есть некая стандартная dll, и неизвестно - загруженна она в память или нет. Почему-то мне помнится (а откуда - непомнится), что вызов LoadLibrary приводит к:
- Загрузке библиотеки, если она не загружена
- А если загружена - побочного эффекта (перезагрузки) не происходит.
не происходит


Цитата:
Сообщение от BaronTreep Посмотреть сообщение
А FreeLibrary:
- Если ни один процесс не использует бтблтотеку, она выгружается
- Если ещё кто-то использует - то нет. Опять же без побочного эффекта.
библиотека выгружается из памяти текущего процесса, память других процессов не изменяется и они даже ничего не узнают об этом.
rpy3uH вне форума Ответить с цитированием
Старый 23.08.2009, 19:39   #3
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Ага, там вроде счётчик какой-то есть, который считает число пользователей библиотеки.
Тогда ещё такая проблема: есть адекватный указатель на процедуру PROC ли FARPROC и я знаю сколько аргументов, и какого типа принимает API функция, как сделать call?
BaronTreep вне форума Ответить с цитированием
Старый 23.08.2009, 19:56   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от BaronTreep Посмотреть сообщение
Ага, там вроде счётчик какой-то есть, который считает число пользователей библиотеки.
ну да, счётчик есть. сначала библиотека подгружается куда-то в общую память и делается проекция на память нужного нам процесса, ведётся счётчик пользователей библиотеки. как только число пользователей обнулится библиотека будет выгружена из этой общей памяти (так же после этого DLL файл можно будет удалить или модифицировать, ведь до полной выгрузки его нельзя изменить).

Цитата:
Сообщение от BaronTreep Посмотреть сообщение
Тогда ещё такая проблема: есть адекватный указатель на процедуру PROC ли FARPROC и я знаю сколько аргументов, и какого типа принимает API функция, как сделать call?
ну это все знают.
push param3
push param2
push param1
call adres
порядок аргументов зависит от типа вызова, в 99% случаев это stdcall, параметры наоборот.

Последний раз редактировалось rpy3uH; 23.08.2009 в 19:59.
rpy3uH вне форума Ответить с цитированием
Старый 23.08.2009, 20:03   #5
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Цитата:
ну это все знают.
В смысле - кроме меня?

Можно и так, как я понял:
Код:
(*fun_handle)(0, "Вызов MessageBoxA", "!!!", MB_OK);
Чтобы за порядком аргументов не следить.

И, раз вы тут, можно ещё вопрос - кроме инфы из справочника, нет больше способов узнать сколько и какого типа аргументы принимает функция? (Вроде нет, но IDA, к примеру, устанавливает это число).

Последний раз редактировалось BaronTreep; 23.08.2009 в 20:06.
BaronTreep вне форума Ответить с цитированием
Старый 23.08.2009, 20:52   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

количество параметров можно определить по первых и последний командам функции (например, по команде retn, по моему IDA так и определяет), тип параметров можно определить только исследовав сам код функции.
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
преобразование переменной AnsiString в PAnsiChar для использования в процедуре loadlibrary The Best Общие вопросы Delphi 2 12.07.2009 20:42
Эффект бегущей единицы OLV_Nikon Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 21.11.2008 09:10
Эффект пулемета Titan123 Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 13.10.2008 13:46
Эффект нажатия SeregaIRK Общие вопросы Delphi 2 17.09.2008 17:47