Выбор идеального базового адреса ДЛЛ во время выполнения

Тема в разделе "WASM.WIN32", создана пользователем bems, 9 мар 2006.

  1. bems

    bems New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2006
    Сообщения:
    10
    Программа запускается при загрузке системы и работает все время. Она внедряет свою длл во все процессы в системе. Естественно (почти) в каждом процессе у нее новый базовый адрес.

    Известно, что во многих системах (например в офисах и тд) решается узкий круг задач и выполняется некоторый (часто небольшой) набор программ. В этих случаях длл будет загружаться во многих программах по одному и тому жу базовому адресу, но он вряд ли совпадет с идеальным, установленным мной во время компиляции. Чтобы решить эту проблему хочу записывать все адреса по которым загружается библиотека на данной машине (например в реестр) и если какому-то из них можно отдать предпочтение то изменить идеальный адрес длл на этот.

    А теперь, г-да знатоки, внимание - вопрос:

    Как из всех адресов по которым загружается библиотека выбрать наиболее подходящий?

    Выбрать просто наиболее часто используемый не подходит, тк если какой-то адрес использовался больше чем другие всего на 1-2 раза, то вполне возможно, что "лидер" будет меняться часто - и как результат - программе придется изменять идеальный адрес все время, что еще хуже чем релокейшоны во время загрузки модуля.







    Заранеее большое спасибо.
     
  2. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Что-то я не совсем понял нах тебе это надо.
     
  3. bems

    bems New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2006
    Сообщения:
    10
    чтобы ускорить загрузку (и след-но запуск каждого(!!!) процесса в системе). а то на РIII тормозит ощутимо.
     
  4. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    bems

    Проанализируй все процессы и какие виртуальные адреса у них заняты, и то что не занято, то и будет твоим базовым адресом. Можно это сделать и на автомате легко, но это будет эффективно лишь в том случае, если состав программного обеспечения на компьютере будет не очень часто изменяться, а лучше вообще никогда. После получения наилучшего значения, правишь базовый адрес DLL и внедряешь ее во все приложения.
     
  5. OlegA11

    OlegA11 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2006
    Сообщения:
    102
    Только плохо то, что невозможно это осуществить программно(из Ring 3) вот и получается, что игра не стоит свеч.

    И вообще, я не думаю, что это может существенно замедлить загрузку программ.



    Можещ попробовать так:

    Возьми максимально большое значение для Базы(т.е FFFFFFFFh - Размер твоего кода)



    Там насколько я помню, всегда пусто.
     
  6. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow


    релокэшн тут не причем, настрой нормально тачку и не будет тормозить, у меня када еще amd k6 2 500 стоял, тачка летала с ХР и никаких тормозов не ощущалось, блин панафтыкают туда касперычей через зад настроенных и всякой нечисти, потом удивляются, что тачка колом стоит !
     
  7. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow


    нуну, ен забывай что с 3 гига ядро висит, и это собственно его адресный спэйсю
     
  8. bems

    bems New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2006
    Сообщения:
    10


    Примерно так я хочу сделать НО! какие виртуальные адреса не заняты определяет система во время загрузки модуля и грузит его туда. Поэтому для сбора статистики я и хочу использовать адреса которые реально использовались - получу тоже самое, но часть работы сделает винда. Проблема в том, что мне нужно как-то узнать самое эффективное значение - например если в 70% случаев использовался один и тот же адрес то он мне и нужен. Но 70% это очень оптимистично. Вопрос в АЛГОРИТМЕ выбора эффективного значения, в обработке статистики а не ее получении
     
  9. bems

    bems New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2006
    Сообщения:
    10


    Да-да, я так и понял. Поэтому задача и стоит именно так - неужно найти ЯВНОГО лидера - если его нет, то сделать ничего не получиться, и придется смириться. Если лидер был, но состав ПО изменился, то возможно есть новый адрес - и еще эффективнее старого, поэтому подсчеты наверное нужно вести в фоновом режиме все время, но применять результаты не слишком часто, вопрос - КОГДА ИМЕННО?
     
  10. bems

    bems New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2006
    Сообщения:
    10


    Возможно. Еще до внедрения ДЛЛ (при мтарте системы) изменить базу ФАЙЛА - на какую решить заранее.



    Опыт показывает - может и реально замедляет
     
  11. bems

    bems New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2006
    Сообщения:
    10


    Настроить тачку нельзя, я заранее не знаю, что это за тачка. Проверялось на РIII-1000, тормоза с моей программой есть - без нее ХР летает. А между тем ДЛЛ весит 36 кило, не точто бы очень много. Остальные используемые ею длл-ки грузит динамически в 1-2 процесса, а в остальных обходится одной ныты.дылылы. Так что грешить приходиться только на релокешоны.
     
  12. OlegA11

    OlegA11 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2006
    Сообщения:
    102


    Ой...точно.

    Ну тогда максимально большое из доступных значений.



    Ну совсем весело...=> ты и не знаешь, какой софт там зарание установлен.



    PS: Не это тормозит твою машину,т.е ты не там ищешь.
     
  13. bems

    bems New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2006
    Сообщения:
    10


    Вот-вот. иначе все было бы слишком просто