Здравствуйте, D-NICKNAME, Вы писали:
DN>Всем привет! DN>У меня проблема, мне нужно доступиться у определённому адресу памяти и поменять значение, к примеру: DN>я писал след образом:
DN>PUINT p1; DN>p1 = (PUINT) 0xA7000024; DN>*p1 |= 0x00010000;
DN>Понял, что для доступа к физ памяти необходим VirtualLocal, но никак не могу понять, как в этом случае сюда прикрутить.
DN>Подскажите, если кто в курсе.
DN>Заранее благодарен.
К физической памяти из обычного приложения ты так просто не залезешь. Ни одной стандартной API функцией (как-то можно в NT\2000 через CreateFile("что-то"), где-то это было). Хуже того, скорее всего тебе туда и не надо. Опиши задачу.
Приложению пользовательского режима память выше 0x8000000 не доступна. Ты лезешь выше. (0xA7000024) и VirtualAlloc тут не при чем. С помощью него память во втором гигабайте не выделется. Она может выделяться неявно при создании какого-либо объекта.
Здравствуйте, SergH, Вы писали:
SH>Здравствуйте, D-NICKNAME, Вы писали:
DN>>Всем привет! DN>>У меня проблема, мне нужно доступиться у определённому адресу памяти и поменять значение, к примеру: DN>>я писал след образом:
DN>>PUINT p1; DN>>p1 = (PUINT) 0xA7000024; DN>>*p1 |= 0x00010000;
DN>>Понял, что для доступа к физ памяти необходим VirtualLocal, но никак не могу понять, как в этом случае сюда прикрутить.
DN>>Подскажите, если кто в курсе.
DN>>Заранее благодарен.
SH>К физической памяти из обычного приложения ты так просто не залезешь. Ни одной стандартной API функцией (как-то можно в NT\2000 через CreateFile("что-то"), где-то это было). Хуже того, скорее всего тебе туда и не надо. Опиши задачу.
На самом деле я это использую под WinCE. Мне надо, чтобы адрес 0xA7000024 соответствовал физическому. Выполнение этой процедуры, нужно для включение подсветки кнопок под Mitec.
Коментарии, которые мне дали были следующие:
"Что касается адресов, то их надо получать через VirtualAlloc, чтоб они соответсвовали физическим."
А изначально решение этой проблемы было продемонстрировано как:
unsigned int p1,p2;
p1=0xA7000024;
p2=0xA7000018;
*p1 |= 0x00010000;// LED ON
*p2 |= 0x00010000;// LED OFF
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Здравствуйте, D-NICKNAME, Вы писали:
AS>[]
AS>Приложению пользовательского режима память выше 0x8000000 не доступна. Ты лезешь выше. (0xA7000024) и VirtualAlloc тут не при чем. С помощью него память во втором гигабайте не выделется. Она может выделяться неявно при создании какого-либо объекта.
На самом деле я это использую под WinCE. Мне надо, чтобы адрес 0xA7000024 соответствовал физическому. Выполнение этой процедуры, нужно для включение подсветки кнопок под Mitec.
Коментарии, которые мне дали были следующие:
"Что касается адресов, то их надо получать через VirtualAlloc, чтоб они соответсвовали физическим."
А изначально решение этой проблемы было продемонстрировано как:
unsigned int p1,p2;
p1=0xA7000024;
p2=0xA7000018;
*p1 |= 0x00010000;// LED ON
*p2 |= 0x00010000;// LED OFF
Здравствуйте, D-NICKNAME, Вы писали:
DN>PUINT p1; DN>p1 = (PUINT) 0xA7000024; DN>*p1 |= 0x00010000;
DN>Понял, что для доступа к физ памяти необходим VirtualLocal, но никак не могу понять, как в этом случае сюда прикрутить.
В физическую память можно писАть только с 0го кольца.
в 9х можно обмануть и выйти на 0е кольцо
а в NT придется драйверок писать
Здравствуйте, D-NICKNAME, Вы писали:
DN>На самом деле я это использую под WinCE.
Про неё я мало чего знаю.
DN>Мне надо, чтобы адрес 0xA7000024 соответствовал физическому.
Какому именно физическому? Ты хочешь сказать, что у тебя больше 2Гб оперативки?
DN>"Что касается адресов, то их надо получать через VirtualAlloc, чтоб они соответсвовали физическим."
Не понимаю смысла этой фразы.
DN>А изначально решение этой проблемы было продемонстрировано как: DN>unsigned int p1,p2; DN> DN>p1=0xA7000024; DN>p2=0xA7000018; DN> DN>*p1 |= 0x00010000;// LED ON DN>*p2 |= 0x00010000;// LED OFF
И этого кода. Хотя, может в WinCE....
Здравствуйте, payglobal, Вы писали:
P>Здравствуйте, D-NICKNAME, Вы писали:
DN>>PUINT p1; DN>>p1 = (PUINT) 0xA7000024; DN>>*p1 |= 0x00010000;
DN>>Понял, что для доступа к физ памяти необходим VirtualLocal, но никак не могу понять, как в этом случае сюда прикрутить.
P>В физическую память можно писАть только с 0го кольца. P>в 9х можно обмануть и выйти на 0е кольцо P>а в NT придется драйверок писать
На самом деле я это использую под WinCE. Мне надо, чтобы адрес 0xA7000024 соответствовал физическому. Выполнение этой процедуры, нужно для включение подсветки кнопок под Mitec.
Коментарии, которые мне дали были следующие:
"Что касается адресов, то их надо получать через VirtualAlloc, чтоб они соответсвовали физическим."
А изначально решение этой проблемы было продемонстрировано как:
unsigned int p1,p2;
p1=0xA7000024;
p2=0xA7000018;
*p1 |= 0x00010000;// LED ON
*p2 |= 0x00010000;// LED OFF
Здравствуйте, SergH, Вы писали:
SH>Здравствуйте, D-NICKNAME, Вы писали:
DN>>На самом деле я это использую под WinCE.
SH>Про неё я мало чего знаю.
DN>>Мне надо, чтобы адрес 0xA7000024 соответствовал физическому.
SH>Какому именно физическому? Ты хочешь сказать, что у тебя больше 2Гб оперативки?
DN>>"Что касается адресов, то их надо получать через VirtualAlloc, чтоб они соответсвовали физическим." SH>Не понимаю смысла этой фразы.
DN>>А изначально решение этой проблемы было продемонстрировано как: DN>>unsigned int p1,p2; DN>> DN>>p1=0xA7000024; DN>>p2=0xA7000018; DN>> DN>>*p1 |= 0x00010000;// LED ON DN>>*p2 |= 0x00010000;// LED OFF SH>И этого кода. Хотя, может в WinCE....
Допустим, что да.
Как просто прочитать и записать в адрес значение, используя VirtualLocal. (На значения пока не надо обращать внимание)
Здравствуйте, D-NICKNAME, Вы писали:
DN>>>Мне надо, чтобы адрес 0xA7000024 соответствовал физическому. SH>>Какому именно физическому? Ты хочешь сказать, что у тебя больше 2Гб оперативки?
Всё-таки, уточни, нужно ли какое-то соответствие виртуального адреса физическому или нет, если нужно, то какое. Просто я не могу даже представить, зачем оно может понадобиться. И я сомневаюсь, что по фиксированному в физической памяти адресу есть какие-то структуры. Да и адрес уж больно большой. Я могу предположить, что эти стуктуры есть по фиксированному в виртуальной памяти адресе. Таких и в NT полно. PEB тот же..
DN>Допустим, что да.
DN>Как просто прочитать и записать в адрес значение, используя VirtualLocal. (На значения пока не надо обращать внимание)
Есть функция VirtualAllocEx. Она умеет выделять память по заданному виртуальному адресу. Соответственно, выделяешь и пишешь.. Но, как тебе уже сказал Alexey Shirshov, она работает только для первых двух гигабайт. В нормальных ОС. Кстати, есл по этому адресу уже что-то хранится, то и выделять ничего не надо — оно уже выделено. Просто к таким адресам у тебя нет доступа.
Резюме: либо тебя накололи, либо в WinCE все сильно отличается от нормальных Windows-ов.