Замена использования глобальной переменной

Тема в разделе "WASM.WIN32", создана пользователем karabas_barabas, 11 сен 2011.

  1. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    Вообщем нестандартная ситуация в моем коде - нужно заменить классическое использование глобальной переменной (создание в .data секции DWORDA) , на что-то более оригинальное - суть в том чтобы можно было "получить к ней доступ" из любого участка кода и любого потока.
    На уме у меня только использование какого-то ненужного поля PEB как глобальной переменной - точнее туда записать указатель , на структуру.
    Может есть у кого-то на примете менее экстремальное решение чем мое ?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Пишите про потоки, а лезете в PEB. Если нужна глобальная для системы, то file, pipe чем не варианты?
     
  3. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    ну дык PEB это же не TEB - общая для всего процесса,
    мне нужна глобальная переменная в рамках одного процесса...
    да pipe и shared memory имеют место быть , спс за наводку.
    правда хочется что-то типа создание объекта синхронизации и присвоение его какого-то id ну или что-то в этом духе - еще какие варианты есть ?
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ну так и зачем вам всё это? Глобальная переменная в секции .data вполне себе шарится между потоками.
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ну бери любое поле из PEB, какое не нужно твоем процессу, в чем вопрос то?)
     
  6. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    есть еще GetProp-SetProp для окон, возможно пригодится
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Попробуй VirtualAlloc(), там можно указать желаемый адрес, который ты можешь тупо задать константой или какой-нибудь формулой, главное, подобрать такой адрес, который гарантировано не будет занят. Ну или можно использовать именованную секцию, т.е. в точке входа создаёшь секцию через CreateFileMapping(), хендл при этом нигде не сохраняешь ибо негде (у тебя нет глобальных переменных), а далее перед каждым использованием этой памяти секцию придётся открывать заново через OpenFileMapping() и мапить через MapViewOfFile() и только затем использовать, а после закрывать через UnmapViewOfFile() и CloseHandle(). Чуть медленнее, конечно, всё это будет работать, но требований к скорости у тебя вроде бы никаких и нет, не так ли?
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ну как бы хендл-то окна тоже где-то хранить надо. В принципе, окна можно перечислить через EnumThreadWindows(), но тогда ID потока ведь тоже придётся где-то хранить, очень маловероятно, что у него там один поток всего. В общем, тут автору виднее, что использовать, всех особенностей его кода мы не знаем.
     
  9. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Я однажды извратился не слабо по этому поводу.
    Есть такие функции: GetEnvironmentVariable/SetEnvironmentVariable.
    Мне надо было иметь один хэндл появившийся в WinMain и на весь процесс.
    Код (Text):
    1. int WINAPI WinMain (...)
    2. {
    3.     ...
    4.     CHAR value [12];
    5.     wsprintfA (value, "%08X", handle);
    6.     SetEnvironmentVariableA ("Event-007", value);  // <-- something like "0023A0F4"
    7.     ...
    8. }
    Ну и функцию сделал короткую:
    Код (Text):
    1. GetEnvironmentVariableA (...);
    2. sscanf (...);
    Работает из любого потока, DLL, и т.п.
    Не изящно, и наверное, не быстро, но мои капиталисты довольны.
     
  10. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Тогда уж проще в файл писать, типа current.cfg. И функциональность забацать, типа автосохранение конфига, ручное сохраненние, сохранение под другим именем/чтение другого и т. п. А если под это дело подрядить готовые компоненты работы с XML, то вообще песня.
     
  11. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Dmitry_Milk
    При таком нагромождении функционала, сами знаете, возможен разрыв связки инструкций push 0x302 / popfd.
     
  12. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    я думаю в таком случае уже лучше юзать registerclass и не надо будет создавать окон
    100% гарантий нет опять же, но вцелом прорабатываю твое направление с heap* функциями
    замечательная идея, ты меня даже сбил с курса :) , а почему ты решил что не быстро ? Сначала я подумал что юзается реестр , потом глянул - исключительно работа с памятью.
     
  13. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Запихни нужное значение в какое-нибудь неиспользуемое поле в KUSER_SHARED_DATA, как это TDL делает
     
  14. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    KUSER_SHARED_DATA доступна только для чтения в ring3, вообщем пошел я нелегким путем (а даже извращенным) и реализовал через хип менеджер - но довольно таки все красиво и практично получилось в итоге