Привет Всем.
Требуется прочитать данные из ячейки физической памяти по адресу 0xF000EC71. Длиной около 21 байта. Чтение должно производиться в системах Win 95/98, Win 2000/XP. Поэтому средства ассемблера сразу отпадают.
Что предпринималось: была написана тестовая программа
#include <stdio.h>
void main()
{
char * addr = (char *) 0xF000EC71;
printf ("Read data = %s\n", addr);
/* или так:
int * addr = (int *) 0xF000EC71;
printf ("Read data = %d\n", * addr);
*/
}
Однако это не сработало — и под Win 98, и под Win 2000.
Вероятно, данная ячейка является защищаемой областью памяти.
Поиск в Инете по ключевым словам "Чтение ячейки памяти известному адресу" ничего не дал
Подскажите, пожалуйста решение данной проблемы или путь поиска решения.
С уважением, Павел
Здравствуйте, SPavel, Вы писали:
SP>Требуется прочитать данные из ячейки физической памяти по адресу 0xF000EC71.
Касаемо NT, есть такой драйвер, \device\physicalmemory через
него можно читать именно ячейки физической памяти. Только вот...
Это ж в районе 4-х гигибайт! (0xf000ec71 == 4 026 592 369).
Касаемо 98. Виртуальная память по таким адресам используется
драйверами и даже доступна для записи. Смотрите у Риштера
"Windoze для профессионалов", глава 4. Опять повторюсь, это
касаемо виртуальных адресов.
Здравствуйте, SPavel, Вы писали:
SP>Привет Всем. SP>Требуется прочитать данные из ячейки физической памяти по адресу 0xF000EC71. Длиной около 21 байта. Чтение должно производиться в системах Win 95/98, Win 2000/XP. Поэтому средства ассемблера сразу отпадают. SP>Что предпринималось: была написана тестовая программа SP>
SP>Однако это не сработало — и под Win 98, и под Win 2000. SP>Вероятно, данная ячейка является защищаемой областью памяти. SP>Поиск в Инете по ключевым словам "Чтение ячейки памяти известному адресу" ничего не дал SP>Подскажите, пожалуйста решение данной проблемы или путь поиска решения. SP>С уважением, Павел
Если речь идет, действительно, о физической памяти по адресу 0xF000EC71, то Вам необходимо ознакомиться с формирование физического адреса в расширенном (защищенном) режиме (скорее всего, придется писать драйвер).
Если это адрес в пределах адресного пространства процесса, то вот что пишет Д. Рихтер по этому поводу:
Win95:
0xC0000000:0xFFFFFFFF — Регион размером 1Гб для драйверов виртуальных устройств, диспетчера памяти и кода файловой системы; доступен всем Win32 процессам для чтения и записи (но лучше туда ничего не записывать).
WinNT:
0x80000000:0xFFFFFFFF — Регион размером 2Гб для операционной системы (не доступен)
Может, если Вы напишете, для чего Вам необходимо обращаться по этому адресу, то будет легче решить проблему.
Здравствуйте, kmn, Вы писали:
kmn>Если речь идет, действительно, о физической памяти по адресу 0xF000EC71, то Вам необходимо ознакомиться с формирование физического адреса в расширенном (защищенном) режиме (скорее всего, придется писать драйвер).
kmn>Если это адрес в пределах адресного пространства процесса, то вот что пишет Д. Рихтер по этому поводу:
kmn>Win95: kmn>
kmn>0xC0000000:0xFFFFFFFF — Регион размером 1Гб для драйверов виртуальных устройств, диспетчера памяти и кода файловой системы; доступен всем Win32 процессам для чтения и записи (но лучше туда ничего не записывать).
kmn>WinNT: kmn>
kmn>0x80000000:0xFFFFFFFF — Регион размером 2Гб для операционной системы (не доступен)
kmn> kmn>Может, если Вы напишете, для чего Вам необходимо обращаться по этому адресу, то будет легче решить проблему.
Действительно, проблема обстоит несколько иначе — требуется выяснить ID материнской платы. Была предпринята попытка выяснения этого номера средствами ОС. Не получилось (данных не хватает). К сожалению, на данном форуме неоднократно звучал вопрос о выяснении серийного номера материнской платы. Конкретных ответов я не нашёл. Поэтому решил подойти к проблеме с другой стороны:
Было выяснено, что искомая информация содержится по адресу 0xF000EC71. Вот и всё.....
Здравствуйте, SPavel, Вы писали:
SP>Не получилось (данных не хватает).
Каких именно данных не хватает?
SP>К сожалению, на данном форуме неоднократно звучал вопрос
К счастью!
SP>Конкретных ответов я не нашёл.
А вот это — к сожалению.
SP>Было выяснено, что искомая информация содержится по адресу 0xF000EC71.
Как уже выяснили, это не физическая память, а ВАП ядра. Потому чтоб оттуда читать — надо писать драйвер. Однако, есть ее WMI, которая на Win2k очень даже работает.
Здравствуйте, SPavel, Вы писали:
SP>Привет Всем. SP>Требуется прочитать данные из ячейки физической памяти по адресу 0xF000EC71. Длиной около 21 байта. Чтение должно производиться в системах Win 95/98, Win 2000/XP.
Насчет Win 95/98 — читай Питрека (Matt Pietrek) "Секреты системного программирования по Windows 95". Книга издавалась на русском, в интернете я встречал только английский вариант, откликается на PietrekBook.pdf.
SP>Поэтому средства ассемблера сразу отпадают.
Почему? Ассемблер != драйвер. Кроме того, очевидно, что для 95 и 2000 задачу придется решать разными способами.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, vasketsov, Вы писали:
V>Как уже выяснили, это не физическая память, а ВАП ядра. Потому чтоб оттуда читать — надо писать драйвер. Однако, есть ее WMI, которая на Win2k очень даже работает.
Однако требуется, чтобы работало и на Win 95/98.
По поводу WMI — этот вариант я рассматривал (ознакомительно — просматривал статьи). Нужной информации не нашёл. Возможно, не заметил нужной инфы. К тому же, как я понял — WMI предназначается для управления, и информации относительно выуживания серийных номеров не заметил.
Здравствуйте, SPavel, Вы писали:
SP>Здравствуйте, vasketsov, Вы писали:
SP>По поводу WMI — этот вариант я рассматривал (ознакомительно — просматривал статьи). Нужной информации не нашёл. Возможно, не заметил нужной инфы. К тому же, как я понял — WMI предназначается для управления, и информации относительно выуживания серийных номеров не заметил.
SP>С уважением, Павел
Попробуй этот скрипт (сгенерён с помощью Scriptomatic) запиши скрипт в файл baseboard.vbs и запусти cscript baseboard.vbs или просто даблкликом.
Здравствуйте, SPavel, Вы писали:
SP>Привет Всем. SP>Требуется прочитать данные из ячейки физической памяти по адресу 0xF000EC71. Длиной около 21 байта. Чтение должно производиться в системах Win 95/98, Win 2000/XP. Поэтому средства ассемблера сразу отпадают. SP>Что предпринималось: была написана тестовая программа SP>
SP>Однако это не сработало — и под Win 98, и под Win 2000. SP>Вероятно, данная ячейка является защищаемой областью памяти. SP>Поиск в Инете по ключевым словам "Чтение ячейки памяти известному адресу" ничего не дал SP>Подскажите, пожалуйста решение данной проблемы или путь поиска решения. SP>С уважением, Павел
Такой код не сработает практически никогда. Под NT системы, как уже говорилось есть \device\PhysicalMemory, нужны только права администратора, под W9x наверное придется писать драйвер, который будет делать
и потом читать данные по полученному линейному адресу+0xC71. Хотя вероятно удасться обойтись без VxD, если написать программу под DPMI. Программа будет делать
потом, при необходимости, создавать селектор с базовым адресом, который будет в BX:CX после int 31h, при условии CF=0, а после этого читать значение по нужному адресу. При желании это можно попытаться выполнить в Win16 DLL, которую можно вызвать из Win32 программы через thunk.
Здравствуйте, vasketsov, Вы писали:
V>Здравствуйте, Roman_M, Вы писали:
RM>>есть \device\PhysicalMemory, V>Читает именно физическую память, а не ВАП ядра.
Так там, вроде, и нужна физическая память, а не виртуальная.
Здравствуйте, Roman_M, Вы писали:
RM>...там, вроде, и нужна физическая память
Не-а. В принципе нереально, чтобы что-нибудь располагалось фиксировано по ТАКОМУ адресу в физической памятию Потому что памяти чаще меньше.
Здравствуйте, vasketsov, Вы писали:
V>Здравствуйте, Roman_M, Вы писали:
RM>>есть \device\PhysicalMemory, V>Читает именно физическую память, а не ВАП
Хорошо — а как им воспользоваться? В MSDN об этом написано крайне скудно
The PhysicalMemory property gives the size of the installed RAM in Megabytes
И как я понимаю, это не совсем то, что имелось в виду под "\device\PhysicalMemory"
Здравствуйте, vasketsov, Вы писали:
V>Здравствуйте, Roman_M, Вы писали:
RM>>...там, вроде, и нужна физическая память V>Не-а. В принципе нереально, чтобы что-нибудь располагалось фиксировано по ТАКОМУ адресу в физической памятию Потому что памяти чаще меньше.
Очень даже реально. Вам не доводилось программировать вывод графики под DOS в разрешени 640x480 и выше через Linear Frame Buffer (VBE 2.0 +) ? Так вот Frame Buffer вполне может располагаться на подобных адреса, если не верите, посмотрите "Свойства системы"->"Диспетчер устройств"->"Видеоадаптеры"->"Свойства"->"Ресурсы". А также можно посмотреть ресурсы устройства "системная плата" (вроде бы нужен её номер), там адреса будут именно такими.
Здравствуйте, vasketsov, Вы писали:
RM>>...там, вроде, и нужна физическая память V>Не-а. В принципе нереально, чтобы что-нибудь располагалось фиксировано по ТАКОМУ адресу в физической памятию Потому что памяти чаще меньше.
Смотря что понимать под физической памятью. Если RAM, то вряд ли. А вот если I/O порты, на память мапленные, то очень даже реально. Вот например на компьютере, за которым я сейчас сижу, Device Manager показывает, что System Board зарезервировала себе кусок памяти FFFE0000 — FFFFFFFF. Почему бы ей не выдавать при чтении из какого-то из этих адресов регистры чипсета, свой ID и прочее?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.