registry

26
3.1. Khi nim v vai tr ca 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ả cc 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 hnh sự thay đổi trong cc thnh phần ca Control Panel, File Associations, v một số thay đổi trong menu Options ca một số ứng dụng,..

Upload: huy-nguyen-tri

Post on 07-Nov-2014

12 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Registry

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,..

Page 2: Registry

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".

• ….

Page 3: Registry

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.

Page 4: Registry

Registry-hive• Hive la tập hợp cac khóa, khóa con va gia trị

trong registry

Page 5: 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)

Page 6: Registry

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.

Page 7: Registry

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

Page 8: Registry

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

Page 9: Registry

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; } }

Page 10: Registry

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); }

Page 11: Registry

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");}

Page 12: Registry

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

Page 13: Registry

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

Page 14: Registry

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);}

Page 15: Registry

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 );

Page 16: Registry

Registry-cac ham• dwIndex: chỉ mục cua khóa con để truy vấn.

Ban đầu =0 sau đó tăng dần• lpName:

Page 17: Registry

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

Page 18: Registry

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);•

Page 19: Registry

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);• }

Page 20: Registry

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.

Page 21: Registry

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

Page 22: Registry

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ụ

Page 23: Registry

Registry-cac ham

Page 24: Registry

Registry-cac ham

Page 25: Registry

Registry-cac ham

Page 26: Registry

Registry-cac ham