Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1362413371
Хыхы
2013-03-04 20:09
2013.07.28
Определить окно с которым работает пользователь.


15-1362508639
jack128_
2013-03-05 22:37
2013.07.28
Почему в дельфи не шаблоны, а дженерики?


15-1362568388
Хыхы
2013-03-06 15:13
2013.07.28
Как быстро скопировать массив в другой?


2-1354195227
ankazh
2012-11-29 17:20
2013.07.28
RichEdit и БД


3-1291295803
svb
2010-12-02 16:16
2013.07.28
Одна таблица или много маленьких





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский