registry
TRANSCRIPT
3.1. Khai ni m va vai tro cua CSDL Registryê• Registry là một CSDL dùng để lưu trữ
thông tin về những sự thay đổi, những lựa chọn, những cấu hình từ người sử dụng Windows.
• Registry bao gồm tất cả các thông tin về phần cứng, phần mềm, người sử dụng.
• Registry luôn được cập nhật khi người sử dụng tiến hành sự thay đổi trong các thành phần của Control Panel, File Associations, và một số thay đổi trong menu Options của một số ứng dụng,..
Registry• Trong Win95 & 98, Registry được ghi
trong 2 file: user.dat và system.dat trong thư mục Windows.
• Trong Windows Me, Registry được lưu trong file Classes.dat trong thư mục Windows.
• Trong Win2K Registry được lưu trong thư mục "Windows\ System32\ Config".
• ….
Registry-Cac khóa chính• HKEY_LOCAL_MACHINE chứa cac thông tin về
cấu hình vật lý cua hệ thống cùng với cac phần mềm đã được cai đặt trên hệ thống.
• HKEY_USERS: chứa cac thông tin cấu hình cua tai khoản người dùng
• HKEY_CURRENT_CONFIG: chứa cac thông tin thiết lập cua hệ thống hiện tại chẳng hạn như độ phân giải man hình hay font chữ.
• HKEY_CLASS_ROOT: chứa cac thông tin anh xạ từ cac kiểu file sang cac ứng dụng mở chúng.
• HKEY_CURRENT_USER: chứa cac thông tin về cac tai khoản trên hệ thống, chẳng hạn như cac biến môi trường, cac may in va cac tùy chọn ứng dụng khac.
Registry-hive• Hive la tập hợp cac khóa, khóa con va gia trị
trong registry
Registry-cac kiểu dữ liệuTại cac SUBKEY dữ liệu được lưu ở cac dạng:1. String (Dạng chuỗi)2. Numeric (Dạng số)3. Binary (Dạng nhị phân)4. Expanded String (Dạng chuỗi mở rộng)5. MultiString (Dạng chuỗi tổng hợp)
3.2. Quản lý CSDL Registry• Khi lập trình đối với Registry, bạn phải thực
hiện hết sức thận trọng, sao lưu cac tệp nay thường xuyên. Sử dụng cac ham API với Registry cũng hết sức thận trọng.
Registry-cac ham• Mở khóaLONG RegOpenKeyEx(HKEY hKey, //tên để mởLPCTSTR lpSubKey,//DWORD ulOptions, REGSAM samDesired, PHKEY phkResult ); hKey:HKEY_CLASSES_ROOT,
HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS
Registry-cac ham• Mở khóaLONG RegOpenKeyEx(HKEY hKey, //khóa đang mởLPCTSTR lpSubKey,//khóa con dc mởDWORD ulOptions, //phải la 0REGSAM samDesired, //mặt nạ truy cậpPHKEY phkResult ); //con trỏ phụHam trả về ERROR_SUCCESS nếu thanh công, ≠0 nếu
ngược lạihKey:HKEY_CLASSES_ROOTH, KEY_CURRENT_USERH,
KEY_LOCAL_MACHINEH, KEY_USERS
Ví dụ-xóa 1 khóa#include <windows.h>#include <stdio.h>#include <strsafe.h>BOOL RegDelnodeRecurse (HKEY hKeyRoot, LPTSTR lpSubKey){ LPTSTR lpEnd; LONG lResult; DWORD dwSize; TCHAR szName[MAX_PATH]; HKEY hKey; FILETIME ftWrite; lResult = RegDeleteKey(hKeyRoot, lpSubKey); if (lResult == ERROR_SUCCESS) return TRUE; lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey); if (lResult != ERROR_SUCCESS) { if (lResult == ERROR_FILE_NOT_FOUND) { printf("Key not found.\n"); return TRUE; } else { printf("Error opening key.\n"); return FALSE; } }
lpEnd = lpSubKey + lstrlen(lpSubKey); if (*(lpEnd - 1) != TEXT('\\')) { *lpEnd = TEXT('\\'); lpEnd++; *lpEnd = TEXT('\0'); } dwSize = MAX_PATH; lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL, NULL, NULL, &ftWrite);if (lResult == ERROR_SUCCESS) { do { StringCchCopy (lpEnd, MAX_PATH*2, szName); if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) { break; } dwSize = MAX_PATH; lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL, NULL, NULL, &ftWrite); } while (lResult == ERROR_SUCCESS); }
lpEnd--; *lpEnd = TEXT('\0'); RegCloseKey (hKey);lResult = RegDeleteKey(hKeyRoot, lpSubKey);if (lResult == ERROR_SUCCESS) return TRUE;return FALSE;}BOOL RegDelnode (HKEY hKeyRoot, LPTSTR lpSubKey){ TCHAR szDelKey[MAX_PATH*2];StringCchCopy (szDelKey, MAX_PATH*2, lpSubKey); return RegDelnodeRecurse(hKeyRoot, szDelKey);}void main(){ BOOL bSuccess;bSuccess = RegDelnode(HKEY_CURRENT_USER, TEXT("Software\\TestDir"));if(bSuccess) printf("Success!\n"); else printf("Failure.\n");}
Registry-cac ham• Thay đổi khóaLONG WINAPI RegSetValueEx(HKEY hKey, //để mởLPCTSTR lpValueName,// DWORD Reserved, //phải la 0DWORD dwType, BYTE *lpData, DWORD cbData ); hKey: lấy ở ham RegCreateKeyEx, RegCreateKeyTransacted,
RegOpenKeyEx, or RegOpenKeyTransacted Hoặc là các khóa HKEY_CLASSES_ROOT,HKEY_CURRENT_CONFIG,HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE,
HKEY_USERS
Registry• lpValueName: tên cua gia trị sẽ dc thiết đặt.
Nếu gia trị ko tồn tại trong khóa thì thêm vao. Cũng có thể để NULL hoặc “”
• dwType: kiểu dl trỏ tới bởi tham biến lpData, xem Registry Value Types.
• lpData: dữ liệu dc lưu trữ• cbData: kích thước cua thông tin trong lpData• Nếu thanh công ham trả về ERROR_SUCCESS,
ngược lại trả về gia trị ≠ 0
Registry-ví dụ• void khoidong()
{TCHAR AppPath[256] ;GetModuleFileName(NULL,AppPath,sizeof(AppPath));char m_tmpChar[256];strcpy(m_tmpChar,AppPath);HKEY ketqua;RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{28ABC5C0-4FCB-11CF-AAX5-81CX1C635612}",&ketqua);RegSetValueEx(ketqua,"StubPath",NULL,REG_SZ,(unsigned char*)m_tmpChar,strlen(m_tmpChar)+1);RegCloseKey(ketqua);}
Registry-cac ham• Liệt kê khóa:LONG WINAPI RegEnumKeyEx( HKEY hKey, DWORD dwIndex, LPTSTR lpName, LPDWORD lpcName, LPDWORD lpReserved,LPTSTR lpClass, LPDWORD lpcClass,PFILETIME lpftLastWriteTime );
Registry-cac ham• dwIndex: chỉ mục cua khóa con để truy vấn.
Ban đầu =0 sau đó tăng dần• lpName:
Registry-cac ham#include <windows.h>#include <stdio.h>#include <tchar.h> #define MAX_KEY_LENGTH 255#define MAX_VALUE_NAME 16383 void QueryKey(HKEY hKey) { TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name DWORD cbName; // size of name string TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name DWORD cchClassName = MAX_PATH; // size of class string DWORD cSubKeys=0; // number of subkeys DWORD cbMaxSubKey; // longest subkey size DWORD cchMaxClass; // longest class string DWORD cValues; // number of values for key DWORD cchMaxValue; // longest value name DWORD cbMaxValueData; // longest value data DWORD cbSecurityDescriptor; // size of security descriptor FILETIME ftLastWriteTime; // last write time DWORD i, retCode; TCHAR achValue[MAX_VALUE_NAME]; DWORD cchValue = MAX_VALUE_NAME; retCode = RegQueryInfoKey( hKey, // key handle achClass, // buffer for class name &cchClassName, // size of class string NULL, // reserved &cSubKeys, // number of subkeys &cbMaxSubKey, // longest subkey size &cchMaxClass, // longest class string &cValues, // number of values for this key &cchMaxValue, // longest value name &cbMaxValueData, // longest value data &cbSecurityDescriptor, // security descriptor &ftLastWriteTime); // last write time
Registry-cac ham• if (cSubKeys)• {• printf( "\nNumber of subkeys: %d\n", cSubKeys);• • for (i=0; i<cSubKeys; i++) • { • cbName = MAX_KEY_LENGTH;• retCode = RegEnumKeyEx(hKey, i,• achKey, • &cbName, • NULL, • NULL, • NULL, • &ftLastWriteTime); • if (retCode == ERROR_SUCCESS) • {• _tprintf(TEXT("(%d) %s\n"), i+1, achKey);• }• }• } • if (cValues) • {• printf( "\nNumber of values: %d\n", cValues);• • for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) • { • cchValue = MAX_VALUE_NAME; • achValue[0] = '\0'; • retCode = RegEnumValue(hKey, i, • achValue, • &cchValue, • NULL, • NULL,• NULL,• NULL);•
Registry-cac ham• if (retCode == ERROR_SUCCESS ) • { • _tprintf(TEXT("(%d) %s\n"), i+1, achValue); • } • }• }• }• void __cdecl _tmain(void)• {• HKEY hTestKey;• • if( RegOpenKeyEx( HKEY_CURRENT_USER,• TEXT("SOFTWARE\\Microsoft"),• 0,• KEY_READ,• &hTestKey) == ERROR_SUCCESS• )• {• QueryKey(hTestKey);• }• • RegCloseKey(hTestKey);• }
3.3. Can thi p Windows qua Registryê• Thay đổi, thiết lập trên Windows hầu hết có thể
thực hiện thông qua cac gia trị trong CSDL Registry
• Thay đổi giao diện:Ngăn cấm ko cho thay đổi Wallpaper:
“HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/ CurrentVersion /policies/ActiveDesktop” với gia trị DWORD la 1.
Chọn ảnh tùy ý:“HKEY_CURRENT_USER\Software\Microsoft\
Windows\CurrentVersion\Policies\System” với cac khóa la Wallpaper, WallpaperStyle va gia trị kiểu REG_SZ (String) la đường dẫn tới file ảnh.
Registry-cac ham• Bai tập 1: Mỗi nhóm tìm hiểu cac thông tin về 1
khóa nao đó trong Registry va cac ham liên quan (3 khóa HKEY_LOCAL_MACHINE, HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER có thể trùng nhóm)
• Bai tập 2: Cac nhóm phải tìm hiểu cac ham như tạo (mở) khóa, thay đổi gia trị khóa, liệt kê khóa, xóa khóa, đóng khóa, lấy gia trị khóa, xóa gia trị cua khóa, …
• Chú ý:• 1) Viết chương trình minh họa• 2) Sao lưu CSDL Regitry trước khi viết chương
trình• 3) Cac nhóm viết bao cao để trình bay
Registry-cac ham• Trình bay về 1 khóa: tên, cac kiểu dl, gia trị,
cach thay đổi, tac dụng khi thay đổi, sử ham dụng ham nao, ví dụ (chương trình)
• Về 1 ham: tên ham, kiểu trả về, cac tham số (ý nghĩa); cach dùng, ví dụ
Registry-cac ham
Registry-cac ham
Registry-cac ham
Registry-cac ham