Лекция 19 ХРАНЕНИЕ СИСТЕМНОЙ ИНФОРМАЦИИ Системный реестр Windows (registry) – централизованное хранилище системной информации и конфигураций установленных приложений, реализованное в виде иерархической базы данных. Ключи реестра упорядочены в иерархическую систему «ключ-подключ». Ключи верхнего уровня: HKEY_CLASSES_ROOT – ссылка на ключ HKEY_LOCAL_MACHINE\SOFTWARE\Classes, содержит определения типов документов, ассоциаций классов и информацию, относящуюся к классам (регистрация COM-объектов). HKEY_CURRENT_USER – ссылка на часть реестра HKEY_USERS, относящуюся к текущему пользователю. HKEY_LOCAL_MACHINE - содержит информацию об аппаратной и программной конфигурации компьютера (данные этого ключа хранятся в файле system.dat). HKEY_USERS - содержит информацию о пользователе по умолчанию и текущем пользователе (файл user.dat). HKEY_CURRENT_CONFIG - ссылка на информацию о текущей конфигурации компьютера, находящуюся в ключе HKEY_LOCAL_MACHINE. HKEY_DYN_DATA – определяет использование механизма plug-and-play для хранения динамических данных. Только для Windows 95/98/Me! Работа с реестром Редактор regedit: .reg-файлы: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] "calc"="C:\\Windows\\System32\\calc.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] "NBKeyScan"=- Функции Win32 API: #include <windows.h> int main(int argc, char* argv[]) { char szBuf[MAX_PATH]; DWORD dwBufLen = MAX_PATH; HKEY hKey; // Строка которую будем писать в реестр char szTestString[] = "This is the test"; // Ключ который будем создавать char szPath[] = "Software\\RegistrySample\\"; // Создаем ключ в ветке HKEY_CURRENT_USER if(RegCreateKeyEx(HKEY_CURRENT_USER, szPath, 0, NULL, REG_OPTION_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS){ printf("Key Create Error\n"); return 1; } // Пишем тестовую строку в созданный ключ if(RegSetValueEx(hKey, "Test string", 0, REG_SZ, (BYTE*)szTestString, sizeof(szTestString)) != ERROR_SUCCESS){ printf("Key Set Error\n"); return 2; } // Закрываем описатель ключа if(RegCloseKey(hKey) != ERROR_SUCCESS){ printf("Key Close Error\n"); return 3; } if(RegGetValue(HKEY_CURRENT_USER, szPath, "Test String", RRF_RT_REG_SZ, NULL, (BYTE*) szBuf, &dwBufLen) != ERROR_SUCCESS){ printf("Key Get Error\n"); return 4; } printf("C-version: %s\n",szBuf); return 0; } LONG RegCreateKeyEx( HKEY hKey, //дескриптор корневого ключа LPCTSTR lpSubKey, //подключ DWORD Reserved, //0 LPTSTR lpClass, //NULL DWORD dwOptions, //сохраняется ли информация после перезагрузки REGSAM samDesired, //определяет доступ LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, //дескриптор созданного (открытого ключа) LPDWORD lpdwDisposition //был ли ключ создан или уже существовал ); LONG RegSetValueEx( HKEY hKey, //дескриптор ключа LPCTSTR lpValueName, //имя значения ключа DWORD Reserved, //0 DWORD dwType, //тип данных значения const BYTE* lpData, DWORD cbData ); LONG RegGetValue( HKEY hkey, LPCTSTR lpSubKey, LPCTSTR lpValue, DWORD dwFlags, //ограничивает тип данных запрашиваемого значения LPDWORD pdwType, //указатель на переменную с кодом типа данных PVOID pvData, LPDWORD pcbData );