home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 4_2005-2006.ISO / data / Zips / Registry_E1917277252005.psc / mMonitor.bas < prev    next >
BASIC Source File  |  2005-07-24  |  16KB  |  423 lines

  1. Attribute VB_Name = "mMonitor"
  2. Option Explicit
  3. '//if you re-use the reg routines, add the proper error handling, (I pulled this from an activex control
  4. '//with global handler), so to save time, I put the resume next statements, but look up event
  5. '//specific errors and add select case to manage errors properly ;o)
  6. '//I don't have time to comment all this, for explainations of api, go to allapi.com..
  7. '//John Underhill 23-07-2005
  8.  
  9. Private Type FILETIME
  10.     dwLowDateTime                              As Long
  11.     dwHighDateTime                             As Long
  12. End Type
  13.  
  14. Private Type SECURITY_ATTRIBUTES
  15.     nLength                                    As Long
  16.     lpSecurityDescriptor                       As Long
  17.     bInheritHandle                             As Boolean
  18. End Type
  19.  
  20. Private Type cRegValue
  21.     Key                                        As String
  22.     DataType                                   As Reg_Type
  23.     Value                                      As Variant
  24.     sName                                      As Variant
  25. End Type
  26.  
  27. Private Enum HKEY_Type
  28.     HKEY_CLASSES_ROOT = &H80000000
  29.     HKEY_CURRENT_USER = &H80000001
  30.     HKEY_LOCAL_MACHINE = &H80000002
  31.     HKEY_USERS = &H80000003
  32.     HKEY_PERFORMANCE_DATA = &H80000004
  33.     HKEY_CURRENT_CONFIG = &H80000005
  34.     HKEY_DYN_DATA = &H80000006
  35. End Enum
  36.  
  37. #If False Then
  38. Private HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_PERFORMANCE_DATA, HKEY_CURRENT_CONFIG
  39. Private HKEY_DYN_DATA
  40. #End If
  41.  
  42. Private Enum Reg_Type
  43.     REG_NONE = 0
  44.     REG_SZ = 1
  45.     REG_EXPAND_SZ = 2
  46.     REG_BINARY = 3
  47.     REG_DWORD = 4
  48.     REG_DWORD_LITTLE_ENDIAN = 4
  49.     REG_DWORD_BIG_ENDIAN = 5
  50.     REG_LINK = 6
  51.     REG_MULTI_SZ = 7
  52.     REG_RESOURCE_LIST = 8
  53. End Enum
  54.  
  55. #If False Then
  56. Private REG_NONE, REG_SZ, REG_EXPAND_SZ, REG_BINARY, REG_DWORD, REG_DWORD_LITTLE_ENDIAN, REG_DWORD_BIG_ENDIAN, REG_LINK, REG_MULTI_SZ
  57. Private REG_RESOURCE_LIST
  58. #End If
  59.  
  60. Private Const KEY_ALL_ACCESS               As Long = &HF003F
  61. Private Const KEY_CREATE_LINK              As Long = &H20
  62. Private Const KEY_CREATE_SUB_KEY           As Long = &H4
  63. Private Const KEY_ENUMERATE_SUB_KEYS       As Long = &H8
  64. Private Const KEY_NOTIFY                   As Long = &H10
  65. Private Const KEY_QUERY_VALUE              As Long = &H1
  66. Private Const KEY_SET_VALUE                As Long = &H2
  67. Private Const KEY_WRITE                    As Long = &H20006
  68. Private Const ERROR_NONE                   As Integer = 0
  69. Private Const ERROR_MORE_DATA              As Integer = 234
  70. Private Const ERROR_NO_MORE_ITEMS          As Integer = 259
  71.  
  72. Public bMonitor                            As Boolean
  73. Public sModmstr                            As String
  74. Public sModmname                           As String
  75. Public lModlhkey                           As Long
  76. Public sModskey                            As String
  77. Public sModApp                             As String
  78. Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
  79. Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, _
  80.                                                                                 ByVal lpSubKey As String, _
  81.                                                                                 ByVal ulOptions As Long, _
  82.                                                                                 ByVal samDesired As Long, _
  83.                                                                                 phkResult As Long) As Long
  84. Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
  85. Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, _
  86.                                                                                       ByVal lpValueName As String, _
  87.                                                                                       ByVal lpReserved As Long, _
  88.                                                                                       lpType As Long, _
  89.                                                                                       lpData As Any, _
  90.                                                                                       lpcbData As Long) As Long
  91. Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, _
  92.                                                                                 ByVal lpSubKey As String) As Long
  93. Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, _
  94.                                                                                     ByVal lpValueName As String) As Long
  95. Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, _
  96.                                                                                     ByVal lpSubKey As String, _
  97.                                                                                     ByVal Reserved As Long, _
  98.                                                                                     ByVal lpClass As String, _
  99.                                                                                     ByVal dwOptions As Long, _
  100.                                                                                     ByVal samDesired As Long, _
  101.                                                                                     lpSecurityAttributes As SECURITY_ATTRIBUTES, _
  102.                                                                                     phkResult As Long, _
  103.                                                                                     lpdwDisposition As Long) As Long
  104. Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, _
  105.                                                                                   ByVal lpValueName As String, _
  106.                                                                                   ByVal Reserved As Long, _
  107.                                                                                   ByVal dwType As Long, _
  108.                                                                                   lpData As Any, _
  109.                                                                                   ByVal cbData As Long) As Long
  110.  
  111. Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (Destination As Any, _
  112.                                                                      Source As Any, _
  113.                                                                      ByVal length As Long)
  114.  
  115. Private Function KeyExist(Key As HKEY_Type, _
  116.                           sSubKey As String) As Boolean
  117.  
  118. Dim hKey        As Long
  119. Dim RetVal      As Long
  120.  
  121.     RetVal = RegOpenKeyEx(Key, sSubKey, 0, KEY_QUERY_VALUE, hKey)
  122.  
  123.     If RetVal = ERROR_NONE Then
  124.         KeyExist = True
  125.     Else
  126.         KeyExist = False
  127.     End If
  128.     RegCloseKey hKey
  129.  
  130. End Function
  131.  
  132. Private Function DeleteKey(Key As HKEY_Type, _
  133.                           sSubKey As String) As Boolean
  134.  
  135. Dim RetVal  As Long
  136.  
  137.     RetVal = RegDeleteKey(Key, sSubKey)
  138.     If RetVal = ERROR_NONE Then
  139.         DeleteKey = True
  140.     Else
  141.         DeleteKey = False
  142.     End If
  143.  
  144. End Function
  145.  
  146. Private Function ReadMulti(Key As HKEY_Type, _
  147.                            Subkey As String, _
  148.                            sName As String) As String
  149.  
  150. Dim hKey        As Long
  151. Dim RetVal      As Long
  152. Dim sBuffer     As String
  153. Dim length      As Long
  154. Dim resBinary() As Byte
  155. Dim resString   As String
  156.  
  157. On Error Resume Next
  158.  
  159.     RetVal = RegOpenKeyEx(Key, Subkey, 0, KEY_ALL_ACCESS, hKey)
  160.     If RetVal <> ERROR_NONE Then
  161.         RegCloseKey (hKey)
  162.     Else
  163.         length = 1024
  164.         ReDim resBinary(0 To length - 1) As Byte
  165.  
  166.         RetVal = RegQueryValueEx(hKey, sName, 0, REG_MULTI_SZ, resBinary(0), length)
  167.  
  168.         If RetVal = ERROR_MORE_DATA Then
  169.             ReDim resBinary(0 To length - 1) As Byte
  170.             RetVal = RegQueryValueEx(hKey, sName, 0, REG_MULTI_SZ, resBinary(0), length)
  171.         End If
  172.  
  173.         If RetVal = ERROR_NONE Then
  174.             resString = Space$(length - 2)
  175.             CopyMemory ByVal resString, resBinary(0), length - 2
  176.             sBuffer = resString
  177.             If Len(TrimNull(sBuffer)) > 0 Then
  178.                 ReadMulti = resString
  179.             End If
  180.         End If
  181.  
  182.         RetVal = RegCloseKey(hKey)
  183.  
  184. On Error GoTo 0
  185.  
  186.     End If
  187.  
  188. End Function
  189.  
  190. Private Function WriteMulti(Key As HKEY_Type, _
  191.                            Subkey As String, _
  192.                            sName As String, _
  193.                            sData As String) As Boolean
  194.  
  195. Dim hKey        As Long
  196. Dim RetVal      As Long
  197. Dim deposit     As Long
  198. Dim secattr     As SECURITY_ATTRIBUTES
  199.  
  200. On Error Resume Next
  201.  
  202.     secattr.nLength = Len(secattr)
  203.     secattr.lpSecurityDescriptor = 0
  204.     secattr.bInheritHandle = 1
  205.     
  206.     RetVal = RegCreateKeyEx(Key, Subkey, 0, "", 0, KEY_WRITE, secattr, hKey, deposit)
  207.     If RetVal <> ERROR_NONE Then
  208.         WriteMulti = False
  209.         Exit Function
  210.     End If
  211.  
  212.     RetVal = RegSetValueEx(hKey, sName, 0, REG_MULTI_SZ, ByVal sData, Len(sData))
  213.     
  214.     If RetVal <> ERROR_NONE Then
  215.         WriteMulti = False
  216.         Exit Function
  217.     End If
  218.     
  219.     RetVal = RegCloseKey(hKey)
  220.     WriteMulti = True
  221.  
  222. On Error GoTo 0
  223.  
  224. End Function
  225.  
  226. Public Function TrimNull(Item As String) As String
  227.  
  228. Dim pos As Integer
  229.  
  230.         pos = InStr(Item, Chr$(0))
  231.         If pos Then Item = Left$(Item, pos - 1)
  232.         TrimNull = Item
  233.         
  234. End Function
  235.  
  236.  
  237.                     '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  238.                     '>               START MONITORING ENGINE              <
  239.                     '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  240.  
  241. Public Sub Start_Monitor(mStr As String, _
  242.                          ByVal mName As String, _
  243.                          ByVal lHKey As Long, _
  244.                          ByVal sKey As String)
  245.  
  246.     sModmstr = mStr                                         '//place the vars in module memory
  247.     sModmname = mName                                       '//so we needn't pass it between subs
  248.     lModlhkey = lHKey
  249.     sModskey = sKey
  250.  
  251.     sModApp = "Software\" & App.FileDescription & Chr$(92) & mName
  252.  
  253.     Backup_Key                                              '//create a binary image of key
  254.  
  255.     If Not LenB(mStr) > 2500 Then                           '//check size of string
  256.         If Not KeyExist(HKEY_CURRENT_USER, sModApp) Then    '//check if key already exists
  257.             If Not WriteMulti(HKEY_CURRENT_USER, sModApp, mName, mStr) Then
  258.                 MsgBox "App Key could not be created!" & vbNewLine & _
  259.        "Check your User Rights!", vbExclamation, "Check Permissions!"
  260.                 Exit Sub
  261.             End If
  262.         End If
  263.     End If
  264.  
  265.     bMonitor = True
  266.     Start_Timer
  267.  
  268. End Sub
  269.  
  270. Public Sub Start_Timer()
  271.  
  272. Dim iInterval As Integer
  273. Dim sComp     As String
  274. Dim sBase     As String
  275. Dim aMBase()  As String
  276. Dim aMComp()  As String
  277. Dim lBase     As Long
  278. Dim lComp     As Long
  279. Dim lLow      As Long
  280. Dim lHigh     As Long
  281. Dim lMax      As Long
  282. Dim lResInd   As Long
  283. Dim bMatch    As Boolean
  284. Dim mLen      As Long
  285.  
  286. bMatch = False
  287. lResInd = 5
  288.  
  289. On Error Resume Next
  290.  
  291.     With frmTest
  292.         If Not .txtInterval.Text = vbNullString Then        '//default polling interval
  293.             iInterval = CInt(.txtInterval.Text)
  294.         Else
  295.             iInterval = 5
  296.         End If
  297.     End With
  298.  
  299.     Do While bMonitor
  300.         sComp = ReadMulti(lModlhkey, sModApp, sModmname)    '//get vals and add to array
  301.         sBase = Return_Values(lModlhkey, sModskey)
  302.         sComp = Left$(sComp, Len(sComp) - 1)                '//trim the null char
  303.  
  304.         If LenB(sComp) = 0 Then
  305.                                                             '//half ass user proofing, needs much more
  306.             MsgBox "Comparison key has no values!" & vbNewLine & _
  307.        "Aborting Monitor!", vbExclamation, "Check Path!"
  308.             bMonitor = False
  309.             Exit Sub
  310.         ElseIf LenB(sBase) = 0 Then
  311.             MsgBox "Could Not Read the key values specified!" & vbNewLine & _
  312.        "Check Path and if Key contains Values!", vbExclamation, "Check Values!"
  313.             bMonitor = False
  314.             Exit Sub
  315.         End If
  316.  
  317.         aMComp = Split(sComp, vbNewLine)
  318.         aMBase = Split(sBase, vbNewLine)
  319.  
  320.         If UBound(aMComp) <> (UBound(aMBase) - 1) Then      '//react if the value count changes
  321.             MsgBox "A New Value has been Added to the Sub Key!" & vbNewLine & _
  322.        "Restarting Monitor to Compensate!", vbExclamation, "New Value!"
  323.             bMonitor = False
  324.             Start_Monitor Return_Values(lModlhkey, sModskey), sModmname, lModlhkey, sModskey
  325.         End If
  326.  
  327.         With frmTest
  328.             If .chkDifferential.Value Then                  '//add 1 sec for every 10 entries
  329.                 mLen = UBound(aMBase)
  330.                 If Not mLen < 10 Then
  331.                     iInterval = (mLen / 10) + 2
  332.                 Else
  333.                     iInterval = 5
  334.                 End If
  335.             End If
  336.         End With
  337.  
  338.         Wait_Timer iInterval                                '//cheapie wait timer
  339.  
  340.         lMax = UBound(aMBase)
  341.  
  342.         For lComp = 0 To UBound(aMComp)                     '//comparison file
  343.             '//set lower search boundry
  344.             If Not lComp < (lResInd) Then
  345.                 lLow = lComp - (lResInd)
  346.             Else
  347.                 lLow = 0
  348.             End If
  349.             '//set upper search boundry
  350.             If Not (lComp + lResInd) > lMax Then
  351.                 lHigh = lComp + lResInd
  352.             Else
  353.                 lHigh = lMax
  354.             End If
  355.             '//start comparing arrays
  356.             For lBase = lLow To lHigh                           '//base file
  357.                 If aMBase(lBase) = aMComp(lComp) Then
  358.                     bMatch = True
  359.                     Exit For
  360.                 End If
  361.             Next lBase
  362.             If Not bMatch Then
  363.                 If Not LenB(aMComp(lComp)) = 0 Then             '//filter blanks
  364.                     bMonitor = False
  365.                     User_Notify aMBase(lComp), aMComp(lComp)    '//call user notify and stop
  366.                 End If
  367.             End If
  368.             bMatch = False
  369.             DoEvents
  370.         Next lComp
  371.     Loop
  372.  
  373. On Error GoTo 0
  374.  
  375. End Sub
  376.  
  377. Private Sub User_Notify(ByVal sNewVal As String, _
  378.                         ByVal sOldVal As String)
  379.  
  380. Dim iChoice  As Integer
  381. Dim sNval    As String
  382. Dim sNewData As String
  383. Dim sOldData As String
  384.  
  385. On Error GoTo Skip
  386.  
  387.     sNval = Left$(sNewVal, InStr(sNewVal, DL_MK) - 1)
  388.     sNewData = Mid$(sNewVal, InStr(sNewVal, DL_MK) + 1)
  389.     sOldData = Mid$(sOldVal, InStr(sOldVal, DL_MK) + 1)
  390.  
  391.     iChoice = MsgBox("The Registry Value: " & sNval & " has changed!" & vbNewLine _
  392.     & "The New Value is: " & sNewData & vbNewLine & "The Original Value was: " & _
  393.     sOldData & vbNewLine & "Click YES to Accept this Change, or NO TO Revert.", vbYesNo, "Value has Changed!!")
  394.  
  395.     If iChoice = 6 Then             '//if accept change, reset image and restart
  396.         If Not DeleteKey(HKEY_CURRENT_USER, sModApp) Then
  397.             MsgBox "Could Not Reset App Key!" & vbNewLine & _
  398.        "Check your User Rights!", vbExclamation, "Check Permissions!"
  399.             Exit Sub
  400.         End If
  401.         Start_Monitor Return_Values(lModlhkey, sModskey), sModmname, lModlhkey, sModskey
  402.         bMonitor = True
  403.     ElseIf iChoice = 7 Then         '//if deny change, restore the original key
  404.         Restore_Key
  405.     End If
  406.     bMonitor = True
  407.  
  408. Skip:
  409.  
  410. End Sub
  411.  
  412. Public Sub Wait_Timer(ByVal lSecs As Long)
  413.  
  414. Dim l As Long
  415.  
  416.     '//wait timer
  417.     For l = 1 To lSecs * 10
  418.         Sleep 100
  419.         DoEvents
  420.     Next l
  421.  
  422. End Sub
  423.