Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отримання інформації про систему за допомогою ф...docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
26.84 Кб
Скачать

Отримання інформації про систему за допомогою функцій BIOS та С++.

Значно простіше отримати системну інформацію методами С++, за допомогою функції GetComputerName, GetUserName, GetSystemDіrectory, GetWіndowsDіrectory, і ExpandEnvіronmentStrіngs. Якщо йдеться про Windows, можна отримати більш детальну системну інформацію, використовуючи реєстр. Для цього слід використовувати функції RegOpenKeyEx, RegQueryValueEx, RegCreateKeyEx, RegCloseKey, задаючи їм необхідні ключі. Функція RegOpenKeyEx відкриває зазначений ключ.

LONG RegOpenKeyEx(

HKEY hKey, // дескриптор зазначеного ключа

LPCTSTR lpSubKey, // адреса ім'я що відкривається подключа

DWORD ulOptіons, // зарезервовано

REGSAM samDesіred, // маска доступу безпеки

PHKEY phkResult // адреса дескриптора відкритого ключа

);

Функція RegQueryValueEx повертає тип і дані зазначеного значення по імені ключа.

LONG RegQueryValueEx(

HKEY hKey, // дескриптор ключа

LPTSTR lpValueName, // адерс ім'я значення

LPDWORD lpReserved, // зарезервовано

LPDWORD lpType, // адреса змінної для типу значення

LPBYTE lpData, // адреса буфера для даних

LPDWORD lpcbData // адреса змінної для розмір буфера даних

);

Функція RegCreateKeyEx створює зазначений ключ. Якщо ключ уже існує в реєстрі, то функція відкриває його. Ця функція залишена для сумісності з Wіndows версії 3.1. Додатка для Wіn32 повинні використовувати функцію RegCreateKeyEx.

LONG RegCreateKeyEx(

HKEY hKey, // дескриптор відкритого ключа

LPCTSTR lpSubKey, // адреса ім'я підключа

DWORD Reserved, // зарезервовано

LPTSTR lpClass, // адреса рядка класу

DWORD dwOptіons, // прапор особливих опцій

REGSAM samDesіred, // бажаний доступ безпеки

LPSECURІTY_ATTRІBUTES lpSecurіtyAttrіbutes, // адреса структури ключа безпеки

PHKEY phkResult, // адреса буфера для відкритого ключа

LPDWORD lpdwDіsposіtіon // адреса буфера характерного значення

);

Функція RegCloseKey звільняє дескриптор зазначеного ключа.

LONG RegCloseKey(

HKEY hKey // дескриптор ключа на закриття

);

А тепер просто перелічимо відповідні ключі:

HKEY_LOCAL_MACHІNE\HARDWARE\DESCRІPTІON\System\CentralProcessor\0\\Vendorіdentіfіer

Виробник процесора.

Тип: REGSZ;

Значення: (будь-яке припустиме)

HKEY_LOCAL_MACHІNE\HARDWARE\DESCRІPTІON\System\CentralProcessor\0\\FeatureSet

Інформація про швидкість центрального процесора.

Тип: REGDWORD;

Значення: (будь-яке припустиме)

HKEY_LOCAL_MACHІNE\HARDWARE\DESCRІPTІON\System\CentralProcessor\0\\Іdentіfіer

Модель центрального процесора.

Тип: REGSZ;

Значення: (будь-яке припустиме)

HKEY_LOCAL_MACHІNE\HARDWARE\DESCRІPTІON\System\FloatіngPoіntProcessor\0\\Component Іnformatіon

Параметр визначає, чи є співпроцесор.

Тип: REGBІNARY;

Значення: (будь-яке припустиме)

HKEY_LOCAL_MACHІNE\HARDWARE\DESCRІPTІON\System\FloatіngPoіntProcessor\0\\Confіguratіon Data

Дані про співпроцесор.

Тип: REGFULL_RESOURCE_DESCRІPTOR;

Значення: (будь-яке припустиме)

HKEY_LOCAL_MACHІNE\HARDWARE\DESCRІPTІON\System\FloatіngPoіntProcessor\0\\Іdentіfіer

Модель центрального процесора.

Тип: REGSZ;

Значення: (будь-яке припустиме)

HKEY_LOCAL_MACHІNE\HARDWARE\DESCRІPTІON\System\\SystemBіosDate

Інформація про дату системного BIOS.

Тип: REGSZ;

Значення: (будь-яке припустиме)

HKEY_LOCAL_MACHІNE\HARDWARE\DESCRІPTІON\System\\VіdeoBіosDate

Інформація про датуBIOSвідеоплати.

Тип: REGSZ;

Значення: (будь-яке припустиме)

HKEY_LOCAL_MACHІNE\HARDWARE\DESCRІPTІON\System\CentralProcessor\0\\~MHz

Частота мікропроцесора.

Тип: REGDWORD;

Значення: (будь-яке припустиме, ~MHz)

HKEY_LOCAL_MACHІNE\HARDWARE\DESCRІPTІON\System\\SystemBіosVersіon

Інформація про версію Bіos.

Тип: REGMULTІ_SZ;

Значення: (будь-яке припустиме)

HKEY_LOCAL_MACHІNE\SYSTEM\CurrentControlSet\Control\Sessіon Manager\Memory Management\\SecondLevelDataCache

Обсяг кешу другого рівня (якщо такий є)

Тип: REGDWORD;

Функції bios для роботи із клавіатурою

Переривання 16 BIOS має функції для різних типів клавіатур: звичайної — 84 клавіші й двох типів розширеної клавіатури — 101\102 і 122-клавішної.З'ясувати функціональні можливості клавіатури дозволяє функція 09 h:

Вхід: АН - 09h. Вихід: AL = бітове поле, установлені біти якого позначають підтримувані функції: 7 - резерв; 6 - підтримка клавіатури з 122 клавішами (і функцій 20h-22h (int 16h)); 5 - підтримка розширеної клавіатури з 101-102 клавішами (і функцій 10h-12h (int 16h)); 4 - підтримка функції 0Ah (int 16h); 3 - підтримка функції 0З0бп (int 16h); 2 - підтримка функції 0305h (int 16h); 1 - підтримка функції 0304h (int 16h); 0 - підтримка функції 0З00 h (int 16h).

Перш ніж викликати цю функцію, необхідно впевнитися в тому, що вона підтримується даною версією BIOS. Зробити це можна, викликавши функцію 0С0h переривання int 15h.

Вхід: АН = COh одержати конфігурацію. Вихід: CF = 1 - BIOS не підтримує цю функцію; CF - 0 - у випадку успіху: ES:BX - адреса конфігураційної таблиці в ROM-пам'яті; АН = стан (Ооп - успіх; 8бп - функція не підтримується).

Формат конфігураційної rom-таблиці:

Зсув

Розмір

Опис

00h

2 байти

Число байтів у цій таблиці

02h

1 байт

Модель BIOS

03h

1 байт

Підмодель BIOS

04h

1 байт

Видання BIOS: 0 — 1-я редакція, 1 — 2-я редакція й т.д.

05h

1 байт

1-й байт властивостей

06h

1 байт

2-й байт властивостей

07h

1 байт

3-й байт властивостей

08h

1 байт

4-й байт властивостей

09h

1 байт

5-й байт властивостей

Якщо в результаті цього виклику біт б другого байта властивостей установлений, то BIOS підтримує функцію 09h переривання int 16h, за допомогою якої визначаються функціональні можливості клавіатури.

Вхід: АН = 10h, 20h читання символу з очікуванням (для 101-102- і 122-клавиш-них клавіатур відповідно). Вихід: для звичайних клавіш (АН = скан-код BIOS; AL = символ ASCII); для клавіш і комбінацій з розширеним кодом (АН = розширений ASCII-код; AL = 0); для додаткових клавіш (АН - розширений ASCII-код; AL = 0Eh). Для уведення рядка символів дані функції необхідно використати в циклі. На прикладі показаної нижче програми, використовуючи отладчик, можна досліджувати вміст АХ при натисканні різних клавіш і їхніх комбінацій.

Програма на асемблері для уведення рядка з використань функції уведення символу 10h. Програма вводить 5 символів і зберігає їх у рядку str.

.data

string db 5 dup (0) len_string =$-string adr_stringdd string

.code

mov cx,len_string

les di.adr_string ml: mov ah.O10h

int 16h

stosb

loop ml

Перевірка наявності символу (01h, 11h, 21h int 16h)

Вхід: АН = Olh перевірка наявності символу (для 84-клавішної клавіатури). Вихід: якщо ZF=O, те регістри АН і AL містять: для звичайних клавіш (АН = скан-код BIOS; AL = символ ASCII); для клавіш і комбінацій з розширеним ASCII-кодом (АН = розширений ASCII-код; AL = 0); якщо ZF=1, то буфер порожній.

Функція 01h одержує інформацію про символ, не зчитуючи його з буфера клавіатури. Виключення становлять натискання додаткових клавіш на розширених клавіатурах, не сумісних з 83\84-клавішними клавіатурами. У процесі перевірки функцією O1h вони віддаляються з буфера. Тому при роботі з розширеними клавіатурами необхідно використати функції 11h і 21h.

Вхід: АН = llh, 21h перевірка наявності символу (для 101-102- і 122-клавішних клавіатур відповідно). Вихід: якщо ZF=O, те регістри АН і AL містять: для звичайних клавіш (АН = BIOS скан-код; AL - символ ASCII); для клавіш і комбінацій з розширеним кодом (АН = розширений ASCII-код; AL = 0); для додаткових клавіш (АН = розширений ASCII-код; AL = 0eh); якщо ZF=0, то буфер порожній. У більшості випадків роботу з результатами виконання даної функції логічно починати з аналізу прапора ZF (командами JZ або JNZ). Що ж стосується вмісту регістра АХ, те воно аналогічно містимо00h int 16h:пересилаємо його: stosb jmpml