Хуки в Win32
От: DeadbraiN Украина http://www.rus.cameldisc.com
Дата: 01.05.04 12:17
Оценка:
Добрый день всем!
Я занимаюсь написанием некоторого "фильтра" сообщений в Win32 с помощью технологии хуков на С++ в чистом API для компилятора gcc. Сам фильтр реализован в виде класса Hook. Те, кто занимался хуками знают, о праблеме распределенной памяти для подключаемых к dll процессам.
Моя праблема:
Мне нужно разместить мой класс в shared секцию так, чтобы он был общим для всех процессов (Если возможно реализовать это другим способом, то напишите как). Также, класс использует динамическую память (например для строк или структур: LPSTR s = (LPSTR)new LPSTR[size]), которая тоже должна быть общей.

Я проанализировал возможности gcc связанные с созданием shared секций. Они создаются слудующим образом (для моего случая):

Hook hook __attribute__((section ("section_name"), shared)) = Hook::Hook();

Но при подключении нового процесса к моей hook.dll, конструктор и деструктор вызываются снова, а переменные этого класса не меняют своего значения.

Я думаю, что можно использовать следующие способы:
— File Mapping. Положить туда свой класс и все динамические данные (объясните как это реализовать).
— С помощью опции линкера --stack=<размер>, указать область побольше и размещать мой класс и все динамические данные в shared секции. (тогда возникает вопрос: "а как выделять память в shared секции?")[/list]
— DDE

Хотелось бы использовать наименее сложный способ.
P.S. Если вы не программировали на gcc, но знаете как это реализовать на Visual C++, помогите всё равно.
Спасибо.
[ Всё, что окружает нас можно понять и представить с помощью чисел ]
Re: Хуки в Win32
От: adontz Грузия http://adontz.wordpress.com/
Дата: 01.05.04 14:12
Оценка:
Здравствуйте, DeadbraiN, Вы писали:

В shared секции можно размещать только POD данные. То есть классы нельзя. Но можно размещать инициализированные переменные
__declspec(shared) bool isAlreadyInitialized = false;

Выделять память динамически можно только импользую Memory Mapped Files. Когда я решал эту проблему, мне оказалось проще сделать большой статический массив of char и использовать его.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Хуки в Win32
От: DeadbraiN Украина http://www.rus.cameldisc.com
Дата: 01.05.04 20:29
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, DeadbraiN, Вы писали:


A>В shared секции можно размещать только POD данные. То есть классы нельзя. Но можно размещать инициализированные переменные

A>
A>__declspec(shared) bool isAlreadyInitialized = false;
A>

A>Выделять память динамически можно только импользую Memory Mapped Files. Когда я решал эту проблему, мне оказалось проще сделать большой статический массив of char и использовать его.

Хорошо, но где мне найти стоющую информацию о MMF?
Заранее спасибо.
[ Всё, что окружает нас можно понять и представить с помощью чисел ]
Re[3]: Хуки в Win32
От: Lone Беларусь  
Дата: 02.05.04 08:55
Оценка:
Здравствуйте, DeadbraiN, Вы писали:

DN>Хорошо, но где мне найти стоющую информацию о MMF?

DN>Заранее спасибо.

У Рихтера.
... << RSDN@Home 1.1.2 stable >>
Re[3]: Хуки в Win32
От: glyph  
Дата: 04.05.04 10:23
Оценка:
Здравствуйте, DeadbraiN, Вы писали:

DN>Здравствуйте, adontz, Вы писали:


DN>Хорошо, но где мне найти стоющую информацию о MMF?

DN>Заранее спасибо.
MSDN, wasm.ru
Re[4]: Хуки в Win32
От: DeadbraiN Украина http://www.rus.cameldisc.com
Дата: 04.05.04 13:38
Оценка:
Здравствуйте, glyph, Вы писали:

G> MSDN, wasm.ru


Большое спасибо!
[ Всё, что окружает нас можно понять и представить с помощью чисел ]
Re: Хуки в Win32
От: DeadbraiN Украина http://www.rus.cameldisc.com
Дата: 19.05.04 16:42
Оценка:
Продолжая тему хуков, хочу спросить следующее:
на данный момент моя программа может отслеживать клавиатурные (KEYBOARD) хуки и CBT хуки. Для них описаны 2 функции. Но при этом возникает праблема. Когда управление передается в хуковоую функцию используется общий блок данных для разных процессов. Но как известно в один момент может возникнуть несколько сообщений, тоесть мы попадем в разные хуковые функции одновременно (из разных процессов например). А значит будем обрабатывать наш общий (shared) блок тоже одновременно, чего делать нельзя.


Мой вопрос:

Как можно выполнять какие — либо действия — как реакцию на определенные сообщения, и при этом не терять всех сообщений? Как успевать?

Возможно ли организовать какую — либо очередь?
Заранее благодарен.
[ Всё, что окружает нас можно понять и представить с помощью чисел ]
Re[2]: Хуки в Win32
От: Аноним  
Дата: 19.05.04 18:44
Оценка:
Здравствуйте, DeadbraiN, Вы писали:

DN>Возможно ли организовать какую — либо очередь?


Надо использовать объекты синхронизации: Mutex или Event смотря как удобнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.