Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2010, 23:11   #1
Breaknus
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 11
По умолчанию Доступ к байту с заданным адресом (чтение)

Здравствуйте. Дело такое: есть адрес в памяти, по нему нужно считать байт. VS 2008 ругает - Bad ptr, нет доступа. В какой-то мере понятно - этот адресс программе никто не выделял. Но как получить доступ? Важно чтение, запись не важна.
Заранее спасибо.
Breaknus вне форума Ответить с цитированием
Старый 26.09.2010, 23:17   #2
ZaRDaK
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 197
По умолчанию

ReadProcessMemory.
Базовый адрес процесса почти всегда равен $400000, к этому адресу прибавишь оффсет. Если я правильно помню, то записывается как (LPVOID)$400000.
ZaRDaK вне форума Ответить с цитированием
Старый 27.09.2010, 00:12   #3
Breaknus
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 11
По умолчанию

Я пытаюсь считать данные таблицы SMBIOS. Понятие не имею, что за процесс использует память, которая мне нужна.

Никак нельзя исключить использование API?

Последний раз редактировалось Stilet; 28.09.2010 в 08:49.
Breaknus вне форума Ответить с цитированием
Старый 27.09.2010, 00:18   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

а как ты себе это представляешь?Распределением памяти занимается ОС и благодаря её API можно использовать привилегированные(запрещенные) команды такие как чтение и запись памяти любого запущенного процесса. И код ассемблера не поможет, как только ОС заметит, что другой процесс использует запрещенные команды, она его блокирует.

Последний раз редактировалось NiCola999; 27.09.2010 в 00:22.
NiCola999 вне форума Ответить с цитированием
Старый 27.09.2010, 00:19   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

хуже, чтоб прочесть произвольный адрес физической памяти(а не виртуальной памяти процесса) вам нужно в Ring 0(в ядро) попасть, а это пахнет драйвером режима ядра
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.09.2010, 00:30   #6
Breaknus
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 11
По умолчанию

Короче, чтобы прочесть физический адрес, нужно написать много букв сложного кода, понял. Ладно. А как прочесть физический адрес с помощью API? Я не знаю, за каким процессом он числится.
Breaknus вне форума Ответить с цитированием
Старый 27.09.2010, 00:36   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Насколько я знаю физический адрес прочесть невозможно даже с помощью api(кроме режима ядра), потому что система работает с виртуальными адресами, преобразование его в физический делает отдельная часть процессора (курс ОС)

И не надо писать много кода, с api всё просто

Код:
void ReadMemoryProcess(char* windowName, DWORD adress, TYPE* data) {
        DWORD   Addr_Str1= adress;
        DWORD   pId;
        HANDLE  ProcHandle;                	               
        HWND hwnd = FindWindow(NULL, windowName);               
        GetWindowThreadProcessId(hwnd, &pId);;
	cout << "PID: " << pId << endl;        
        if(pId!=0)
        {                
                if ((ProcHandle=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId)))
                {         				     
                        if(ReadProcessMemory(ProcHandle, (LPCVOID)(Addr_Str1), (LPVOID)&data, sizeof(data), NULL))                                        
                                cout<< "Adress value: " << data[0]<<endl;                                
                        else
                                cout << "Read memory error\n";				
                }else
                       cout << "Process error\n";	
        }                
}

/*пример использования
   ReadMemoryProcess("Notepad", 0xb2021a, data);
*/

Последний раз редактировалось NiCola999; 27.09.2010 в 00:42.
NiCola999 вне форума Ответить с цитированием
Старый 27.09.2010, 00:45   #8
Breaknus
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 11
По умолчанию

Курс системное ПО только начался. Надо курсовик делать) Придумал тему - считывание показателей температуры, нагрузки, вращение вентиляторов и прочие данные о железках. Думал - непросто. Погуглил - все делается через WMI API. А она берет данные из SMBIOS. Думал, ради усложнения, самому взять данные из SMBIOS) Прочитал ее спецификацию, узнал по каким адресам нужная информация хранится, а тут такие дела =(
P.S. 2NiCola999
Я не знаю, за каким процессом числится адрес! Я знаю только его значение - 0x000f0000. Хотя бы его прочитать.
Breaknus вне форума Ответить с цитированием
Старый 27.09.2010, 10:47   #9
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

в твоем случае можно вопсользоваться ассемблером

Последний раз редактировалось NiCola999; 27.09.2010 в 10:54.
NiCola999 вне форума Ответить с цитированием
Старый 27.09.2010, 20:45   #10
Breaknus
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 11
По умолчанию

Мне по задумке надо работать не только с одним байтом, а с большой таблицей, которая там размещена... Буду гуглить, как попасть в ring 0. Я не представляю, как писать драйвер режима ядра, но у меня еще до ссесии уйма времени) Буду очень признателен, если подскажете литературу.
Breaknus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с адресом сайта Приклад PHP 5 11.09.2010 18:06
Socket / Доступ к буферу чтения сокета / Чтение из буфера bwwebm Работа с сетью в Delphi 1 29.04.2010 10:42
помогите с адресом пожалуйста rudolfe Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 07.03.2009 13:19
Проблема с адресом файла Геля Общие вопросы Delphi 8 20.04.2007 20:48
Помогите с IP-адресом! gluk666 Работа с сетью в Delphi 1 25.02.2007 09:28