Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.181.209] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Славян ну вот.. значит фишка работает.. спасибо!
|
Сообщ.
#17
,
|
|
|
А, ещё у меня (ибо DA, а не 9A):
Bit14 ESCD support is available - 1 (Yes) Добавлено Да, работает. Непонятно, всё же, почему у Jin X не пашет. |
Сообщ.
#18
,
|
|
|
а вообще, тут достаточно двух строк в консоли:
wmic partition get type |
Сообщ.
#19
,
|
|
|
Да, это я прогнал
Короче, писал на Delphi 7 и на fasm. В Delphi забыл поставить stdcall в определении функций. А в fasm указывал строкой, но она почему-то не заносилась в стек вообще (при подключении win32ax.inc, а вот с win32a.inc всё работает). Конкретно этот бит пока не проверял, но думаю, всё сработает, спасибо за инфу |
Сообщ.
#20
,
|
|
|
возвращает тип разделов, среди которых должен быть и 'Extended int-13'
Добавлено Цитата но думаю, всё сработает, спасибо за инфу я - так вообще не проверял.. (у меня XP 32-бит) чисто в теории должно было работать |
Сообщ.
#21
,
|
|
|
Какие-то странноватые данные выходят. Я же правильно понял, что "BIOS Characteristics" находится по смещению 0Ah?
У меня там 7F03F00002010000h (00 00 01 02 00 F0 03 7F), т.е. 19-й бит сброшен. Хотя EDD однозначно поддерживается. А по смещению 2 байт = 2 (а это как бы размер форматированных данных, включая заголовок). При этом первый байт (тип структуры) = 0 (т.е. должно быть всё ок). Добавлено Опа, а вот по смещению 8 начинается нормальный заголовок: тип 0, размер 18h и дальше по смещению 0Ah (относительно 8-го байта) идёт число 13F8B9880h (80 98 8B 3F 01 00 00 00), 19-й бит стоит! Ура! Осталось теперь разобраться, почему у меня первые 8 байт – какая-то лажа... Добавлено Первые 8 байт: 00 02 07 00 2B 0C 00 00, а дальше уже 00 18 00 00 01 02 00 F0 Если это всё массив структур, то почему второй байт (размер) = 2 ? Если размер этого блока = 2 байтам, то далее идёт тип 7 и размер 0, но как размер может быть 0 ??? И как вообще понять, где нужный мне блок начинается (может, по сегменту F000)? Жесть какая-то... Добавлено В какой шапке? А вообще, эта таблица (в таком виде) из какой программы сграблена? Добавлено На всякий случай инфа из RBIL: Format of SMBIOS data structure: Offset Size Description (Table F0059) 00h 4 BYTEs structure header BYTE structure type (see #F0060) 80h-FFh available for system/OEM-specific data BYTE length of formatted data, including header WORD structure handle (a unique value 0000h-FEFFh [v2.0 allows up to FFFEh]) handles FF00h-FFFFh are reserved for use by the SMBIOS specification handles need not be contiguous -- a handle might not exist any more after a configuration change, but the BIOS may not re-assign that handle number to another structure ---type 00h--- 04h BYTE string number of the vendor name (string numbers are 1-based) 05h BYTE string number of the version string (00h if not present) 06h WORD starting segment of runtime BIOS 08h BYTE string number of BIOS release date 09h BYTE size of BIOS ROM (stored as one less than number of 64K units) 0Ah QWORD BIOS characteristics (see #F0061) 12h var optional space for BIOS characteristics extension (see #F0062,#F0063) (size of optional space is implied by header's length field) var var free-form ASCIZ strings (max 64 bytes per string) Добавлено Хотя, некоторая картинка вырисовывается, но как-то очень странно это. (тут первые 2 цифра – смещение от начала) 00: тип = 0 (инфа о биосе(?)) 01: размер = 2 (тут этот блок и закончился) Далее пошли ASCIIZ-строки (в конце двойной ноль): 02: 07 00 04: 2B 0C 00 00 Новый блок: 08: тип = 0 (снова инфа о биосе) 09: размер = 18h (24) 0A: данные (22 оставшихся байта) 20: пошли строки Новый блок (тут строки закончились): 48: тип = 1 (системная инфа) 49: размер = 1Bh (27 байт) 4A: данные (25 оставшихся байт) 63: начались строки (пока всё чётко) Новый блок: F5: тип = 2 (материнка) F6: размер = 0Fh (15) F7: данные (13 оставшихся байт) 104: начались строки... и т.д. Вроде как всё сходится. Смущает только первый блок – нафига он? Почему у меня 2 блока инфы о биосе? |
Сообщ.
#22
,
|
|
|
Jin X, мои логи из программы rw: http://rweverything.com/download/
я не вижу, что возвращает эта функция, ..но вы можете сравнить выхлоп функции "GetSystemFirmwareTable" с данными этой проги. По сути, там сперва должен идти заголовок (см.мой лог), а потом - сами структуры. В заголовке указывается кол-во структур в таблице. RBIL (как я понял) это хелп Ральфа Брауна что-ли? Лучше покурить SMBIOS/DMI спецификацию: https://www.dmtf.org/sites/default/files/st...P0134_3.2.0.pdf |
Сообщ.
#23
,
|
|
|
на всякий.. приведу расклад DMI-таблицы
по моим расчётам, GetSystemFirmwareTable должна была сбросить в буфер всю таблицу, включая заголовок, иначе разобраться в куче данных будет проблематично (нет описания таблицы). То-есть данные в буфере должны начинаться с сигнатуры _SM_. Ну и где-то должна валяться база таблицы [SMBIOS-Entry], чтобы дальше плясать от неё. Например вот лог, где указана линейная база 0x000FAFF0 (FAFF:0000) - дзебуг подтверждает Entry-Point: [SMBIOS Entry] 0x000FAFF0 5F 53 4D 5F C3 1F 02 04 BA 00 00 00 00 00 00 00 _SM_............ 5F 44 4D 49 5F C4 65 04 40 D6 0F 00 16 00 00 _DMI_.e.@...... Anchor String _SM_ Checksum 0xC3 Length 0x1F Version 2.4 Maximum Structure Size 0x00BA Entry Point Revision 0x00 Formatted Area 0x00 0x00 0x00 0x00 0x00 Intermediate Anchor _DMI_ Intermediate Checksum 0xC4 Structure Table Length 0x0465 Structure Table Address 0x000FD640 <--- указатель на структуру 'BIOS-Info' Number of Structures 0x0016 wNumSMBStruc 0x00 дальше, ..в заголовке видим адрес 0x000FD640 - это и есть адрес первой структуры 'BIOS-Info'. Соответственно разница между ними: 0xFD640 - 0xFAFF0 = 0x2650 (~9K). Делаю вывод, что сама DMI-таблица находится в другом/свободном месте физ.памяти и не прижата к заголовку: [BIOS Information] (Type 0) 00 18 00 00 01 02 00 F0 03 07 80 9A 8B 7F 01 00 ................ 00 00 33 07 08 0C FF FF 41 6D 65 72 69 63 61 6E ..3.....American 20 4D 65 67 61 74 72 65 6E 64 73 20 49 6E 63 2E Megatrends Inc. 00 50 31 2E 32 30 00 30 32 2F 30 35 2F 32 30 30 .P1.20.02/05/200 39 00 00 9.. Type 0x00 (0) Length 0x18 (24) Handle 0x0000 (0) BIOS Vendor String1 - "American Megatrends Inc." BIOS Version String2 - "P1.20" Start Address Segment 0xF000 Release Date String3 - "02/05/2009" ROM Size 0x07 (512KB) BIOS Characteristics 0x000000017F8B9A80 Bit0 Reserved - 0 (No) Bit1 Reserved - 0 (No) Bit2 Unknown - 0 (No) Bit3 BIOS Characteristics Not Supported - 0 (No) |
Сообщ.
#24
,
|
|
|
core-i7, да, это Ralf Brown, но в спецификации SMBIOS такая же фигня, ничего про эту канитель со странными первыми 8-ю байтами я не нашёл.
В общем, я накатал вот такую прогу для проверки поддержки EDD: ; fasm 1 (Windows Vista/XP Pro x64 +) format PE Console 5.0 include 'win32axp.inc' include 'simport.inc' ;-- CODE SECTION ------------------------------------------------------------------------------------------------------- FirmText equ 'RSMB' FirmSign = FirmText shr 24 + (FirmText shr 8) and 0xFF00 + (FirmText shl 8) and 0xFF0000 + (FirmText shl 24) and 0xFF000000 FirmTable = 0 BUFFER_SIZE = 65536 SHOW_READ_OK = 1 SAVE_TO_FILE = 1 SHOW_FLAG_QWORD = 1 .code start: ; Read raw SMBIOS firmware table invoke GetSystemFirmwareTable, FirmSign, FirmTable, Table, BUFFER_SIZE test eax,eax jz .readerror cmp eax,BUFFER_SIZE ja .toolarge mov [TableSize],eax if defined SHOW_READ_OK & SHOW_READ_OK cinvoke printf, <FirmText,' table is read (size = %d bytes)!',10>, eax end if if defined SAVE_TO_FILE & SAVE_TO_FILE ; Save table to file stdcall SaveToFile end if ; Check of EDD support and show results stdcall GetBIOSChars jc .notfound if defined SHOW_FLAG_QWORD & SHOW_FLAG_QWORD push eax cinvoke printf, <'BIOS Characteristics QWORD = %08X%08X',10>, edx, eax pop eax end if btc eax,19 jnc @F cinvoke printf, <'EDD is supported!',10> jmp .finish @@: cinvoke printf, <'EDD is NOT supported :(',10> ; Finalization .finish: cinvoke printf, <'Press a key to exit...',10> cinvoke getch invoke ExitProcess, 0 .readerror: cinvoke printf, <FirmText,' table read error :(',10> jmp .finish .toolarge: cinvoke printf, <FirmText,' table too large (%d bytes)',10>, eax jmp .finish .notfound: cinvoke printf, <'No correct BIOS Information structure is found :(',10> jmp .finish ; Get BIOS Characteristic QWORD (EDX:EAX, CF=0) or CF=1 on error proc GetBIOSChars uses esi ; Search for BIOS Information structure cld mov esi,Table mov edx,[TableSize] add edx,esi ; table end .next: mov ecx,esi ; structure start xor eax,eax lodsb ; structure type cmp al,127 je .notfound ; jump if end-of-table type test al,al lodsb ; structure size lea esi,[eax+ecx] ; structure end, start of strings jnz .skipstrings ; jump if type <> 0 (BIOS Information) cmp al,2 jb .notfound ; WTF??? cmp al,12h jnb .ok ; no jump if bad structure (no BIOS Characteristics qword in this structure) .skipstrings: @@: mov ah,al ; al <> 0 for the first time lodsb test eax,eax jnz @B ; searching for strings end (double 0) cmp esi,edx jb .next ; check next structure ; Structure is NOT found .notfound: stc ; CF=1 (error) ret .ok: ; Structure is found (CF=0, because jumped here by jnb = jnc) mov eax,[ecx+0Ah] ; BIOS Characteristics low dword mov edx,[ecx+0Eh] ; BIOS Characteristics high dword ret endp ; Save table to file proc SaveToFile uses ebx invoke CreateFile, <FirmText,#'.bin'>, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 cmp eax,INVALID_HANDLE_VALUE je .createerror mov ebx,eax invoke WriteFile, ebx, Table, [TableSize], Written, 0 test eax,eax jz .writeerror cmp [Written],ebx jb .writeerror cinvoke printf, <'Table is saved to file!',10> .continue: invoke CloseHandle, ebx ret .createerror: cinvoke printf, <'File create error :(',10> ret .writeerror: cinvoke printf, <'File write error :(',10> jmp .continue endp ;-- DATA SECTION ------------------------------------------------------------------------------------------------------- .data Written rd 1 TableSize rd 1 Table rb BUFFER_SIZE ZeroWord rw 1 simport kernel32, GetSystemFirmwareTable slibrary msvcrt, 'msvcrt.dll' simport msvcrt,\ printf, ,\ getch, '_getch' .end start simport.inc: ; WinAPI function import (written by Tomasz Grysztar, square brackets [] added by Jin X) ; usage: ; simport kernel32, GetFirmwareEnvironmentVariableA ; function name string can be omitted (like here) ; api GetFirmwareEnvironmentVariable ; only for functions with 'A' or 'W' suffix macro simport library_label*, [label*, string] { match ,string \{ define library_label#.collection label,`label \} match any, string \{ define library_label#.collection label,string \} } ; wrapper of import macros (written by Tomasz Grysztar) macro import library_label*, list& { common local all define all irpv a, library_label#.collection \{ all equ all , a \} match a, list \{ all equ , list all \} match complete, all \{ import library_label complete \} } ; DLL library import (written by Tomasz Grysztar) ; usage: ; slibrary msvcrt ; dll name string can be omitted (like here) ; simport msvcrt, printf ; function name string can be omitted (like here) ; or: ; simport msvcrt, printf,, getch, '_getch', scanf macro slibrary library_label*, string { match ,string \{ define import_library library_label,`library_label#'.DLL' \} match any, string \{ define import_library library_label,string \} } ; wrapper of library macros (written by Tomasz Grysztar) macro library list& { common local all define all irpv a, import_library \{ all equ all , a \} match complete, list all \{ library complete \} irpv a, import_library \{ match library_label=,string, a \\{ import library_label \\} \} } Добавлено Нашёл эи 8 байт! Оказывается GetSystemFirmwareTable возвращает структуру: struct RawSMBIOSData { BYTE Used20CallingMethod; BYTE SMBIOSMajorVersion; BYTE SMBIOSMinorVersion; BYTE DmiRevision; DWORD Length; BYTE SMBIOSTableData[]; }; |
Сообщ.
#25
,
|
|
|
Итого имеем...
EDDSupportCheck.fasm: ; fasm 1 (Windows Vista/XP Pro x64 +) format PE Console 5.0 include 'win32axp.inc' include 'simport.inc' ;-- CODE SECTION ------------------------------------------------------------------------------------------------------- FirmText equ 'RSMB' FirmSign = FirmText shr 24 + (FirmText shr 8) and 0xFF00 + (FirmText shl 8) and 0xFF0000 + (FirmText shl 24) and 0xFF000000 FirmTable = 0 MAX_TABLE_SIZE = 65536 BUFFER_SIZE = MAX_TABLE_SIZE+8 ; 8 bytes of header SHOW_READ_OK = 1 ;SAVE_TO_FILE = 1 SHOW_FLAG_QWORD = 1 .code start: ; Read raw SMBIOS firmware table invoke GetSystemFirmwareTable, FirmSign, FirmTable, Buffer, BUFFER_SIZE test eax,eax jz .readerror cmp eax,BUFFER_SIZE ja .toolarge if defined SHOW_READ_OK & SHOW_READ_OK movzx ecx,[Buffer+1] movzx edx,[Buffer+2] sub eax,8 cinvoke printf, <'SMBIOS table is read (size = %d bytes + 8 bytes of raw data header)!',10,\ 'SMBIOS version %d.%d',10>, eax, ecx, edx end if if defined SAVE_TO_FILE & SAVE_TO_FILE ; Save table to file stdcall SaveToFile end if ; Check of EDD support and show results stdcall GetBIOSChars jc .notfound if defined SHOW_FLAG_QWORD & SHOW_FLAG_QWORD push eax cinvoke printf, <'BIOS Characteristics QWORD = %08X%08X',10>, edx, eax pop eax end if btc eax,19 jnc @F cinvoke printf, <'EDD is supported!',10> jmp .finish @@: cinvoke printf, <'EDD is NOT supported :(',10> ; Finalization .finish: cinvoke printf, <'Press a key to exit...',10> cinvoke getch invoke ExitProcess, 0 .readerror: cinvoke printf, <'SMBIOS table read error :(',10> jmp .finish .toolarge: cinvoke printf, <'SMBIOS raw table is too large (%d bytes)',10>, eax jmp .finish .notfound: cinvoke printf, <'BIOS Information structure is not found :(',10> jmp .finish ; Get BIOS Characteristic QWORD in EDX:EAX and address of structure start in ECX if CF=0 or CF=1 on error proc GetBIOSChars uses esi ; Search for BIOS Information structure cld mov esi,Table mov edx,[TableSize] add edx,esi ; table end .next: mov ecx,esi ; structure start xor eax,eax lodsb ; structure type cmp al,127 stc ; CF=1 if next just will occur je .finish ; jump if end-of-table type test al,al lodsb ; structure size lea esi,[eax+ecx] ; structure end, start of strings jz .oktype ; jump if type = 0 (BIOS Information) ; Skip strings @@: mov ah,al ; AL <> 0 for the first pass lodsb test eax,eax jnz @B ; searching for strings end (double 0) cmp esi,edx jb .next ; check next structure (of continue with AL = 0) .oktype: cmp al,12h jb .finish ; jump if bad structure (structure must be at least 12h bytes in size) [CF=1] ; Structure is found [CF=0] mov eax,[ecx+0Ah] ; BIOS Characteristics low dword mov edx,[ecx+0Eh] ; BIOS Characteristics high dword .finish: ret ; CF=0 if ok, CF=1 on error endp ; Save table to file proc SaveToFile uses ebx invoke CreateFile, <'SMBIOSTable.bin'>, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 cmp eax,INVALID_HANDLE_VALUE je .createerror mov ebx,eax invoke WriteFile, ebx, Table, [TableSize], Written, 0 test eax,eax jz .writeerror cmp [Written],ebx jb .writeerror cinvoke printf, <'Table is saved to file!',10> .continue: invoke CloseHandle, ebx ret .createerror: cinvoke printf, <'File create error :(',10> ret .writeerror: cinvoke printf, <'File write error :(',10> jmp .continue endp ;-- DATA SECTION ------------------------------------------------------------------------------------------------------- .data Buffer rb 4 TableSize rd 1 Table rb MAX_TABLE_SIZE ZeroWord rw 1 ; just in case virtual at Buffer Written rd 1 end virtual simport kernel32, GetSystemFirmwareTable slibrary msvcrt, 'msvcrt.dll' simport msvcrt,\ printf, ,\ getch, '_getch' .end start simport.inc: ; WinAPI function import (written by Tomasz Grysztar, square brackets [] added by Jin X) ; usage: ; simport kernel32, GetFirmwareEnvironmentVariableA ; function name string can be omitted (like here) ; api GetFirmwareEnvironmentVariable ; only for functions with 'A' or 'W' suffix macro simport library_label*, [label*, string] { match ,string \{ define library_label#.collection label,`label \} match any, string \{ define library_label#.collection label,string \} } ; wrapper of import macros (written by Tomasz Grysztar) macro import library_label*, list& { common local all define all irpv a, library_label#.collection \{ all equ all , a \} match a, list \{ all equ , list all \} match complete, all \{ import library_label complete \} } ; DLL library import (written by Tomasz Grysztar) ; usage: ; slibrary msvcrt ; dll name string can be omitted (like here) ; simport msvcrt, printf ; function name string can be omitted (like here) ; or: ; simport msvcrt, printf,, getch, '_getch', scanf macro slibrary library_label*, string { match ,string \{ define import_library library_label,`library_label#'.DLL' \} match any, string \{ define import_library library_label,string \} } ; wrapper of library macros (written by Tomasz Grysztar) macro library list& { common local all define all irpv a, import_library \{ all equ all , a \} match complete, list all \{ library complete \} irpv a, import_library \{ match library_label=,string, a \\{ import library_label \\} \} } Прикреплённый файлEDDSupportCheck.zip (3,23 Кбайт, скачиваний: 152) Добавлено Можно, конечно, так не заморачиваться, а просто проверять первый байт (вернее, 9-й, т.е. со смещением 8, если брать Raw SMBIOS table) на значение 0, а второй - на значение 12h+ (чтоб был не меньше), а дальше уже по смещению 0Ah берём 19-й бит (а точнее test byte [Buffer+0Ch],8). Добавлено Хоть в спецификации и не сказано, что структура BIOS Information (тип 0) должна быть первой, наверняка всегда (или почти всегда) так и есть. Но я бы лучше подстраховался и сделал нормально (как в коде выше). |
Сообщ.
#26
,
|
|
|
Jin X, прикольно.. закинем в сундучок.
а для систем ХР можно реализовать так-же, и читать SMBIOS хоть ком-файлом чз NTVDM |
Сообщ.
#27
,
|
|
|
Так же, наверное, не выйдет, т.к. заветной функции нет в XP (32-битной, по крайней мере).
Можно попробовать через \\Device\PhysicalMemory. И там искать сигнатуру _SM_ или _SM3_ (я пока не понял, есть ли в SMBIOS 3.0 _SM_ тоже или только _SM3_) и дальше выходить на таблицу. Добавлено Ну или WMI как универсальный способ... |
Сообщ.
#28
,
|
|
|
Короче, сделал я так, что теперь всё работает и на Windows XP, и на более свежих.
Правда, я не проверял, можно ли заменить NtOpenSection на CreateFile + CreateFileMapping, но не думаю, что тут будет какой-то профит (по размеру файла). Ну и ещё, конечно, можно заменить MapViewOfFile на NtMapViewOfSection (чтобы раз начали с натива, то и дальше в том же духе), но пока заморачиваться не хочется, а хочется спать Исходники в аттаче (постить в лом). Прикреплённый файлEDDSupportCheck.zip (4,67 Кбайт, скачиваний: 140) |
Сообщ.
#29
,
|
|
|
Цитата Jin X @ теперь всё работает и на Windows XP, и на более свежих. ..у меня почему-то выдаёт эррор: Цитата SMBIOS table read error Press a key to exit... |
Сообщ.
#30
,
|
|
|
Хм, у меня на виртуалке работает.
Будем разбираться тогда. Запустите дебаг-версию, какие данные она выдаст? Прикреплённый файлEDDSupportCheckDEBUG.zip (4,45 Кбайт, скачиваний: 152) |