Сейчас на форуме: _MBK_ (+7 невидимых) |
![]() |
eXeL@B —› Основной форум —› THREAD падает на RtlMoveMemory с определенным железом |
Посл.ответ | Сообщение |
|
Создано: 24 июля 2009 22:32 · Личное сообщение · #1 К EXE файлу подцепляю длл в ней создаю THREAD, который раз в 100 ms копирует определенное кол-во байт из области основной программы с помощью функции RtlMoveMemory в массив в длл. Всё работало стабильно довольно давно до тех пор, пока не попробовал это на нескольких компьютерах, где оказалась интегрированная Intel видео. Пробовал разные сборки видны - результат один, через 5-15 минут - ошибка, трид затыкается при этом основная программа продолжает работать. Вел лог. До копирования памяти запись есть, после уже нет. Т.е. всё происходит в недрах и копирует RtlMoveMemory. Также использовал самописную функцию для сравнения участка памяти основной программы с моим массивом. На ней тоже падает... Вопрос в том, почему это происходит только на некоторых компьютерах, а на других не происходит вообще, почему не сразу, а через определенное время и как это можно исправить? Пытался try-except - не помогло. Длл на Дельфи. Буду очень благодарен за подсказку. P.S. Может как-то нужно делать доступ к памяти особым образом. Типа shared memory? ![]() |
|
Создано: 24 июля 2009 23:02 · Личное сообщение · #2 |
|
Создано: 24 июля 2009 23:40 · Личное сообщение · #3 сколько памяти на компе с интергрированным чипсетом? может быть * память освобождается быстрее * что-то попадает в своп * происходит одновременный доступ к памяти с каким исключением отваливается длл? особенно настораживает, что копирование памяти происходит по таймеру, а не по событию может быть тебе стоит копировать память только тогда, когда в неё что-то пишется т.е. либо хукать код, либо обращение к памяти если буфер динамический - то хукай ф-цию выделения памяти - у тебя всегда будет свежий буфер с данными ;) если статический - лови код, который туда пишет и тоже хуч его мона ещё реализовать подобие отладчика, и ловить на хардварных бряках досутп к памяти ----- EnJoy! ![]() |
|
Создано: 25 июля 2009 06:19 · Личное сообщение · #4 Тоесть юзермод. Любую память можно расшарить. - Замена на проекцию(Free/Map). - Проецирование напрямую физической памяти(без изменения целевых страниц). Перед копированием NtQueryVirtualMemory/NtProtectVirtualMemory. Вобщем делать чтото по таймеру это зло. Если необходимо подменить массив данных при бращении к нему только одним потоком - регистрируем диспетчер исключений, помечаем регион памяти как сторожевой(GUARD), обрабатываем сепшин(копируем свои данные) и снова делаем регион сторожевым. Если регион памяти используют несколько потоков - делаем регион памяти не доступным, обрабатываем сепшины. Как частный случай - использование LDT(замена селектора и трассировка инструкции). Эти два случая имеют смысл если не известны ссылки на регион, либо он фиксирован в коде(секции модуля), в случае если известна ссылка на регион(например храниться в секции данных модуля) - замена указателя в этой переменной. У сепшина есть причина. Открываем олей, ставим останов на диспетчер исключений. Это если есть ось на которойц падает. ![]() |
|
Создано: 25 июля 2009 22:01 · Личное сообщение · #5 |
|
Создано: 26 июля 2009 15:58 · Личное сообщение · #6 |
|
Создано: 28 июля 2009 23:36 · Личное сообщение · #7 |
|
Создано: 31 июля 2009 19:52 · Личное сообщение · #8 |
![]() |
eXeL@B —› Основной форум —› THREAD падает на RtlMoveMemory с определенным железом |
Эта тема закрыта. Ответы больше не принимаются. |