Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> exception : 0xC0000005: Access Violation 
:(
    Опции темы
batex
Дата 2.8.2012, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 15.5.2010

Репутация: нет
Всего: нет



Разработка идет по windows mobile 6. Возникла необходимость в определенном случае менять данные в памяти по адресу 0x02020000 cо смещение 0x4a. Написал в лоб:
Код

int offset = 0x4a;
int Addr = 0x02020000;
Addr += offset;
char * c = (char *) Addr;
*c = 0x1;


Выдает исключение: exception : 0xC0000005: Access Violation. Нет доступа к памяти. Попытался сделать через ReadProccessMemory и WriteProccessMemory. Вроде через эти функции можно писать в память другого процесса. Но для этого надо знать Handle процесса. Вопрос в следующем: Как узнать какому процессу принадлежит память(хотя есть такое ощущение, что это вообще реестр) или как получить доступ и писать в защищенную память?

Это сообщение отредактировал(а) batex - 2.8.2012, 10:47
PM MAIL   Вверх
korian
Дата 2.8.2012, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



А оно вам надо?  smile
От куда вообще взялся такой адрес? Вы уверены, что он не изменится при перезагрузке например?
Если вы знаете от куда он взялся, вы поидее должны знать, какой процесс им обладает.

PM   Вверх
batex
Дата 2.8.2012, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 15.5.2010

Репутация: нет
Всего: нет



Цитата(korian @ 2.8.2012,  11:27)
А оно вам надо?  smile
От куда вообще взялся такой адрес? Вы уверены, что он не изменится при перезагрузке например?
Если вы знаете от куда он взялся, вы поидее должны знать, какой процесс им обладает.

этот адрес дало начальство сверху. Откуда конкретно он взялся - я не знаю
PM MAIL   Вверх
magesi
Дата 2.8.2012, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(batex @  2.8.2012,  10:46 Найти цитируемый пост)
Возникла необходимость в определенном случае менять данные в памяти по адресу 0x02020000 cо смещение 0x4a.

Вам нужно сместить сам адрес или значение по адресу? ( думаю второе )

Вам именно как сместить нужно? побитовые сдвиги через << или тупо прибавить значение к существующему?

Обычно, как вы выразились в вопросе, имеют в виду побитовые сдвигы, но судя по коду ( точнее по логике кода , которую Вы хотели бы видеть, однако не то делаете ), Вы просто получаете "как бы" новый адрес в виде 0x02020000 + offset ( 0x4a ) = 0x0202004A и пытаетесь по нему записать *c = 0x1; значение , но это в концептуальном плане, как у Вас выглядит судя по коду ( реально код Ваш этого конечно не делает )

Если Вам нужно само значение по адресу 0x02020000 увеличить на 0x4a

Код

int offset = 0x4a;
*(int*)0x02020000 += offset;


Но мне, что-то внутри подсказывает, что Вам скорее нужно по адресу просто значение сдвинуть << 0x4a побитово ) Вы поконкретнее объясните, что требуется.

PS
Что-то какой-то метод разработки микроконтроллеров у ТС причем голых , Венда Мобайл будет слать конечно запросто за такие попытки, да и цель сильно смущает...
В целом, Вам вряд ли дадут менять так данные ОС, Вам хотя бы в ring0 в kernel надо gate открыть, если неймется ( хотя конечно, что за контроллер у Вас, у АРМ - концепции колец безопасности - нет, но зато есть безопасные режимы с различными диапазонами, но если у Вас Intel Atom, который сейчас пихают во всем мобильники... то там уже кольца x86, но у Вас Венда 6 скорее всего для такой ОС, там какой-нибудь АРМ стоит, но Венда Мобайл режимы тоже фильтрует, и просто так значения в адресах не получится, там и protected mode и еще несколько... ), хотя не понимаю, для чего нужно проекту на Винде Мобайл изменять по адресам значения

Это сообщение отредактировал(а) magesi - 2.8.2012, 12:08
PM MAIL   Вверх
batex
Дата 2.8.2012, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 15.5.2010

Репутация: нет
Всего: нет



Требуется именно сменить значение по адресу 0x02020000 + offset ( 0x4a ) = 0x0202004A на 0x1. Адрес записан в виде базовый + смещение, потому что смещение для некоторых случаев - разное.
PM MAIL   Вверх
magesi
Дата 2.8.2012, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(batex @  2.8.2012,  12:06 Найти цитируемый пост)
Требуется именно сменить значение по адресу 0x02020000 + offset ( 0x4a ) = 0x0202004A на 0x1. Адрес записан в виде базовый + смещение, потому что смещение для некоторых случаев - разное. 

Код

int addr = 0x02020000;
int offset = 0x4a;

*(int*)(addr + offset) += 0x1; // или *(int*)(addr + offset) = 0x1; если просто присвоить, а не увеличить на 0x1


Но только Венда Мобайл не должна позволять такое делать ) Вы по логике access violation все равно будете получать

Это сообщение отредактировал(а) magesi - 2.8.2012, 12:15
PM MAIL   Вверх
batex
Дата 2.8.2012, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 15.5.2010

Репутация: нет
Всего: нет



Цитата(magesi @ 2.8.2012,  12:09)
Цитата(batex @  2.8.2012,  12:06 Найти цитируемый пост)
Требуется именно сменить значение по адресу 0x02020000 + offset ( 0x4a ) = 0x0202004A на 0x1. Адрес записан в виде базовый + смещение, потому что смещение для некоторых случаев - разное. 

Код

int addr = 0x02020000;
int offset = 0x4a;

*(int*)(addr + offset) += 0x1; // или *(int*)(addr + offset) = 0x1; если просто присвоить, а не увеличить на 0x1


Но только Венда Мобайл не должна позволять такое делать ) Вы по логике access violation все равно будете получать

Ага, получу эксепшн. Вопрос в том, как получить доступ к этому участку памяти
PM MAIL   Вверх
magesi
Дата 2.8.2012, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



batex, через Cи-синатксис именно так, как я написал, но Вы ни слова не сказали откуда Вы пытаетесь такой код запустить, если из под самой ОС из некого подобия user-mode, то такой код не будет работать.

Поскольку, скорее всего у Вас - АРМ микрконтроллер ( хотя Вы не уточнили ), то Вам нужно читать документацию про свой микроконтроллер на сайте АРМ, про диапазоны адресов различных режимов ( mode ) и попасть в Supervisor mode, и учить как попадать туда из под Венды Мобайл и только так уже записывать в памяти.

У АРМ такие моды:

Код

The ARM architecture specifies the following CPU modes.
At any moment in time, the CPU can be in only one mode, but it can switch modes due to external events (interrupts) or programmatically.

User mode
    The only non-privileged mode.
System mode
    The only privileged mode that is not entered by an exception.
 It can only be entered by executing an instruction that explicitly writes to the mode bits of the CPSR.
Supervisor (svc) mode
    A privileged mode entered whenever the CPU is reset or when a SWI instruction is executed.
Abort mode
    A privileged mode that is entered whenever a prefetch abort or data abort exception occurs.
Undefined mode
    A privileged mode that is entered whenever an undefined instruction exception occurs.
Interrupt mode
    A privileged mode that is entered whenever the processor accepts an IRQ interrupt.
Fast Interrupt mode
    A privileged mode that is entered whenever the processor accepts an FIQ interrupt.
Hyp mode
    A hypervisor mode introduced in armv-7a for cortex-A15 processor for providing hardware virtualization support. 


http://infocenter.arm.com/help/index.jsp?t...c/Cihhcjia.html

Это сообщение отредактировал(а) magesi - 2.8.2012, 12:31
PM MAIL   Вверх
bems
Дата 2.8.2012, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Дело в том, что в разных процессах в по этому адресу лежат разные данные, поэтому вопрос "какому процессу принадлежит адрес" некорректен (в общем случае)
Опиши подробнее что вы делаете? может имеется в виду доступ к внутренним данным длл, загруженной по адресу 02020000? тогда нужно грузить длл в свой процесс, и тогда менять в своём процессе, предварительно получив права на запись (VirtualProtect)


--------------------
Обижено школьников: 8
PM MAIL   Вверх
bsa
Дата 2.8.2012, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



скорее всего, необходим доступ к физическому адресу. Если это так, то необходимо действительно переходить в привелигерованный режим (драйвер?) и делать это оттуда.
Требуй от начальства подробностей. Что это, зачем и так далее.


Это сообщение отредактировал(а) bsa - 2.8.2012, 15:57
PM   Вверх
magesi
Дата 2.8.2012, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(bsa @  2.8.2012,  15:56 Найти цитируемый пост)
скорее всего, необходим доступ к физическому адресу. Если это так, то необходимо действительно переходить в привелигерованный режим (драйвер?) и делать это оттуда.
Требуй от начальства подробностей. Что это, зачем и так далее.

тут скорее спецификации микропроцессора и Венды Мобайл читать надо, чем начальство мучать  smile хотя судя по задаче, больно странное начальство 
PM MAIL   Вверх
batex
Дата 2.8.2012, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 15.5.2010

Репутация: нет
Всего: нет



да в том то все и дело, что пришло письмо с требованием, при таком-то случаи, включить такой-то режим. И приложен скрин сторонней программы с подписью, что мол для вкл режима выставить такие значения. На скрине адрес 0x02020000, внизу введено смещение и ниже данные. 
PM MAIL   Вверх
magesi
Дата 2.8.2012, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 20.5.2012

Репутация: -4
Всего: -4



Цитата(batex @  2.8.2012,  18:06 Найти цитируемый пост)
при таком-то случаи, включить такой-то режим.

ну, не при каком-то, а там есть триггер перехода в различные режимы

Цитата(batex @  2.8.2012,  18:06 Найти цитируемый пост)
 И приложен скрин 

выложите в тему пожалуйста скрин и описание , быстрее же Вам поможем

Это сообщение отредактировал(а) magesi - 2.8.2012, 20:38
PM MAIL   Вверх
batex
Дата 3.8.2012, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 15.5.2010

Репутация: нет
Всего: нет



Сегодня стало немного понятнее. 0x02020000 + 0x4a это физический адрес, следовательно, необходимо перейти в привилегированный режим. Пока что не могу найти как это сделать

Это сообщение отредактировал(а) batex - 3.8.2012, 11:50
PM MAIL   Вверх
batex
Дата 3.8.2012, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 15.5.2010

Репутация: нет
Всего: нет



Попробовал через функцию MmMapIoSpace.

Код

PHYSICAL_ADDRESS PhyAddr;
PhyAddr.HighPart = 0x02020000+0x4a;
PhyAddr.LowPart = 0;
LPDWORD mMem = (LPDWORD) MmMapIoSpace(PhyAdde,16374,false);
*mMem = 0x1;


вылетает эксепшн 0xDFFF0123. 

Интересно вот что. Если посмотреть архитектуру адресного пространства, то системное адресное пространство начинается с 0х80000000 и выше. Системное ап отображается линейно на физические? Т.е. физический 0х02020000 это системный 0х82020000? или нет?

Это сообщение отредактировал(а) batex - 3.8.2012, 13:51
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1193 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.