Здравствуйте, SPavel, Вы писали:
МЧ>>МЧ>>02/06/2002-i815E-W83627H-6A69RA1KC-7U
МЧ>>
МЧ>>"Серийным номером" материнки это не назовешь. Дата и версия BIOS'а, не более того. Эта же строка выводится внизу экрана при включении питания.
МЧ>>И, IMHO, если какие-нибудь производители и прошивают серийный номер материнки куда-нить, то это жутко непортабельно. Увы...
SP>ВОТ! Именно эта информация мне и нужна! Именно эта! Тут есть дата, модель, и серийный номер. И действительно — это инфа биоса.
SP>Скажите, пожалуйста, каким образом Вы её получили?
Нет тут никакого серийного номера. Это просто дата и версия прошивки BIOS'а.
А получил я ее очень просто — по упоминавшемуся тут уже адресу 0xFEC71. Заметь — не 0xF000EC71, а 0xFEC71. Почему-то к 0xF000EC71 доступа не было дано. Можешь считать, что BIOS физически проецируется в оба этих места, но доступно из-под Windows NT только 0xFEC71.
Есть книга Коберниченко "Недокументированные возможности Windows NT". Там в 5-й главе показано, как из user level получить доступ на чтение к физической памяти (через объект ядра \Device\PhysicalMemory). Используются недокументированные возможности — функции ntdll.dll. Точнее, функции документированы, но только для kernel level. Использование их (точнее, их user level отражений) не документировано.
Итак, находишь примеры к этой книге. Берешь файл chapter5\phystest.c и меняешь там
LARGE_INTEGER offset={0,0};
на
LARGE_INTEGER offset={0x0F0000,0};
И там, где у Коберниченко printf'ы векторов прерываний (и прочей информации из первых 64K физической памяти), можешь смело использовать указатель
((const BYTE*)base)+0xEC71
Должно работать на всех NT-системах (3.51, 4, 2000, XP). У меня работает под WinXP Home Edition.
Удачи!..
По поводу Win9X можно посоветовать DOS-программу (которой система обязана давать доступ к 0xFEC71). Возможно также, что и у обычных Win32-приложений под Win9X по этому адресу находится то же самое. Не знаю. Уже 3 года не видел 9X...