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 مربوط به یک کلید
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
- تابع RegCreateKeyEx: ساخت یک کلید در رجیستری (اگر کلید قبلاً وجود داشته باشد، این تابع آنرا باز می کند).
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: باز کردن یک کلید
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) یک نام متناظر با یک کلید باز شده
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: حذف مقدار یک کلید
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))
Case REG_DWORD " type of value is Double word
lValue = vValue
SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, lType, lValue, 4)
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)
Select Case lType
" For strings
Case REG_SZ:
sValue = String(cch, 0)
lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, sValue, cch)
If lrc = ERROR_NONE Then
vValue = Left$(sValue, cch)
Else
vValue = Empty
End If
" For DWORDS
Case REG_DWORD:
lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, lValue, cch)
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 که نام کلیدی است که باید از رجیستری حذف شود. این کلید ممکن است شامل زیر کلیدهایی نیز باشد مثلاً Key1\SubKey1
Public Function DeleteKey(lPredefinedKey As Long, sKeyName As String)
Dim lRetVal As Long
lRetVal = RegDeleteKey(lPredefinedKey, sKeyName)
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)
Dim lRetVal As Long
Dim hKey As Long
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)
lRetVal = RegDeleteValue(hKey, sValueName)
RegCloseKey (hKey)
DeleteValue = lRetVal
End Function
- تابع CreateNewKey: این تابع یک کلید جدید ایجاد می کند. دارای دو پارامتر ورودی است: Location و KeyName
Public Function CreateNewKey(lPredefinedKey As Long, sNewKeyName As String)
Dim hNewKey As Long
Dim lRetVal As Long
lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&,
vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0&, hNewKey,
lRetVal)
RegCloseKey (hNewKey)
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)
Dim lRetVal As Long
Dim hKey As Long
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)
lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)
RegCloseKey (hKey)
SetKeyValue = lRetVal
End Function
- تابع QueryValue: این تابع فیلد داده یک entry را برمی گرداند. دارای سه پارامتر ورودی است:
Location ،KeyName و ValueName
Public Function QueryValue(lPredefinedKey As Long, sKeyName As String, sValueName As String)
Dim lRetVal As Long
Dim hKey As Long
Dim vValue As Variant
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)
lRetVal = QueryValueEx(hKey, sValueName, vValue)
QueryValue = vValue
RegCloseKey (hKey)
End Function
ساخت یک انتصاب فایل (File Association) به یک برنامه:
در این بخش
می خواهم با استفاده از کلاسی که معرفی شد، تابعی بسازیم که توسط آن
بتوانیم فایلهای با پسوندی مشخص را به یک برنامه اختصاص دهیم. بعبارت دیگر
تابعی بنویسیم که اطلاعات لازم برای باز شدن فایلهایی با پسوند xxx را
توسط برنامه MyApp.exe در رجیستری ثبت کند.
Public Sub CreateAssociation(sExtension As String, sApplication As String, sAppPath As String)
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"
sAppExe = sApplication & ".exe"
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
کاربرد این تابع بصورت زیر است:
Call CreateAssociation("xxx", "MyApp", "c:\MyApp.exe")
اجرا شدن یک برنامه در هنگام راه اندازی سیستم:
فرض کنید می خواهیم
برنامه ای بنویسیم که هر بار در هنگام راه اندازی سیستم بطور خودكار اجرا
شود. البته نمی خواهم در 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