Определение имени dll-файла

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Определение имени dll-файла

Сообщение Qwertiy » 01.04.2012 (Вс) 19:31

Как без .NET из dll узнать её имя файла? Именно имя файла, не assembly name.

Т. е. нужен нативный аналог этого:
Код: Выделить всё
System::Reflection::Assembly::GetExecutingAssembly()->Location

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 02.04.2012 (Пн) 0:49

Qwertiy писал(а):Именно имя файла, не assembly name.

Лол. Windows знать не знает, что такое assembly, единственное, что она знает, это module image.

Получить имя файла легко — GetModuleName.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.04.2012 (Пн) 2:40

Хакер писал(а):Получить имя файла легко — GetModuleName.

А где хендл модуля взять? Если передавать 0 или GetModuleHandleW(0), то получается exe-файл, а мне надо мой dll. Причём, из загружающей его программы я ничего передать не могу, dll должен сам определить своё имя.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 02.04.2012 (Пн) 3:32

Qwertiy писал(а):А где хендл модуля взять?

VB? C/C++? Delphi?

DLL-шке при загрузке передаётся её hModule и DLL-шка должна сохранить у себя это значение, если ей оно в дальнейшем потребуется.

Если это пишется на С/С++, то надо это делать вручную.
Если на VB — всё уже сделано, сохранённое значение можно получить через App.hInstance.
В делфях не знаю как.

Если значение сохранить не судьба в силу каких-то совершенно невероятных причин, то...
Собственно, ответь для себя на вопрос: в адресном пространстве загруженно несколько десятков разных DLL-шек. Имя какой из них нужно получить?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.04.2012 (Пн) 7:42

Хакер писал(а):DLL-шке при загрузке передаётся её hModule и DLL-шка должна сохранить у себя это значение, если ей оно в дальнейшем потребуется.

Си++. Сохранил, теперь всё работает. Спасибо :)

Хакер писал(а):Имя какой из них нужно получить?

Я думал, что выполняющийся код "знает", из какой он взят...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 02.04.2012 (Пн) 7:45

Qwertiy писал(а):Я думал, что выполняющийся код "знает", из какой он взят...

То есть ты считал это врожденным свойством x86-машинного кода?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.04.2012 (Пн) 8:27

Хакер писал(а):То есть ты считал это врожденным свойством x86-машинного кода?

Я считал это врождённым свойством Windows, точнее, что существует некая функция, делающая примерно то же, что и .NET'овская GetExecutingAssembly.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 02.04.2012 (Пн) 8:32

А что именно она должна делать? Успешная формулировка ещё задачи, то есть успешная постановка вопроса сразу даст лучший ответ.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.04.2012 (Пн) 11:08

Хакер писал(а):А что именно она должна делать?

Определять хендл dll'ки, в которой находится та функция, из которой она вызвана :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 02.04.2012 (Пн) 11:11

Qwertiy писал(а):Определять хендл dll'ки, в которой находится та функция, из которой она вызвана

Та = функция, а она = кто?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.04.2012 (Пн) 20:13

Хакер писал(а):Та = функция, а она = кто?

Ты издеваешься что ли :lol:
Я же даже пример показал того, о чём думал. Только хендл вместо сборки.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 03.04.2012 (Вт) 3:58

Qwertiy писал(а):Ты издеваешься что ли :lol:

Абсолютно нет.

Qwertiy писал(а):Я же даже пример показал того, о чём думал. Только хендл вместо сборки.

Понятие сборка — такое же дотнетспецифичное, как понятие EpiProject у VB6.
Windows знать не хочет и не оперирует таким понятиями: ни понятием сборка, ни понятием EpiPrject.

Windows оперирует понятием «executable image» или «module».
Теперь ты спрашиваешь: есть некая функция и есть некий модуль. Нужно, чтобы эта функция получила имя этого модуля.
Решить эту задачу никак нельзя, пока ты со всей строгостью не скажешь, какая связь между этой функцией и этим модулем присутствует. Ведь функций может быть сто тысяч, и модулей может быть сотня. Имя какого из ста модулей должна возвращать каждая из ста тысяч функций. Очевидно же, что не любого, а какого-то определённого спецификой задачи.

Вот ты должен с математической строгостью определить взаимосвязь. Я то знаю, какую примерно взаимосвязь ты хочешь. Но важно, чтобы именно ты высказал. Потому что сразу увидишь проблемы, которые сейчас не видишь. Концептуальные.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.04.2012 (Вт) 7:43

Хакер писал(а):какая связь между этой функцией и этим модулем присутствует

Между вызывающей функцией и модулем - она в нём находится.
Между вызываемой функцией и модулем - никакой.
Возможная проблема - вызываемая функция не имеет непосредственной связи с модулем. Возможное решение - использование адреса возврата из стека.
Других проблем пока не вижу.

К тому же, передав 0, я получаю exe'шник. Не вижу концептуальных проблем, что мешает получить dll'ку примерно таким же образом.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10
Откуда: Санкт-Петербург

Re: Определение имени dll-файла

Сообщение VBTerminator » 03.04.2012 (Вт) 8:14

Хакер писал(а):а она = кто?

Как я понял, когда выполнение передаётся в какую-то функцию его библиотеки, этой функции надо узнать имя файла, в котором она была объявлена.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.04.2012 (Вт) 8:35

VBTerminator писал(а):Как я понял, когда выполнение передаётся в какую-то функцию его библиотеки, этой функции надо узнать имя файла, в котором она была объявлена.

Было надо :) Это уже сделано и работает.
Теперь тут обсуждается, почему нельзя получить хендл этой библиотеки вызовом какой-нибудь winapi-функции, а надо его сохранять сразу :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 03.04.2012 (Вт) 8:54

Qwertiy писал(а):Между вызывающей функцией и модулем - она в нём находится.

Между вызываемой функцией и модулем - никакой.[/quote]

Речь идёт о твоей функции или о гипотетической системной? Системная, насколько я помню, такая тоже была, правда из PSAPI или ImageHelp (непомню, откуда и как называлась).

Вот видишь, теперь уже всё стало ясно (не на уровне догадок, а на уровне изложенного факта).


Если ты хочешь написать сам функцию, которая определяет имя модуля, которым принадлежат её инструкции. То это просто. Инструкция может получить свой собственный адрес? Может. Теперь уже по адресу инструкции нужно получить адрес модуля. Это можно сделать двумя путями. Округлить адрес вниз на 64k и проверить, является ли это началом модуля (если нет, отнимать 64k до тех пор, пока это не будет началом). Второй способ заключается в том, чтобы перечислить все модули и смотреть, какому принадлежит полученный адрес.

Если ты хочешь написать сам функцию, которая определяет имя модуля, которому принадлежит вызывающая сторона, то ты сам уже сказал:
Qwertiy писал(а):Возможное решение - использование адреса возврата из стека.


Если тебя интересует, почему такой функции нет. То она во-первых насколько я помню есть. Но лучше бы её не было, потому что такое решение не соответствует принципу лени (не нужно вычислять/получать то, что когда-то раньше уже было вычислено или известно), а во-вторых — это принципиально порочная практика. Программа должна всегда знать, что в точности она хочет получить, а не уповать на то, что получится.

Если какой-то код хочет получить имя модуля, значит он должен знать хендл модуля. И хендл модуля он должен получить от системы тогда, когда она загружает модуль. В противном случае, может быть код вообще живёт НЕ в модуле. Для ситуации, когда код есть, а модуля нет, система должна быть спроектирована так, что в такой ситуации и получить имя/хендл модуля нельзя. Система спроектированна так. Блестящее решение.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.04.2012 (Вт) 13:51

Хакер писал(а):Вот видишь, теперь уже всё стало ясно (не на уровне догадок, а на уровне изложенного факта).

А что из этого было не ясно раньше?

Хакер писал(а):То она во-первых насколько я помню есть.

:mrgreen:

Хакер писал(а):Для ситуации, когда код есть, а модуля нет, система должна быть спроектирована так, что в такой ситуации и получить имя/хендл модуля нельзя. Система спроектированна так.

Ну представим такую ситуацию. Присваивание выполнено не будет, поэтому в переменной будет лежать 0. Что тут хорошего?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 03.04.2012 (Вт) 14:08

Qwertiy писал(а):А что из этого было не ясно раньше?

Да есть тысяча вариантов.
Вызываемый код должен определять модуль, которому он сам принадлежит.
Вызываемый код должен определять модуль, которому принадлежит вызывающий код.
В первом случае, если речь идёт о дотнете, то известно, что дотнет конвертирует MSIL в Native-код, и очевидно, что Native-код уже не будет лежать в пределах какого-либо из модулей.
Во-втором случае вызывающий код так же может не принадлежать какому-либо из модулей.
При использовании стека для выяснения деталей возникает целая цепочка из потенциально нужных тебе модулей.

Проблема в том, что когда говорят «код должен определить текущую библиотеку», то остаются незафиксированные вариации. А когда говорят, код должен установить модуль, которому он сам (код, инструкции) принадлежат — это совсем другое.

Qwertiy писал(а):Присваивание выполнено не будет, поэтому в переменной будет лежать 0. Что тут хорошего?

Какой-то совершенно не состоятельный довод. Про любую программу можно сказать: а что если какого-то присваивания в ней вдруг не состоится. Ой-ой, тогда всё пойдёт не так, как должно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.04.2012 (Вт) 18:04

Хакер писал(а):Какой-то совершенно не состоятельный довод. Про любую программу можно сказать: а что если какого-то присваивания в ней вдруг не состоится. Ой-ой, тогда всё пойдёт не так, как должно.

Это тут при чём?

Хакер писал(а):сли какой-то код хочет получить имя модуля, значит он должен знать хендл модуля. И хендл модуля он должен получить от системы тогда, когда она загружает модуль. В противном случае, может быть код вообще живёт НЕ в модуле. Для ситуации, когда код есть, а модуля нет, система должна быть спроектирована так, что в такой ситуации и получить имя/хендл модуля нельзя. Система спроектированна так. Блестящее решение.

Если код не в модуле, то DllMain не вызывается, хендл модуля не присваивается и остаётся 0. Или я неправильно представляю эту ситуацию?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 03.04.2012 (Вт) 18:07

Qwertiy писал(а):Если код не в модуле, то DllMain не вызывается, хендл модуля не присваивается и остаётся 0. Или я неправильно представляю эту ситуацию?

Если код не в модуле, то DllMain не существует, хендл не передаётся, присваивания нет, и самой переменной нет. Как и бесконечного множества других гипотетических сущностей, которых в мире не существует. В чём смысл о них думать, коли они не существуют?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.04.2012 (Вт) 19:24

Хакер писал(а):Если код не в модуле, то DllMain не существует, хендл не передаётся, присваивания нет, и самой переменной нет. Как и бесконечного множества других гипотетических сущностей, которых в мире не существует. В чём смысл о них думать, коли они не существуют?

А теперь ты меня запутываешь. Следующая ситуация возможна: сторонняя программа загружает образ dll'ки в память, сам файл на диске не существует. DllMain не вызывается, но переменная существует и в ней лежит 0? Если нет, то я не понимаю, как тот факт, что модуль может не существовать, связан со всем остальным в этой теме.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 03.04.2012 (Вт) 19:57

Qwertiy писал(а):возможна: сторонняя программа загружает образ dll'ки в память, сам файл на диске не существует

Такая ситуация невозможна. Нельзя спроецировать в файл образ, которого нет на диске.

Qwertiy писал(а):Если нет, то я не понимаю, как тот факт, что модуль может не существовать, связан со всем остальным в этой теме.

Я тоже не понимаю. Ты спросил, почему они сделали так, а не иначе. Я ответил: то, как они сделали — пример хорошей инженерии, а то, как ты предлагаешь — пример плохой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.04.2012 (Вт) 20:16

Хакер писал(а):
Qwertiy писал(а):возможна: сторонняя программа загружает образ dll'ки в память, сам файл на диске не существует

Такая ситуация невозможна. Нельзя спроецировать в файл образ, которого нет на диске.

В смысле в память?

Хакер писал(а):Я тоже не понимаю. Ты спросил, почему они сделали так, а не иначе. Я ответил: то, как они сделали — пример хорошей инженерии, а то, как ты предлагаешь — пример плохой.

Вот так - понятно :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 03.04.2012 (Вт) 20:18

Qwertiy писал(а):В смысле в память?

Да, описка.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10
Откуда: Санкт-Петербург

Re: Определение имени dll-файла

Сообщение VBTerminator » 03.04.2012 (Вт) 21:09

Qwertiy писал(а):Если код не в модуле, то DllMain не существует, хендл не передаётся

А как тогда вызывать функции, ожидающие на входе хендл DLL?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 04.04.2012 (Ср) 7:37

VBTerminator писал(а):функции, ожидающие на входе хендл DLL?

Что означает «функции, ожидающие хендл DLL»?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10
Откуда: Санкт-Петербург

Re: Определение имени dll-файла

Сообщение VBTerminator » 04.04.2012 (Ср) 13:43

Хакер писал(а):функции, ожидающие хендл DLL

Я про функции, принимающие одним из аргументов значение hinstDLL, которое как раз и неизвестно из-за отсутствия DllMain.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16134
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение имени dll-файла

Сообщение Хакер » 04.04.2012 (Ср) 14:10

Если функция что-то делает с DLL, а самой DLL, с которой хочется что-то сделать, нет, то в чём смысл подобной ситуации?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList