Здравствуйте, SPavel, Вы писали:
SP>Привет Всем.
SP>Требуется прочитать данные из ячейки физической памяти по адресу 0xF000EC71. Длиной около 21 байта. Чтение должно производиться в системах Win 95/98, Win 2000/XP. Поэтому средства ассемблера сразу отпадают.
SP>Что предпринималось: была написана тестовая программа
SP>SP>#include <stdio.h>
SP>void main()
SP>{
SP> char * addr = (char *) 0xF000EC71;
SP> printf ("Read data = %s\n", addr);
SP>/* или так:
SP> int * addr = (int *) 0xF000EC71;
SP> printf ("Read data = %d\n", * addr);
SP>*/
SP>}
SP>
SP>Однако это не сработало — и под Win 98, и под Win 2000.
SP>Вероятно, данная ячейка является защищаемой областью памяти.
SP>Поиск в Инете по ключевым словам "Чтение ячейки памяти известному адресу" ничего не дал
SP>Подскажите, пожалуйста решение данной проблемы или путь поиска решения.
SP>С уважением, Павел
Такой код не сработает практически никогда. Под NT системы, как уже говорилось есть \device\PhysicalMemory, нужны только права администратора, под W9x наверное придется писать драйвер, который будет делать
VMMCall _MapPhysToLinear, <PhysAddr, nBytes, flags>
PhysAddr = 0xF000E000
nBytes = 0x1000
flags = 0
и потом читать данные по полученному линейному адресу+0xC71. Хотя вероятно удасться обойтись без VxD, если написать программу под DPMI. Программа будет делать
mov (e)ax, 800h
mov (e)cx, 0E000h
mov (e)bx, 0F000h
mov (e)di, 1000h
xor (e)si, (e)si
int 31h
потом, при необходимости, создавать селектор с базовым адресом, который будет в BX:CX после int 31h, при условии CF=0, а после этого читать значение по нужному адресу. При желании это можно попытаться выполнить в Win16 DLL, которую можно вызвать из Win32 программы через thunk.