سیستم عامل ویندوز تنظیمات سخت افزاری و نرم افزاری خود را بطور مرکزی در یک بانک اطلاعاتی با ساختار سلسله مراتبی ذخیره می کند که رجیستری نام دارد . رجیستری جایگزینی برای بسیاری از فایلهای پیکربندی INI ، SYS و COM است که در نسخه های اولیه ویندوز موجود بود . رجیستری ، سیستم عامل را با مهیا کردن اطلاعات موردنیز برای اجرای برنامه ها و load شدن component ها ، کنترل می کند .
رجیستری شامل انواع مختلفی از اطلاعات می باشد
مثل :
- اطلاعات سخت افزارهای نصب شده روی سیستم
- اطلاعات درایورهای نصب شده روی سیستم
- اطلاعات برنامه های نصب شده روی سیستم
- اطلاعات پروتکلهای شبکه ای مورد استفاده در سیستم
ساختار رجیستری شامل چندین مجموعه رکورد است که داده های این رکوردها توسط بسیاری از برنامه ها و اجزای سیستم عامل خوانده و یا نوشته می شود .
اجزای رجیستری
اجزای تشکیل دهنده رجیستری عبارتند از :
1 – subtree : Subtree ها همانند folder های موجود در ریشه یک درایو هارد هستند . رجستری ویندوز دارای پنج subtree می باشد :
- HKEY_LOCAL_MACHINE : شامل تمام داده های پیکربندی برای کامپیوتر می باشد و شامل 5 key است :Hardware ، SAM ، Security ، Software و System
- HKEY_USERS : شامل داده های مربوط به تنظیمات سیستم عامل برای هر user است مثل تنظیمات desktop و محیط ویندوز
- HKEY_CURRENT_USER : شامل داده های کاربر فعلی سیستم
- HKEY_CLASSES_ROOT : شامل اطلاعات پیکربندی نرم افزار است مثل داده های OLE و داده های کلاسهای متناظر با فایل
- HKEY_CURRENT_CONFIG : شامل اطلاعات مورد نیاز برای تنظیمات داریورهای سخت افزاری و غیره
2 – Key : key ها همانند folder ها و subfolder های روی هارد هستند . هر key متناظر با object های نرم افزاری یا سخت افزاری می باشد . subkey ها key هایی هستند که درون یکسری key قراردارند .
3 – Entry : هر key دارای یک یا چند entry است . هر entry دارای سه بخش می باشد :
- نام Name
- نوع داده ای Data Type : مقدار هر entry یکی از انواع داده های زیر است :
REG_DWORD ، REG_SZ ، REG_EXPAND_SZ ، REG_BINARY ،
REG_MULTI_SZ ، REG_FULL_RESOURCE_DESCRIPTOT
- مقدار Value
نکته 1 : برای مشاهده رجیستری و اعمال تغییرات در آن ( لطفاً اگر هیچ تجربه ای در تنظیم کردن رجیستری ندارید اطلاعات آنرا تغییر ندهید ) ، می توانید از برنامه regedit.exe و یا regedt32.exe موجود در ویندوز استفاده کنید . برای اینکار کافیست نام برنامه را در کادر Run وارد کنید .
---------------------
برای کار با رجیستری در ویژوال بیسیک کلاس Registery.bas را مطابق مطالب زیر ایجاد کرده و در پروژه های خود از آن استفاده کنید :
1 - تعریف ثابتهای مورد نیاز : برای نوشتن این کلاس نیاز به تعریف چهار دسته ثابت داریم :
- ثابتهای مربوط به تعریف data type های entry های رجیستری :
Global Const REG_SZ As Long = 1
Global Const REG_DWORD As Long = 4
- ثابتهای مربوط به تعریف key های رجیستری
Global Const HKEY_CLASSES_ROOT = &H80000000
Global Const HKEY_CURRENT_USER = &H80000001
Global Const HKEY_LOCAL_MACHINE = &H80000002
Global Const HKEY_USERS = &H80000003
- ثابتهای مربوط به خطاهای کار با رجیستری
Global Const ERROR_NONE = 0
Global Const ERROR_BADDB = 1
Global Const ERROR_BADKEY = 2
Global Const ERROR_CANTOPEN = 3
Global Const ERROR_CANTREAD = 4
Global Const ERROR_CANTWRITE = 5
Global Const ERROR_OUTOFMEMORY = 6
Global Const ERROR_INVALID_PARAMETER = 7
Global Const ERROR_ACCESS_DENIED = 8
Global Const ERROR_INVALID_PARAMETERS = 87
Global Const ERROR_NO_MORE_ITEMS = 259
- ثابتهای متفرقه
Global Const KEY_ALL_ACCESS = &H3F
Global Const REG_OPTION_NON_VOLATILE = 0
2 - Declare کردن Api های مورد نیاز : برای کار با رجیستری از توابع کتابخانه Advapi32.dll استفاده می کنیم . این توابع عبارتند از :
- تابع RegCloseKey : آزاد کردن handle مربوط به یک key
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
- تابع RegCreateKeyEx : ساخت یک key در رجیستری ( اگر key قبلاً وجود داشته باشد ، این تابع آنرا باز می کند ) :
Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As Long
- تابع RegOpenKeyEx : باز کردن یک key
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
- تابع RegQueryValueExLong : استخراج type و data ی یک نام متناظر با یک key باز شده
Declare Function RegQueryValueExString Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Long, lpcbData As Long) As Long
Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
- تابع RegSetValueEx : ذخیره یک مقدار در فیلد value یک کلید باز
Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As String, ByVal cbData As Long) As Long
Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, ByVal cbData As Long) As Long
- تابع RegDeleteKey : پاک کردن یک کلید و کلیه اطلاعات مرتبط با آن
Private Declare Function RegDeleteKey& Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String)
- تابع RegDeleteValue : حذف مقدار یک key
Private Declare Function RegDeleteValue& Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String)
3 - توابع کمکی : برای نوشتن توابع اصلی کار با رجیستری نیاز به نوشتن توابع کمکی زیر است :
- تابع SetValueEx : با توجه به نوع داده یک کلید ، مقدار موجود در آنرا در یک متغیر ذخیره می کند :
Public Function SetValueEx(ByVal hKey As Long, sValueName As String, lType As Long, vValue As Variant) As Long
Dim lValue As Long
Dim sValue As String
Select Case lType
Case REG_SZ ' type of value is string
sValue = vValue
SetValueEx = RegSetValueExString(hKey, sValueName, 0&, lType, sValue, Len(sValue))x
Case REG_DWORD ' type of value is Double word
lValue = vValue
SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, lType, lValue, 4)x
End Select
End Function
- تابع QueryValueEx : سایز و نوع داده ای یک داده را که باید خوانده شود مشخص می کند .
Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As String, vValue As Variant) As Long
Dim cch As Long
Dim lrc As Long
Dim lType As Long
Dim lValue As Long
Dim sValue As String
lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)x
Select Case lType
' For strings
Case REG_SZ:
sValue = String(cch, 0)x
lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, sValue, cch)x
If lrc = ERROR_NONE Then
vValue = Left$(sValue, cch)x
Else
vValue = Empty
End If
' For DWORDS
Case REG_DWORD:
lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, lValue, cch)x
If lrc = ERROR_NONE Then vValue = lValue
Case Else
'all other data types not supported
lrc = -1
End Select
QueryValueExExit:
QueryValueEx = lrc
Exit Function
QueryValueExError:
Resume QueryValueExExit
End Function
4 - توابع اصلی : توابع مربوط به پاک کردن یک کلید از رجیستری ، ساخت یک کلید جدید در رجیستری و مقداردهی به یک کلید :
- تابع DeleteKey : این تابع یک کلید از رجیستری را حذف می کند . دارای دو پارامتر ورودی است :
Location که یکی از مقادیر HKEY_CLASSES_ROOT ، HKEY_CURRENT_USER
، HKEY_LOCAL_MACHINE و یا HKEY_USERS است .
KeyName که نام کلیدی است که باید از رجیستری حذف شود . این کلید ممکنست شامل subkey هایی نیز باشد مثلاً Key1\SubKey1
Public Function DeleteKey(lPredefinedKey As Long, sKeyName As String)x
Dim lRetVal As Long
lRetVal = RegDeleteKey(lPredefinedKey, sKeyName)x
DeleteKey = lRetVal ' return function value
End Function
- تابع DeleteValue : این تابع یک entry را از کلید حذف می کند . دارای سه پارامتر ورودی است : Location ، KeyName و ValueName که نام آن value را مشخص می کند .
Public Function DeleteValue(lPredefinedKey As Long, sKeyName As String, sValueName As String)x
Dim lRetVal As Long
Dim hKey As Long
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)x
lRetVal = RegDeleteValue(hKey, sValueName)x
RegCloseKey (hKey)x
DeleteValue = lRetVal
End Function
- تابع CreateNewKey : این تابع یک کلید جدید ایجاد می کند . دارای دو پارامتر ورودی است : Location و KeyName
Public Function CreateNewKey(lPredefinedKey As Long, sNewKeyName As String)x
Dim hNewKey As Long
Dim lRetVal As Long
lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0&, hNewKey, lRetVal)x
RegCloseKey (hNewKey)x
CreateNewKey = lRetVal
End Function
- تابع SetKeyValue : این تابع پارامتر data یک entry را تنظیم می کند . دارای 5 پارامتر ورودی است : Location ، KeyName ، ValueName ، ValueSetting و ValueType
Public Function SetKeyValue(lPredefinedKey As Long, sKeyName As String, sValueName As String, vValueSetting As Variant, lValueType As Long)x
Dim lRetVal As Long
Dim hKey As Long
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)x
lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)x
RegCloseKey (hKey)x
SetKeyValue = lRetVal
End Function
- تابع QueryValue : این تابع فیلد داده یک entry را برمی گرداند . دارای سه پارامتر ورودی است : Location ، KeyName و ValueName
Public Function QueryValue(lPredefinedKey As Long, sKeyName As String, sValueName As String)x
Dim lRetVal As Long
Dim hKey As Long
Dim vValue As Variant
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)x
lRetVal = QueryValueEx(hKey, sValueName, vValue)x
QueryValue = vValue
RegCloseKey (hKey)x
End Function
--------------------------
ساخت یک انتصاب فایل یا File Association به یک برنامه
در این درس می خواهم با استفاده از کلاسی که در درس قبل معرفی شد تابعی بسازیم که توسط آن بتوانیم فایلهای با پسوندی مشخص را به یک برنامه اختصاص دهیم . بعبارت دیگر تابعی بنویسیم که اطلاعات لازم برای باز شدن فایلهایی با پسوند xxx را توسط برنامه MyApp.exe در رجیستری ثبت کند .
Public Sub CreateAssociation(sExtension As String, sApplication As String, sAppPath As String)x
Dim sPath, sAppExe As String
CreateNewKey "." & sExtension, HKEY_CLASSES_ROOT
SetKeyValue HKEY_CLASSES_ROOT, "." & sExtension, "", sApplication & ".Document", REG_SZ
CreateNewKey sApplication & ".Document\shell\open\command", HKEY_CLASSES_ROOT
SetKeyValue HKEY_CLASSES_ROOT, sApplication & ".Document", "", sApplication & " Document", REG_SZ
sPath = sAppPath & " %1"x
sAppExe = sApplication & ".exe"x
SetKeyValue HKEY_CLASSES_ROOT, sApplication& ".Document\shell\open\command", "", sPath, REG_SZ
CreateNewKey "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\." & sExtension, HKEY_CURRENT_USER
SetKeyValue HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\." & sExtension, "Application", sAppExe, REG_SZ
CreateNewKey "Applications\" & sAppExe & "\shell\open\command", HKEY_CLASSES_ROOT
SetKeyValue HKEY_CLASSES_ROOT, "Applications\" & sAppExe & "\shell\open\command", "", sPath, REG_SZ
End Sub
کاربرد این تابع بصورت زیر است :
CreateAssociation("xxx","MyApp","c:\MyApp.exe")x
اجرا شدن یک برنامه در هنگام راه اندازی سیستم
فرض کنید می خواهیم برنامه ای بنویسیم که هر بار در هنگام راه اندازی سیستم بطور خودکار اجرا شود. البته نمی خواهم در startup ویندوز دیده شود .
برای این کار باید برنامه موردنظر را در StartUp رجیستری قرار دهیم . به این ترتیب که در یکی از کلیدهای زیر یک مقدار رشته ای جدید(String Value) ایجاد کنیم و آدرس برنامه را در آن وارد کنیم :
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
برای مثال اگه اسم برنامه مورد نظر MyApp و مسیرش C:\Windows\MyApp.exe است باید بصورت زیر عمل کرد :
SetKeyValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "MyApp", "C:\MyApp.exe", REG_SZ
نکته : البته دو تا راه دیگر برای اینکار وجود دارد که برخی تروجان ها هم از این روشها استفاده می کنند تا روی سیستم باقی بمانند :
یکی استفاده از win.ini و نوشتن نام فایل جلوی = run و دیگری استفاده از system.ini و نوشتن نام برنامه جلوی خط explorer.exe .