![]() |
На различных форумах часто можно встретить вопрос: -"Как определить установленное физ.оборудование на мат.плате?" (не путать с материнским капиталом). Однажды я тоже столкнулся с проблемой софт-реализации данного вопроса, в результате чего появился код, с которым решил поделиться здесь. Под катом..
1. Графическая оболочка GUI 2. Процессор, BIOS, мат.плата 3. Видео и ядро GPU 4. Жёсткие диски ATA/SATA/NVM 5. Система - тип и дата установки 6. Заключение 1. Графическая оболочка GUI Для начала несколько слов об окне, куда будем выводить всю нарытую инфу. Если в двух словах, то принцип прост до неприличия - мы создаём основное окно функцией Код:
CreateWindow()Как видим, при использовании диалоговых окон мы избавляемся как минимум от 8-ми функций Win32API, что упрощает непосредственную работу с окнами. Суть в том, что для создания обычного окна мы должны сначала создать его класс, далее зарегистрировать этот класс у оконного менеджера системы, и только потом создать рабочую область через Код:
CreateWindow()Код:
MsgLoop()В общем для простых инфо-окон такая стратегия накладна и никак не оправдывает себя, а потому разумнее создать именно диалоговое окно всего одной функцией Код:
DialogBoxParam()Код:
WndProc()Оформление окна будем хранить в секции-ресурсов, где придётся описать детали каждого "элемента управления" вручную. По сути это только элементы типа "Static", в которые буду отправлять текст функцией Код:
SetDlgItemText()C-подобный: Код:
BOOLИнформацию о бортовом оборудовании можно найти в ветке системного реестра Код:
HKLM\System\CurrentControlSet\EnumКод:
CPUIDКод:
EAXК счастью производитель мат.плат прошивает в биос полные сведения о своём продукте, и прямо из под юзера мы можем прочитать их функцией Код:
GetSystemFirmwareTable()Чтобы пропарсить эту базу в поисках перечисленных таблиц, придётся раскурить спеку на SMBIOS, последняя версия которой датируется августом 2024 года под номером v3.8. По объёму база достаточно большая (особенно на вирт.машинах), поэтому нужно предусмотреть приёмный буфер порядка 16 КБ. В скрепке к статье лежит исходник для сборки ассемблером fasm, где всё расписано до мелочей. В итоге получим такую картину: Здесь всё, кроме кодового имя ядра "Ivy Bridge", считано из соответствующих таблиц базы SMBIOS, а вот ядро вычисляется по коду CPUID. На данный момент в моей программе имеется список соответствий из 97 наименований процессоров Intel и AMD, которые я нашёл здесь. Вполне возможно, что код не сможет определить имя ядра вашего процика, тогда просьба отписаться в комментах, и я добавлю его в свой список. 3. Видео и ядро графического процессора GPU Единственно возможный вариант вытащить из системы детальную инфу об установленном видео-адаптере, это запросить её у подсистемы DirectX, но для начала нужно узнать имя девайса у менеджера конфигурации функцией Код:
CM_Get_Device_Interface_List()Код:
D3DKMTOpenAdapterFromDeviceName()Код:
D3DKMTQueryAdapterInfo()4. Жёсткие дискиATA/SATA/NVM Как и в случае с мат.платой, производитель хардов сохраняет паспорт своего продукта прямо на носителе, для чего выделяется специальный сектор размером в 512 байт. Для его чтения предусмотрена отдельная ATA-команда "IDENTIFY_DEVICE" с кодом Код:
0xECATA-команды можно посылать драйверу накопителя функцией Код:
DeviceIoControl()Раз уж имеем доступ к подноготной диска, ничего не мешает прочитать и его SMART командой "SMART_READ_DATA". Тогда получим такие сведения как: счётчик включений, кол-во проработанных часов, число переназначенных/сбойных секторов (если таковые имеются), и текущую температуру. Я недавно всего за 20$ приобрёл новый диск SATA "WesternDigital_Blue", и как показывает лог ниже, на данный момент включал его всего 46 раз, из которых он проработал 347 часов. C-подобный: Код:
;5. Система - тип и дата установки В подвал окна я добавил инфу о самой системе - это её версия, время установки, и число проработанных часов с последнего включения. Версию можно взять из структуры РЕВ процесса, где прописаны сведения вплоть до сервис-пака "OSCSDVersion". Позаимствованные у WinDbg смещения от начала структуры представлены ниже. В данном случае имеем "Win 6.1.7601-SP1.0": Время установки девственной системы может и хранится где-нибудь в реестре, однако можно заполучить его и более простым способом. Поскольку папка пользователей "Users" на диске C:\ создаётся именно в момент установки системы, то достаточно функцией Код:
FindFirstFile()Код:
FileTimeToSystemTime()Код:
GetTickCount()6. Заключение В скрепку положил исходник для сборки fasm'ом, а так-же готовый исполняемый файл для тестов (запускать правой клавишей мыши от имени админа, иначе не сможем собрать инфу о жёстких дисках). Буду премного благодарен, если набросаете своих скринов, т.к. могут быть глюки, например отсутствие или неправильные значения в полях. Вот что представили мне коллеги на этапе тестирования кода, но этого явно мало: https://forum.antichat.xyz/attachmen...78cbaa1b02.png А здесь почему-то не определилось видео https://forum.antichat.xyz/attachmen...a832cdcd20.png У людей машины работают неделями без перебоя https://forum.antichat.xyz/attachmen...2e3455f878.png Зверюга Ryzen-9, с 98 гигов памяти на борту https://forum.antichat.xyz/attachmen...a3dc4ebd83.png Походу чел геймер, и заточил машину под игры https://forum.antichat.xyz/attachmen...bac312f924.png Честно проработав ~40.000 часов, мой ATA-хард приказал долго жить https://forum.antichat.xyz/attachmen...1d0f3912ff.png |
| Время: 17:52 |