home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 4_2005-2006.ISO / data / Zips / Updated-_V1986874132006.psc / clsRegHandler.cls < prev   
Text File  |  2006-04-12  |  44KB  |  1,500 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "clsRegHandler"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16.  
  17. '***************************************************************************************
  18. '*  CONTROL WRAPPER clsRegHandler ->> (nsprcl.dll)                                     *
  19. '*                                                                                     *
  20. '*  Created:     November 10, 2005                                                     *
  21. '*  Purpose:     Interface to registry control library (nsprcl.dll)                    *
  22. '*  Functions:   (listed)                                                              *
  23. '*  Revision:    1.4                                                                   *
  24. '*  Compile:     PCode                                                                 *
  25. '*  Referenced:  clsMruSearch, frmSearch, frmRegDemo                                   *
  26. '*  Author:      John Underhill                                                        *
  27. '*                                                                                     *
  28. '***************************************************************************************
  29.  
  30. '** List of exposed functions **
  31.  
  32. '** Value Types **
  33. '// Access_Check - Test user access rights
  34. '// Read_BEndian - read a big endian value
  35. '// Write_BEndian - write a big_endian value
  36. '// Read_Binary - read a binary value
  37. '// Write_Binary - write a binary value
  38. '// Read_Dword - read a dword value
  39. '// Write_Dword - write a dword value
  40. '// Read_Link - read a binary link value
  41. '// Write_Link - write a binary link value
  42. '// List_Values - puts all of a keys values into a collection
  43. '// Read_LEndian - read a little endian value
  44. '// Write_LEndian - write a little_endian value
  45. '// Read_Multi - read a multi_sz value
  46. '// Write_Multi - write a multi_sz value
  47. '// Read_MultiCN - reads a multi value and splits into a collection
  48. '// Write_MultiCN - converts a collection into a multi_sz value
  49. '// Write_Qword - write a 64bit dword number
  50. '// Read_Qword - read a 64bit dword number
  51. '// Read_ResDesc - read hardware resource description (hex)binary
  52. '// Write_ResDesc = write hardware resource description (hex)binary
  53. '// Read_ResList - read a hardware resource list (hex)binary
  54. '// Write_ResList - write to a hardware resource list (hex)binary
  55. '// Read_ResRequired - read a hardware resource requirements list (hex)binary
  56. '// Write_ResRequired - write to a hardware resource requirements list (hex)binary
  57. '// Read_String - read a string(sz) or expanded string(expand_sz)
  58. '// Write_String - write a string value
  59. '// Write_StringEX - write an expanded string value
  60.  
  61. '** Key Related Functions **
  62. '// List_Keys - puts all subkeys under specified branch into a collection
  63. '// Key_Exists - test if key exists
  64. '// Create_Key - create a new key
  65. '// Delete_Key - delete a key
  66.  
  67. '** Value Related Functions **
  68. '// Write_Value - write value types: 1)sz 2)expand_sz 3)multi_sz 4)binary 5)dword 6)little_endian 7)big_endian
  69. '// Delete_Value - delete a value
  70. '// Search_Value - search for a value under the key
  71.  
  72. '** Conversion Routines **
  73. '// Make_LEndian16 - convert integer to 16bit little_endian
  74. '// Make_LEndian32 - convert long to 32bit little_endian
  75. '// Make_BEndian32 - convert long to big endian format
  76.  
  77. '** Error Logging **
  78. '// Get_Error - interprets errors passed from dll
  79. '// Log_Error - sends errors to a log file
  80.  
  81. '** Security Functions **
  82. '// Test_Access - test users level of access permissions
  83. '// Set_Key_Permissions - change access permissions to a key
  84.  
  85. '** Backup and Restore **
  86. '// Save_Key - save a binary image of a registry key
  87. '// Restore_Key - restore key from binary image
  88.  
  89.  
  90.  
  91.  
  92. '//root keys
  93. Public Enum HKEY_Type
  94.     HKEY_CLASSES_ROOT = &H80000000
  95.     HKEY_CURRENT_USER = &H80000001
  96.     HKEY_LOCAL_MACHINE = &H80000002
  97.     HKEY_USERS = &H80000003
  98.     HKEY_PERFORMANCE_DATA = &H80000004
  99.     HKEY_CURRENT_CONFIG = &H80000005
  100.     HKEY_DYN_DATA = &H80000006
  101. End Enum
  102.  
  103. '//Generic Access Rights
  104. Private Const GENERIC_ALL                         As Long = &H10000000
  105. Private Const GENERIC_READ                        As Long = &H80000000
  106. Private Const GENERIC_EXECUTE                     As Long = &H20000000
  107. Private Const GENERIC_WRITE                       As Long = &H40000000
  108.  
  109. '//Standard Access Rights
  110. Private Const DELETE                              As Long = &H10000
  111. Private Const READ_CONTROL                        As Long = &H20000
  112. Private Const WRITE_DAC                           As Long = &H40000
  113. Private Const WRITE_OWNER                         As Long = &H80000
  114. Private Const SYNCHRONIZE                         As Long = &H100000
  115. Private Const STANDARD_RIGHTS_REQUIRED            As Long = &HF0000
  116. Private Const STANDARD_RIGHTS_READ                As Long = READ_CONTROL
  117. Private Const STANDARD_RIGHTS_WRITE               As Long = READ_CONTROL
  118. Private Const STANDARD_RIGHTS_EXECUTE             As Long = READ_CONTROL
  119. Private Const STANDARD_RIGHTS_ALL                 As Long = &H1F0000
  120. Private Const SPECIFIC_RIGHTS_ALL                 As Long = &HFFFF
  121. Private Const ACCESS_SYSTEM_SECURITY              As Long = &H1000000
  122. Private Const MAXIMUM_ALLOWED                     As Long = &H2000000
  123.  
  124. '//inherit flags of an Ace header.
  125. Private Const OBJECT_INHERIT_ACE                  As Long = &H1
  126. Private Const CONTAINER_INHERIT_ACE               As Long = &H2
  127. Private Const NO_PROPAGATE_INHERIT_ACE            As Long = &H4
  128. Private Const INHERIT_ONLY_ACE                    As Long = &H8
  129. Private Const INHERITED_ACE                       As Long = &H10
  130. Private Const VALID_INHERIT_FLAGS                 As Long = &H1F
  131.  
  132. '//security descriptor flags.
  133. Private Const SE_DACL_AUTO_INHERIT_REQ            As Long = &H100
  134. Private Const SE_SACL_AUTO_INHERIT_REQ            As Long = &H200
  135. Private Const SE_DACL_AUTO_INHERITED              As Long = &H400
  136. Private Const SE_SACL_AUTO_INHERITED              As Long = &H800
  137. Private Const SE_DACL_PROTECTED                   As Long = &H1000
  138. Private Const SE_SACL_PROTECTED                   As Long = &H2000
  139.  
  140. '//ACE being added.
  141. Private Const ACCESS_ALLOWED_ACE_TYPE             As Integer = 0
  142. Private Const ACCESS_DENIED_ACE_TYPE              As Integer = 1
  143.  
  144. '//well-known SIDs, users and groups
  145. Private Const SECURITY_WORLD_SID_AUTHORITY        As Long = &H1
  146. Private Const SECURITY_NT_AUTHORITY               As Long = &H5
  147. Private Const SECURITY_BUILTIN_DOMAIN_RID         As Long = &H20
  148. Private Const DOMAIN_ALIAS_RID_ADMINS             As Long = &H220
  149. Private Const DOMAIN_ALIAS_RID_USERS              As Long = &H221
  150. Private Const SECURITY_LOCAL_SYSTEM_RID           As Long = &H12
  151. Private Const SECURITY_WORLD_RID                  As Long = &H0
  152. Private Const DOMAIN_USER_RID_ADMIN               As Long = &H1F4
  153. Private Const DOMAIN_USER_RID_GUEST               As Long = &H1F5
  154. Private Const DOMAIN_GROUP_RID_ADMINS             As Long = &H200
  155. Private Const INVALID_HANDLE_VALUE                As Integer = -1
  156. Private Const OPEN_EXISTING                       As Integer = 3
  157. Private Const FILE_FLAG_BACKUP_SEMANTICS          As Long = &H2000000
  158.  
  159. '//API Constants
  160. Private Const DACL_SECURITY_INFORMATION           As Long = &H4
  161. Private Const SECURITY_DESCRIPTOR_REVISION        As Integer = 1
  162. Private Const SECURITY_DESCRIPTOR_MIN_LENGTH      As Integer = 20
  163. Private Const SD_SIZE                             As Double = (65536 + SECURITY_DESCRIPTOR_MIN_LENGTH)
  164. Private Const ACL_REVISION2                       As Integer = 2
  165. Private Const ACL_REVISION                        As Integer = 2
  166. Private Const MAXDWORD                            As Long = &HFFFFFFFF
  167. Private Const SidTypeUser                         As Integer = 1
  168. Private Const AclSizeInformation                  As Integer = 2
  169.  
  170. '//Registry access masks
  171. Private Const KEY_QUERY_VALUE                     As Long = &H1
  172. Private Const KEY_SET_VALUE                       As Long = &H2
  173. Private Const KEY_CREATE_SUB_KEY                  As Long = &H4
  174. Private Const KEY_ENUMERATE_SUB_KEYS              As Long = &H8
  175. Private Const KEY_NOTIFY                          As Long = &H10
  176. Private Const KEY_CREATE_LINK                     As Long = &H20
  177. Private Const KEY_WOW64_32KEY                     As Long = &H200
  178. Private Const KEY_WOW64_64KEY                     As Long = &H100
  179.  
  180. Private Const KEY_READ                            As Double = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
  181. Private Const KEY_WRITE                           As Double = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
  182. Private Const KEY_EXECUTE                         As Double = ((KEY_READ) And (Not SYNCHRONIZE))
  183. Private Const KEY_ALL_ACCESS                      As Double = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
  184.  
  185. Public Enum REGISTRY_ACCESS
  186.     '//unique rights
  187.     Registry_Read = KEY_READ
  188.     Registry_Write = KEY_WRITE
  189.     Registry_Execute = KEY_EXECUTE
  190.     Registry_Full_Control = KEY_ALL_ACCESS
  191.     '//compound rights
  192.     Registry_Read_Write = KEY_READ Or KEY_WRITE
  193.     Registry_Read_Execute = KEY_READ Or KEY_EXECUTE
  194.     Registry_Read_Write_Execute = KEY_READ Or KEY_WRITE Or KEY_EXECUTE
  195. End Enum
  196.  
  197. Public Enum ACCESS_TYPE
  198.     '//permissive DACL
  199.     Access_Allowed
  200.     '//deny DACL
  201.     Access_Denied
  202. End Enum
  203.  
  204. '<<<inheritence properties>>>
  205. Public Enum INHERITENCE_FLAGS
  206.     Container_Inherit = CONTAINER_INHERIT_ACE
  207.     Object_Inherit = OBJECT_INHERIT_ACE
  208.     Non_Propogate = NO_PROPAGATE_INHERIT_ACE
  209.     Inherit_Only = INHERIT_ONLY_ACE
  210.     Inherit_Ace = INHERITED_ACE
  211.     Object_Container_Inherit = OBJECT_INHERIT_ACE Or CONTAINER_INHERIT_ACE
  212.     Child_Inherit_Level = OBJECT_INHERIT_ACE Or CONTAINER_INHERIT_ACE Or NO_PROPAGATE_INHERIT_ACE
  213.     Child_Container_Inherit = OBJECT_INHERIT_ACE Or CONTAINER_INHERIT_ACE Or INHERIT_ONLY_ACE
  214.     Family_Container_Inherit = OBJECT_INHERIT_ACE Or CONTAINER_INHERIT_ACE Or INHERITED_ACE
  215. End Enum
  216.  
  217. Public Enum eSEUserRights
  218.     eAssignPrimaryToken = 0
  219.     eAudit = 1
  220.     eBackupName = 2
  221.     eChangeNotify = 3
  222.     eCreatePermanent = 4
  223.     eCreateToken = 5
  224.     eIncreaseBasePriority = 6
  225.     eIncreasePageFile = 7
  226.     eIncreseQuota = 8
  227.     eLoadDriver = 9
  228.     eLockMemory = 10
  229.     eMachineAccount = 11
  230.     eProfileSingleProc = 12
  231.     eRemoteShutdown = 13
  232.     eRestoreName = 14
  233.     eSecurity = 14
  234.     eServiceLogon = 16
  235.     eShutdown = 17
  236.     eSystemEnviroment = 18
  237.     eSystemProfile = 19
  238.     eSystemTime = 20
  239.     eTakeOwnership = 21
  240.     eTcb = 22
  241.     eUnsolicitedInput = 23
  242. End Enum
  243.  
  244. Private cReg As clsReg
  245.  
  246.  
  247. '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  248. '                                           REGISTRY INTERFACE
  249. '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  250.  
  251. Public Function Access_Check(ByVal RootKey As HKEY_Type, _
  252.                              ByVal SubKey As String) As Boolean
  253.  
  254. '//test user write access rights
  255. '//to a specified key
  256. On Error GoTo Handler
  257.     '//test write access to a key
  258.     With New clsReg
  259.         If .Access_Test(RootKey, SubKey) Then
  260.             Access_Check = True
  261.         End If
  262.     End With
  263.     
  264. Handler:
  265. On Error GoTo 0
  266.  
  267. End Function
  268.  
  269. Public Function Read_BEndian(ByVal RootKey As HKEY_Type, _
  270.                              ByVal SubKey As String, _
  271.                              ByVal KeyVal As String) As Variant
  272.  
  273. '//list a big_endian value
  274. Dim lReturn     As Long
  275.  
  276. On Error GoTo Handler
  277.  
  278.     '//read value
  279.     With New clsReg
  280.         Read_BEndian = .cRead_BEndian(RootKey, SubKey, KeyVal, lReturn)
  281.     End With
  282.     '//test for error
  283.     If Not lReturn = 0 Then Get_Error lReturn
  284.     
  285. Handler:
  286. On Error GoTo 0
  287.  
  288. End Function
  289.  
  290. Public Function Write_BEndian(ByVal RootKey As HKEY_Type, _
  291.                               ByVal SubKey As String, _
  292.                               ByVal KeyVal As String, _
  293.                               ByVal vData As Variant) As Boolean
  294.  
  295. '//write a big_endian value
  296. Dim lReturn     As Long
  297.  
  298. On Error GoTo Handler
  299.     '//write value
  300.     With New clsReg
  301.         lReturn = .cWrite_BEndian(RootKey, SubKey, KeyVal, vData)
  302.     End With
  303.     
  304.     '//test for error
  305.     If lReturn = 0 Then
  306.         Write_BEndian = True
  307.     Else
  308.         Get_Error lReturn
  309.     End If
  310.     
  311. Handler:
  312. On Error GoTo 0
  313.  
  314. End Function
  315.  
  316. Public Function Read_Binary(ByVal RootKey As HKEY_Type, _
  317.                             ByVal SubKey As String, _
  318.                             ByVal KeyVal As String) As Variant
  319.  
  320. '//get binary data
  321. Dim lReturn     As Long
  322. 'On Error GoTo Handler
  323.     
  324.     '//read value
  325.     With New clsReg
  326.         Read_Binary = .cRead_Binary(RootKey, SubKey, KeyVal, lReturn)
  327.     End With
  328.     '//test for error
  329.     If Not lReturn = 0 Then Get_Error lReturn
  330.     
  331. Handler:
  332. On Error GoTo 0
  333.  
  334. End Function
  335.  
  336. Public Function Write_Binary(ByVal RootKey As HKEY_Type, _
  337.                              ByVal SubKey As String, _
  338.                              ByVal KeyVal As String, _
  339.                              ByVal sData As String) As Boolean
  340.  
  341. '//write a binary value
  342. Dim lReturn     As Long
  343. Dim j           As Long
  344. Dim MByte()     As Byte
  345. Dim Btemp()     As String
  346.  
  347. On Error GoTo Handler
  348.  
  349.     Btemp() = Split(sData, " ")
  350.     For j = 0 To UBound(Btemp) - 1
  351.         ReDim Preserve MByte(j)
  352.         MByte(j) = CByte(Btemp(j))
  353.     Next j
  354.     
  355.     With New clsReg
  356.         lReturn = .cWrite_Binary(RootKey, SubKey, KeyVal, MByte)
  357.     End With
  358.     
  359.     '//test for error
  360.     If lReturn = 0 Then
  361.         Write_Binary = True
  362.     Else
  363.         Get_Error lReturn
  364.     End If
  365.     
  366. Handler:
  367. On Error GoTo 0
  368.  
  369. End Function
  370.  
  371. Public Function Read_Dword(ByVal RootKey As HKEY_Type, _
  372.                            ByVal SubKey As String, _
  373.                            ByVal KeyVal As String) As String
  374.  
  375. '//get dword data
  376. '//will also read little endian
  377. Dim lReturn     As Long
  378.  
  379. On Error GoTo Handler
  380.     '//read value
  381.     With New clsReg
  382.         Read_Dword = .cRead_DWord(RootKey, SubKey, KeyVal, lReturn)
  383.     End With
  384.     '//test for error
  385.     If Not lReturn = 0 Then Get_Error lReturn
  386.     
  387. Handler:
  388. On Error GoTo 0
  389.  
  390. End Function
  391.  
  392. Public Function Write_Dword(ByVal RootKey As HKEY_Type, _
  393.                             ByVal SubKey As String, _
  394.                             ByVal KeyVal As String, _
  395.                             ByVal lData As Long) As Boolean
  396.  
  397. '//write a dword value
  398. Dim lReturn     As Long
  399.  
  400. On Error GoTo Handler
  401.     '//write value
  402.     With New clsReg
  403.         lReturn = .cWrite_DWord(RootKey, SubKey, KeyVal, lData)
  404.     End With
  405.     
  406.     '//test for error
  407.     If lReturn = 0 Then
  408.         Write_Dword = True
  409.     Else
  410.         Get_Error lReturn
  411.     End If
  412.     
  413. Handler:
  414. On Error GoTo 0
  415.  
  416. End Function
  417.  
  418. Public Function Read_LEndian(ByVal RootKey As HKEY_Type, _
  419.                              ByVal SubKey As String, _
  420.                              ByVal KeyVal As String) As Variant
  421.  
  422. '//list a little_endian value
  423. Dim lReturn     As Long
  424.  
  425. On Error GoTo Handler
  426.  
  427.     '//read value
  428.     With New clsReg
  429.         Read_LEndian = .cRead_LEndian(RootKey, SubKey, KeyVal, lReturn)
  430.     End With
  431.     '//test for error
  432.     If Not lReturn = 0 Then Get_Error lReturn
  433.     
  434. Handler:
  435. On Error GoTo 0
  436.  
  437. End Function
  438.  
  439. Public Function Write_LEndian(ByVal RootKey As HKEY_Type, _
  440.                               ByVal SubKey As String, _
  441.                               ByVal KeyVal As String, _
  442.                               ByVal vData As Variant) As Boolean
  443.  
  444. '//write a little_endian value
  445. Dim lReturn     As Long
  446.  
  447. On Error GoTo Handler
  448.     '//write value
  449.     With New clsReg
  450.         lReturn = .cWrite_LEndian(RootKey, SubKey, KeyVal, vData)
  451.     End With
  452.     
  453.     '//test for error
  454.     If lReturn = 0 Then
  455.         Write_LEndian = True
  456.     Else
  457.         Get_Error lReturn
  458.     End If
  459.     
  460. Handler:
  461. On Error GoTo 0
  462.  
  463. End Function
  464.  
  465. '//WIN32 ONLY
  466. Public Function Read_Link(ByVal RootKey As HKEY_Type, _
  467.                           ByVal SubKey As String, _
  468.                           ByVal KeyVal As String) As Variant
  469.  
  470. '//get link data
  471. Dim lReturn     As Long
  472. 'On Error GoTo Handler
  473.     
  474.     '//read value
  475.     With New clsReg
  476.         Read_Link = .cRead_Link(RootKey, SubKey, KeyVal, 0)
  477.     End With
  478.     '//test for error
  479.     If Not lReturn = 0 Then Get_Error lReturn
  480.     
  481. Handler:
  482. On Error GoTo 0
  483.  
  484. End Function
  485.  
  486. '//WIN32 ONLY
  487. Public Function Write_Link(ByVal RootKey As HKEY_Type, _
  488.                              ByVal SubKey As String, _
  489.                              ByVal KeyVal As String, _
  490.                              ByVal sData As String) As Boolean
  491.  
  492. '//write a link value
  493. Dim lReturn     As Long
  494. Dim j           As Long
  495. Dim MByte()     As Byte
  496. Dim Btemp()     As String
  497.  
  498. On Error GoTo Handler
  499.  
  500.     Btemp() = Split(sData, " ")
  501.     For j = 0 To UBound(Btemp) - 1
  502.         ReDim Preserve MByte(j)
  503.         MByte(j) = CByte(Btemp(j))
  504.     Next j
  505.     
  506.     With New clsReg
  507.         lReturn = .cWrite_Link(RootKey, SubKey, KeyVal, MByte)
  508.     End With
  509.     
  510.     '//test for error
  511.     If lReturn = 0 Then
  512.         Write_Link = True
  513.     Else
  514.         Get_Error lReturn
  515.     End If
  516.     
  517. Handler:
  518. On Error GoTo 0
  519.  
  520. End Function
  521.  
  522. Public Function Read_Multi(ByVal RootKey As HKEY_Type, _
  523.                            ByVal SubKey As String, _
  524.                            ByVal KeyVal As String) As String
  525.  
  526. '//read multi value into string
  527. Dim sTemp       As String
  528. Dim l           As Long
  529. Dim lReturn     As Long
  530. Dim sMVal       As String
  531. Dim aMVals()    As String
  532.  
  533. On Error GoTo Handler
  534.     '//read value
  535.     With New clsReg
  536.         sMVal = .cRead_Multi(RootKey, SubKey, KeyVal)
  537.     End With
  538.     
  539.     '//format results for string
  540.     aMVals = Split(sMVal, vbNullChar)
  541.     For l = 0 To UBound(aMVals)
  542.         sTemp = sTemp & aMVals(l) & " "
  543.     Next l
  544.     '//trim terminating null char
  545.     Read_Multi = Left$(sTemp, Len(sTemp) - 1)
  546.     '//test for error
  547.     If Not lReturn = 0 Then Get_Error lReturn
  548.     
  549. Handler:
  550. On Error GoTo 0
  551.  
  552. End Function
  553.  
  554. Public Function Write_Multi(ByVal RootKey As HKEY_Type, _
  555.                             ByVal SubKey As String, _
  556.                             ByVal KeyVal As String, _
  557.                             ByVal sData As String) As Boolean
  558.  
  559. '//write a multi_sz value
  560. Dim lReturn     As Long
  561.  
  562. On Error GoTo Handler
  563.     '//write value
  564.     With New clsReg
  565.         lReturn = .cWrite_Multi(RootKey, SubKey, KeyVal, sData)
  566.     End With
  567.     
  568.     '//test for error
  569.     If lReturn = 0 Then
  570.         Write_Multi = True
  571.     Else
  572.         Get_Error lReturn
  573.     End If
  574.     
  575. Handler:
  576. On Error GoTo 0
  577.  
  578. End Function
  579.  
  580. Public Function Read_MultiCN(ByVal RootKey As HKEY_Type, _
  581.                              ByVal SubKey As String, _
  582.                              ByVal KeyVal As String) As Collection
  583.  
  584. '//process multi_sz value
  585. '//and return collection
  586. Dim aTemp()     As String
  587. Dim cTemp       As New Collection
  588. Dim sTemp       As String
  589. Dim l           As Long
  590. Dim lReturn     As Long
  591.  
  592. On Error Resume Next
  593.  
  594.     Set cTemp = New Collection
  595.     '//get multi string
  596.     With New clsReg
  597.         sTemp = .cRead_Multi(RootKey, SubKey, KeyVal, lReturn)
  598.     End With
  599.  
  600.     '//get values and add to collection
  601.     aTemp = Split(sTemp, vbNullChar)
  602.     For l = 0 To UBound(aTemp)
  603.         cTemp.Add aTemp(l)
  604.     Next l
  605.     '//test for error
  606.     If Not lReturn = 0 Then Get_Error lReturn
  607.     '//set collection and release library
  608.     Set Read_MultiCN = cTemp
  609.     Set cTemp = Nothing
  610.     
  611. On Error GoTo 0
  612.  
  613. End Function
  614.  
  615. Public Sub Write_MultiCN(ByVal RootKey As HKEY_Type, _
  616.                          ByVal SubKey As String, _
  617.                          ByVal KeyVal As String, _
  618.                          ByVal DataSet As Collection)
  619.  
  620. '//process a collection and
  621. '//write to registry as a
  622. '//multi_sz entry
  623. Dim sTemp       As String
  624. Dim sValue      As String
  625. Dim cTemp       As New Collection
  626. Dim l           As Long
  627. Dim lReturn     As Long
  628. Dim Item        As Variant
  629.  
  630. On Error Resume Next
  631.  
  632.     For Each Item In DataSet
  633.         sTemp = sTemp & Item & vbNullChar
  634.     Next
  635.     '//add terminating null char
  636.     sTemp = sTemp & vbNullChar
  637.     '//write to registry
  638.     With New clsReg
  639.         lReturn = .cWrite_Multi(RootKey, SubKey, KeyVal, sTemp)
  640.     End With
  641.     
  642.     '//test for error and release library
  643.     If Not lReturn = 0 Then Get_Error lReturn
  644.     
  645. On Error GoTo 0
  646.  
  647. End Sub
  648.  
  649. '//WIN32 ONLY
  650. Public Function Read_Qword(ByVal RootKey As HKEY_Type, _
  651.                            ByVal SubKey As String, _
  652.                            ByVal KeyVal As String) As Currency
  653.  
  654. '//get qword data
  655. '//qwords are 64 bit integers
  656. '//used currency as it is 64
  657. '//but to display, you must
  658. '//multiply by 10000
  659. '//to move decimal point
  660.  
  661. Dim lReturn     As Long
  662.  
  663. On Error GoTo Handler
  664.     '//read value
  665.     With New clsReg
  666.         Read_Qword = .cRead_QWord(RootKey, SubKey, KeyVal, lReturn)
  667.     End With
  668.     '//test for error
  669.     If Not lReturn = 0 Then Get_Error lReturn
  670.     
  671. Handler:
  672. On Error GoTo 0
  673.  
  674. End Function
  675.  
  676. '//WIN32 ONLY
  677. Public Function Write_Qword(ByVal RootKey As HKEY_Type, _
  678.                             ByVal SubKey As String, _
  679.                             ByVal KeyVal As String, _
  680.                             ByVal cData As Currency) As Boolean
  681.  
  682. '//write a qword (64bit dword) value
  683. '//wasn't sure how to use 64 bit in vb
  684. '//currency was option I chose..
  685. Dim lReturn     As Long
  686.  
  687. On Error GoTo Handler
  688.     '//write value
  689.     With New clsReg
  690.         lReturn = .cWrite_QWord(RootKey, SubKey, KeyVal, cData)
  691.     End With
  692.     
  693.     '//test for error
  694.     If lReturn = 0 Then
  695.         Write_Qword = True
  696.     Else
  697.         Get_Error lReturn
  698.     End If
  699.     
  700. Handler:
  701. On Error GoTo 0
  702.  
  703. End Function
  704.  
  705. '//WIN32 ONLY
  706. Public Function Read_ResDesc(ByVal RootKey As HKEY_Type, _
  707.                              ByVal SubKey As String, _
  708.                              ByVal KeyVal As String) As Variant
  709.  
  710. '//get resource descriptor
  711. Dim lReturn     As Long
  712. 'On Error GoTo Handler
  713.     
  714.     '//read value
  715.     With New clsReg
  716.         Read_ResDesc = .cRead_ResDescriptor(RootKey, SubKey, KeyVal, lReturn)
  717.     End With
  718.     '//test for error
  719.     If Not lReturn = 0 Then Get_Error lReturn
  720.     
  721. Handler:
  722. On Error GoTo 0
  723.  
  724. End Function
  725.  
  726. '//WIN32 ONLY
  727. Public Function Write_ResDesc(ByVal RootKey As HKEY_Type, _
  728.                               ByVal SubKey As String, _
  729.                               ByVal KeyVal As String, _
  730.                               ByVal sData As String) As Boolean
  731.  
  732. '//write a resource descriptor value
  733. Dim lReturn     As Long
  734. Dim j           As Long
  735. Dim MByte()     As Byte
  736. Dim Btemp()     As String
  737.  
  738. On Error GoTo Handler
  739.  
  740.     Btemp() = Split(sData, " ")
  741.     For j = 0 To UBound(Btemp) - 1
  742.         ReDim Preserve MByte(j)
  743.         MByte(j) = CByte(Btemp(j))
  744.     Next j
  745.     
  746.     With New clsReg
  747.         lReturn = .cWrite_ResDescriptor(RootKey, SubKey, KeyVal, MByte)
  748.     End With
  749.     
  750.     '//test for error
  751.     If lReturn = 0 Then
  752.         Write_ResDesc = True
  753.     Else
  754.         Get_Error lReturn
  755.     End If
  756.     
  757. Handler:
  758. On Error GoTo 0
  759.  
  760. End Function
  761.  
  762. '//WIN32 ONLY
  763. Public Function Read_ResList(ByVal RootKey As HKEY_Type, _
  764.                              ByVal SubKey As String, _
  765.                              ByVal KeyVal As String) As Variant
  766.  
  767. '//get resource list
  768. Dim lReturn     As Long
  769. 'On Error GoTo Handler
  770.     
  771.     '//read value
  772.     With New clsReg
  773.         Read_ResList = .cRead_ResourceList(RootKey, SubKey, KeyVal, lReturn)
  774.     End With
  775.     '//test for error
  776.     If Not lReturn = 0 Then Get_Error lReturn
  777.     
  778. Handler:
  779. On Error GoTo 0
  780.  
  781. End Function
  782.  
  783. '//WIN32 ONLY
  784. Public Function Write_ResList(ByVal RootKey As HKEY_Type, _
  785.                               ByVal SubKey As String, _
  786.                               ByVal KeyVal As String, _
  787.                               ByVal sData As String) As Boolean
  788.  
  789. '//write a resource list value
  790. Dim lReturn     As Long
  791. Dim j           As Long
  792. Dim MByte()     As Byte
  793. Dim Btemp()     As String
  794.  
  795. On Error GoTo Handler
  796.  
  797.     Btemp() = Split(sData, " ")
  798.     For j = 0 To UBound(Btemp) - 1
  799.         ReDim Preserve MByte(j)
  800.         MByte(j) = CByte(Btemp(j))
  801.     Next j
  802.     
  803.     With New clsReg
  804.         lReturn = .cWrite_ResourceList(RootKey, SubKey, KeyVal, MByte)
  805.     End With
  806.     
  807.     '//test for error
  808.     If lReturn = 0 Then
  809.         Write_ResList = True
  810.     Else
  811.         Get_Error lReturn
  812.     End If
  813.     
  814. Handler:
  815. On Error GoTo 0
  816.  
  817. End Function
  818.  
  819. '//WIN32 ONLY
  820. Public Function Read_ResRequired(ByVal RootKey As HKEY_Type, _
  821.                                  ByVal SubKey As String, _
  822.                                  ByVal KeyVal As String) As Variant
  823.  
  824. '//get resource list
  825. Dim lReturn     As Long
  826. 'On Error GoTo Handler
  827.     
  828.     '//read value
  829.     With New clsReg
  830.         Read_ResRequired = .cRead_ResRequired(RootKey, SubKey, KeyVal, lReturn)
  831.     End With
  832.     '//test for error
  833.     If Not lReturn = 0 Then Get_Error lReturn
  834.     
  835. Handler:
  836. On Error GoTo 0
  837.  
  838. End Function
  839.  
  840. '//WIN32 ONLY
  841. Public Function Write_ResRequired(ByVal RootKey As HKEY_Type, _
  842.                                   ByVal SubKey As String, _
  843.                                   ByVal KeyVal As String, _
  844.                                   ByVal sData As String) As Boolean
  845.  
  846. '//write a resource list value
  847. Dim lReturn     As Long
  848. Dim j           As Long
  849. Dim MByte()     As Byte
  850. Dim Btemp()     As String
  851.  
  852. On Error GoTo Handler
  853.  
  854.     Btemp() = Split(sData, " ")
  855.     For j = 0 To UBound(Btemp) - 1
  856.         ReDim Preserve MByte(j)
  857.         MByte(j) = CByte(Btemp(j))
  858.     Next j
  859.     
  860.     With New clsReg
  861.         lReturn = .cWrite_ResRequired(RootKey, SubKey, KeyVal, MByte)
  862.     End With
  863.     
  864.     '//test for error
  865.     If lReturn = 0 Then
  866.         Write_ResRequired = True
  867.     Else
  868.         Get_Error lReturn
  869.     End If
  870.     
  871. Handler:
  872. On Error GoTo 0
  873.  
  874. End Function
  875.  
  876. Public Function Read_String(ByVal RootKey As HKEY_Type, _
  877.                             ByVal SubKey As String, _
  878.                             ByVal KeyVal As String) As String
  879.  
  880. '//list any string value
  881. '//sz, expand_sz, link, list
  882. Dim lReturn     As Long
  883.  
  884. On Error Resume Next
  885.  
  886.     '//read value
  887.     With New clsReg
  888.         Read_String = .cRead_String(RootKey, SubKey, KeyVal, lReturn)
  889.     End With
  890.     '//test for error
  891.     If Not lReturn = 0 Then Get_Error lReturn
  892.     
  893. Handler:
  894. On Error GoTo 0
  895.  
  896. End Function
  897.  
  898. Public Function Write_String(ByVal RootKey As HKEY_Type, _
  899.                              ByVal SubKey As String, _
  900.                              ByVal KeyVal As String, _
  901.                              ByVal sData As String) As Boolean
  902.  
  903. '//write string data
  904. Dim lReturn     As Long
  905.  
  906. On Error GoTo Handler
  907.     '//write value
  908.     With New clsReg
  909.         lReturn = .cWrite_String(RootKey, SubKey, KeyVal, sData)
  910.     End With
  911.     
  912.     '//test for error
  913.     If lReturn = 0 Then
  914.         Write_String = True
  915.     Else
  916.         Get_Error lReturn
  917.     End If
  918.     
  919. Handler:
  920. On Error GoTo 0
  921.  
  922. End Function
  923.  
  924. Public Function Write_StringEX(ByVal RootKey As HKEY_Type, _
  925.                                ByVal SubKey As String, _
  926.                                ByVal KeyVal As String, _
  927.                                ByVal sData As String) As Boolean
  928.  
  929. '//write an expanded string value
  930. Dim lReturn     As Long
  931.  
  932. On Error GoTo Handler
  933.     '//write value
  934.     With New clsReg
  935.         lReturn = .cWrite_String_Expand(RootKey, SubKey, KeyVal, sData)
  936.     End With
  937.     
  938.     '//test for error
  939.     If lReturn = 0 Then
  940.         Write_StringEX = True
  941.     Else
  942.         Get_Error lReturn
  943.     End If
  944.     
  945. Handler:
  946. On Error GoTo 0
  947.  
  948. End Function
  949.  
  950. Public Function Create_Key(ByVal RootKey As HKEY_Type, _
  951.                            ByVal SubKey As String) As Boolean
  952.  
  953. '//create a key
  954. Dim lReturn     As Long
  955.  
  956. On Error GoTo Handler
  957.  
  958.     With New clsReg
  959.         lReturn = .cCreate_Key(RootKey, SubKey)
  960.         If lReturn = 0 Then
  961.             Create_Key = True
  962.         Else
  963.             Get_Error lReturn
  964.         End If
  965.     End With
  966.     
  967. Handler:
  968. On Error GoTo 0
  969.  
  970. End Function
  971.  
  972. Public Function Delete_Key(ByVal RootKey As HKEY_Type, _
  973.                            ByVal SubKey As String) As Boolean
  974.  
  975. '//delete a key
  976. Dim lReturn     As Long
  977.  
  978. On Error GoTo Handler
  979.  
  980.     '//delete the specified key
  981.     With New clsReg
  982.         lReturn = .cDelete_Key(RootKey, SubKey)
  983.         If lReturn = 0 Then
  984.             Delete_Key = True
  985.         Else
  986.             Get_Error lReturn
  987.         End If
  988.     End With
  989.     
  990. Handler:
  991. On Error GoTo 0
  992.  
  993. End Function
  994.  
  995. Public Function Key_Exists(ByVal RootKey As HKEY_Type, _
  996.                            ByVal SubKey As String) As Boolean
  997.  
  998. '//test for key
  999. On Error GoTo Handler
  1000.  
  1001.     '//if no error then key exists
  1002.     With New clsReg
  1003.         If .cKey_Exist(RootKey, SubKey) Then
  1004.             Key_Exists = True
  1005.         End If
  1006.     End With
  1007.  
  1008. Handler:
  1009. On Error GoTo 0
  1010.  
  1011. End Function
  1012.  
  1013. Public Function Value_Exists(ByVal RootKey As HKEY_Type, _
  1014.                              ByVal SubKey As String, _
  1015.                              ByVal KeyVal As String) As Boolean
  1016.  
  1017. '//test for key
  1018. On Error GoTo Handler
  1019.  
  1020.     '//if no error then key exists
  1021.     With New clsReg
  1022.         If .cValue_Exist(RootKey, SubKey, KeyVal) Then
  1023.             Value_Exists = True
  1024.         End If
  1025.     End With
  1026.  
  1027. Handler:
  1028. On Error GoTo 0
  1029.  
  1030. End Function
  1031.  
  1032. Public Function Write_Value(ByVal RootKey As HKEY_Type, _
  1033.                             ByVal SubKey As String, _
  1034.                             ByVal KeyVal As String, _
  1035.                             ByVal ValData As String, _
  1036.                             ByVal DataType As Integer) As Boolean
  1037.  
  1038. '//create a new value with data
  1039. '//supports sz, multi_sz, expand_sz
  1040. '//binary, dword, little_endian
  1041. '//big_endian and link
  1042. Dim j           As Integer
  1043. Dim lData       As Long
  1044. Dim MByte()     As Byte
  1045. Dim Btemp()     As String
  1046. Dim lReturn     As Long
  1047.  
  1048. On Error GoTo Handler
  1049.  
  1050.     With New clsReg
  1051.         Select Case DataType
  1052.             Case 1
  1053.                 '//sz
  1054.                 lReturn = .cWrite_String(RootKey, SubKey, KeyVal, ValData)
  1055.         
  1056.             Case 2
  1057.                 '//expand_sz
  1058.                 lReturn = .cWrite_String_Expand(RootKey, SubKey, KeyVal, ValData)
  1059.             
  1060.             Case 3
  1061.                 '//multi_sz
  1062.                 lReturn = .cWrite_Multi(RootKey, SubKey, KeyVal, ValData)
  1063.             
  1064.             Case 4
  1065.                 '//binary
  1066.                 Btemp() = Split(ValData, " ")
  1067.                 For j = 0 To UBound(Btemp) - 1
  1068.                     ReDim Preserve MByte(j)
  1069.                     MByte(j) = CByte(Btemp(j))
  1070.                 Next j
  1071.                 lReturn = .cWrite_Binary(RootKey, SubKey, KeyVal, MByte)
  1072.         
  1073.             Case 5
  1074.                 '//dword
  1075.                 lData = CLng(ValData)
  1076.                 lReturn = .cWrite_DWord(RootKey, SubKey, KeyVal, lData)
  1077.     
  1078.             Case 6
  1079.                 '//little_endian
  1080.                 lReturn = .cWrite_LEndian(RootKey, SubKey, KeyVal, lData)
  1081.             
  1082.             Case 7
  1083.                 '//big_endian
  1084.                 lReturn = .cWrite_BEndian(RootKey, SubKey, KeyVal, lData)
  1085.         End Select
  1086.     End With
  1087.     
  1088.     If lReturn = 0 Then
  1089.         Write_Value = True
  1090.     Else
  1091.         Get_Error lReturn
  1092.     End If
  1093.     
  1094.     Erase Btemp
  1095.     Erase MByte
  1096.  
  1097. Handler:
  1098. On Error GoTo 0
  1099.  
  1100. End Function
  1101.  
  1102. Public Function Delete_Value(ByVal RootKey As HKEY_Type, _
  1103.                              ByVal SubKey As String, _
  1104.                              ByVal KeyVal As String) As Boolean
  1105.  
  1106. '//delete a value
  1107. Dim lReturn     As Long
  1108.  
  1109. On Error GoTo Handler
  1110.  
  1111.     '//deletes the specified value
  1112.     With New clsReg
  1113.         lReturn = .cDelete_Value(RootKey, SubKey, KeyVal)
  1114.         If lReturn = 0 Then
  1115.             Delete_Value = True
  1116.         Else
  1117.             Get_Error lReturn
  1118.         End If
  1119.     End With
  1120.  
  1121.     
  1122. Handler:
  1123. On Error GoTo 0
  1124.  
  1125. End Function
  1126.  
  1127. Public Function Search_Value(ByVal RootKey As HKEY_Type, _
  1128.                              ByVal KeyVal As String, _
  1129.                              ByVal SearchVal As String) As Boolean
  1130.  
  1131. '//search for a value
  1132. Dim Item        As Variant
  1133. Dim lReturn     As Long
  1134.  
  1135. On Error GoTo Handler
  1136.     
  1137.     '//enumerate values and compare
  1138.     '//to search item
  1139.     With New clsReg
  1140.         For Each Item In .cSearch_Values(RootKey, KeyVal, lReturn)
  1141.             If LCase$(Item) = SearchVal Then
  1142.                 Search_Value = True
  1143.                 Exit For
  1144.             End If
  1145.         Next Item
  1146.     End With
  1147.     
  1148.     '//log errors
  1149.     If Not lReturn = 0 Then Get_Error lReturn
  1150.         
  1151. Handler:
  1152. On Error GoTo 0
  1153.     
  1154. End Function
  1155.  
  1156. Public Function List_Keys(ByVal RootKey As HKEY_Type, _
  1157.                           ByVal SubKey As String) As Collection
  1158.  
  1159. '//list all subkeys in path
  1160. Dim Item        As cRegKey
  1161. Dim cTemp       As New Collection
  1162. Dim lReturn     As Long
  1163.  
  1164. On Error GoTo Handler
  1165.  
  1166.     Set cTemp = New Collection
  1167.     '//add each key returned from library
  1168.     '//to a new collection
  1169.     With New clsReg
  1170.         For Each Item In .cList_Keys(RootKey, SubKey, lReturn)
  1171.             cTemp.Add Item.Key
  1172.         Next Item
  1173.     End With
  1174.     
  1175.     '//test for error, and release library
  1176.     If Not lReturn = 0 Then Get_Error lReturn
  1177.     Set List_Keys = cTemp
  1178.     Set cTemp = Nothing
  1179.     
  1180. Handler:
  1181. On Error GoTo 0
  1182.  
  1183. End Function
  1184.  
  1185. Public Function List_Values(ByVal RootKey As HKEY_Type, _
  1186.                             ByVal SubKey As String) As Collection
  1187.  
  1188. '//add values under key to collection
  1189. '//lists values of type string, string_exp
  1190. '//dword, little_endian, and binary
  1191. Dim Item        As cRegValue
  1192. Dim sCurrVal    As String
  1193. Dim cTemp       As New Collection
  1194. Dim lReturn     As Long
  1195.  
  1196. On Error GoTo Handler
  1197.  
  1198.     Set cTemp = New Collection
  1199.     '//add each value to collection
  1200.     With New clsReg
  1201.         For Each Item In .cList_Values(RootKey, SubKey, lReturn)
  1202.             cTemp.Add Item.Key
  1203.         Next Item
  1204.     End With
  1205.     '//test for error and release
  1206.     '//collection and library
  1207.     If Not lReturn = 0 Then Get_Error lReturn
  1208.     Set List_Values = cTemp
  1209.     Set cTemp = Nothing
  1210.     
  1211. Handler:
  1212. On Error GoTo 0
  1213.  
  1214. End Function
  1215.  
  1216.  
  1217. '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  1218. '                                         ERROR LOGGING
  1219. '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  1220.  
  1221. Private Function Get_Error(ByVal lErrNum As Long) As String
  1222. '//interpret registry errors passed from library
  1223. '//including custom errors from clsRegSecurity
  1224.  
  1225. On Error GoTo Handler
  1226.  
  1227.     Select Case lErrNum
  1228.     Case 1
  1229.         Get_Error = "Error: " & lErrNum & " Bad Database. The database is invalid"
  1230.     Case 2
  1231.         Get_Error = "Error: " & lErrNum & " Bad Key Name. Key is corrupt or does not exist"
  1232.     Case 3
  1233.         Get_Error = "Error: " & lErrNum & " Key Locked. The key requested does not exist"
  1234.     Case 4
  1235.         Get_Error = "Error: " & lErrNum & " Failed Read. The key requested can not be read accessed"
  1236.     Case 5
  1237.         Get_Error = "Error: " & lErrNum & " Failed Write. The key requested can not be write accessed"
  1238.     Case 6
  1239.         Get_Error = "Error: " & lErrNum & " Out Of Memory. The process has exceeded its memory allocation"
  1240.     Case 7
  1241.         Get_Error = "Error: " & lErrNum & " Work Area Invalid. The process work area appears to be corrupt"
  1242.     Case 8
  1243.         Get_Error = "Error: " & lErrNum & " Access Is Denied. Access to this key has been denied"
  1244.     Case 87
  1245.         Get_Error = "Error: " & lErrNum & " Invalid Parameters. The call parameters passed are invalid"
  1246.     Case 234
  1247.         Get_Error = "Error: " & lErrNum & " More Data. The container has more data"
  1248.     Case 259
  1249.         Get_Error = "Error: " & lErrNum & " No More Items. No more items for this query"
  1250.     '//begin clsRegSecurity custom error messages
  1251.     Case 901
  1252.         Get_Error = "Error: " & lErrNum & " Could not intialize SWSA SID"
  1253.     Case 902
  1254.         Get_Error = "Error: " & lErrNum & " Could not open key"
  1255.     Case 903
  1256.         Get_Error = "Error: " & lErrNum & " Failed to create Key Descriptor"
  1257.     Case 904
  1258.         Get_Error = "Error: " & lErrNum & " Could not retieve SID with LocalAlloc"
  1259.     Case 905
  1260.         Get_Error = "Error: " & lErrNum & " Get Key Security Failure"
  1261.     Case 906
  1262.         Get_Error = "Error: " & lErrNum & " Buffer Creation Failed"
  1263.     Case 907
  1264.         Get_Error = "Error: " & lErrNum & " Could not Initialize Security Descriptor"
  1265.     Case 908
  1266.         Get_Error = "Error: " & lErrNum & " Empty DACL or Request Failure"
  1267.     Case 909
  1268.         Get_Error = "Error: " & lErrNum & " No DACL return data"
  1269.     Case 910
  1270.         Get_Error = "Error: " & lErrNum & " Account Name is Invalid"
  1271.     Case 911
  1272.         Get_Error = "Error: " & lErrNum & " Requested SID does not exist"
  1273.     Case 912
  1274.         Get_Error = "Error: " & lErrNum & " Memory allocation failure for new DACL"
  1275.     Case 913
  1276.         Get_Error = "Error: " & lErrNum & " New DACL could not be initialized"
  1277.     Case 914
  1278.         Get_Error = "Error: " & lErrNum & " LocalAlloc Ace returned zero"
  1279.     Case 915
  1280.         Get_Error = "Error: " & lErrNum & " DACL type NON_INHERITENCE was not added to DACL"
  1281.     Case 916
  1282.         Get_Error = "Error: " & lErrNum & " Failed to add ACE to ACL Structure"
  1283.     Case 917
  1284.         Get_Error = "Error: " & lErrNum & " DACL type ACCESS_ALLOWED_ACE_TYPE was not added to DACL"
  1285.     Case 918
  1286.         Get_Error = "Error: " & lErrNum & " ACE Entry could Not be Allocated"
  1287.     Case 919
  1288.         Get_Error = "Error: " & lErrNum & " ACL Build Failure"
  1289.     Case 920
  1290.         Get_Error = "Error: " & lErrNum & " Failed to set Descriptor control entry"
  1291.     Case 921
  1292.         Get_Error = "Error: " & lErrNum & " Failed to Allocate Key Descriptor"
  1293.     Case Else
  1294.         Get_Error = "Error: An Unknown Error has occured"
  1295.     End Select
  1296.     
  1297.     Log_Error Get_Error
  1298.  
  1299. Handler:
  1300. On Error GoTo 0
  1301.  
  1302. End Function
  1303.  
  1304. Private Sub Log_Error(ByVal ErrDesc As String)
  1305. '//log errors
  1306.  
  1307. On Error Resume Next
  1308.  
  1309.     '//write to log
  1310.     Open App.Path & "\err.log" For Append As #1
  1311.         Print #1, CStr(Now) & vbTab & ErrDesc
  1312.     Close #1
  1313.  
  1314. On Error GoTo 0
  1315.  
  1316. End Sub
  1317.  
  1318.  
  1319. '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  1320. '                                       ENDIAN CONVERSION ROUTINES
  1321. '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  1322. '// Thanks go out to actorics.de PSC submission
  1323.  
  1324. Private Function Low_Byte(ByVal iNum As Integer) As Byte
  1325.  
  1326. On Error GoTo Handler
  1327.  
  1328.     Low_Byte = iNum And &HFF
  1329.  
  1330. Handler:
  1331. On Error GoTo 0
  1332.  
  1333. End Function
  1334.  
  1335. Private Function High_Byte(ByVal iNum As Integer) As Byte
  1336.  
  1337. On Error GoTo Handler
  1338.  
  1339.     High_Byte = (iNum And &HFF00&) \ 256
  1340.  
  1341. Handler:
  1342. On Error GoTo 0
  1343.  
  1344. End Function
  1345.  
  1346. Private Function Make_Wturn = 0 T,1Item
  1347.     End WithbN
  1348. HandlerhV,  Case 9undler
  1349. aBc
  1350.     E<<<<<<<<<< 0
  1351. on Key_Exists(BU2ag Key_Exists(BU2ag Key_Exists(BU2ag Key_Exists(BU2ag Kata As StrfIe(RootDescriptor"
  1352.     CasOs(Brivateb
  1353.  
  1354. On Ekt
  1355.  
  1356.      Get_Error GoId     ey_Exists(BU2ag Kata As StrfIe(RootDescriA,ion
  1357.  
  1358. Private SubEoyte(BSo"    (   As Long
  1359. 'On Errorpe, _
  1360.    Error GoId     ey_ExiPoeEY_QUERY_Num An<ErrDesand binary
  1361. Dim Iate Funo     ey_ExiPoeaGIf Not lReturn = 0 Then Get_ErrKey_Exists(BU2ag Kata As StrfIe(RootDescriptor"
  1362.     CasOs(Brivateb
  1363.  
  1364. On Ekt
  1365.  
  1366.      Get_Error GoId     ey_Exists(BU2ag Kata As StrfIe(RootDescriA,ion
  1367.  
  1368. Private SubEoyte(BSo"    (   As Long
  1369. 'On Errorpe, _
  1370.    Error GoId     ey_ExiPoeEY_QUERY_Num An<ErrDesaurn = 0 Then Get_ErrKey_Exists(BU2agF
  1371. Priva ky De    C"oeEY_QUERY_Num Ase_Wturn = 0iN   Next Item
  1372.     End With
  1373.     
  1374.     '//log errors
  1375.     y_ExA) Funo   iva kynd With
  1376.   0iN   ,                            ByVal KeyVal A"_
  1377. End Key_Exis        End   32 eyEd    '//ow) &0r Gs(BU2aNum A0UaNumey_ExrrKey"eaGIf Not ls)BU2aNuk)ERY_Ns Strivate SubEoyaa<0A0UaNumey_Exrrexists(BU2agF
  1378.  Error GoTo 0
  1379.  
  1380. End Function
  1381.  
  1382. Prie0)BU1       Read_B    ubEoyaa<0A0UaNumey_Exrrexists(BU2arn = 0 Sxrren
  1383.  
  1384. Prie0)BU1 ren
  1385.    21Y_QUERY_Num An<ErrDesaurn = 0 T)BU1ollection
  1386.     '//adS"oeEey_ExrrmN,ocaC
  1387.  
  1388. 'xrren
  1389.  
  1390. PriemN,oUrreg Kata As StrfIe(RootDescriptor"
  1391.     CasOs(Brivateb
  1392.  
  1393. On Ekt
  1394.  
  1395.      Get_Err 0iN
  1396.     '/ion Write_ResList(lU2arn = 0 Sx_Error U(""""""gO
  1397.         GF 32 ey0Num An<ErrDe
  1398. On Error GoToSCPub
  1399.  
  1400. Enc"""""gO
  1401.         GF0to aootDescriA,ion
  1402.  
  1403. Private SubEoyte(BSo"    (   As Long
  1404. 'On Errorpe, _
  1405.    Error GoId     ey_ExiPoeEY_QUERY_Num A,or GoToSCPub
  1406.  
  1407. Enc"""""gO
  1408.         GF0to aootDescriA,ion
  1409.  
  1410. eForpe, _
  1411.    uo Hang
  1412. ftor"
  1413.  
  1414. '/QUERY_ 9100to aooction
  1415.     ba *aKVi&0r Gs(BU2aNum A0UaNum
  1416.     High_Byte = (iNum And &HFF00&) \ 25Oe A0UaNum
  1417.    ,ion
  1418.  
  1419. eCk)ERY_Ns Strivate SubE\'RY_Ns Strivate SubE\'RY_Ns StrivaurceLiiA,ionmGoToSCPub
  1420.  
  1421. Enc"""""gO
  1422.    (0   = 0 Then
  1423.     tDesc"gO
  1424.    (0u/e Sub0UaNumt  xrrexists(BU2agF
  1425.  Error GoTo 0
  1426.  
  1427. End Function
  1428.  
  1429. Prie0)BU1     ion
  1430. UD A,orTMSION ROUTINES
  1431. '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  ion
  1432. UD A,orTMSION RSTb
  1433. UD A,orTMSION RSTb
  1434. UD A,orTMSION RSTb
  1435. UD A,orTMSION RSTb
  1436. UD A,orTMSION RSTb
  1437. UD A,orTMSION R     ion
  1438. UD A,MSIONrTMSION R0oi
  1439.  
  1440. On Ekt
  1441.  
  1442.      Get_Error GoId     ey_Exists(BU2ag Kata As StrfIe(RootDescriA,ion
  1443.  
  1444. Private SubEoyte(BSo"    (   As Long>>>>>FRSTb
  1445. rrords LonO00>>ng>>>>ror GoTo 0ioId    oH,orTMSION )uk)ERY_Ns NES
  1446. '<<<>>>>te(BSo"    SION )uSION pBSION )uSION pBSION )uSION pBSION )uSION pBSION )uSION pBSION33333333333333333333333N pBSION )uSION pBSIO><<<<<<<<<<<<<<<<<<<<<<<<  ion
  1447. UD A,orTMSION RSTb
  1448. UD A,orTMSION RSTb
  1449. 33333333333333333N pBSION )uSIOvGum & "BU2ag& "BToSCPub
  1450.  
  1451. Enc If No+3333333333N pBSION )2 <<<<< ion
  1452. UD\6SION pA$30         '//sz"    ion
  1453. UD A,v & "SION )S,e )S6Ko+3333r"TA$30    
  1454. '//delete a valueON )S,e )S6KoSwAs StAkA,orTMSIOealueO
  1455.    21Y_QUERY_NukIOealueO
  1456.    21Y_ 0ioI_I
  1457.         _ 21Y_ 0ioI_I
  1458.      Tb
  1459. 33ioI_I
  1460.      bt),,MSIONrTMSION R0oi
  1461.  
  1462. On Ekt
  1463.  
  1464.      Get_Error GoId   V um & ists(BU2ag Kata As StrfIe(RootDescriA,i(ror = "Error'1Y_ 0iod   V IUrroreO
  1465.    21YibE\'RY_Ns StrivaurceLiiA,ionmGoToSCPub
  1466.  
  1467. Enc"""""gO
  1468.    (0   = 0 Then
  1469.  3 you mus As      B0
  1470.         _ 21Y_ 0ioI_I
  1471.      T    _ 21Y   = 0 ThenfIe(RootDe  Get_Ernc"""""gO
  1472.    (0   = 0 Then
  1473.  3 you mus As      B0
  1474.         _ 21Y_ION """""gO
  1475.    (0   = 0 Then
  1476.  3 you mus As      B0
  1477.         _ 21Y_ION """""gO
  1478.    (0  ts   St muso&F
  1479.  3        _ Y_ION """""gO
  1480.    (0   _ Y_ION """""gO0(Y_ION      ""gO
  1481.    (bcsS """""gO
  1482. rI
  1483.       LonnnnnnnnnnnnnnnK"""""gO
  1484.       TbAs      B0
  1485.         c$S  ""gO
  1486.    (bcsS """""gO
  1487. rI
  1488.       LonnnnnnnnnnnnnnnK"""""gO
  1489.       TbAs      B0
  1490. Num
  1491.     High_Byte = (iNum And &HFF00&) \ 25Oe h_Byte = (iN
  1492. Dim cTem'//readSui     Bap(ea      B0
  1493. Num
  1494. e S
  1495. UD ,gfa0BAs      Byte = (iNted S     UD A,  B0
  1496.  <(iNte cTem'//readSui     Bap(ea    ni"nnnnnnnnnnnnnnnn,orTM6 ion
  1497. UA,  Bs   St muso&F
  1498.  3e(U 3    ey, SubKey, KeyVal,nating null chaa   _(<0N ""R0oi
  1499.  
  1500. O