0

کار با ريجستري در ويژوال بيسيک 6

 
papari
papari
کاربر برنزی
تاریخ عضویت : دی 1387 
تعداد پست ها : 314
محل سکونت : تهران

کار با ريجستري در ويژوال بيسيک 6
شنبه 26 بهمن 1387  9:51 PM

رجيستري چيست؟
سيستم عامل ويندوز تنظيمات سخت افزاري و نرم افزاري خود را بطور مرکزي در يک بانک اطلاعاتي با ساختار سلسله مراتبي ذخيره مي کند که رجيستري نام دارد. رجيستري جايگزيني براي بسياري از فايلهاي پيکربندي INI ،SYS و COM است که در نسخه هاي اوليه ويندوز موجود بود. رجيستري، سيستم عامل را با مهيا کردن اطلاعات مورد نياز براي اجراي برنامه ها و لود شدن کامپونت (Component) ها، کنترل مي کند.
رجيستري شامل انواع مختلفي از اطلاعات مي باشد، مثل:
- اطلاعات سخت افزارهاي نصب شده روي سيستم
- اطلاعات درايورهاي نصب شده روي سيستم
- اطلاعات برنامه هاي نصب شده روي سيستم
- اطلاعات پروتکلهاي شبکه اي مورد استفاده در سيستم
ساختار رجيستري شامل چندين مجموعه رکورد است که داده هاي اين رکوردها توسط بسياري از برنامه ها و اجزاي سيستم عامل خوانده و يا نوشته مي شود.
اجزاي رجيستري:
اجزاي تشکيل دهنده رجيستري عبارتند از:
1- زير شاخه (Subtree):
زير شاخه ها همانند فولدر (Folder) هاي موجود در ريشه يک درايو هارد هستند. رجستري ويندوز داراي پنج زير شاخه مي باشد:
- HKEY_LOCAL_MACHINE: شامل تمام داده هاي پيکربندي براي کامپيوتر مي باشد و شامل 5 کليد (Key) است:Hardware ،SAM ،Security ،Software و System
- HKEY_USERS: شامل داده هاي مربوط به تنظيمات سيستم عامل براي هر کاربر (User) است مثل تنظيمات دسکتاپ و محيط ويندوز.
- HKEY_CURRENT_USER: شامل داده هاي کاربر فعلي سيستم.
- HKEY_CLASSES_ROOT: شامل اطلاعات پيکربندي نرم افزار است مثل داده هاي OLE و داده هاي کلاسهاي متناظر با فايل.
- HKEY_CURRENT_CONFIG: شامل اطلاعات مورد نياز براي تنظيمات داريورهاي سخت افزاري و غيره.
2- کليد (Key):
کليدها همانند فولدرها و پوشه هااي روي هارد هستند. هر کليد متناظر با آبجکت هاي (Object) نرم افزاري يا سخت افزاري مي باشد. زير کليدها (Subkey)، کليدهايي هستند که درون يکسري کليد قرار دارند.
3- Entry:
هر کليد داراي يک يا چند entry است. هر entry داراي سه بخش مي باشد:
الف) نام Name
ب) نوع داده اي Data Type - مقدار هر entry يکي از انواع داده هاي زير است:
REG_DWORD
REG_SZ
REG_EXPAND_SZ
REG_BINARY
REG_MULTI_SZ
REG_FULL_RESOURCE_DESCRIPTOT
ج) مقدار (Value)
براي کار با رجيستري در ويژوال بيسيک کلاس Registery.bas را مطابق مطالب زير ايجاد کرده و در پروژه هاي خود از آن استفاده کنيد.
نکته 1: براي مشاهده رجيستري و اعمال تغييرات در آن (لطفاً اگر هيچ تجربه اي در تنظيم کردن رجيستري نداريد، اطلاعات آنرا تغيير ندهيد)، مي توانيد از برنامه regedit.exe و يا regedt32.exe موجود در ويندوز استفاده کنيد. براي اين کار کافيست نام برنامه را در کادر Run وارد کنيد.
1- تعريف ثابتهاي مورد نياز:
براي نوشتن اين کلاس نياز به تعريف چهار دسته ثابت داريم:
- ثابتهاي مربوط به تعريف نوع داده (Data Type) هاي entry هاي رجيستري:
Global Const REG_SZ As Long = 1
Global Const REG_DWORD As Long = 4
- ثابتهاي مربوط به تعريف کليدهاي رجيستري:
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 مربوط به يک کليد
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
 
منبع خبر: سايت اژدها
و این جهان پر از صدای پای مردمی است که همچنانکه تو را می بوسند در ذهن خود طناب دارت را می بافند.
تشکرات از این پست
hadisafari
دسترسی سریع به انجمن ها