Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];

Вниз

Список экспортируемых ф-ций   Найти похожие ветки 

 
mcs   (2002-06-27 09:43) [0]

Как получить все экспортируемые ф-ции DLL-ки? Можно ли принудительно выгрузить DLL, зная только имя(или еще Handle)?


 
MBo   (2002-06-27 09:58) [1]

TDump поможет


 
Игорь Шевченко   (2002-06-27 11:20) [2]

mcs © (27.06.02 09:43)

Из своего процесса - можно. Из чужого - труднее, но тоже можно.

А зачем ?


 
Fellomena   (2002-06-27 12:21) [3]

2 Игорь Шевченко © (27.06.02 11:20):
Из своего процесса - можно. Из чужого - труднее, но тоже можно.

А что если в этот чужой процесс внедрить свою DLL и из неё выгрузить ту, что необходимо??? ;)


 
Игорь Шевченко   (2002-06-27 13:47) [4]

Fellomena (27.06.02 12:21)

Дык, гланды тоже можно по-разному вырезать :-)))


 
v0id   (2002-06-27 14:26) [5]

Игорь Шевченко -> И кто там ламер? Ты у всех только спрашиваешь зачем это надо?? Однако, хороший помошник!

mcs -> Как это сделать? Запросто!

На форму брось ListBox и Button.

Пиши:

unit Unit1;

interface

uses
ImageHlp, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function EnumSymbols(SymbolName: PChar; SymbolAddress, SymbolSize: ULONG;
Strings: Pointer): Bool; stdcall;
begin
TStrings(Strings).Add(SymbolName);
Result := True;
end;

function GetImageFunctionList(const FileName: string; Strings: TStrings):
Boolean;

var
Handle: THandle;
hProcess: THandle;
VersionInfo: TOSVersionInfo;
begin
Strings.Clear;
Result := False;

SymSetOptions(SYMOPT_UNDNAME or SYMOPT_DEFERRED_LOADS);

VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
if not GetVersionEx(VersionInfo) then Exit;

if VersionInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS
then hProcess := GetCurrentProcessId
else hProcess := GetCurrentProcess;

if not SymInitialize(hProcess, nil, True) then Exit;
try

Handle := LoadLibrary(PChar(FileName));
if Handle = 0 then Exit;

try


if not SymLoadModule(hProcess, 0, PChar(FileName), nil, Handle, 0)
then Exit;

try
if not SymEnumerateSymbols(hProcess, Handle, EnumSymbols, Strings)
then Exit;
finally
SymUnloadModule(hProcess, Handle);
end;

finally
FreeLibrary(Handle);
end;

finally
SymCleanup(hProcess);
end;

Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not GetImageFunctionList("kernel32.dll", ListBox1.Items) then
Messagebox(0,"Ошибочка вышла","",0);
end;

end.


Как выгрузить DLL? FreeLibrary! В качестве параметра используй GetModuleHandle("имя.dll");

Только почему-то на kernel32.dll у меня не действует.


 
v0id   (2002-06-27 14:28) [6]

... не действует - не выгружается.


 
Digitman   (2002-06-27 15:07) [7]

>v0id

И что же ты понимаешь под "выгрузкой" модуля ? Как это должно, по-твоему, "действовать" ?


 
Игорь Шевченко   (2002-06-27 15:18) [8]

v0id © (27.06.02 14:28)

Кто ламер - рассудит история :-)


 
easy   (2002-06-27 17:57) [9]

...я ламер...


 
v0id   (2002-06-27 18:06) [10]

Digitman -> Выгрузка - освобождение. Я получаю хендл kernel32.dll с помощью GetModuleHandle, а дальше FreeLibrary. Потом смотрю в Process Explorer, но там kernel32 все еще подгружена.


 
Игорь Шевченко   (2002-06-27 18:11) [11]

FreeLibrary находится в kernel32.dll, поэтому она и не выгружается. Из-под себя табуретку выбить не получится.


 
Digitman   (2002-06-27 18:26) [12]

>v0id

Освобождение - чего ??
Ты понимаешь, что , кр.всего прочего и - в первую очередь, для любых разделяемых ресурсов ОС есть понятие "подсчет ссылок" ?


 
mcs   (2002-06-28 23:23) [13]

Спасибо, вроде разобрался


 
Юрий Зотов   (2002-06-30 08:17) [14]

> а дальше FreeLibrary.

К вопросу о ламерстве и загибании пальцев...

FreeLibrary - это НЕ физическая выгрузка DLL. Это всего лишь уведомление системе, что данный процесс в данной DLL более не нуждается. Система при этом декрементирует счетчик ссылок на эту DLL и, если он стал равен нулю, выгружает ее физически. Только при этом условии, не раньше.

Точно так же и LoadLibrary - это НЕ физическая загрузка DLL, а всего лишь запрос на ее использовании. Физически система загрузит ее лишь в том случае, если ее еще никто не использует (счетчик ссылок стал равным единице).

Это если говорить очень упрощенно, потому что на самом деле все намного сложнее (выделение физической памяти, проецирование на адресное пространство, подгрузка страниц и пр. - там целая кухня).

Но с kernel32 даже и это не прокатит. Потому что, если программа скажет, что kernel32 ей больше не нужна, а система вдруг ее сдуру послушает и снимет проекцию, то эта самая программа тут же и умрет. Первая. Потому что без kernel32 она работать просто не сможет. А система это прекрасно понимает, поскольку она совсем не такая идиотка, какой ее почему-то часто пытаются представить разные "масдайщики".

Вот такие пироги. Извините, но если человек вслух заявляет, что он не ламер, то базовые вещи ему положено знать и понимать.


 
Cobalt   (2002-07-01 09:49) [15]

Хотел бы высказать свою точку зрения на "проблему выгрузки kernel32". Может быть дело в том, что она прилинкована статически? Или FreeLibrary такая умная, что проверяет, что ей суют.
Кстати, попробуйте прилинковать свою ДЛЛ-ку статически и выгрузить её. И сообщите, получилось ли?


 
Игорь Шевченко   (2002-07-01 10:46) [16]

Cobalt © (01.07.02 09:49)


> Кстати, попробуйте прилинковать свою ДЛЛ-ку статически и
> выгрузить её. И сообщите, получилось ли?


Пробовали - получалось. Но зачем?


 
Alx2   (2002-07-01 10:58) [17]

>v0id © (27.06.02 14:26)

Плагиатствуем, батенька?

Приведенный Вами код полностью соответствует
http://delphibase.endimus.com/?action=viewfunc&topic=filedll&id=10062

Там же сказано: "© Mystic"


 
@andrew   (2002-07-01 13:07) [18]

Ну хорошо, не хочется делать LoadLibrary: могу я получить список экпортируемых функций?


 
@andrew   (2002-07-01 13:16) [19]

В том смысле, что в приведенном на http://delphibase.endimus.com/?action=viewfunc&topic=filedll&id=10062 коде для выполнения функции необходимо DLL-ку подгрузить, а я вообще не хочу, чтобы начинал работать хоть какой-нибудь код DLL-ки.


 
Игорь Шевченко   (2002-07-01 13:17) [20]

@andrew © (01.07.02 13:07)


> Ну хорошо, не хочется делать LoadLibrary: могу я получить
> список экпортируемых функций?


tdump, очевидно, стоит запустить. Или, прочитав статью Matt Pietrek в MSDN, написать его аналог :-)


 
@andrew   (2002-07-01 13:26) [21]

>Игорь Шевченко
Сенкс. Попробую почитатью. Если честно, то проблема в том, что мне надо, чтобы эта "прога-возвращалка экп. функций" работала под Unix, т.е. запускать Windows-only DLL-ки не катит.


 
Игорь Шевченко   (2002-07-01 14:25) [22]

@andrew © (01.07.02 13:26)

Для unix - IDA. Или еще масса аналогов



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.008 c
14-3566
tovSuhov
2002-08-05 16:19
2002.09.02
Посоветуйте компонент...


1-3366
multik
2002-08-21 22:14
2002.09.02
сравнение значков


14-3597
VictorT
2002-05-27 13:31
2002.09.02
Раз пошла такая пьянка, то может и львовянам стрелкануться?


1-3516
TBeginner
2002-08-21 14:20
2002.09.02
Class


1-3452
kserg@ukr.net
2002-08-20 16:34
2002.09.02
Работа с файлом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский