Форум: "Прочее";
Текущий архив: 2013.07.28;
Скачать: [xml.tar.bz2];
ВнизВ ProcessExplorer видно,что DLL загружена 2 раза Найти похожие ветки
← →
Pit (2013-03-04 12:13) [0]При просмотре процесса видно, что одна и та же DLL (путь одинаков) загружена 2 раза. Так бывает?
А у меня соответственно отладка не работает в этой DLL...
← →
брат Птибурдукова (2013-03-04 12:16) [1]Так бывает.
← →
Pit (2013-03-04 12:25) [2]а почему так происходит? По идее винда должна понять что грузить одно и тоже два раза бессмысленно и просто увеличить количество ссылок, отправить библиотеке уведомление об аттаче и все такое.. но зачем грузить 2 раза в ВАП процесса?
← →
sniknik © (2013-03-04 13:08) [3]dll hell в действии?
← →
Игорь Шевченко © (2013-03-04 13:15) [4]procmon рулит
← →
O'ShinW © (2013-03-04 13:18) [5]Интересно, причем и "стандартные" программы (IE) так делают
http://www.fotolink.su/v.php?id=e6fef4e8acbe0be3bfed5075c4481e78
а если самому писать
var
H1, H2: THandle;
begin
H1 := LoadLibrary("C:\delphi_Work\dllSMS\SMS_RTK.dll");
H2 := LoadLibrary("C:\delphi_Work\dllSMS\SMS_RTK.dll");
ShowMessageFmt(" %d %d ",[H1, H2]);
то один
← →
Pit (2013-03-04 13:45) [6]
> dll hell в действии?
причем тут dll hell?
> procmon рулит
не понял смысла поста
> причем и "стандартные" программы (IE) так делают
а вот ПОЧЕМУ так происходит?
Ведь действительно, если сделать два раза LoadLibrary - то винда не загрузит библиотеку два раза... Как же в некоторых процессах так выходит?
← →
Игорь Шевченко © (2013-03-04 13:47) [7]
> не понял смысла поста
http://lmgtfy.com/?q=procmon
← →
bems © (2013-03-04 13:52) [8]кажется такое бывает при использовании флажка LOAD_LIBRARY_AS_DATAFILE, или как-то так
← →
Pit (2013-03-04 13:55) [9]
> http://lmgtfy.com/?q=procmon
нахрен мне нужна ссылка на procmon.
Я не понимаю каким образом вопрос о двойной загрузке dll связан с какой-то программой.
Этап размышлений - описываю третий раз. Стандартный способ загрузить DLL - это вроде как LoadLibrary. Но если сделать два раза над одной DLL, то она не будет загружена два раза в ВАП процесса. И это логично, именно так и описывается у того же Рихтера (вроде бы) как это всё работает. А тут я вижу двойную загрузку... Почему так может происходить?
← →
брат Птибурдукова (2013-03-04 13:56) [10]
> bems © (04.03.13 13:52) [8]
В моём случае именно так
← →
sniknik © (2013-03-04 13:59) [11]> причем тут dll hell?
при том, что если правда про 2ю загрузку то это именно оно.
> Я не понимаю каким образом вопрос о двойной загрузке dll связан с какой-то программой.
таким, что загрузка, и отображение могут различаться, нужно "правильные" инструменты использовать.
> А тут я вижу двойную загрузку... Почему так может происходить?
мираж?
← →
Игорь Шевченко © (2013-03-04 14:03) [12]
> Я не понимаю каким образом вопрос о двойной загрузке dll
> связан с какой-то программой.
программа, которая тебе нахрена, показывает, кто, как, когда с какими опциями загружает DLL в адресное пространство процесса.
Впрочем, если тебе интересна не причина, а трындеж - ну продолжай трындеть
← →
Inovet © (2013-03-04 14:34) [13]Подумалл. Не могут ли пути быть внешне одинаковыми, а реально разные? Похоже на что-то неправильное, но мало ли что там в Виндоус сделано для совместимости с кучей копий ДЛЛ в разных папках и подменой путей.
← →
robt (2013-03-04 14:39) [14]для начала надо знать что именно показывает ProcessExplorer :)
например в [5] показан ие порожденный другим ие
а потом уже спорить
← →
брат Птибурдукова (2013-03-04 14:49) [15]
> Inovet © (04.03.13 14:34) [13]
Да можно при желании... Но — не объясняй злым умыслом то, что можно объяснить глупостью ;-)
← →
Pit (2013-03-04 15:34) [16]
> при том, что если правда про 2ю загрузку
правда. тут уже продемонстрировали скриншот, например, из IE
> то это именно оно.
причем тут dll hell?! Это ведь конфликт ВЕРСИЙ. А тут одна и та же DLL, которая лежит по ОДНОМУ ПУТИ (не две версии одной dll с разными путями) грузится два раза в память
> таким, что загрузка, и отображение могут различаться
ты хочешь сказать, что PE неверно определяет путь модуля, который загружен в ВАП процесса?
> программа, которая тебе нахрена, показывает, кто, как, когда
> с какими опциями загружает DLL
Игорь, я должен был сам об этом догадаться? Я бы тогда не задавал вопрос.
Если вы не умеете отвечать без обильного изливания желчи попутно - не пишите просто, пожалуйста, и всё.
← →
Pit (2013-03-04 15:56) [17]воспользовался procmon.
Настроил фильтр по Process Name и Path, чтобы содержала нужную мне DLL.
Так вот в выводе procmon (запущен под админом) я вижу два раза вызов LoadImage, но в описании одинаковый адрес загрузки: Image Base: 0x40e0000
Больше похожих событий не видно. Есть различные: IRP_MJ_CREATE / IRP_MJ_CLOSE / IRP_MJ_CLEANUP / FASTIO_NETWORK_QUERY_OPEN / IRP_MJ_READ / FASTIO_QUERY_INFORMATION
В process explorer же я вижу 2 загруженные DLL, притом у одной Load Address: 0x40E0000
А у второй: 0x48C0000
← →
sniknik © (2013-03-04 16:03) [18]> ты хочешь сказать, что PE неверно определяет путь модуля, который загружен в ВАП процесса?
нет, я хочу сказать, что не верна твоя интерпретация увиденного... ну вот например -> robt (04.03.13 14:39) [14]
← →
Pit (2013-03-04 16:09) [19]
> нет, я хочу сказать, что не верна твоя интерпретация увиденного.
> .
ну может быть.
Я поэтому и задаю вопрос - как это можно объяснить?
← →
Игорь Шевченко © (2013-03-04 16:12) [20]Pit (04.03.13 15:56) [17]
Там много полезной информации выдается, и стек вызовов в момент загрузки
← →
Pit (2013-03-04 17:08) [21]
> Там много полезной информации выдается
не сомневаюсь. Настолько много, что ориентироваться в ней не могу. Я сделал фильтрацию как описал в [17].
Вижу только 2 вызова LoadImage и там, видимо, была загружена DLL, но по одному адресу (то есть, это не двойная загрузка).
А в PE вижу именно две DLL с разными base address.
← →
Игорь Шевченко © (2013-03-04 17:18) [22]А в PE вижу именно две DLL с разными base address.
в PE есть две колонки - заказанный адрес и реальный.
← →
Игорь Шевченко © (2013-03-04 17:24) [23]Собственно, код элементарный
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
LoadLibrary("foobar.dll");
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
LoadLibraryEx("Foobar.dll", 0, LOAD_LIBRARY_AS_DATAFILE);
end;
end.
в PE две DLL, у них разный Base и разный Image Base, для DataFile - 0
← →
Pit (2013-03-04 17:42) [24]ну да, судя по всему bems в [8] был прав. Там у одной DLL стоит Mapping Type: Data и размер маленький.
Только вот в исходниках вызывающего процесса нет никакого LOAD_LIBRARY_AS_DATAFILE. И в исходниках DLL тоже...
Есть мысль, что это связано с COM технологией.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.07.28;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.002 c