Обмен данными внутри процесса

Тема в разделе "WASM.WIN32", создана пользователем _Juicy, 6 мар 2012.

  1. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Два (три, четыре...) разных модуля внутри одного процесса. Один должен сохранить некое значение (DWORD), а остальные его считать. Как можно реализовать, помимо экспортируемой переменной?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Squash
    Написать ф-ию, которая возвращает адрес DWORD'а? Но тогда придется экспортировать ф-ию. Извратный вариант: поместить переменную в структуру между двумя переменными, дать переменным уникальное значение и искать их в секции данных. Т.е. что-то типа:

    struct MY_SECRET_VARIABLE
    {
    BYTE SignStart[16];
    DWORD TargetVariable;
    BYTE SignEnd[16];
    };

    MY_SECRET_VARIABLE Var = { { x, x, ... }, SecretVar, { y, y, ... } };

    Находим модуль в памяти, находим сигнатуры в секции данных, извлекаем значение переменной, PORFIT!!!1111
     
  3. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    PEB? TLS? Environment variable?
     
  4. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    shchetinin, да-да надо что-то вроде, раскройте тему плз.
    Только TLS наверное не годится, что там с потоками непонятно.
     
  5. zxcv

    zxcv New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2011
    Сообщения:
    257
    я б организовал небольшой менеджер. строк на 10-20.

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

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    С этим ОК, им и не нужно.
     
  7. zxcv

    zxcv New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2011
    Сообщения:
    257
    Squash
    через полнедели может стать нужно. будете править весь код?

    но дело ваше. если это не вирь, то лучше и проще всего (и безглючнее в будущем) сделать функи на чтение и запись и к переменной обращаться именем (строкой).

    АДД
    обязательно обрамив само чтение/запись локами
     
  8. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Через полнедели я так и быть ее экспортирую.
     
  9. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Squash
    Environment variable: GetEnvironmentvariable\SetEnvironmentvariable (Одно из самых правильных ).
     
  10. zxcv

    zxcv New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2011
    Сообщения:
    257
    Squash
    вам кажется что такой менеджер это слишком сложно? написать?
    в любой модульной проге их валом
     
  11. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    shchetinin, спасибо, попробую.
     
  12. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Обычно используются специальные сегменты. Вот например нужно из любого модуля текущий PID узнать - читаем из Fs:[0x20]. Тут константы две - селектор сегмента и смещение в сегменте до переменной. Это самый эффективный путь. Именованные обьекты не вариант, ибо они глобальны.
     
  13. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Что вы усложняете, есть разделяемая память для таких вещей.
    Malfoy
    Какая разница, что они глобальны?