Допустим есть у нас дллка "dll1.dll", в первый раз функция "LoadLibrary" загружает эту длл, всё нормально, но как загрузть эту же длл второй раз по другому базовому смещению? И второй вопрос менее важный но не менее интересный, есть ли в FASM-е простой способ построить таблицу настроек адресов для длл? Зарание спасибо
По поводу второй копии ДЛЛ. На ум приходит два споба: 1. Подправить LDR_DATA так, что бы перавя копия ДЛЛ исчезла. (Не факт что только там править прийдется) 2. Свой загрузчик, но будет еще несколько проблем, стандартные АПИ типа GetProcAddress работать с второй длл не смогут и придется писать свою функцию получения адресов экспорта.
Aspire да. усомниться можно, если короткое имя получено с помощью системной функции, а если загружать. 1. используя относительное имя; 2 - используя короткое имя (в перемешку с длинными для папок), то тут винда сдастся и загрузит 2 копию. главное, что бы имя dll было коротким и имя пары папок тоже. А такие (..\..\..\..\..\Progra~1\My Program\MyLibr~1.dll) винда тоже не любит.
2 K10 После загрузки временый файл нужно будет удалить, библиотеки будут подгружатся в течении работы программы. Стринно что мелкомяхкие не придусматрели такой возможности 2max7C4 Танци с бубном = не хорошо
Низя ничего удалять, дллка подкачиваеться с того файла, надо переписать самой-собою (в памяти), а потом отвязать секцию от файла и удалять, в результате copy-on-write он начнет подкачиваться из свопа.
эммм... вообще то, вполне логично со стороны мелкомягких было ограничить загрузку одной и той же длл-лины в один процесс... чтобы не возникало ошибок... да к тому же, зачем тебе по две копии одних и тех же методов в памяти? если тебе надо выполнить два каких-то метода разных при загрузке длл, первый реализуй в длл-мейн, второй - как отдельный метод, потом по мере надобности его вызываешь... поясни, что ты хочешь сделать этим... вообще можно выгрузить длл-лину из памяти и загрузить ее снова, но это бред по-моему...
Всем спасибо! Первая проблема решилась способом предложеным К10, вторая GoldFinch, за что им и респект! Для чего? Попробую вкраце обьяснить Пишу редактора с подсветкой синтаксиса, в нём есть менеджер проектов позволяющий открывать несколько проектов сразу, проекты могут быть на разных языках, может быть несколько на одном. Модуль подсветки синтакиса для каждого языка представляет собой длл, после загрузки в ней запускается поток который собственно и занимается анализом текта (выискивает объекты программы (переменные,метки и тп.) и составляет их список) и подсветкой, копия длл нужна потому что каждый поток имеет масу своих локальных данных, я не хочю заморачиваться с разделением кода и данных, RAM сегодня не такой уже и дефецит в отличее от процесорного времени, он если кто подскажет способ лучше буду только благодарен, темболее что ассемблер будет одним из первых поддерживаемих языков
Мегаизвращение. Все локальные данные размещаются в стеке и каждый поток работает со своей копией данных. В чем проблема-то?
В стеке? это интересно, но как? Вот например такой код: Код (Text): format PE GUI 4.0 DLL include 'win32a.inc' proc My_func mov eax,Dat_1 ;;В основном такие операции выполняются с данными mov eax,[Dat_1] mov [Dat_1],eax ;;Здесь инициируется и создаётся поток с точкой входа "Toch_vhod". ret endp ;;Это цикл потока Toch_vhod: ;;Здесь поток инициирует свои ресурсы. Cukl_potoka: ;;В цикле выполняются три вещи: ;;1.Выборка сообщений (от главного (создавшего) потока) ;;2.Обработка текста ;;3.В случае получения сообщения о выходе - выход(jmp Toch_vuhod) jmp Cukl_potoka Toch_vuhod: ;;Освобождение ресурсов ret ;;Здесь я размещаю данные Dat_1 dd 0 ;;Дальше ещё несколько тысяч переменных section '.idata' import data readable writeable library user,'USER32.DLL' import user,\ MessageBox,'MessageBoxA' section '.edata' export data readable export 'My.DLL',\ My_func,'My_func' section '.reloc' fixups data discardable Как разместить данные в стеке?
Код (Text): Toch_vhod proc tParam: DWORD local res1: DWORD local res2: BYTE ... вот тебе и стек - в чем проблема?