2012-03-23 4 views
1

Я пытаюсь получить серийный номер BIOS для 32-разрядной системы WinXP Embedded из приложения режима пользователя Win32 (MFC, если это делает какой-либо diff).Получение серийного номера BIOS без WMI

Я пытаюсь получить тот же серийный номер, который вы можете получить через WMI из класса Win32_BIOS из члена «SerialNumber». Проблема в том, что я не могу использовать WMI, так как это нужно будет запускать в старых системах, у которых не установлен WMI.

В основном у нас есть серия машин с данными, закодированными в этом поле BIOS, поэтому они не могут быть изменены пользователями, и нам иногда требуется, чтобы эта информация выводилась в файл и отправлялась нам.

Я нашел «GetSystemFirmwareTable», но минимальная версия Win - 64-бит WinXP. WMI не может быть и речи, и у нас уже есть код для чтения из непосредственно сопоставленного физического адреса, но проблема в том, что используемое нами программное обеспечение, которое позволяет нам сопоставлять эти физические адреса, привязано к нашему программному обеспечению, и наше программное обеспечение не может работать на данном этапе в этом конкретном случае использования (лицензирование).

Насколько я знаю, единственный способ сопоставить физический аппаратный адрес из приложения пользовательского режима - это вникать в территорию драйвера и интегрировать в приложение некоторые библиотеки драйверов, чтобы он мог сопоставлять физические адреса.

Есть ли какая-то теневая копия, которую ОС делает доступной без огромного количества настроек?

ответ

1

NTVDM в Windows XP отображает первый MiB физической памяти, чтобы вы могли найти blob-память SMBIOS в этом первом мегабайте и получить серийный номер BIOS оттуда. Дополнительную информацию см. В разделе PDF specification.

+0

Я не совсем уверен, что понимаю. Следуя спецификации, я все равно должен получить доступ к аппаратным адресам 0x000f0000, а это значит, что мое приложение режима пользователя должно иметь возможность сопоставить его с виртуальным адресом, который я не могу сделать в данный момент (насколько мне известно) из-за того, что я сказал выше. Не является ли ntvdm процессом, который запускает 16-разрядные приложения DOS в текущих версиях Windows? Вы предлагаете мне написать 16-разрядное приложение DOS, чтобы я мог прочитать его копию данных SMBIOS? – NaimK

+0

Да, это то, о чем я думал. Удалите COM-файл MS-DOS и запустите его из своего приложения Windows и напишите данные SMBIOS в файл с помощью INT 0x21, который затем вы можете получить из своего пользовательского режима. –

+1

Хм, хорошая идея, но я действительно нашел пример кода для приложения sysinternals.com для отображения физической памяти: http://nah6.com/~itsme/cvs-xdadevtools/itsutils/src/sysint-physmem. cpp Я смог адаптировать это, чтобы сделать то, что хотел, довольно легко. Но он работает только на XP, для меня это хорошо, это все, в чем я нуждаюсь, потому что на чем-то более высоком мы, вероятно, закончим использование WMI, потому что это просто проще и поставляется с ОС. – NaimK

Смежные вопросы