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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как достать доступ к виртуальной памяти, отведенной для нужд Винды 
:(
    Опции темы
GIK
Дата 6.2.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


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

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



Народ, привет smile
Вобщем прочитал я пару статей про виндовую адресацию памяти, теперь интересует следующее:
Компилятор не дает значение данных хранимых, к примеру, в виртуальной области от 0x00000000 до 0x0000FFFF Если я создаю указатель, то он ссылается на первый байт, но значение от этого указателя нельзя получить и присвоить соответсятвенно тоже.
Как можно сделать так, чтобы доступ открылся?

Код

#include<conio>
#include<iostream>
using namespace std;

int main()
{
    void *g;
    int p=123;
    cout<<g<<endl; //результат- 1-ый бай ВИРТУАЛЬНОГО адресного пространства
    //cout<<*g<<endl; //и к нему нет доступа!!! (прочесть нельзя)
    //int ooo=*g;

    int *g2;
    int p2=123;
    g2=&p2;
    cout<<g2<<endl;  //адреса для кода и данных пользовательского режима, начинаются 
                                 //с 0x00010000 и заканчиваются 0x7FFEFFFF
    cout<<*g2<<endl;



    getche();
        return 0;
}


Добавлено @ 23:12 
Да, еще, чуть не забыл smile


Код

#include<conio>
#include<iostream>
using namespace std;

int main()
{
  
    int *g2;
    int p2=123;
    g2=&p2;
    g2++; //странно даже......
    cout<<g2<<endl;  //а что выдает то....
    cout<<*g2<<endl;
    getche();
        return 0;
}

Очень интересно наблюдать, когда выкидывает одинаковые числа smile

Код

#include<conio>
#include<iostream>
using namespace std;

int main()
{
  
    int *g2;
    int p2=123;
    g2=&p2;
    cout<<g2<<endl;  
    cout<<*g2<<endl;
    getche();
        return 0;
}




--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Anikmar
Дата 6.2.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



По поводу первого участка:
Код

    void *g;
    int p=123;
    cout<<g<<endl; //результат- 1-ый бай ВИРТУАЛЬНОГО адресного пространства
    //cout<<*g<<endl; //и к нему нет доступа!!! (прочесть нельзя)


А почему вы решили, что значение указателя g должно указывать на 1-й байт виртуальной памяти? Откуда такие утверждения? Вы просто видите значение переменной типа "указатель", которая НИЧЕМ не проинициализирована...

Это сообщение отредактировал(а) Anikmar - 6.2.2007, 23:18
PM MAIL ICQ   Вверх
GIK
Дата 6.2.2007, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


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

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



Куда указывает указатель? Не на память с адресом в один байт?



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Anikmar
Дата 6.2.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Он никуда не указывает! Это просто указатель. Чтобы он на что-то указывал ему нужно присвоить какое-нибудь значение. А так - все зависит от компилятора. В билдере, насколько я помню, указатель инициализируется значениме чуть больше нуля. Но не факт и в стандарте не прописано (насколько я знаю).
PM MAIL ICQ   Вверх
Romikgy
Дата 6.2.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Код

long * x;



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Anikmar
Дата 6.2.2007, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Romikgy, и? 
Не врубился...
PM MAIL ICQ   Вверх
Romikgy
Дата 6.2.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(GIK @  6.2.2007,  22:37 Найти цитируемый пост)
Куда указывает указатель? Не на память с адресом в один байт?


Цитата(Romikgy @  6.2.2007,  22:42 Найти цитируемый пост)
    
long * x;

я привел пример где указатель указывает на 4 бафта smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Anikmar
Дата 6.2.2007, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(Romikgy @  6.2.2007,  23:47 Найти цитируемый пост)
я привел пример где указатель указывает на 4 бафта  

И опять неправильно. С чего это следует? Пока он не инициализирован он никуда не указывает. Он МОЖЕТ указывать на память из 4-х байт (вернее на long).
А если взять конструкцию:
Код

long *pLong;
char *pChar;
long i;

pLong = &i;
pChar = (char*)pLong;


pLong и pChar имеют одно и тоже значение? И на какой участок памяти они указывают?
PM MAIL ICQ   Вверх
Romikgy
Дата 7.2.2007, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



да неправильно высказался
Цитата(Anikmar @  6.2.2007,  22:53 Найти цитируемый пост)
указатель

Цитата(Anikmar @  6.2.2007,  22:53 Найти цитируемый пост)
на 4 байта

так правильно?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
GIK
Дата 7.2.2007, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


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

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



Мне кажется в любом случае, если есть значение у указателя, значет оно, хотябы косвенно, куда то указывает.... Разве я не прав?
Почему тогда нельзя взять данные из области с адресом 1? Или вообще нельзя брать данные, из неинициализированного указаьеля?


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Romikgy
Дата 7.2.2007, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(GIK @  6.2.2007,  23:12 Найти цитируемый пост)
Или вообще нельзя брать данные, из неинициализированного указаьеля? 

смотря что в нем 
Цитата(GIK @  6.2.2007,  23:12 Найти цитируемый пост)
Почему тогда нельзя взять данные из области с адресом 1?

срабатывает имхо защита на доступ в системную область


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Anikmar
Дата 7.2.2007, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(GIK @  7.2.2007,  00:12 Найти цитируемый пост)
Мне кажется в любом случае, если есть значение у указателя, значет оно, хотябы косвенно, куда то указывает.... Разве я не прав?

Нет, это не так. Поцессу выделено его адрессное пространство, но память разделена на блоки. И каждый блок должен быть выделен менеджером памяти. Если указателю присвоить произвольное значение, то это далеко не всегда попадает в распределенное пространоство для процесса. В MSDOS так можно было - пробежаться по выделенным блокам, да и в любое место залесть было можно. Но стандартом Си++ это уже никак не определено - память должна выделяться в нужном объеме и освобождаться после. Произвольные адреса не допускаются.
PM MAIL ICQ   Вверх
vinter
Дата 7.2.2007, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата

Или вообще нельзя брать данные, из неинициализированного указаьеля?

нельзя, и нормальный компилятор будет на это ругаться..


--------------------
Мой блог
PM MAIL WWW   Вверх
Anikmar
Дата 7.2.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(vinter @  7.2.2007,  00:24 Найти цитируемый пост)
нельзя, и нормальный компилятор будет на это ругаться.. 

Интерес чисто познавательный, а каким образом он будет ругаться?

Я думал, что все что он скажет - это предупреждение "Возможное использование переменной до ее инициализации".  (зачастую оно по умолчанию выключено)

Или я чего-то не знаю?
PM MAIL ICQ   Вверх
SergeCpp
Дата 7.2.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Цитата(GIK @  7.2.2007,  00:58 Найти цитируемый пост)
значение данных хранимых, к примеру, в виртуальной области от 0x00000000 до 0x0000FFFF

user posted image
А. В. Коберниченко — Недокументированные возможности Windows NT
В этой книге рассказано и есть пример.

Советую найти (1998 год издания) и купить.

PM MAIL WWW ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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