Есть проблема, и никак не могу ее решить. Есть Vista и мне необходимо считать данные с BIOS по адресу указаннову в заголовке. Как мне быть, функция GetSystemFirmwareTable('FIRM', 'E000', buffer, Buffesize); не дает результата. Пишет, неверные параметры. Люди, кто знает что делать, помогите, плиз.
Re: Vista как получить информацию BIOS(E0000-FFFFF)
KK>Привет, всем!
KK>Есть проблема, и никак не могу ее решить. Есть Vista и мне необходимо считать данные с BIOS по адресу указаннову в заголовке. Как мне быть, функция GetSystemFirmwareTable('FIRM', 'E000', buffer, Buffesize); не дает результата. Пишет, неверные параметры. Люди, кто знает что делать, помогите, плиз.
Использовать WMI. MSSMBios_RawSMBiosTables.SMBiosData.
> Есть проблема, и никак не могу ее решить. Есть Vista и мне необходимо считать данные с BIOS по адресу указаннову в заголовке. Как мне быть, функция GetSystemFirmwareTable('FIRM', 'E000', buffer, Buffesize); не дает результата. Пишет, неверные параметры. Люди, кто знает что делать, помогите, плиз.
Второй параметр, кстати, little-endian. Поэтому писать надо видимо не 'E000', а '000E'.
Posted via RSDN NNTP Server 2.0
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Vista как получить информацию BIOS(E0000-FFFFF)
>> Есть проблема, и никак не могу ее решить. Есть Vista и мне необходимо считать данные с BIOS по адресу указаннову в заголовке. Как мне быть, функция GetSystemFirmwareTable('FIRM', 'E000', buffer, Buffesize); не дает результата. Пишет, неверные параметры. Люди, кто знает что делать, помогите, плиз.
S>Второй параметр, кстати, little-endian. Поэтому писать надо видимо не 'E000', а '000E'.
Я уже все это пробовал, а вот по поводу WMI. Сижу разбираюсь. Если кто-нибудь уже занимался этой проблемой, киньте сэмпл плиз, всем участникам заранее и уже спасибо!
Re[3]: Vista как получить информацию BIOS(E0000-FFFFF)
>>> Есть проблема, и никак не могу ее решить. Есть Vista и мне необходимо считать данные с BIOS по адресу указаннову в заголовке. Как мне быть, функция GetSystemFirmwareTable('FIRM', 'E000', buffer, Buffesize); не дает результата. Пишет, неверные параметры. Люди, кто знает что делать, помогите, плиз.
S>>Второй параметр, кстати, little-endian. Поэтому писать надо видимо не 'E000', а '000E'. KK>Я уже все это пробовал, а вот по поводу WMI. Сижу разбираюсь. Если кто-нибудь уже занимался этой проблемой, киньте сэмпл плиз, всем участникам заранее и уже спасибо!
Свой сампл не кину, а вот пример с кодегуру — пожалуйста. http://www.codeguru.com/Cpp/W-P/system/misc/article.php/c5675
В общем, нужно только подставить нужные классы и пропертЯ. Хотя, конечно, могу заметить, что у "pure" api есть множество проблем с security, которых нет у скриптового (который с префиксом S). Посему рекомендую использовать последний — разница зачастую только в названии интерфейсов.
Здравствуйте, KromKromov, Вы писали:
KK>Привет, всем!
KK>Есть проблема, и никак не могу ее решить. Есть Vista и мне необходимо считать данные с BIOS по адресу указаннову в заголовке. Как мне быть, функция GetSystemFirmwareTable('FIRM', 'E000', buffer, Buffesize); не дает результата. Пишет, неверные параметры. Люди, кто знает что делать, помогите, плиз.
Здравствуйте, Andrew S, Вы писали:
AS>>>Насколько я помню, секция physicalmemory недоступна "обычным" процессам уже начиная с Win2003 и XPsp2. MQ>>Печально.... AS>А чего печального? WMI то ведь доступна
Дал неправильный совет, вот и печально...
Re[2]: Vista как получить информацию BIOS(E0000-FFFFF)
On Fri, 16 Feb 2007 16:51:53 +0500, Sergey <77@users.rsdn.ru> wrote:
> Второй параметр, кстати, little-endian. Поэтому писать надо видимо не > 'E000', а '000E'.
LE-представлением числа 0xE000 будет запись "00E0", а не "000E".
Re[5]: Vista как получить информацию BIOS(E0000-FFFFF)
От:
Аноним
Дата:
19.02.07 15:12
Оценка:
Здравствуйте, Andrew S, Вы писали:
AS>>>Насколько я помню, секция physicalmemory недоступна "обычным" процессам уже начиная с Win2003 и XPsp2. MQ>>Печально....
AS>А чего печального? WMI то ведь доступна
Люди, никто не кинет сэмпл с использованием WMI для считывания необходимого промежутка памяти БИОС. Я нашел класс MSSMBios_RawSMBiosTables и свойство SMBiosData, но насколько я понял, даннное свойство возвращает лишь данные SMBIOS, но не необходимого промежутка. Ребят, кто-нибудь знает как считать необходимый промежуток, киньте описание или пример, плиз. И вот еще, а может кто объяснить почему не работает специальное API введенное в WS2003 и Vista с данными параметрами: GetSystemFirmwareTable('FIRM',(здесь я пробовал различные комбинации от 'E000' до '000E' поочереди, Buffer, nBuffer); С другими провайдарами все работает:'ACPI', 'RSMB'.
Re[6]: Vista как получить информацию BIOS(E0000-FFFFF)
AS>>>>Насколько я помню, секция physicalmemory недоступна "обычным" процессам уже начиная с Win2003 и XPsp2. MQ>>>Печально....
AS>>А чего печального? WMI то ведь доступна
А>Люди, никто не кинет сэмпл с использованием WMI для считывания необходимого промежутка памяти БИОС. Я нашел класс MSSMBios_RawSMBiosTables и свойство SMBiosData, но насколько я понял, даннное свойство возвращает лишь данные SMBIOS, но не необходимого промежутка. Ребят, кто-нибудь знает как считать необходимый промежуток, киньте описание или пример, плиз. И вот еще, а может кто объяснить почему не работает специальное API введенное в WS2003 и Vista с данными параметрами: GetSystemFirmwareTable('FIRM',(здесь я пробовал различные комбинации от 'E000' до '000E' поочереди, Buffer, nBuffer); С другими провайдарами все работает:'ACPI', 'RSMB'.
Зачем именно этот провайдер? Из wmi вам ведь возвращаются raw данные, оттуда можно все что угодно извлечь.
Здравствуйте, Andrew S, Вы писали:
AS>>>>>Насколько я помню, секция physicalmemory недоступна "обычным" процессам уже начиная с Win2003 и XPsp2. MQ>>>>Печально....
AS>>>А чего печального? WMI то ведь доступна
А>>Люди, никто не кинет сэмпл с использованием WMI для считывания необходимого промежутка памяти БИОС. Я нашел класс MSSMBios_RawSMBiosTables и свойство SMBiosData, но насколько я понял, даннное свойство возвращает лишь данные SMBIOS, но не необходимого промежутка. Ребят, кто-нибудь знает как считать необходимый промежуток, киньте описание или пример, плиз. И вот еще, а может кто объяснить почему не работает специальное API введенное в WS2003 и Vista с данными параметрами: GetSystemFirmwareTable('FIRM',(здесь я пробовал различные комбинации от 'E000' до '000E' поочереди, Buffer, nBuffer); С другими провайдарами все работает:'ACPI', 'RSMB'.
AS>Зачем именно этот провайдер? Из wmi вам ведь возвращаются raw данные, оттуда можно все что угодно извлечь.
Я читал официальную статью найденную на интернете на эту тему и там есть такие слова
System APIs for Reading SMBIOS Data
Beginning with Windows Server 2003 SP1, applications can call two new user-mode functions to retrieve various system firmware tables, including SMBIOS tables. To read SMBIOS and ACPI tables and to read raw firmware data from low physical memory, programs can call EnumSystemFirmwareTables() and GetSystemFirmwareTable(). Information about these functions is available on the Microsoft Developer Network website.
Driver Access to SMBIOS Data by Using WMI
Kernel-mode device drivers can use WMI to read the raw SMBIOS data tables in the same manner as user-mode applications access the MSSMBios_RawSMBiosTables WMI class.
Kernel-mode device drivers can call the IoWmiOpenBlock() and the IoWMIQueryAllData() functions to retrieve a buffer that contains the raw contents of the SMBIOS table data. Specifically, this buffer contains the same SMBIOS data as the buffer returned by calling the GetSystemFirmwareTable() function with the raw SMBIOS (RSMB) table provider.
The returned buffer has the following data:
BYTE Used20CallingMethod
BYTE SMBIOSMajorVersion
BYTE SMBIOSMinorVersion
BYTE DmiRevision
DWORD Length
BYTE[] SMBIOSTableData
Each value in the buffer return corresponds to the individual properties stored in the MSSMBios_RawSMBiosTables WMI class. The SMBIOSTableData property contains the entire SMBIOS data table, except for the SMBIOS structure table entry point.
Существуют различные таблицы данных: To read SMBIOS and ACPI tables and to read raw firmware data from low physical memory. Меня интересуют raw данные, а не SMBIOS.И я знаю только одну возможность считать массив данных с BIOS ROM с помощью : MSSMBios _RawSMBiosTables и свойства SMBiosData. Но оно возвращает лишь SMBOIS данные, а мне необходимо делать проверку всего пространства E000-FFFF(т.е. raw данные) на наличие определенной строки, а как это сделать в WMI я не знаю.
Re[8]: Vista как получить информацию BIOS(E0000-FFFFF)
А>>>Люди, никто не кинет сэмпл с использованием WMI для считывания необходимого промежутка памяти БИОС. Я нашел класс MSSMBios_RawSMBiosTables и свойство SMBiosData, но насколько я понял, даннное свойство возвращает лишь данные SMBIOS, но не необходимого промежутка. Ребят, кто-нибудь знает как считать необходимый промежуток, киньте описание или пример, плиз. И вот еще, а может кто объяснить почему не работает специальное API введенное в WS2003 и Vista с данными параметрами: GetSystemFirmwareTable('FIRM',(здесь я пробовал различные комбинации от 'E000' до '000E' поочереди, Buffer, nBuffer); С другими провайдарами все работает:'ACPI', 'RSMB'.
AS>>Зачем именно этот провайдер? Из wmi вам ведь возвращаются raw данные, оттуда можно все что угодно извлечь.
KK>Существуют различные таблицы данных: To read SMBIOS and ACPI tables and to read raw firmware data from low physical memory. Меня интересуют raw данные, а не SMBIOS.И я знаю только одну возможность считать массив данных с BIOS ROM с помощью : MSSMBios _RawSMBiosTables и свойства SMBiosData. Но оно возвращает лишь SMBOIS данные, а мне необходимо делать проверку всего пространства E000-FFFF(т.е. raw данные) на наличие определенной строки, а как это сделать в WMI я не знаю.
Ну, если вы точно уверены, что нужная вам информация не содержится в SMBIOS (а, точнее, в блоке DMI) и других вариантов получения ее нет, тогда других альтернатив, кроме EnumSystemFirmwareTables\GetSystemFirmwareTable, я не вижу. Вы пробовал Enum вызывать? Какие адреса он возвращает?
Здравствуйте, Andrew S, Вы писали:
А>>>>Люди, никто не кинет сэмпл с использованием WMI для считывания необходимого промежутка памяти БИОС. Я нашел класс MSSMBios_RawSMBiosTables и свойство SMBiosData, но насколько я понял, даннное свойство возвращает лишь данные SMBIOS, но не необходимого промежутка. Ребят, кто-нибудь знает как считать необходимый промежуток, киньте описание или пример, плиз. И вот еще, а может кто объяснить почему не работает специальное API введенное в WS2003 и Vista с данными параметрами: GetSystemFirmwareTable('FIRM',(здесь я пробовал различные комбинации от 'E000' до '000E' поочереди, Buffer, nBuffer); С другими провайдарами все работает:'ACPI', 'RSMB'.
AS>>>Зачем именно этот провайдер? Из wmi вам ведь возвращаются raw данные, оттуда можно все что угодно извлечь.
KK>>Существуют различные таблицы данных: To read SMBIOS and ACPI tables and to read raw firmware data from low physical memory. Меня интересуют raw данные, а не SMBIOS.И я знаю только одну возможность считать массив данных с BIOS ROM с помощью : MSSMBios _RawSMBiosTables и свойства SMBiosData. Но оно возвращает лишь SMBOIS данные, а мне необходимо делать проверку всего пространства E000-FFFF(т.е. raw данные) на наличие определенной строки, а как это сделать в WMI я не знаю.
AS>Ну, если вы точно уверены, что нужная вам информация не содержится в SMBIOS (а, точнее, в блоке DMI) и других вариантов получения ее нет, тогда других альтернатив, кроме EnumSystemFirmwareTables\GetSystemFirmwareTable, я не вижу. Вы пробовал Enum вызывать? Какие адреса он возвращает?
Я хочу сначала поблагодарить вас за ответы на мои вопросы, спасибо Andrew S! Да, мне необходима именно эта область памяти BIOS. Там у меня прошита символика и по ней ставится ПО.
Пояснение, после EnumSystemFirmwareTables(..) я получаю массив с провайдерами. В случае, например, 'ACPI' их три и при вызове GetSystemFirmwareTable(..) я получаю в буфере массив данных части ROM. Но мне необходим провайдер 'FIRM', и при вызове Enum.. я получаю два занчения 00e0 и 00c0. но при подставлении. даже с разными комбинациями от e000 до 000e и другим регистром, результат один, 87 — неверные параметры в GetSystem...('FIRM','e000', buffer, nbuf);
Вообщем работает все кроиме провайдера 'FIRM', я пробовал...
Вот линк на ресурс по теме: http://msdn2.microsoft.com/en-us/library/ms724259.aspx
Re[10]: Vista как получить информацию BIOS(E0000-FFFFF)
AS>>Ну, если вы точно уверены, что нужная вам информация не содержится в SMBIOS (а, точнее, в блоке DMI) и других вариантов получения ее нет, тогда других альтернатив, кроме EnumSystemFirmwareTables\GetSystemFirmwareTable, я не вижу. Вы пробовал Enum вызывать? Какие адреса он возвращает?
Вообще, я офигиваю с MSDN и m$. Такое ощущение, что там в последнее время полный crazy происходит. Для начала, оценим красоту мысли, которая рекомендует передавать сигнатуру в виде character literal ('xxxx'). Наверное, ребята не читали стандарта С++, где говориться, что порядок следования байт такого литерала implementation depended, что и подтверждает тот же gcc.
Ну а во-вторых, я офигеваю с приведенного кода, который, кстати, был сделан почти в соответствии с MSDN.
The raw firmware table provider ('FIRM') returns a list of DWORD table identifiers. Each identifier corresponds to the beginning of a physical address range. Currently, this provider returns 'C000' and 'E000'. These values correspond to physical memory from 0xC0000 to 0xDFFFF and 0xE0000 to 0xFFFFF, respectively.
Ок, пробуем EnumSystemFirmwareTables, и выясняем, что в DWORD возвращаются 0xE0000 и 0xC0000 (а не указанные 'E000'), с которымы, ессно, GetSystemFirmwareTable уже работает нормально. В общем, кроме матных слов в адрес m$, тут сказать нечего. Какой, вашу маму, АЭРО, когда функции задокументировать нормально не можете. Блин.
PS
А еще они покорежили MSDN (2), так, что он на IE6 выдается какие-то безумные фреймы, дерево перемещается вверх, а внизу дерева тулбар а-ля офис 2006, и собственно страничка. Ладно, фигня, я уже свыкся с тем, что эта хрень-2 тормозит и на мегабите, но еще и оболванить дизайн. Идиотизму нет предела Право, со всех их последних действий хочется только ругаться, много, долго и громко.
Re[11]: Vista как получить информацию BIOS(E0000-FFFFF)
От:
Аноним
Дата:
20.02.07 07:42
Оценка:
Здравствуйте, Andrew S, Вы писали:
AS>Вообще, я офигиваю с MSDN и m$. Такое ощущение, что там в последнее время полный crazy происходит. Для начала, оценим красоту мысли, которая рекомендует передавать сиг AS>А еще они покорежили MSDN (2), так, что он на IE6 выдается какие-то безумные фреймы, дерево перемещается вверх, а внизу дерева тулбар а-ля офис 2006, и собственно страничка. Ладно, фигня, я уже свыкся с тем, что эта хрень-2 тормозит и на мегабите, но еще и оболванить дизайн. Идиотизму нет предела Право, со всех их последних действий хочется только ругаться, много, долго и громко.
Большое спасибо, Andrew S! У меня все получилось и это здорово! Я чето не подумал и использовал для буфера субпровайдеров буфер типа UCHAR и естественно меня зарубала функция с этими параметрами, даже пробовал писать не 'E000', а E000. Блин, но так как было ясно сказано что субпровайдеры указываются как четыре символа, мля! Я и не пробовал E0000!
Вообщем, это не первый раз когда я натыкаюсь на такие грабли в MSDN. Но что поделать, одна радость, есть такие люди как вы. Спасибо!
PS: по поводу критики некоторых моментов M$, я с вами полностью согласен, итак, продолжим.....