Расшарить байт эдак 50 данных в библиотеке на делфях.

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

  1. Dusk

    Dusk New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    10
    Собственно тривиальная задача - расшарить данные между копиями загруженной библиотеки. Средства IPC использовать не хочется поскольку данных очень мало (два DWORD'а и короткая строка), можно ли как-нибудь изменить уже скомпиленную библиотеку чтобы добавить к ней расшаренную на запись и на чтение секцию?
     
  2. Dusk

    Dusk New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    10
    Да, есть ещё один вопрос.
    Что произойдёт если процесс загрузивший библиотеку, выгрузит её после того как та создаст поток, который будет висеть на WaitForSingleObject(). Ведь рано или поздно объект синхронизации может освободится.... (или я чего-то не знаю, и не понимаю)
     
  3. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    как только WaitForSingleObject() вернет
    управление произойдет исключение (тк память
    по тому будет адресу либо невыделена либо
    занята чем нибудь другим)
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    kropalik
    А разве можно выгрузить библиотеку, если в ней есть спящий поток?
     
  5. Dusk

    Dusk New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    10
    Да, собственно идея заключается в том, что можно написать функцию на асме ,которую можно забить NOP'ами, после чего в коде использовать её адрес для записи и чтения этих самых данных.
    PS: Можно ли измнить аттрибуты секции кода?
     
  6. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    можно. у меня не раз получалось....
    пока не понял что надо так
    Код (Text):
    1. push 0
    2. push hInstance
    3. push ExitThread
    4. jmp FreeLibrary
    5. или так
    6. FreeLibraryAndExitThread()
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Dusk
    В делфи не в курсе. Можно при выполнении: см. VirtualProtect.

    kropalik
    Это если один поток. А если в ней второй поток и он спит?
     
  8. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Dusk
    Можно... Я писал по адресу функции, VirtualProtect помагет ))
     
  9. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    а по существу вопроса так и не ответили...
    как заставить dlphi поместить переменные
    в отдельную секцию я не знаю (хотя наверно
    можно) поэтому предложу поюзать
    Код (Text):
    1. h=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE|SEC_COMMIT,0,size,"name_xxx");
    2. p=MapViewOfFile(h,FILE_MAP_WRITE,0,0,0);
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Dusk
    Разрешить запись в страницу кода конечно можно, но при записи сработает copy-on-write и измененная страница dll станет приватной для данного приложения, т.е. расшарить таким способом данные между разными процессами ИМХО не удасться - винду так просто не обманешь ;)
     
  11. Dusk

    Dusk New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    10
    Я тогда эту задачу не решил, обошёл с помощью файлмаппинга, но всё ж таки интересно.
    Собственно подкорректирую вопрос:
    в готовой библиотеке на делфях (скомпилированной), т.е. в dll'ке возможно ли создать shared секцию. и как добраться до этой секции в рантайме?
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Dusk
    А почему нет? Поменять атрибут секции на Shared и юзать на здоровье.