| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > exception : 0xC0000005: Access Violation |
| Автор: batex 2.8.2012, 10:46 | ||
Разработка идет по windows mobile 6. Возникла необходимость в определенном случае менять данные в памяти по адресу 0x02020000 cо смещение 0x4a. Написал в лоб:
Выдает исключение: exception : 0xC0000005: Access Violation. Нет доступа к памяти. Попытался сделать через ReadProccessMemory и WriteProccessMemory. Вроде через эти функции можно писать в память другого процесса. Но для этого надо знать Handle процесса. Вопрос в следующем: Как узнать какому процессу принадлежит память(хотя есть такое ощущение, что это вообще реестр) или как получить доступ и писать в защищенную память? |
| Автор: korian 2.8.2012, 11:27 |
| А оно вам надо? От куда вообще взялся такой адрес? Вы уверены, что он не изменится при перезагрузке например? Если вы знаете от куда он взялся, вы поидее должны знать, какой процесс им обладает. |
| Автор: batex 2.8.2012, 11:42 | ||
этот адрес дало начальство сверху. Откуда конкретно он взялся - я не знаю |
| Автор: batex 2.8.2012, 12:06 |
| Требуется именно сменить значение по адресу 0x02020000 + offset ( 0x4a ) = 0x0202004A на 0x1. Адрес записан в виде базовый + смещение, потому что смещение для некоторых случаев - разное. |
| Автор: magesi 2.8.2012, 12:09 | ||||
Но только Венда Мобайл не должна позволять такое делать ) Вы по логике access violation все равно будете получать |
| Автор: batex 2.8.2012, 12:18 | ||||||
Ага, получу эксепшн. Вопрос в том, как получить доступ к этому участку памяти |
| Автор: magesi 2.8.2012, 12:26 | ||
| batex, через Cи-синатксис именно так, как я написал, но Вы ни слова не сказали откуда Вы пытаетесь такой код запустить, если из под самой ОС из некого подобия user-mode, то такой код не будет работать. Поскольку, скорее всего у Вас - АРМ микрконтроллер ( хотя Вы не уточнили ), то Вам нужно читать документацию про свой микроконтроллер на сайте АРМ, про диапазоны адресов различных режимов ( mode ) и попасть в Supervisor mode, и учить как попадать туда из под Венды Мобайл и только так уже записывать в памяти. У АРМ такие моды:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0210c/Cihhcjia.html |
| Автор: bems 2.8.2012, 12:29 |
| Дело в том, что в разных процессах в по этому адресу лежат разные данные, поэтому вопрос "какому процессу принадлежит адрес" некорректен (в общем случае) Опиши подробнее что вы делаете? может имеется в виду доступ к внутренним данным длл, загруженной по адресу 02020000? тогда нужно грузить длл в свой процесс, и тогда менять в своём процессе, предварительно получив права на запись (VirtualProtect) |
| Автор: bsa 2.8.2012, 15:56 |
| скорее всего, необходим доступ к физическому адресу. Если это так, то необходимо действительно переходить в привелигерованный режим (драйвер?) и делать это оттуда. Требуй от начальства подробностей. Что это, зачем и так далее. |
| Автор: magesi 2.8.2012, 16:13 | ||
тут скорее спецификации микропроцессора и Венды Мобайл читать надо, чем начальство мучать |
| Автор: batex 2.8.2012, 18:06 |
| да в том то все и дело, что пришло письмо с требованием, при таком-то случаи, включить такой-то режим. И приложен скрин сторонней программы с подписью, что мол для вкл режима выставить такие значения. На скрине адрес 0x02020000, внизу введено смещение и ниже данные. |
| Автор: magesi 2.8.2012, 20:37 |
ну, не при каком-то, а там есть триггер перехода в различные режимы выложите в тему пожалуйста скрин и описание , быстрее же Вам поможем |
| Автор: batex 3.8.2012, 11:29 |
| Сегодня стало немного понятнее. 0x02020000 + 0x4a это физический адрес, следовательно, необходимо перейти в привилегированный режим. Пока что не могу найти как это сделать |
| Автор: batex 3.8.2012, 13:29 | ||
Попробовал через функцию MmMapIoSpace.
вылетает эксепшн 0xDFFF0123. Интересно вот что. Если посмотреть архитектуру адресного пространства, то системное адресное пространство начинается с 0х80000000 и выше. Системное ап отображается линейно на физические? Т.е. физический 0х02020000 это системный 0х82020000? или нет? |
| Автор: bsa 3.8.2012, 13:58 |
| нет. скорее всего в этой области адресов находится какое-то внешнее оборудование (считай запись в порт). |
| Автор: korian 3.8.2012, 14:04 | ||
на сколько я понимаю значение надо писать в PhyAddr.LowPart т.е. что-то типа такого: int64 address = some_value; PhyAddr.HighPart = address >> 32; PhyAddr.LowPart = address & 0xFFFFFFFF; В вашем случае будет достаточно PhyAddr.HighPart = 0; PhyAddr.LowPart = 0x02020000+0x4a;
Опять же, на сколько я понимаю, физический адрес мапится на виртуальный для текущего процесса, в результате указатель mMem может быть любым, зависит от того, что делает операционка. Предполагаю, если виртуальный адрес 0х82020000 не занят - замапит туда, если занят, то куда-нить еще. |
| Автор: bems 3.8.2012, 15:11 |
ну оно не выгружаемое, это да. А касательно соответствия физическому, то насколько я понимаю не даже гарантии что две страницы идущие подряд в системном будут идти подряд в физическом. Короч маппинг может быть более сложным |
| Автор: batex 3.8.2012, 18:42 |
| Ну в общем, с помощью MmMapIoSpace все заработало. Всем спасибо. Тему можно закрывать |