Чтение данных из физической ячейки памяти
От: SPavel Украина  
Дата: 17.01.03 08:33
Оценка:
Привет Всем.
Требуется прочитать данные из ячейки физической памяти по адресу 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.
Вероятно, данная ячейка является защищаемой областью памяти.
Поиск в Инете по ключевым словам "Чтение ячейки памяти известному адресу" ничего не дал
Подскажите, пожалуйста решение данной проблемы или путь поиска решения.
С уважением, Павел
Re: Чтение данных из физической ячейки памяти
От: Whisperer  
Дата: 17.01.03 09:01
Оценка:
Здравствуйте, SPavel, Вы писали:

Драйвер.
Re: Чтение данных из физической ячейки памяти
От: Snax Россия  
Дата: 17.01.03 09:06
Оценка:
Здравствуйте, SPavel, Вы писали:

SP>Требуется прочитать данные из ячейки физической памяти по адресу 0xF000EC71.


Касаемо NT, есть такой драйвер, \device\physicalmemory через
него можно читать именно ячейки физической памяти. Только вот...
Это ж в районе 4-х гигибайт! (0xf000ec71 == 4 026 592 369).

Касаемо 98. Виртуальная память по таким адресам используется
драйверами и даже доступна для записи. Смотрите у Риштера
"Windoze для профессионалов", глава 4. Опять повторюсь, это
касаемо виртуальных адресов.

Павел.
Re: Чтение данных из физической ячейки памяти
От: kmn Украина  
Дата: 17.01.03 09:16
Оценка:
Здравствуйте, 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>С уважением, Павел

Если речь идет, действительно, о физической памяти по адресу 0xF000EC71, то Вам необходимо ознакомиться с формирование физического адреса в расширенном (защищенном) режиме (скорее всего, придется писать драйвер).

Если это адрес в пределах адресного пространства процесса, то вот что пишет Д. Рихтер по этому поводу:

Win95:

0xC0000000:0xFFFFFFFF — Регион размером 1Гб для драйверов виртуальных устройств, диспетчера памяти и кода файловой системы; доступен всем Win32 процессам для чтения и записи (но лучше туда ничего не записывать).


WinNT:

0x80000000:0xFFFFFFFF — Регион размером 2Гб для операционной системы (не доступен)



Может, если Вы напишете, для чего Вам необходимо обращаться по этому адресу, то будет легче решить проблему.
Re[2]: Чтение данных из физической ячейки памяти
От: SPavel Украина  
Дата: 17.01.03 09:42
Оценка:
Здравствуйте, kmn, Вы писали:

kmn>Если речь идет, действительно, о физической памяти по адресу 0xF000EC71, то Вам необходимо ознакомиться с формирование физического адреса в расширенном (защищенном) режиме (скорее всего, придется писать драйвер).


kmn>Если это адрес в пределах адресного пространства процесса, то вот что пишет Д. Рихтер по этому поводу:


kmn>Win95:

kmn>

kmn>0xC0000000:0xFFFFFFFF — Регион размером 1Гб для драйверов виртуальных устройств, диспетчера памяти и кода файловой системы; доступен всем Win32 процессам для чтения и записи (но лучше туда ничего не записывать).


kmn>WinNT:

kmn>

kmn>0x80000000:0xFFFFFFFF — Регион размером 2Гб для операционной системы (не доступен)


kmn>

kmn>Может, если Вы напишете, для чего Вам необходимо обращаться по этому адресу, то будет легче решить проблему.

Действительно, проблема обстоит несколько иначе — требуется выяснить ID материнской платы. Была предпринята попытка выяснения этого номера средствами ОС. Не получилось (данных не хватает). К сожалению, на данном форуме неоднократно звучал вопрос о выяснении серийного номера материнской платы. Конкретных ответов я не нашёл. Поэтому решил подойти к проблеме с другой стороны:
Было выяснено, что искомая информация содержится по адресу 0xF000EC71. Вот и всё.....

С уважением, Павел
Re[3]: Чтение данных из физической ячейки памяти
От: vasketsov Россия http://ntprog.by.ru
Дата: 17.01.03 11:06
Оценка:
Здравствуйте, SPavel, Вы писали:

SP>Не получилось (данных не хватает).

Каких именно данных не хватает?

SP>К сожалению, на данном форуме неоднократно звучал вопрос

К счастью!

SP>Конкретных ответов я не нашёл.

А вот это — к сожалению.

SP>Было выяснено, что искомая информация содержится по адресу 0xF000EC71.

Как уже выяснили, это не физическая память, а ВАП ядра. Потому чтоб оттуда читать — надо писать драйвер. Однако, есть ее WMI, которая на Win2k очень даже работает.
Васкецов Сергей
http://registry.km.ru
Re: Чтение данных из физической ячейки памяти
От: Sergey Россия  
Дата: 17.01.03 11:46
Оценка:
Здравствуйте, SPavel, Вы писали:

SP>Привет Всем.

SP>Требуется прочитать данные из ячейки физической памяти по адресу 0xF000EC71. Длиной около 21 байта. Чтение должно производиться в системах Win 95/98, Win 2000/XP.

Насчет Win 95/98 — читай Питрека (Matt Pietrek) "Секреты системного программирования по Windows 95". Книга издавалась на русском, в интернете я встречал только английский вариант, откликается на PietrekBook.pdf.

SP>Поэтому средства ассемблера сразу отпадают.


Почему? Ассемблер != драйвер. Кроме того, очевидно, что для 95 и 2000 задачу придется решать разными способами.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Чтение данных из физической ячейки памяти
От: vasketsov Россия http://ntprog.by.ru
Дата: 17.01.03 11:57
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Почему? Ассемблер != драйвер.

Правильнее было бы написать, "а при чем тут вообще ассемблер?"
Васкецов Сергей
http://registry.km.ru
Re[4]: Чтение данных из физической ячейки памяти
От: SPavel Украина  
Дата: 17.01.03 12:14
Оценка:
Здравствуйте, vasketsov, Вы писали:

V>Как уже выяснили, это не физическая память, а ВАП ядра. Потому чтоб оттуда читать — надо писать драйвер. Однако, есть ее WMI, которая на Win2k очень даже работает.


Однако требуется, чтобы работало и на Win 95/98.
По поводу WMI — этот вариант я рассматривал (ознакомительно — просматривал статьи). Нужной информации не нашёл. Возможно, не заметил нужной инфы. К тому же, как я понял — WMI предназначается для управления, и информации относительно выуживания серийных номеров не заметил.

С уважением, Павел
Re[5]: Чтение данных из физической ячейки памяти
От: vasketsov Россия http://ntprog.by.ru
Дата: 17.01.03 12:22
Оценка:
Здравствуйте, SPavel, Вы писали:

SP>Однако требуется, чтобы работало и на Win 95/98.

Пишите драйвер, честнее будет.
Васкецов Сергей
http://registry.km.ru
Re[5]: Чтение данных из физической ячейки памяти
От: VVV Россия  
Дата: 17.01.03 12:32
Оценка:
Здравствуйте, SPavel, Вы писали:

SP>Здравствуйте, vasketsov, Вы писали:


SP>По поводу WMI — этот вариант я рассматривал (ознакомительно — просматривал статьи). Нужной информации не нашёл. Возможно, не заметил нужной инфы. К тому же, как я понял — WMI предназначается для управления, и информации относительно выуживания серийных номеров не заметил.


SP>С уважением, Павел


Попробуй этот скрипт (сгенерён с помощью Scriptomatic) запиши скрипт в файл baseboard.vbs и запусти cscript baseboard.vbs или просто даблкликом.


On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_BaseBoard",,48)
For Each objItem in colItems
    Wscript.Echo "Caption: " & objItem.Caption
    Wscript.Echo "ConfigOptions: " & objItem.ConfigOptions
    Wscript.Echo "CreationClassName: " & objItem.CreationClassName
    Wscript.Echo "Depth: " & objItem.Depth
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo "Height: " & objItem.Height
    Wscript.Echo "HostingBoard: " & objItem.HostingBoard
    Wscript.Echo "HotSwappable: " & objItem.HotSwappable
    Wscript.Echo "InstallDate: " & objItem.InstallDate
    Wscript.Echo "Manufacturer: " & objItem.Manufacturer
    Wscript.Echo "Model: " & objItem.Model
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "OtherIdentifyingInfo: " & objItem.OtherIdentifyingInfo
    Wscript.Echo "PartNumber: " & objItem.PartNumber
    Wscript.Echo "PoweredOn: " & objItem.PoweredOn
    Wscript.Echo "Product: " & objItem.Product
    Wscript.Echo "Removable: " & objItem.Removable
    Wscript.Echo "Replaceable: " & objItem.Replaceable
    Wscript.Echo "RequirementsDescription: " & objItem.RequirementsDescription
    Wscript.Echo "RequiresDaughterBoard: " & objItem.RequiresDaughterBoard
    Wscript.Echo "SerialNumber: " & objItem.SerialNumber
    Wscript.Echo "SKU: " & objItem.SKU
    Wscript.Echo "SlotLayout: " & objItem.SlotLayout
    Wscript.Echo "SpecialRequirements: " & objItem.SpecialRequirements
    Wscript.Echo "Status: " & objItem.Status
    Wscript.Echo "Tag: " & objItem.Tag
    Wscript.Echo "Version: " & objItem.Version
    Wscript.Echo "Weight: " & objItem.Weight
    Wscript.Echo "Width: " & objItem.Width
Next


также посмотри http://www.rsdn.ru/Forum/Message.aspx?mid=126901#126901
Автор: VVV
Дата: 06.11.02
там есть пример как перевести скрипт на C++
Re: Чтение данных из физической ячейки памяти
От: Roman_M rgmroman.narod.ru
Дата: 17.01.03 12:35
Оценка:
Здравствуйте, 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.
Re[6]: Чтение данных из физической ячейки памяти
От: Whisperer  
Дата: 17.01.03 12:51
Оценка:
Здравствуйте, vasketsov, Вы писали:

ДрайверА
Re[2]: Чтение данных из физической ячейки памяти
От: vasketsov Россия http://ntprog.by.ru
Дата: 17.01.03 13:11
Оценка:
Здравствуйте, Roman_M, Вы писали:

RM>есть \device\PhysicalMemory,

Читает именно физическую память, а не ВАП ядра.
Васкецов Сергей
http://registry.km.ru
Re[3]: Чтение данных из физической ячейки памяти
От: Roman_M rgmroman.narod.ru
Дата: 17.01.03 13:24
Оценка:
Здравствуйте, vasketsov, Вы писали:

V>Здравствуйте, Roman_M, Вы писали:


RM>>есть \device\PhysicalMemory,

V>Читает именно физическую память, а не ВАП ядра.

Так там, вроде, и нужна физическая память, а не виртуальная.
Re[4]: Чтение данных из физической ячейки памяти
От: vasketsov Россия http://ntprog.by.ru
Дата: 17.01.03 13:28
Оценка:
Здравствуйте, Roman_M, Вы писали:

RM>...там, вроде, и нужна физическая память

Не-а. В принципе нереально, чтобы что-нибудь располагалось фиксировано по ТАКОМУ адресу в физической памятию Потому что памяти чаще меньше.
Васкецов Сергей
http://registry.km.ru
Re[3]: Чтение данных из физической ячейки памяти
От: SPavel Украина  
Дата: 17.01.03 13:32
Оценка:
Здравствуйте, vasketsov, Вы писали:

V>Здравствуйте, Roman_M, Вы писали:


RM>>есть \device\PhysicalMemory,

V>Читает именно физическую память, а не ВАП
Хорошо — а как им воспользоваться? В MSDN об этом написано крайне скудно

The PhysicalMemory property gives the size of the installed RAM in Megabytes

И как я понимаю, это не совсем то, что имелось в виду под "\device\PhysicalMemory"
Re[4]: Чтение данных из физической ячейки памяти
От: vasketsov Россия http://ntprog.by.ru
Дата: 17.01.03 13:34
Оценка:
Здравствуйте, SPavel, Вы писали:

SP>Хорошо — а как им воспользоваться?

В DDK и на sysinternals.com есть примеры, и еще куча их разбросано.
Васкецов Сергей
http://registry.km.ru
Re[5]: Чтение данных из физической ячейки памяти
От: Roman_M rgmroman.narod.ru
Дата: 17.01.03 13:42
Оценка:
Здравствуйте, vasketsov, Вы писали:

V>Здравствуйте, Roman_M, Вы писали:


RM>>...там, вроде, и нужна физическая память

V>Не-а. В принципе нереально, чтобы что-нибудь располагалось фиксировано по ТАКОМУ адресу в физической памятию Потому что памяти чаще меньше.

Очень даже реально. Вам не доводилось программировать вывод графики под DOS в разрешени 640x480 и выше через Linear Frame Buffer (VBE 2.0 +) ? Так вот Frame Buffer вполне может располагаться на подобных адреса, если не верите, посмотрите "Свойства системы"->"Диспетчер устройств"->"Видеоадаптеры"->"Свойства"->"Ресурсы". А также можно посмотреть ресурсы устройства "системная плата" (вроде бы нужен её номер), там адреса будут именно такими.
Re[5]: Чтение данных из физической ячейки памяти
От: Sergey Россия  
Дата: 17.01.03 13:45
Оценка:
Здравствуйте, vasketsov, Вы писали:

RM>>...там, вроде, и нужна физическая память

V>Не-а. В принципе нереально, чтобы что-нибудь располагалось фиксировано по ТАКОМУ адресу в физической памятию Потому что памяти чаще меньше.

Смотря что понимать под физической памятью. Если RAM, то вряд ли. А вот если I/O порты, на память мапленные, то очень даже реально. Вот например на компьютере, за которым я сейчас сижу, Device Manager показывает, что System Board зарезервировала себе кусок памяти FFFE0000 — FFFFFFFF. Почему бы ей не выдавать при чтении из какого-то из этих адресов регистры чипсета, свой ID и прочее?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.