> Обращайся к ней обычным образом по физическому адресу > F0000h: > FILE *f = fopen("rom", "wb"); > fwrite((void *) 0xF0000, 1, 65536, f); > fclose(f); > > > Да, because я не кулхацкер, просилось бы реал примеры > с > > кодом, ну токо не на Сы (++ - - * * = =). > > На Delphi вроде так: > BlockWrite(F, Ptr($F0000), 65536) > > В WinNT/2K это не будет работать
Вау ! Супер ! Я бесконечно благодарен господину :-)
простите не знаю как зовут...
Следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
F : file;
P : pointer;
begin
P := Ptr($F0000);
работает под Win98 без проблем !
Написать сразу: BlockWrite(F, Ptr($F0000), 65536)
нельзы, т.к. компилер ругается, второй параметр должен быть переменной.
А знаете для чего мне это надо было ?
Некая фирма Hewlett-Packard хранит где-то в BIOSe серийный (заводской)
номер компа. Так вот, чтобы мне не обходить все 500 компов для инвентаризации, я пишу маленькую прогу, которая при входе в сеть записывает серийный номер куда-то в файл.
Самое мерзопакостное в том, что они хранят этот номер где-то хрен знает где, т.е. на одних моделях он где-то по адресу $F3xxx- Vectra XM4 $FCxxx-Vectra VEi7. Но тут выход есть, ищу аббревиатуру Hewlett-Packard, а за ней после модели следует серийный номер (правда там куча какой-то @#$ни).
Ну, если кто-то знает способ лучше - пусть кинет в меня им !
Уважаемые хракеры !
Есть проблема, которая для вас не проблема.
Пишу прогу под Delphi (не надо плеваться).
В какой-то момент мне надо прочитать 64к памяти по физическому адресу
$F000:0000 (типа ПЗУшка).
И все !
Но, маленькое но...
Прога работает или под Win9x или под WinNT/2000.
Ну версию операционки я определить смогу...
Да, because я не кулхацкер, просилось бы реал примеры с кодом, ну токо не на Сы (++ - - * * = =).
[Win32] Скопировать память по физическому адресу01.11.01 11:19 Автор: z0 <z0> Статус: Member
> Уважаемые хракеры ! > Есть проблема, которая для вас не проблема. > Пишу прогу под Delphi (не надо плеваться). > В какой-то момент мне надо прочитать 64к памяти по > физическому адресу > $F000:0000 (типа ПЗУшка). > И все ! > Но, маленькое но... > Прога работает или под Win9x или под WinNT/2000. > Ну версию операционки я определить смогу...
не пролучится
кроме DOS (без EMM386) и NOVEL все остальные оськи работают с PAGING_ENABLE (бит 31 в CR0) и адрес памяти по которому ты читаешь или пишешь из своей проги это не настоящий адрес и никак с настоящим не связан
возможные способы решения:
набор драйверов для разных OS: *.vxd, *.sys которые либо используют системные вызовы отображения физ.памяти ДОСТУПНЫЕ ТОЛЬКО ДЛЯ КЕРНЕЛ-МОДЕ ДРАЙВЕРОВ (искать нужно что-то связанное с DMA т.к. именно таким девайсам нужна ФИЗ.ПАМЯТЬ) либо сами производят обратный поиск по таблицам страниц со всевозможными CLI и блокировками
либо чистый DOS
а у твоей проге на дельфи во всем ее адесном пространстве адреса соответствующего F0000 НЕТ ВООБЩЕ. и системной функции для получения такового тож нет...
[Win32] Скопировать память по физическому адресу01.11.01 14:19 Автор: :-) <:-)> Статус: Elderman
> не пролучится > кроме DOS (без EMM386) и NOVEL все остальные оськи работают
Ну в EMM386, QEMM и etc есть VCPI, так что проблем нет.
> с PAGING_ENABLE (бит 31 в CR0) и адрес памяти по которому > ты читаешь или пишешь из своей проги это не настоящий адрес > и никак с настоящим не связан > возможные способы решения: > набор драйверов для разных OS: *.vxd, *.sys которые либо > используют системные вызовы отображения физ.памяти > ДОСТУПНЫЕ ТОЛЬКО ДЛЯ КЕРНЕЛ-МОДЕ ДРАЙВЕРОВ (искать нужно > что-то связанное с DMA т.к. именно таким девайсам нужна > ФИЗ.ПАМЯТЬ) либо сами производят обратный поиск по таблицам > страниц со всевозможными CLI и блокировками > либо чистый DOS > > а у твоей проге на дельфи во всем ее адесном пространстве > адреса соответствующего F0000 НЕТ ВООБЩЕ. и системной > функции для получения такового тож нет...
Это тока в NT/2K.
В Win9x у процесса немного другое адресное пространство, и по 0xF0000 можно обращаться.
Также это можно делать из 16-битовых прог под Win9x - KRNL386.EXE экспортирует следующие функции, смещения которых являются значениями соответствующих селекторов:
__0000H, __0040H, __A000H, __B000H, __B800H, __C000H, __D000H, __E000H, __F000H, __ROMBIOS
[Win32] Скопировать память по физическому адресу02.11.01 10:45 Автор: z0 <z0> Статус: Member
> Обращайся к ней обычным образом по физическому адресу > F0000h: > FILE *f = fopen("rom", "wb"); > fwrite((void *) 0xF0000, 1, 65536, f); > fclose(f); > > > Да, because я не кулхацкер, просилось бы реал примеры > с > > кодом, ну токо не на Сы (++ - - * * = =). > > На Delphi вроде так: > BlockWrite(F, Ptr($F0000), 65536) > > В WinNT/2K это не будет работать
Вау ! Супер ! Я бесконечно благодарен господину :-)
простите не знаю как зовут...
Следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
F : file;
P : pointer;
begin
P := Ptr($F0000);
работает под Win98 без проблем !
Написать сразу: BlockWrite(F, Ptr($F0000), 65536)
нельзы, т.к. компилер ругается, второй параметр должен быть переменной.
А знаете для чего мне это надо было ?
Некая фирма Hewlett-Packard хранит где-то в BIOSe серийный (заводской)
номер компа. Так вот, чтобы мне не обходить все 500 компов для инвентаризации, я пишу маленькую прогу, которая при входе в сеть записывает серийный номер куда-то в файл.
Самое мерзопакостное в том, что они хранят этот номер где-то хрен знает где, т.е. на одних моделях он где-то по адресу $F3xxx- Vectra XM4 $FCxxx-Vectra VEi7. Но тут выход есть, ищу аббревиатуру Hewlett-Packard, а за ней после модели следует серийный номер (правда там куча какой-то @#$ни).
Ну, если кто-то знает способ лучше - пусть кинет в меня им !
В любом случае - спасибо всем, вы - лучшие !!!
[Win32] Только для Win9x02.11.01 11:39 Автор: :-) <:-)> Статус: Elderman
> работает под Win98 без проблем ! > Написать сразу: BlockWrite(F, Ptr($F0000), 65536) > нельзы, т.к. компилер ругается, второй параметр должен быть > переменной.
Можно, только надо так (я там забыл разыменовать указатель):
BlockWrite(F, Ptr($F0000)^, 65536);
Отвык уже от Дельфи :)
[Win32] Извратный вариант, может подойдет ... ;)31.10.01 15:32 Автор: Chingachguk <Chingachguk> Статус: Member
Я слышал, что есть api-функции, эмулирующие прерывание v86 - те доса или биоса. По крайней мере можно выполнить функцию биоса для записи на дискету. Наверное, что-то вроде:
ExecuteV86Interrupt(reg.ax=0X0201...)
Ну и ты поищи среди апи ф-цию для чтения твоей F000:0000...
Это есть вариант 1.
Вариант номер два.
Теми же самыми апи для эмуляции прерывний v86 вызываешь прерывание 21h(dos) таким образом:
- Открываешь дос-файл;
- Делаешь запись блока в файл с ds=F000, dx=0000(твой сегмент);
- Закрываешь файл;
И твой сегмент в файле ?!