Vista как получить информацию BIOS(E0000-FFFFF)
От: KromKromov  
Дата: 16.02.07 12:31
Оценка:
Привет, всем!

Есть проблема, и никак не могу ее решить. Есть Vista и мне необходимо считать данные с BIOS по адресу указаннову в заголовке. Как мне быть, функция GetSystemFirmwareTable('FIRM', 'E000', buffer, Buffesize); не дает результата. Пишет, неверные параметры. Люди, кто знает что делать, помогите, плиз.
Re: Vista как получить информацию BIOS(E0000-FFFFF)
От: Andrew S Россия http://alchemy-lab.com
Дата: 16.02.07 13:28
Оценка: 5 (1)
KK>Привет, всем!

KK>Есть проблема, и никак не могу ее решить. Есть Vista и мне необходимо считать данные с BIOS по адресу указаннову в заголовке. Как мне быть, функция GetSystemFirmwareTable('FIRM', 'E000', buffer, Buffesize); не дает результата. Пишет, неверные параметры. Люди, кто знает что делать, помогите, плиз.


Использовать WMI. MSSMBios_RawSMBiosTables.SMBiosData.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Vista как получить информацию BIOS(E0000-FFFFF)
От: Sergey Россия  
Дата: 16.02.07 13:51
Оценка:
> Есть проблема, и никак не могу ее решить. Есть 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)
От: KromKromov  
Дата: 16.02.07 14:26
Оценка:
Здравствуйте, Sergey, Вы писали:


>> Есть проблема, и никак не могу ее решить. Есть Vista и мне необходимо считать данные с BIOS по адресу указаннову в заголовке. Как мне быть, функция GetSystemFirmwareTable('FIRM', 'E000', buffer, Buffesize); не дает результата. Пишет, неверные параметры. Люди, кто знает что делать, помогите, плиз.


S>Второй параметр, кстати, little-endian. Поэтому писать надо видимо не 'E000', а '000E'.

Я уже все это пробовал, а вот по поводу WMI. Сижу разбираюсь. Если кто-нибудь уже занимался этой проблемой, киньте сэмпл плиз, всем участникам заранее и уже спасибо!
Re[3]: Vista как получить информацию BIOS(E0000-FFFFF)
От: Andrew S Россия http://alchemy-lab.com
Дата: 16.02.07 15:34
Оценка:
>>> Есть проблема, и никак не могу ее решить. Есть 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). Посему рекомендую использовать последний — разница зачастую только в названии интерфейсов.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Vista как получить информацию BIOS(E0000-FFFFF)
От: McQwerty Россия  
Дата: 16.02.07 17:21
Оценка:
Здравствуйте, KromKromov, Вы писали:

KK>Привет, всем!


KK>Есть проблема, и никак не могу ее решить. Есть Vista и мне необходимо считать данные с BIOS по адресу указаннову в заголовке. Как мне быть, функция GetSystemFirmwareTable('FIRM', 'E000', buffer, Buffesize); не дает результата. Пишет, неверные параметры. Люди, кто знает что делать, помогите, плиз.



#define InitializeObjectAttributes(p,n,a,r,s) { \
    (p)->Length = sizeof( OBJECT_ATTRIBUTES );  \
    (p)->RootDirectory = r;                     \
    (p)->Attributes = a;                        \
    (p)->ObjectName = n;                        \
    (p)->SecurityDescriptor = s;                \
    (p)->SecurityQualityOfService = NULL;       \
    }

typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR  Buffer;
} UNICODE_STRING;
typedef UNICODE_STRING *PUNICODE_STRING;

typedef struct _OBJECT_ATTRIBUTES {
    ULONG Length;
    HANDLE RootDirectory;
    PUNICODE_STRING ObjectName;
    ULONG Attributes;
    PVOID SecurityDescriptor;        // Points to type SECURITY_DESCRIPTOR
    PVOID SecurityQualityOfService;  // Points to type SECURITY_QUALITY_OF_SERVICE
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;

typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS; // windbgkd
typedef DWORD NTSTATUS;

typedef NTSTATUS (__stdcall *__NtUnmapViewOfSection)(
  IN HANDLE  ProcessHandle,
  IN PVOID  BaseAddress
);

typedef NTSTATUS (__stdcall *__NtOpenSection)(
  OUT PHANDLE  SectionHandle,
  IN ACCESS_MASK  DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes
);

typedef NTSTATUS (__stdcall *__NtMapViewOfSection)(
  IN HANDLE  SectionHandle,
  IN HANDLE  ProcessHandle,
  IN OUT PVOID  *BaseAddress,
  IN ULONG  ZeroBits,
  IN ULONG  CommitSize,
  IN OUT PLARGE_INTEGER  SectionOffset, /* optional */
  IN OUT PULONG  ViewSize,
  IN DWORD  InheritDisposition,
  IN ULONG  AllocationType,
  IN ULONG  Protect
);

typedef VOID (__stdcall *__RtlInitUnicodeString)(
  IN OUT PUNICODE_STRING  DestinationString,
  IN PCWSTR  SourceString
);

typedef ULONG (__stdcall *__RtlNtStatusToDosError) (
  IN NTSTATUS Status
);

void ReadBIOSRegion (DWORD dwAddress, DWORD dwSize, LPVOID pDestAddress)
{
    HANDLE hSectionHandle = (HANDLE) -1;;
    PDWORD pAddress = (PDWORD) (LPVOID) dwAddress;
    DWORD  dwLength = ((dwSize + 0x0FFF + (dwAddress % 0x1000)) / 0x1000) * 0x1000;
    LPBYTE pVirtualAddress = NULL;
    PHYSICAL_ADDRESS ViewBase = { 0 };

    UNICODE_STRING szPhysmemString;
    OBJECT_ATTRIBUTES oaAttributes;

    HINSTANCE hDLL = GetModuleHandle ("ntdll.dll");
    __NtOpenSection NtOpenSection = (__NtOpenSection) GetProcAddress (hDLL, "NtOpenSection");
    __NtMapViewOfSection NtMapViewOfSection = (__NtMapViewOfSection) GetProcAddress (hDLL, "NtMapViewOfSection");
    __NtUnmapViewOfSection NtUnmapViewOfSection = (__NtUnmapViewOfSection) GetProcAddress (hDLL, "NtUnmapViewOfSection");
    __RtlInitUnicodeString RtlInitUnicodeString = (__RtlInitUnicodeString) GetProcAddress (hDLL, "RtlInitUnicodeString");
    __RtlNtStatusToDosError RtlNtStatusToDosError = (__RtlNtStatusToDosError) GetProcAddress (hDLL, "RtlNtStatusToDosError");

    RtlInitUnicodeString( &szPhysmemString, L"\\device\\physicalmemory" ); 
    InitializeObjectAttributes( &oaAttributes, &szPhysmemString,0x00000040L, NULL, NULL ); 

    NtOpenSection( &hSectionHandle, SECTION_MAP_READ, &oaAttributes );

    ViewBase.QuadPart = (ULONGLONG) (pAddress);

    ViewBase.QuadPart = (ULONGLONG) (((DWORD) pAddress) & 0xFFFFF000);
    INT ntStatus = NtMapViewOfSection 
    (
        hSectionHandle,
        (HANDLE) -1,
        (PVOID*) &pVirtualAddress,
        0L,
        dwLength,
        &ViewBase,
        &dwLength,
        1,
        0,
        PAGE_READONLY
    );
    DWORD xxx = RtlNtStatusToDosError (ntStatus);

    CopyMemory (pDestAddress, (pVirtualAddress + (dwAddress % 0x1000)), dwSize);

    NtUnmapViewOfSection((HANDLE)-1,pVirtualAddress);
    CloseHandle(hSectionHandle);
} // ReadBIOSRegion


И потом примерно так:
    BYTE BIOS [0x10000] = { 0 };
    ReadBIOSRegion (0xF0000, 0x10000, BIOS);
Re[2]: Vista как получить информацию BIOS(E0000-FFFFF)
От: Andrew S Россия http://alchemy-lab.com
Дата: 16.02.07 17:24
Оценка:
[code skippped]

MQ>И потом примерно так:

MQ>
MQ>    BYTE BIOS [0x10000] = { 0 };
MQ>    ReadBIOSRegion (0xF0000, 0x10000, BIOS);
MQ>


Насколько я помню, секция physicalmemory недоступна "обычным" процессам уже начиная с Win2003 и XPsp2.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: Vista как получить информацию BIOS(E0000-FFFFF)
От: McQwerty Россия  
Дата: 16.02.07 17:37
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>[code skippped]


MQ>>И потом примерно так:

MQ>>
MQ>>    BYTE BIOS [0x10000] = { 0 };
MQ>>    ReadBIOSRegion (0xF0000, 0x10000, BIOS);
MQ>>


AS>Насколько я помню, секция physicalmemory недоступна "обычным" процессам уже начиная с Win2003 и XPsp2.

Печально....
Re[4]: Vista как получить информацию BIOS(E0000-FFFFF)
От: Andrew S Россия http://alchemy-lab.com
Дата: 16.02.07 17:52
Оценка:
AS>>Насколько я помню, секция physicalmemory недоступна "обычным" процессам уже начиная с Win2003 и XPsp2.
MQ>Печально....

А чего печального? WMI то ведь доступна
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Vista как получить информацию BIOS(E0000-FFFFF)
От: McQwerty Россия  
Дата: 16.02.07 18:18
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>>>Насколько я помню, секция physicalmemory недоступна "обычным" процессам уже начиная с Win2003 и XPsp2.

MQ>>Печально....
AS>А чего печального? WMI то ведь доступна
Дал неправильный совет, вот и печально...
Re[2]: Vista как получить информацию BIOS(E0000-FFFFF)
От: Megabyte Россия  
Дата: 17.02.07 10:07
Оценка:
On Fri, 16 Feb 2007 16:51:53 +0500, Sergey <77@users.rsdn.ru> wrote:

> Второй параметр, кстати, little-endian. Поэтому писать надо видимо не

> 'E000', а '000E'.

LE-представлением числа 0xE000 будет запись "00E0", а не "000E".

--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
Posted via RSDN NNTP Server 2.0
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)
От: Andrew S Россия http://alchemy-lab.com
Дата: 19.02.07 16:10
Оценка:
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 данные, оттуда можно все что угодно извлечь.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[7]: Vista как получить информацию BIOS(E0000-FFFFF)
От: KromKromov  
Дата: 19.02.07 16:44
Оценка:
Здравствуйте, 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)
От: Andrew S Россия http://alchemy-lab.com
Дата: 19.02.07 17:21
Оценка:
А>>>Люди, никто не кинет сэмпл с использованием 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 вызывать? Какие адреса он возвращает?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[9]: Vista как получить информацию BIOS(E0000-FFFFF)
От: KromKromov  
Дата: 19.02.07 17:48
Оценка:
Здравствуйте, 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. Там у меня прошита символика и по ней ставится ПО.

а пишу я следующее:

#include <windows.h>
#include <string.h>
#include <iostream>
#include <stdio.h>

typedef UINT (__stdcall *EnumSystemFirmwareTables_t)(DWORD d1, PVOID d2 , DWORD d3);
typedef UINT (__stdcall *GetSystemFirmwareTable_t)(DWORD d1,DWORD d2, PVOID d3 , DWORD d4);



void main()
{
HMODULE hmod = GetModuleHandle("kernel32.dll");
printf("%x\n", (int*)hmod);
static EnumSystemFirmwareTables_t EnumSystemFimwareTables(0);
EnumSystemFimwareTables = (EnumSystemFirmwareTables_t)GetProcAddress(hmod,"EnumSystemFirmwareTables");
printf("%x\n", EnumSystemFimwareTables);
getchar();

UCHAR pFirmwareTableBuffer1[0x10000];
UCHAR pFirmwareTableBuffer2[14000];
ULONG_PTR retValue;
ULONG_PTR err;
DWORD table[]={'ACPI','FIRM','RSMB'};

retValue = EnumSystemFimwareTables(table[1], pFirmwareTableBuffer1, 0x100);
err = GetLastError();
printf("Ret vlaue 1= %d LastError: %d\n", retValue, err);
for (int i=0; i<retValue; i++)
printf("%x",pFirmwareTableBuffer1[i]);

static GetSystemFirmwareTable_t GetSystemFirmwareTable(0);
GetSystemFirmwareTable = (GetSystemFirmwareTable_t)GetProcAddress(hmod,"GetSystemFirmwareTable");
printf("%x\n", GetSystemFirmwareTable);

retValue = GetSystemFirmwareTable(table[1], 'E000', pFirmwareTableBuffer2, 131070);
err = GetLastError();
printf("retValue2: %d err: %d\n", retValue, err);
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
for (int i=0; i<retValue; i++)
printf("%c,", pFirmwareTableBuffer2[i]);
printf("\n");
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
getchar();
}

Пояснение, после 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)
От: Andrew S Россия http://alchemy-lab.com
Дата: 19.02.07 20:19
Оценка:
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$, тут сказать нечего. Какой, вашу маму, АЭРО, когда функции задокументировать нормально не можете. Блин.

Вот этот код

    typedef UINT (__stdcall *EnumSystemFirmwareTables_t)(DWORD d1, PVOID d2 , DWORD d3);
    typedef UINT (__stdcall *GetSystemFirmwareTable_t)(DWORD d1,DWORD d2, PVOID d3 , DWORD d4);
    HMODULE hmod = GetModuleHandle("kernel32.dll");
    EnumSystemFirmwareTables_t pEnumSystemFirmwareTables;
    pEnumSystemFirmwareTables = (EnumSystemFirmwareTables_t)GetProcAddress(hmod,"EnumSystemFirmwareTables");
    GetSystemFirmwareTable_t pGetSystemFirmwareTable;
    pGetSystemFirmwareTable = (GetSystemFirmwareTable_t)GetProcAddress(hmod,"GetSystemFirmwareTable");
    if (pEnumSystemFirmwareTables && pGetSystemFirmwareTable)
    {
        DWORD tmpBuf1[0x10000];
        BYTE tmpBuf2[0x10000];
        UINT nRet = pEnumSystemFirmwareTables('FIRM', tmpBuf1, 0x100);
        if (nRet)
        {
            nRet /= 4;
            for (UINT i = 0; i < nRet; ++i)
                if (pGetSystemFirmwareTable('FIRM', tmpBuf1[i], tmpBuf2, 0x10000))
                    printf("%x: OK\n", tmpBuf1[i]);
        }
    }

на висте выдает


с0000: ОК
е0000: ОК


PS
А еще они покорежили MSDN (2), так, что он на IE6 выдается какие-то безумные фреймы, дерево перемещается вверх, а внизу дерева тулбар а-ля офис 2006, и собственно страничка. Ладно, фигня, я уже свыкся с тем, что эта хрень-2 тормозит и на мегабите, но еще и оболванить дизайн. Идиотизму нет предела Право, со всех их последних действий хочется только ругаться, много, долго и громко.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
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$, я с вами полностью согласен, итак, продолжим.....