Сейчас на форуме: _MBK_ (+7 невидимых)

 eXeL@B —› Основной форум —› THREAD падает на RtlMoveMemory с определенным железом
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 24 июля 2009 22:32
· Личное сообщение · #1

К EXE файлу подцепляю длл в ней создаю THREAD, который раз в 100 ms копирует
определенное кол-во байт из области основной программы с помощью функции RtlMoveMemory
в массив в длл. Всё работало стабильно довольно давно до тех пор, пока не попробовал
это на нескольких компьютерах, где оказалась интегрированная Intel видео.
Пробовал разные сборки видны - результат один, через 5-15 минут - ошибка, трид
затыкается при этом основная программа продолжает работать. Вел лог. До копирования
памяти запись есть, после уже нет. Т.е. всё происходит в недрах и копирует RtlMoveMemory.
Также использовал самописную функцию для сравнения участка памяти основной программы
с моим массивом. На ней тоже падает... Вопрос в том, почему это происходит только
на некоторых компьютерах, а на других не происходит вообще, почему не сразу, а через определенное
время и как это можно исправить? Пытался try-except - не помогло. Длл на Дельфи.
Буду очень благодарен за подсказку.
P.S. Может как-то нужно делать доступ к памяти особым образом. Типа shared memory?



Ранг: 13.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 24 июля 2009 23:02
· Личное сообщение · #2

А если так:
1) засуспендить основную программу
2) проверить области памяти на возможность чтения/записи (IsBadHugeReadPtr, IsBadHugeWritePtr), ну или хотя бы чтения
3) скопировать
4) рассуспендить обратно

И... почему RTLMoveMemory? CopyMemory чем не нравится? "Основная программа" не драйвер случаем?




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 24 июля 2009 23:40
· Личное сообщение · #3

сколько памяти на компе с интергрированным чипсетом?
может быть
* память освобождается быстрее
* что-то попадает в своп
* происходит одновременный доступ к памяти

с каким исключением отваливается длл?

особенно настораживает, что копирование памяти происходит по таймеру, а не по событию

может быть тебе стоит копировать память только тогда, когда в неё что-то пишется
т.е. либо хукать код, либо обращение к памяти
если буфер динамический - то хукай ф-цию выделения памяти - у тебя всегда будет свежий буфер с данными ;)
если статический - лови код, который туда пишет и тоже хуч его
мона ещё реализовать подобие отладчика, и ловить на хардварных бряках досутп к памяти

-----
EnJoy!




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 25 июля 2009 06:19
· Личное сообщение · #4

Тоесть юзермод. Любую память можно расшарить.
- Замена на проекцию(Free/Map).
- Проецирование напрямую физической памяти(без изменения целевых страниц).
Перед копированием NtQueryVirtualMemory/NtProtectVirtualMemory.
Вобщем делать чтото по таймеру это зло. Если необходимо подменить массив данных при бращении к нему только одним потоком - регистрируем диспетчер исключений, помечаем регион памяти как сторожевой(GUARD), обрабатываем сепшин(копируем свои данные) и снова делаем регион сторожевым.
Если регион памяти используют несколько потоков - делаем регион памяти не доступным, обрабатываем сепшины. Как частный случай - использование LDT(замена селектора и трассировка инструкции). Эти два случая имеют смысл если не известны ссылки на регион, либо он фиксирован в коде(секции модуля), в случае если известна ссылка на регион(например храниться в секции данных модуля) - замена указателя в этой переменной.
У сепшина есть причина. Открываем олей, ставим останов на диспетчер исключений. Это если есть ось на которойц падает.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 25 июля 2009 22:01
· Личное сообщение · #5

Спасибо огромное за подсказки!!! Прочитав всё появилась масса идей и направлений куда рыть дальше.
Буду пробывать и обязательно отпишу.
На моём компе всё работает, а вот проблемные компы далеко... Сколько памяти пока не знаю и пока нет возможности добраться олькой.



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 26 июля 2009 15:58
· Личное сообщение · #6

Только мне кажется что причина может быть из-за отсутствия синхронизации?

-----
Shalom ebanats!





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 28 июля 2009 23:36
· Личное сообщение · #7

SLV
я и клерк об этом уже сказали. ты третий.

-----
EnJoy!





Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 31 июля 2009 19:52
· Личное сообщение · #8

Проблему решил, под отладчиком понял, что она была совсем не там... Тем не менее полученная информация помогла в правильной организации работы трида с памятью. Теперь уверен, что там не упадёт. Всем спасибо за помощь!


 eXeL@B —› Основной форум —› THREAD падает на RtlMoveMemory с определенным железом
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати