Как загрузить вторую копию DLL?

Тема в разделе "WASM.WIN32", создана пользователем AlexCab, 29 янв 2009.

  1. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    Допустим есть у нас дллка "dll1.dll", в первый раз функция "LoadLibrary" загружает эту длл, всё нормально, но
    как загрузть эту же длл второй раз по другому базовому смещению?
    И второй вопрос менее важный но не менее интересный, есть ли в FASM-е простой способ построить таблицу настроек адресов для
    длл?
    Зарание спасибо:)
     
  2. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    скопируй под другим именем
     
  3. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    Много операций с файлами = не хорошо:)
    Возможно есть более простой способ?
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    data fixups
    ;тут пусто, все впишется само
    end data
    вроде так
     
  5. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    По поводу второй копии ДЛЛ.
    На ум приходит два споба:
    1. Подправить LDR_DATA так, что бы перавя копия ДЛЛ исчезла. (Не факт что только там править прийдется)
    2. Свой загрузчик, но будет еще несколько проблем, стандартные АПИ типа GetProcAddress работать с второй длл не смогут и придется писать свою функцию получения адресов экспорта.
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    А попробуй загрузить ее используя короткое имя. Знаешь это катило.
     
  7. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    max7C4 Позвольте усомниться.
     
  8. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    AlexCab
    Одна - это много? :)
    Конечно - реализовать свой загрузчик.
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Aspire
    да. усомниться можно, если короткое имя получено с помощью системной функции, а если загружать. 1. используя относительное имя; 2 - используя короткое имя (в перемешку с длинными для папок), то тут винда сдастся и загрузит 2 копию. главное, что бы имя dll было коротким и имя пары папок тоже. А такие (..\..\..\..\..\Progra~1\My Program\MyLibr~1.dll) винда тоже не любит.
     
  10. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Да пофиг какой путь! Хоть относительный хоть абсолютный.
     
  11. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    2 K10
    После загрузки временый файл нужно будет удалить, библиотеки будут подгружатся в течении работы программы.
    Стринно что мелкомяхкие не придусматрели такой возможности:dntknw:

    2max7C4
    Танци с бубном = не хорошо:)
     
  12. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Низя ничего удалять, дллка подкачиваеться с того файла, надо переписать самой-собою (в памяти), а потом отвязать секцию от файла и удалять, в результате copy-on-write он начнет подкачиваться из свопа.
     
  13. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Может объяснишь, зачем тебе это нужно? Тогда может больше идей появится.
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    эммм... вообще то, вполне логично со стороны мелкомягких было ограничить загрузку одной и той же длл-лины в один процесс... чтобы не возникало ошибок... да к тому же, зачем тебе по две копии одних и тех же методов в памяти? если тебе надо выполнить два каких-то метода разных при загрузке длл, первый реализуй в длл-мейн, второй - как отдельный метод, потом по мере надобности его вызываешь... поясни, что ты хочешь сделать этим... вообще можно выгрузить длл-лину из памяти и загрузить ее снова, но это бред по-моему...
     
  15. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    Всем спасибо!
    Первая проблема решилась способом предложеным К10, вторая GoldFinch, за что им и респект!

    Для чего? Попробую вкраце обьяснить
    Пишу редактора с подсветкой синтаксиса, в нём есть менеджер проектов позволяющий открывать несколько проектов сразу,
    проекты могут быть на разных языках, может быть несколько на одном. Модуль подсветки синтакиса для каждого языка
    представляет собой длл, после загрузки в ней запускается поток который собственно и занимается анализом текта (выискивает
    объекты программы (переменные,метки и тп.) и составляет их список) и подсветкой,
    копия длл нужна потому что каждый поток имеет масу своих локальных данных, я не хочю заморачиваться с разделением
    кода и данных, RAM сегодня не такой уже и дефецит в отличее от процесорного времени, он если кто подскажет способ лучше
    буду только благодарен, темболее что ассемблер будет одним из первых поддерживаемих языков:)
     
  16. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Мегаизвращение.
    Все локальные данные размещаются в стеке и каждый поток работает со своей копией данных. В чем проблема-то?
     
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ужас какой... ты канеш извини, но это очень кривая реализация...
     
  18. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    В стеке? это интересно, но как?
    Вот например такой код:
    Код (Text):
    1. format PE GUI 4.0 DLL
    2. include 'win32a.inc'
    3.  
    4. proc My_func
    5.         mov eax,Dat_1 ;;В основном такие операции выполняются с данными
    6.         mov eax,[Dat_1]
    7.         mov [Dat_1],eax
    8.         ;;Здесь инициируется и создаётся поток с точкой входа "Toch_vhod".
    9.         ret
    10. endp
    11.  
    12. ;;Это цикл потока
    13. Toch_vhod:
    14.      ;;Здесь поток инициирует свои ресурсы.
    15.      Cukl_potoka:
    16.            ;;В цикле выполняются три вещи:
    17.            ;;1.Выборка сообщений (от главного (создавшего) потока)
    18.            ;;2.Обработка текста
    19.            ;;3.В случае получения сообщения о выходе - выход(jmp Toch_vuhod)
    20.      jmp Cukl_potoka
    21. Toch_vuhod:
    22. ;;Освобождение ресурсов
    23. ret
    24.  
    25. ;;Здесь я размещаю данные
    26. Dat_1 dd 0
    27. ;;Дальше ещё несколько тысяч переменных
    28.  
    29. section '.idata' import data readable writeable
    30.   library user,'USER32.DLL'
    31.   import user,\
    32.          MessageBox,'MessageBoxA'
    33.  
    34. section '.edata' export data readable
    35.   export 'My.DLL',\
    36.          My_func,'My_func'
    37.  
    38. section '.reloc' fixups data discardable
    Как разместить данные в стеке?
     
  19. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Код (Text):
    1. Toch_vhod proc tParam: DWORD
    2. local res1: DWORD
    3. local res2: BYTE
    4. ...
    вот тебе и стек - в чем проблема?
     
  20. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    И еще TLS. Первая сцылка в гугле http://wm-help.net/books-online/book/59464/59464-15.html