VBcoders Guest



Don't have an account yet? Register
 


Forgot Password?



The Complete Registry Module

by Eric O'Sullivan ()
Category: Registry
Compatability: Visual Basic 5.0
Difficulty: Advanced
Date Added: Wed 3rd February 2021
Rating: (7 Votes)

Complete registry access code, including procedures for file associations, NT Ctrl+alt+del menus, shelling files, getting windows directories (system, my documents, history, temp, temp internet file, cookies etc), runing an app at startup etc.

API Declarations
'=================================================
'AUTHOR : Eric O'Sullivan
' -----------------------------------------------
'DATE : 11 Januarary 2001
' -----------------------------------------------
'CONTACT: [email protected]
' -----------------------------------------------
'TITLE : Registry Access Module
' -----------------------------------------------
'COMMENTS :
'This was made to retrieve various information
'that is stored in the registry.
'=================================================
'all variables must be declared
Option Explicit
'this module cannot be accessed from outside this project
Option Private Module
'text comparisons are not case sensitive
Option Compare Text
'------------------------------------------------
' API DECLARATIONS
'------------------------------------------------
'api calls to retereive the system and windows folders
Private Declare Function GetSystemDirectory _
Lib "kernel32" _
Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, _
ByVal nSize As Long) _
As Long
Private Declare Function GetWindowsDirectory _
Lib "kernel32" _
Alias "GetWindowsDirectoryA" _
(ByVal lpBuffer As String, _
ByVal nSize As Long) _
As Long
'get the location of the temp directory on the system
Private Declare Function GetTempDirectory _
Lib "kernel32" _
Alias "GetTempPathA" _
(ByVal lBufferLength As Long, _
ByVal strBuffer As String) _
As Long
'get information about the current operating system
Private Declare Function GetVersionEx _
Lib "kernel32" _
Alias "GetVersionExA" _
(ByRef lpVersionInformation As OSVERSIONINFO) _
As Long
'registry api calls
'close an open registry key
Private Declare Function RegCloseKey _
Lib "advapi32.dll" _
(ByVal hKey As Long) _
As Long

'connect with the registry on a remote machine
Private Declare Function RegConnectRegistry _
Lib "advapi32.dll" _
Alias "RegConnectRegistryA" _
(ByVal lpMachineName As String, _
ByVal hKey As Long, _
phkResult As Long) _
As Long
'create a new registry key
Private Declare Function RegCreateKey _
Lib "advapi32.dll" _
Alias "RegCreateKeyA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String, _
phkResult As Long) _
As Long
'create new - entended
Private 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, _
lpSecurityAttributes As SECURITY_ATTRIBUTES, _
phkResult As Long, _
lpdwDisposition As Long) _
As Long
'delete the specified registry key (also any sub keys
'for non-NT based systems)
Private Declare Function RegDeleteKey _
Lib "advapi32.dll" _
Alias "RegDeleteKeyA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String) _
As Long
'delete a registry value
Private Declare Function RegDeleteValue _
Lib "advapi32.dll" _
Alias "RegDeleteValueA" _
(ByVal hKey As Long, _
ByVal lpValueName As String) _
As Long
'return a list of registry sub keys in the specified key
Private Declare Function RegEnumKey _
Lib "advapi32.dll" _
Alias "RegEnumKeyA" _
(ByVal hKey As Long, _
ByVal dwIndex As Long, _
ByVal lpName As String, _
ByVal cbName As Long) _
As Long
Private Declare Function RegEnumKeyEx _
Lib "advapi32.dll" _
Alias "RegEnumKeyExA" _
(ByVal hKey As Long, _
ByVal dwIndex As Long, _
ByVal lpName As String, _
lpcbName As Long, _
ByVal lpReserved As Long, _
ByVal lpClass As String, _
lpcbClass As Long, _
lpftLastWriteTime As FILETIME) _
As Long
'get a list of registry values in a key
Private Declare Function RegEnumValue _
Lib "advapi32.dll" _
Alias "RegEnumValueA" _
(ByVal hKey As Long, _
ByVal dwIndex As Long, _
ByVal lpValueName As String, _
lpcbValueName As Long, _
ByVal lpReserved As Long, _
lpType As Long, _
lpData As Byte, _
lpcbData As Long) _
As Long
'writes all the attributes of the specified open key
'into the registry
Private Declare Function RegFlushKey _
Lib "advapi32.dll" _
(ByVal hKey As Long) _
As Long
'get the security attributes of the specified key
Private Declare Function RegGetKeySecurity _
Lib "advapi32.dll" _
(ByVal hKey As Long, _
ByVal SecurityInformation As Long, _
pSecurityDescriptor As SECURITY_DESCRIPTOR, _
lpcbSecurityDescriptor As Long) _
As Long
'creates a subkey under HKEY_USER or HKEY_LOCAL_MACHINE
'and stores registration information from a specified
'file into that subkey. This registration information
'is in the form of a hive. A hive is a discrete body of
'keys, subkeys, and values that is rooted at the top of
'the registry hierarchy. A hive is backed by a single
'file and .LOG file
Private Declare Function RegLoadKey _
Lib "advapi32.dll" _
Alias "RegLoadKeyA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal lpFile As String) _
As Long
'notify a specified procedure (use the AddressOf
'operator), that a key has changed
Private Declare Function RegNotifyChangeKeyValue _
Lib "advapi32.dll" _
(ByVal hKey As Long, _
ByVal bWatchSubtree As Long, _
ByVal dwNotifyFilter As Long, _
ByVal hEvent As Long, _
ByVal fAsynchronus As Long) _
As Long
'open a registry key for access
Private Declare Function RegOpenKey _
Lib "advapi32.dll" _
Alias "RegOpenKeyA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String, _
phkResult As Long) _
As Long
Private 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
'get key information
Private Declare Function RegQueryInfoKey _
Lib "advapi32.dll" _
Alias "RegQueryInfoKeyA" _
(ByVal hKey As Long, _
ByVal lpClass As String, _
lpcbClass As Long, _
ByVal lpReserved As Long, _
lpcSubKeys As Long, _
lpcbMaxSubKeyLen As Long, _
lpcbMaxClassLen As Long, _
lpcValues As Long, _
lpcbMaxValueNameLen As Long, _
lpcbMaxValueLen As Long, _
lpcbSecurityDescriptor As Long, _
lpftLastWriteTime As FILETIME) _
As Long
'get value information. Note that if you declare the
'lpData parameter as String, you must pass it By Value.
Private Declare Function RegQueryValue _
Lib "advapi32.dll" _
Alias "RegQueryValueA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal lpValue As String, _
lpcbValue As Long) _
As Long
Private Declare Function RegQueryValueEx _
Lib "advapi32.dll" _
Alias "RegQueryValueExA" _
(ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal lpReserved As Long, _
lpType As Long, _
lpData As Any, _
lpcbData As Long) _
As Long
'replace one key with another
Private Declare Function RegReplaceKey _
Lib "advapi32.dll" _
Alias "RegReplaceKeyA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal lpNewFile As String, _
ByVal lpOldFile As String) _
As Long
'reads registry information from a file and enters it
'into the registry
Private Declare Function RegRestoreKey _
Lib "advapi32.dll" _
Alias "RegRestoreKeyA" _
(ByVal hKey As Long, _
ByVal lpFile As String, _
ByVal dwFlags As Long) _
As Long
'saves a registry key and all its values to a file
Private Declare Function RegSaveKey _
Lib "advapi32.dll" _
Alias "RegSaveKeyA" _
(ByVal hKey As Long, _
ByVal lpFile As String, _
lpSecurityAttributes As SECURITY_ATTRIBUTES) _
As Long
'set the security attributes of the specified registry
'key
Private Declare Function RegSetKeySecurity _
Lib "advapi32.dll" _
(ByVal hKey As Long, _
ByVal SecurityInformation As Long, _
pSecurityDescriptor As SECURITY_DESCRIPTOR) _
As Long
'set the information of an existing value. Note that if
'you declare the lpData parameter as String, you must
'pass it By Value.
Private Declare Function RegSetValue _
Lib "advapi32.dll" _
Alias "RegSetValueA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal dwType As Long, _
ByVal lpData As String, _
ByVal cbData As Long) _
As Long
Private Declare Function RegSetValueEx _
Lib "advapi32.dll" _
Alias "RegSetValueExA" _
(ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal Reserved As Long, _
ByVal dwType As Long, _
lpData As Any, _
ByVal cbData As Long) _
As Long

'unloads a registry key and its values from the registry
Private Declare Function RegUnLoadKey _
Lib "advapi32.dll" _
Alias "RegUnLoadKeyA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String) _
As Long
'system information api calls
Private Declare Sub GlobalMemoryStatus _
Lib "kernel32" _
(lpBuffer As MEMORYSTATUS)
Private Declare Function GetDiskFreeSpace _
Lib "kernel32" _
Alias "GetDiskFreeSpaceA" _
(ByVal lpRootPathName As String, _
lpSectorsPerCluster As Long, _
lpBytesPerSector As Long, _
lpNumberOfFreeClusters As Long, _
lpTotalNumberOfClusters As Long) _
As Long
Private Declare Function GetTickCount _
Lib "kernel32" _
() As Long
'------------------------------------------------
' ENUMERATORS
'------------------------------------------------
Public Enum MemType
CPUUsage
MemoryUsage
TotalPhysical
AvailablePhysical
TotalPageFile
AvailablePageFile
TotalVirtual
AvailableVirtual
TotalDisk
AvailableDisk
End Enum
Public Enum AccessType
FileInput = 0
FileOutPut = 1
FileRandom = 2
FileBinary = 3
FileAppend = 4
End Enum
'registry root directory constants
Public Enum RegistryHives
HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_CONFIG = &H80000005
HKEY_CURRENT_USER = &H80000001
HKEY_DYN_DATA = &H80000006
HKEY_LOCAL_MACHINE = &H80000002
HKEY_PERFORMANCE_DATA = &H80000004
HKEY_USERS = &H80000003
End Enum
'registry key constants
Public Enum RegistryKeyAccess
KEY_CREATE_LINK = &H20
KEY_CREATE_SUB_KEY = &H4
KEY_ENUMERATE_SUB_KEYS = &H8
KEY_EVENT = &H1 ' Event contains key event record
KEY_NOTIFY = &H10
KEY_QUERY_VALUE = &H1
KEY_SET_VALUE = &H2
READ_CONTROL = &H20000
STANDARD_RIGHTS_ALL = &H1F0000
STANDARD_RIGHTS_REQUIRED = &HF0000
SYNCHRONIZE = &H100000
STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)
STANDARD_RIGHTS_READ = (READ_CONTROL)
STANDARD_RIGHTS_WRITE = (READ_CONTROL)
KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL + KEY_QUERY_VALUE + KEY_SET_VALUE + KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + KEY_CREATE_LINK) And (Not SYNCHRONIZE))
KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
KEY_EXECUTE = ((KEY_READ) And (Not SYNCHRONIZE))
KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
End Enum
'registry value attributes
Public Enum RegistryKeyValues
REG_CREATED_NEW_KEY = &H1 ' New Registry Key created
REG_EXPAND_SZ = 2 ' Unicode nul terminated string
REG_FULL_RESOURCE_DESCRIPTOR = 9 ' Resource list in the hardware description
REG_LINK = 6 ' Symbolic Link (unicode)
REG_MULTI_SZ = 7 ' Multiple Unicode strings
REG_NONE = 0 ' No value type
REG_NOTIFY_CHANGE_ATTRIBUTES = &H2
REG_NOTIFY_CHANGE_LAST_SET = &H4 ' Time stamp
REG_NOTIFY_CHANGE_NAME = &H1 ' Create or delete (child)
REG_NOTIFY_CHANGE_SECURITY = &H8
REG_OPENED_EXISTING_KEY = &H2 ' Existing Key opened
REG_OPTION_BACKUP_RESTORE = 4 ' open for backup or restore
REG_OPTION_CREATE_LINK = 2 ' Created key is a symbolic link
REG_OPTION_NON_VOLATILE = 0 ' Key is preserved when system is rebooted
REG_OPTION_RESERVED = 0 ' Parameter is reserved
REG_OPTION_VOLATILE = 1 ' Key is not preserved when system is rebooted
REG_REFRESH_HIVE = &H2 ' Unwind changes to last flush
REG_RESOURCE_LIST = 8 ' Resource list in the resource map
REG_RESOURCE_REQUIREMENTS_LIST = 10
REG_SZ = 1 ' Unicode nul terminated string
REG_WHOLE_HIVE_VOLATILE = &H1 ' Restore whole hive volatile
REG_LEGAL_CHANGE_FILTER = (REG_NOTIFY_CHANGE_NAME Or REG_NOTIFY_CHANGE_ATTRIBUTES Or REG_NOTIFY_CHANGE_LAST_SET Or REG_NOTIFY_CHANGE_SECURITY)
REG_LEGAL_OPTION = (REG_OPTION_RESERVED Or REG_OPTION_NON_VOLATILE Or REG_OPTION_VOLATILE Or REG_OPTION_CREATE_LINK Or REG_OPTION_BACKUP_RESTORE)
End Enum
Public Enum RegistryDataTypes
REG_DT_SZ = 1 ' string data
REG_DT_BINARY = 3 ' Free form binary
REG_DT_DWORD = 4 ' 32-bit number
REG_DT_DWORD_BIG_ENDIAN = 5 ' 32-bit number
REG_DT_DWORD_LITTLE_ENDIAN = 4 ' 32-bit number (same as REG_DWORD)
End Enum
Public Enum RegistryLongTypes
REG_BINARY = 3 ' Free form binary
REG_DWORD = 4 ' 32-bit number
REG_DWORD_BIG_ENDIAN = 5 ' 32-bit number
REG_DWORD_LITTLE_ENDIAN = 4 ' 32-bit number (same as REG_DWORD)
End Enum
'error codes returned
Public Enum RegistryErrorCodes
ERROR_ACCESS_DENIED = 5&
ERROR_INVALID_PARAMETER = 87 ' dderror
ERROR_MORE_DATA = 234 ' dderror
ERROR_SUCCESS = 0&
End Enum
'the shell folders like my documents, recycle bin, temp directory etc.
Public Enum ShellFoldersType
'registry entry names
ApplicationDataDir = 0
TempInetFilesDir = 1
CookiesDir = 2
DesktopDir = 3
FavouritesDir = 4
FontsDir = 5
HistoryDir = 6
LocalAppDataDir = 7
NetHoodDir = 8
MyDocumentsDir = 9
PrintHoodDir = 10
StartProgramsDir = 11
RecentDir = 12
SendToDir = 13
StartMenuDir = 14
StartupDir = 15
TemplatesDir = 16

'these next items are not stored in the registry
SystemDir = 17
WindowsDir = 18
TempDir = 19 'temperory folder is always in the Windows directory
End Enum
Public Enum StartLoginType
RunBeforeLogin
RunAfterLogin
End Enum
'the different nt privilages that can be set/unset
Public Enum EnumNTSettings
'items that can be disabled on the Lock Screen
CHANGE_PASSWORD = 0
LOCK_WORKSTATION = 1
REGISTRY_TOOLS = 2
TASK_MGR = 3

'the tabs on the Display Properties dialog box
DISP_APPEARANCE_PAGE = 4
DISP_BACKGROUND_PAGE = 5
DISP_CPL = 6
DISP_SCREENSAVER = 7
DISP_SETTINGS = 8
End Enum
'------------------------------------------------
' USER-DEFINED TYPES
'------------------------------------------------
'holds information about the current operating system that the program is
'running on
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
'the current status of physical (ram), virtual memory and the page file.
Public Type MEMORYSTATUS
dwLength As Long
dwMemoryLoad As Long
dwTotalPhys As Long
dwAvailPhys As Long
dwTotalPageFile As Long
dwAvailPageFile As Long
dwTotalVirtual As Long
dwAvailVirtual As Long
End Type
'defined structures needed
Public Type ACL
AclRevision As Byte
Sbz1 As Byte
AclSize As Integer
AceCount As Integer
Sbz2 As Integer
End Type
Public Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Public Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Public Type SECURITY_DESCRIPTOR
Revision As Byte
Sbz1 As Byte
Control As Long
gstrOwner As Long
Group As Long
Sacl As ACL
Dacl As ACL
End Type
'------------------------------------------------
' MODULE-LEVEL CONSTANTS
'------------------------------------------------
'module constants
Private Const WIN_INFO_SUBKEY As String = "Software\Microsoft\Windows\CurrentVersion" 'HKEY_LOCAL_MACHINE
Private Const WIN_NT_INFO_SUBKEY As String = "Software\Microsoft\Windows NT\CurrentVersion" 'HKEY_LOCAL_MACHINE
Private Const SHELL_FOLDERS_SUBKEY As String = ".Default\Software\Microsoft\Windows\" + _
"CurrentVersion\Explorer\Shell Folders" 'HKEY_USERS
Private Const COUNTRY_SUBKEY As String = ".Default\Control Panel\International" 'HKEY_USERS
Private Const NT_SETTINGS As String = WIN_INFO_SUBKEY & "\Policies\System" 'HKEY_CURRENT_USER
Private Const W2K_SETTINGS As String = WIN_INFO_SUBKEY & "\Group Policy Objects\LocalUser\" + _
"Software\Microsoft\Windows\CurrentVersion\Policies\System" 'HKEY_CURRENT_USER
Private Const STARTUP_AL_SUBKEY As String = WIN_INFO_SUBKEY & "\Run" 'run after login screen
Private Const STARTUP_BL_SUBKEY As String = WIN_INFO_SUBKEY & "\RunServices" 'run before login screen

Rate The Complete Registry Module

'=================================================
'AUTHOR :  Eric O'Sullivan
' -----------------------------------------------
'DATE :   11 Januarary 2001
' -----------------------------------------------
'CONTACT:  [email protected]
' -----------------------------------------------
'TITLE :  Registry Access Module
' -----------------------------------------------
'COMMENTS :
'This was made to retrieve various information
'that is stored in the registry.
'=================================================
'all variables must be declared
Option Explicit
'this module cannot be accessed from outside this project
Option Private Module
'text comparisons are not case sensitive
Option Compare Text
'------------------------------------------------
'        API DECLARATIONS
'------------------------------------------------
'api calls to retereive the system and windows folders
Private Declare Function GetSystemDirectory _
    Lib "kernel32" _
    Alias "GetSystemDirectoryA" _
      (ByVal lpBuffer As String, _
       ByVal nSize As Long) _
       As Long
Private Declare Function GetWindowsDirectory _
    Lib "kernel32" _
    Alias "GetWindowsDirectoryA" _
      (ByVal lpBuffer As String, _
       ByVal nSize As Long) _
       As Long
'get the location of the temp directory on the system
Private Declare Function GetTempDirectory _
    Lib "kernel32" _
    Alias "GetTempPathA" _
      (ByVal lBufferLength As Long, _
       ByVal strBuffer As String) _
       As Long
'get information about the current operating system
Private Declare Function GetVersionEx _
    Lib "kernel32" _
    Alias "GetVersionExA" _
      (ByRef lpVersionInformation As OSVERSIONINFO) _
       As Long
'registry api calls
'close an open registry key
Private Declare Function RegCloseKey _
    Lib "advapi32.dll" _
      (ByVal hKey As Long) _
       As Long
       
'connect with the registry on a remote machine
Private Declare Function RegConnectRegistry _
    Lib "advapi32.dll" _
    Alias "RegConnectRegistryA" _
      (ByVal lpMachineName As String, _
       ByVal hKey As Long, _
       phkResult As Long) _
       As Long
'create a new registry key
Private Declare Function RegCreateKey _
    Lib "advapi32.dll" _
    Alias "RegCreateKeyA" _
      (ByVal hKey As Long, _
       ByVal lpSubKey As String, _
       phkResult As Long) _
       As Long
'create new - entended
Private 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, _
       lpSecurityAttributes As SECURITY_ATTRIBUTES, _
       phkResult As Long, _
       lpdwDisposition As Long) _
       As Long
'delete the specified registry key (also any sub keys
'for non-NT based systems)
Private Declare Function RegDeleteKey _
    Lib "advapi32.dll" _
    Alias "RegDeleteKeyA" _
      (ByVal hKey As Long, _
       ByVal lpSubKey As String) _
       As Long
'delete a registry value
Private Declare Function RegDeleteValue _
    Lib "advapi32.dll" _
    Alias "RegDeleteValueA" _
      (ByVal hKey As Long, _
       ByVal lpValueName As String) _
       As Long
'return a list of registry sub keys in the specified key
Private Declare Function RegEnumKey _
    Lib "advapi32.dll" _
    Alias "RegEnumKeyA" _
      (ByVal hKey As Long, _
       ByVal dwIndex As Long, _
       ByVal lpName As String, _
       ByVal cbName As Long) _
       As Long
Private Declare Function RegEnumKeyEx _
    Lib "advapi32.dll" _
    Alias "RegEnumKeyExA" _
      (ByVal hKey As Long, _
       ByVal dwIndex As Long, _
       ByVal lpName As String, _
       lpcbName As Long, _
       ByVal lpReserved As Long, _
       ByVal lpClass As String, _
       lpcbClass As Long, _
       lpftLastWriteTime As FILETIME) _
       As Long
'get a list of registry values in a key
Private Declare Function RegEnumValue _
    Lib "advapi32.dll" _
    Alias "RegEnumValueA" _
      (ByVal hKey As Long, _
       ByVal dwIndex As Long, _
       ByVal lpValueName As String, _
       lpcbValueName As Long, _
       ByVal lpReserved As Long, _
       lpType As Long, _
       lpData As Byte, _
       lpcbData As Long) _
       As Long
'writes all the attributes of the specified open key
'into the registry
Private Declare Function RegFlushKey _
    Lib "advapi32.dll" _
      (ByVal hKey As Long) _
       As Long
'get the security attributes of the specified key
Private Declare Function RegGetKeySecurity _
    Lib "advapi32.dll" _
      (ByVal hKey As Long, _
       ByVal SecurityInformation As Long, _
       pSecurityDescriptor As SECURITY_DESCRIPTOR, _
       lpcbSecurityDescriptor As Long) _
       As Long
'creates a subkey under HKEY_USER or HKEY_LOCAL_MACHINE
'and stores registration information from a specified
'file into that subkey. This registration information
'is in the form of a hive. A hive is a discrete body of
'keys, subkeys, and values that is rooted at the top of
'the registry hierarchy. A hive is backed by a single
'file and .LOG file
Private Declare Function RegLoadKey _
    Lib "advapi32.dll" _
    Alias "RegLoadKeyA" _
      (ByVal hKey As Long, _
       ByVal lpSubKey As String, _
       ByVal lpFile As String) _
       As Long
'notify a specified procedure (use the AddressOf
'operator), that a key has changed
Private Declare Function RegNotifyChangeKeyValue _
    Lib "advapi32.dll" _
      (ByVal hKey As Long, _
       ByVal bWatchSubtree As Long, _
       ByVal dwNotifyFilter As Long, _
       ByVal hEvent As Long, _
       ByVal fAsynchronus As Long) _
       As Long
'open a registry key for access
Private Declare Function RegOpenKey _
    Lib "advapi32.dll" _
    Alias "RegOpenKeyA" _
      (ByVal hKey As Long, _
       ByVal lpSubKey As String, _
       phkResult As Long) _
       As Long
Private 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
'get key information
Private Declare Function RegQueryInfoKey _
    Lib "advapi32.dll" _
    Alias "RegQueryInfoKeyA" _
      (ByVal hKey As Long, _
       ByVal lpClass As String, _
       lpcbClass As Long, _
       ByVal lpReserved As Long, _
       lpcSubKeys As Long, _
       lpcbMaxSubKeyLen As Long, _
       lpcbMaxClassLen As Long, _
       lpcValues As Long, _
       lpcbMaxValueNameLen As Long, _
       lpcbMaxValueLen As Long, _
       lpcbSecurityDescriptor As Long, _
       lpftLastWriteTime As FILETIME) _
       As Long
'get value information. Note that if you declare the
'lpData parameter as String, you must pass it By Value.
Private Declare Function RegQueryValue _
    Lib "advapi32.dll" _
    Alias "RegQueryValueA" _
      (ByVal hKey As Long, _
       ByVal lpSubKey As String, _
       ByVal lpValue As String, _
       lpcbValue As Long) _
       As Long
Private Declare Function RegQueryValueEx _
    Lib "advapi32.dll" _
    Alias "RegQueryValueExA" _
      (ByVal hKey As Long, _
       ByVal lpValueName As String, _
       ByVal lpReserved As Long, _
       lpType As Long, _
       lpData As Any, _
       lpcbData As Long) _
       As Long
'replace one key with another
Private Declare Function RegReplaceKey _
    Lib "advapi32.dll" _
    Alias "RegReplaceKeyA" _
      (ByVal hKey As Long, _
       ByVal lpSubKey As String, _
       ByVal lpNewFile As String, _
       ByVal lpOldFile As String) _
       As Long
'reads registry information from a file and enters it
'into the registry
Private Declare Function RegRestoreKey _
    Lib "advapi32.dll" _
    Alias "RegRestoreKeyA" _
      (ByVal hKey As Long, _
       ByVal lpFile As String, _
       ByVal dwFlags As Long) _
       As Long
'saves a registry key and all its values to a file
Private Declare Function RegSaveKey _
    Lib "advapi32.dll" _
    Alias "RegSaveKeyA" _
      (ByVal hKey As Long, _
       ByVal lpFile As String, _
       lpSecurityAttributes As SECURITY_ATTRIBUTES) _
       As Long
'set the security attributes of the specified registry
'key
Private Declare Function RegSetKeySecurity _
    Lib "advapi32.dll" _
      (ByVal hKey As Long, _
       ByVal SecurityInformation As Long, _
       pSecurityDescriptor As SECURITY_DESCRIPTOR) _
       As Long
'set the information of an existing value. Note that if
'you declare the lpData parameter as String, you must
'pass it By Value.
Private Declare Function RegSetValue _
    Lib "advapi32.dll" _
    Alias "RegSetValueA" _
      (ByVal hKey As Long, _
       ByVal lpSubKey As String, _
       ByVal dwType As Long, _
       ByVal lpData As String, _
       ByVal cbData As Long) _
       As Long
Private Declare Function RegSetValueEx _
    Lib "advapi32.dll" _
    Alias "RegSetValueExA" _
      (ByVal hKey As Long, _
       ByVal lpValueName As String, _
       ByVal Reserved As Long, _
       ByVal dwType As Long, _
       lpData As Any, _
       ByVal cbData As Long) _
       As Long
       
'unloads a registry key and its values from the registry
Private Declare Function RegUnLoadKey _
    Lib "advapi32.dll" _
    Alias "RegUnLoadKeyA" _
      (ByVal hKey As Long, _
       ByVal lpSubKey As String) _
       As Long
'system information api calls
Private Declare Sub GlobalMemoryStatus _
    Lib "kernel32" _
      (lpBuffer As MEMORYSTATUS)
Private Declare Function GetDiskFreeSpace _
    Lib "kernel32" _
    Alias "GetDiskFreeSpaceA" _
      (ByVal lpRootPathName As String, _
       lpSectorsPerCluster As Long, _
       lpBytesPerSector As Long, _
       lpNumberOfFreeClusters As Long, _
       lpTotalNumberOfClusters As Long) _
       As Long
Private Declare Function GetTickCount _
    Lib "kernel32" _
      () As Long
'------------------------------------------------
'          ENUMERATORS
'------------------------------------------------
Public Enum MemType
  CPUUsage
  MemoryUsage
  TotalPhysical
  AvailablePhysical
  TotalPageFile
  AvailablePageFile
  TotalVirtual
  AvailableVirtual
  TotalDisk
  AvailableDisk
End Enum
Public Enum AccessType
  FileInput = 0
  FileOutPut = 1
  FileRandom = 2
  FileBinary = 3
  FileAppend = 4
End Enum
'registry root directory constants
Public Enum RegistryHives
  HKEY_CLASSES_ROOT = &H80000000
  HKEY_CURRENT_CONFIG = &H80000005
  HKEY_CURRENT_USER = &H80000001
  HKEY_DYN_DATA = &H80000006
  HKEY_LOCAL_MACHINE = &H80000002
  HKEY_PERFORMANCE_DATA = &H80000004
  HKEY_USERS = &H80000003
End Enum
'registry key constants
Public Enum RegistryKeyAccess
  KEY_CREATE_LINK = &H20
  KEY_CREATE_SUB_KEY = &H4
  KEY_ENUMERATE_SUB_KEYS = &H8
  KEY_EVENT = &H1  ' Event contains key event record
  KEY_NOTIFY = &H10
  KEY_QUERY_VALUE = &H1
  KEY_SET_VALUE = &H2
  READ_CONTROL = &H20000
  STANDARD_RIGHTS_ALL = &H1F0000
  STANDARD_RIGHTS_REQUIRED = &HF0000
  SYNCHRONIZE = &H100000
  STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)
  STANDARD_RIGHTS_READ = (READ_CONTROL)
  STANDARD_RIGHTS_WRITE = (READ_CONTROL)
  KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL + KEY_QUERY_VALUE + KEY_SET_VALUE + KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + KEY_CREATE_LINK) And (Not SYNCHRONIZE))
  KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
  KEY_EXECUTE = ((KEY_READ) And (Not SYNCHRONIZE))
  KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
End Enum
'registry value attributes
Public Enum RegistryKeyValues
  REG_CREATED_NEW_KEY = &H1        ' New Registry Key created
  REG_EXPAND_SZ = 2            ' Unicode nul terminated string
  REG_FULL_RESOURCE_DESCRIPTOR = 9    ' Resource list in the hardware description
  REG_LINK = 6              ' Symbolic Link (unicode)
  REG_MULTI_SZ = 7            ' Multiple Unicode strings
  REG_NONE = 0              ' No value type
  REG_NOTIFY_CHANGE_ATTRIBUTES = &H2
  REG_NOTIFY_CHANGE_LAST_SET = &H4    ' Time stamp
  REG_NOTIFY_CHANGE_NAME = &H1      ' Create or delete (child)
  REG_NOTIFY_CHANGE_SECURITY = &H8
  REG_OPENED_EXISTING_KEY = &H2      ' Existing Key opened
  REG_OPTION_BACKUP_RESTORE = 4      ' open for backup or restore
  REG_OPTION_CREATE_LINK = 2       ' Created key is a symbolic link
  REG_OPTION_NON_VOLATILE = 0       ' Key is preserved when system is rebooted
  REG_OPTION_RESERVED = 0         ' Parameter is reserved
  REG_OPTION_VOLATILE = 1         ' Key is not preserved when system is rebooted
  REG_REFRESH_HIVE = &H2         ' Unwind changes to last flush
  REG_RESOURCE_LIST = 8          ' Resource list in the resource map
  REG_RESOURCE_REQUIREMENTS_LIST = 10
  REG_SZ = 1               ' Unicode nul terminated string
  REG_WHOLE_HIVE_VOLATILE = &H1      ' Restore whole hive volatile
  REG_LEGAL_CHANGE_FILTER = (REG_NOTIFY_CHANGE_NAME Or REG_NOTIFY_CHANGE_ATTRIBUTES Or REG_NOTIFY_CHANGE_LAST_SET Or REG_NOTIFY_CHANGE_SECURITY)
  REG_LEGAL_OPTION = (REG_OPTION_RESERVED Or REG_OPTION_NON_VOLATILE Or REG_OPTION_VOLATILE Or REG_OPTION_CREATE_LINK Or REG_OPTION_BACKUP_RESTORE)
End Enum
Public Enum RegistryDataTypes
  REG_DT_SZ = 1         ' string data
  REG_DT_BINARY = 3       ' Free form binary
  REG_DT_DWORD = 4        ' 32-bit number
  REG_DT_DWORD_BIG_ENDIAN = 5  ' 32-bit number
  REG_DT_DWORD_LITTLE_ENDIAN = 4 ' 32-bit number (same as REG_DWORD)
End Enum
Public Enum RegistryLongTypes
  REG_BINARY = 3       ' Free form binary
  REG_DWORD = 4        ' 32-bit number
  REG_DWORD_BIG_ENDIAN = 5  ' 32-bit number
  REG_DWORD_LITTLE_ENDIAN = 4 ' 32-bit number (same as REG_DWORD)
End Enum
'error codes returned
Public Enum RegistryErrorCodes
  ERROR_ACCESS_DENIED = 5&
  ERROR_INVALID_PARAMETER = 87 ' dderror
  ERROR_MORE_DATA = 234 ' dderror
  ERROR_SUCCESS = 0&
End Enum
'the shell folders like my documents, recycle bin, temp directory etc.
Public Enum ShellFoldersType
  'registry entry names
  ApplicationDataDir = 0
  TempInetFilesDir = 1
  CookiesDir = 2
  DesktopDir = 3
  FavouritesDir = 4
  FontsDir = 5
  HistoryDir = 6
  LocalAppDataDir = 7
  NetHoodDir = 8
  MyDocumentsDir = 9
  PrintHoodDir = 10
  StartProgramsDir = 11
  RecentDir = 12
  SendToDir = 13
  StartMenuDir = 14
  StartupDir = 15
  TemplatesDir = 16
  
  'these next items are not stored in the registry
  SystemDir = 17
  WindowsDir = 18
  TempDir = 19 'temperory folder is always in the Windows directory
End Enum
Public Enum StartLoginType
  RunBeforeLogin
  RunAfterLogin
End Enum
'the different nt privilages that can be set/unset
Public Enum EnumNTSettings
  'items that can be disabled on the Lock Screen
  CHANGE_PASSWORD = 0
  LOCK_WORKSTATION = 1
  REGISTRY_TOOLS = 2
  TASK_MGR = 3
  
  'the tabs on the Display Properties dialog box
  DISP_APPEARANCE_PAGE = 4
  DISP_BACKGROUND_PAGE = 5
  DISP_CPL = 6
  DISP_SCREENSAVER = 7
  DISP_SETTINGS = 8
End Enum
'------------------------------------------------
'        USER-DEFINED TYPES
'------------------------------------------------
'holds information about the current operating system that the program is
'running on
Private Type OSVERSIONINFO
  dwOSVersionInfoSize     As Long
  dwMajorVersion       As Long
  dwMinorVersion       As Long
  dwBuildNumber        As Long
  dwPlatformId        As Long
  szCSDVersion        As String * 128
End Type
'the current status of physical (ram), virtual memory and the page file.
Public Type MEMORYSTATUS
    dwLength        As Long
    dwMemoryLoad      As Long
    dwTotalPhys       As Long
    dwAvailPhys       As Long
    dwTotalPageFile     As Long
    dwAvailPageFile     As Long
    dwTotalVirtual     As Long
    dwAvailVirtual     As Long
End Type
'defined structures needed
Public Type ACL
    AclRevision       As Byte
    Sbz1          As Byte
    AclSize         As Integer
    AceCount        As Integer
    Sbz2          As Integer
End Type
Public Type FILETIME
    dwLowDateTime      As Long
    dwHighDateTime     As Long
End Type
Public Type SECURITY_ATTRIBUTES
    nLength         As Long
    lpSecurityDescriptor  As Long
    bInheritHandle     As Long
End Type
Public Type SECURITY_DESCRIPTOR
    Revision        As Byte
    Sbz1          As Byte
    Control         As Long
    gstrOwner        As Long
    Group          As Long
    Sacl          As ACL
    Dacl          As ACL
End Type
'------------------------------------------------
'       MODULE-LEVEL CONSTANTS
'------------------------------------------------
'module constants
Private Const WIN_INFO_SUBKEY    As String = "Software\Microsoft\Windows\CurrentVersion"         'HKEY_LOCAL_MACHINE
Private Const WIN_NT_INFO_SUBKEY  As String = "Software\Microsoft\Windows NT\CurrentVersion"       'HKEY_LOCAL_MACHINE
Private Const SHELL_FOLDERS_SUBKEY As String = ".Default\Software\Microsoft\Windows\" + _
                        "CurrentVersion\Explorer\Shell Folders"           'HKEY_USERS
Private Const COUNTRY_SUBKEY    As String = ".Default\Control Panel\International"           'HKEY_USERS
Private Const NT_SETTINGS      As String = WIN_INFO_SUBKEY & "\Policies\System"            'HKEY_CURRENT_USER
Private Const W2K_SETTINGS     As String = WIN_INFO_SUBKEY & "\Group Policy Objects\LocalUser\" + _
                        "Software\Microsoft\Windows\CurrentVersion\Policies\System" 'HKEY_CURRENT_USER
Private Const STARTUP_AL_SUBKEY   As String = WIN_INFO_SUBKEY & "\Run"                  'run after login screen
Private Const STARTUP_BL_SUBKEY   As String = WIN_INFO_SUBKEY & "\RunServices"              'run before login screen
'------------------------------------------------
'     PROCEDURES
'------------------------------------------------
Public Sub CreateFileAssociation(ByVal strFileType As String, _
         ByVal strTypeDescription As String, _
         Optional ByVal strExeName As String, _
         Optional ByVal strExePath As String, _
         Optional ByVal strIconPath As String)
 'This procedure will create a new association for a file. For anyone
 'who is unfamiliar with this, this means that if you were to double-
 'click on a file with the specified extention, the specified application
 'would start. eg, if you were to double click on a .txt file, notepad
 'would start and open the file.
 'Please note that if you wish to associate an icon, the icon has to be
 'a .ico file - no other file types are accepted. If you wish to use an
 'icon that is only in your exe (if your distributing you app for
 'example), then you need to save the icon as a file. This can be done
 'by using;
 '
 'Call SavePicture(MyControl.Picture, App.Path & "\MyIcon.ico")
 '
 'Although, please note that the picture must have originally been an
 'icon before you tried to save it as one.
 
 
 Dim lngResult As Long
 Dim strFullPath As String
 Dim strAppKey As String
 
 'exit procedure if the file type feild is blank
 If (strFileType = "") Then
  Exit Sub
 Else
  'if the first character is a dot, then remove it
  If Left(strFileType, 1) = "." Then
   strFileType = Right(strFileType, Len(strFileType) - 1)
  End If
  
  'check to see that the file type is only three characters long
  If Len(strFileType) > 3 Then
   strFileType = Left(strFileType, 3)
  End If
 
  'the type description should be no longer than 25 characters
  '(this is not necessary, but it keeps things neat in the registry)
  If Len(strTypeDescription) > 25 Then
   strTypeDescription = Left(strTypeDescription, 25)
  End If
 End If
 
 'set the default paths and exe name is they were not specified
 If strExeName = "" Then
  strExeName = App.ExeName
 End If
 
 If strExePath = "" Then
  strExePath = App.Path
 End If
 
 'make sure that the exename ends in ".exe"
 If LCase(Right(strExeName, 4)) <> ".exe" Then
  strExeName = strExeName & ".exe"
 End If
 
 'get the full path name of the exe
 If Right(strExePath, 1) = "\" Then
  'if the path already contains a trailing backslash (eg "d:\") then
  'don't add one when creating the path
  strFullPath = strExePath & strExeName
 Else
  'insert a backslash to seperate the name from the path
  strFullPath = strExePath & "\" & strExeName
 End If
 
 'check to make sure that the file exists
 If Dir(strFullPath) = "" Then
  'there is no file
  Exit Sub
 End If
 
 'if no icon was specified, then use the icon for the exe
 If (strIconPath = "") Or (Dir(strIconPath) = "") Then
  strIconPath = strFullPath
 End If
 
 'create the file type extention in the registry
 Call CreateSubKey(HKEY_CLASSES_ROOT, "." & strFileType)
 
 'create the registry entry in the above sub key that holds the
 'sub key with the file path
 'eg, "MyApp.Description", "Vb6.Module", "Word.Document"
 'Note that a blank entry lable name means a default value for that key,
 'if any spaces are in the type description, they are replaced with
 'a "." character.
 strAppKey = Replace(Left(strExeName, Len(strExeName) - 4) & "." & strTypeDescription, " ", ".")
 Call CreateRegString(HKEY_CLASSES_ROOT, _
       "." & strFileType, _
       "", _
       strAppKey)
 
 'create the key that will hold the applications path and type information.
 'additional commands can be put into the "Shell\Open\Command" sub key.
 'This means that when you right click on the file type, a popup menu
 'appears with the Open option. Other options can be inserted into this
 'menu by creating sub keys in the Shell key like; "Print\Command",
 '"Edit\Command", "Assemble\Command", "Split\Command" etc. where
 'the Command sub key contains a [default] entry with a command line
 'parameter to an executable file like "C:\Windows\Notepad.exe /p %1"
 Call CreateSubKey(HKEY_CLASSES_ROOT, _
      strAppKey & "\Shell\Open\Command")
 
 'create the text that describes the file type
 Call CreateRegString(HKEY_CLASSES_ROOT, _
       strAppKey, _
       "", _
       strTypeDescription)
 
 'create the command line parameter to open the file type with the
 'application specified
 Call CreateRegString(HKEY_CLASSES_ROOT, _
       strAppKey & "\Shell\Open\Command", _
       "", _
       strFullPath & " ""%1""")
 
 'create the icon sub key
 Call CreateSubKey(HKEY_CLASSES_ROOT, _
      strAppKey & "\DefaultIcon")
 
 'create the entry that points to the icon.
 If LCase(Right(strIconPath, 3)) = "exe" Then
  'get icon from .exe
  Call CreateRegString(HKEY_CLASSES_ROOT, _
        strAppKey & "\DefaultIcon", _
        "", _
        strIconPath & ",1")
 Else
  'get icon from .ico file
  Call CreateRegString(HKEY_CLASSES_ROOT, _
        strAppKey & "\DefaultIcon", _
        "", _
        strIconPath & ",0")
 End If
End Sub
Public Sub DeleteFileAssociation(ByVal strFileType As String)
 'This procedure will remove a file association. It is recommended that
 'you only remove an association that your application created, as once
 'the association is gone, it cannot be recreated without knowing the
 'file type, application involved and the icon assiciated with the file type.
 'See CreateFileAssociation for further information.
 
 Dim strSubKeyAssociation As String
 
 'validate the parameter
 
 'make sure that the parameter contains something
 If strFileType = "" Then
  Exit Sub
 End If
 
 'make sure that the first character is a dot (.)
 If Left(strFileType, 1) <> "." Then
  'insert dot
  strFileType = "." & strFileType
 End If
 
 'now we check the registry
 
 strSubKeyAssociation = ReadRegString(HKEY_CLASSES_ROOT, _
           strFileType, "")
 
 'if there was an error, then exit
 If LCase(Left(strSubKeyAssociation, 5)) = "error" Then
  Exit Sub
 End If
 
 'delete the commands and information about the selected file type
 Call DeleteSubKey(HKEY_CLASSES_ROOT, strSubKeyAssociation)
End Sub
Public Sub PutAppInStartup(ByVal strEntryLabel As String, _
       Optional ByVal strFilePath As String, _
       Optional ByVal blnStartup As StartLoginType = RunAfterLogin, _
       Optional ByVal blnOverwrite As Boolean = False)
 'This will take an applications full path name and put it into the registry
 'to start the program either before or after the login screen in normally
 'loaded. If no app path is specified, then by default, it puts the current
 'project in to startup after the login screen. Existing enteries are not
 'overwritten. You could call this procedure like;
 '
 'Call PutAppInStartup("MyCoolApp", MyAppsFilePath, RunAfterLogin, False)
 '
 'or
 '
 'Call PutAppInStartup("MyCoolApp")
 '
 'See also RemoveAppFromStartup.
 
 
 Dim strSubKey As String
 Dim strCheck As String
 
 'check to see if a file path was specified
 If strFilePath = "" Then
  'specifiy the path from the current project
  
  'if the applications path is a root directory, then don't add a
  'backslash to the path
  If Right(App.Path, 1) = "\" Then
   strFilePath = App.Path & App.ExeName & ".exe"
  Else
   strFilePath = App.Path & "\" & App.ExeName & ".exe"
  End If
 End If
 
 'check to see if the file exists
 If (Dir(strFilePath) = "") Or (strEntryLabel = "") Then
  'can't find file. There is no point in making an entry for a file
  'that doesn't exist, so exit
  Exit Sub
 End If
 
 'create the sub key based on the options
 If blnStartup = RunAfterLogin Then
  'set the app to start after the login screen
  strSubKey = STARTUP_AL_SUBKEY
 Else
  'set the app to run before the login screen
  strSubKey = STARTUP_BL_SUBKEY
 End If
 
 'if the entry already exists and we don't want to overwrite, then exit
 strCheck = ReadRegString(HKEY_LOCAL_MACHINE, _
        strSubKey, _
        strEntryLabel)
 If (Not blnOverwrite) And (Left(strCheck, 5) <> "Error") Then
  Exit Sub
 End If
 
 'write to the registry
 Call CreateRegString(HKEY_LOCAL_MACHINE, _
       strSubKey, _
       strEntryLabel, _
       strFilePath)
End Sub
Public Sub RemoveAppFromStartup(ByVal strEntryLabel As String, _
        Optional ByVal blnStartup As StartLoginType = RunAfterLogin)
 'This procedure will remove an app from the startup be specifying
 'it's label and whether or not the app startsup before or after the
 'login screen. Also see the PutInStartup procedure.
 
 Dim strSubKey As String
 Dim strCheck As String
 
 'find the sub key depending on the startup gstrMethod
 If blnStartup = RunAfterLogin Then
  'startup after the login screen [default]
  strSubKey = STARTUP_AL_SUBKEY
 Else
  'startup before the login screen
  strSubKey = STARTUP_BL_SUBKEY
 End If
 
 'check to see if the entry exists
 strCheck = ReadRegString(HKEY_LOCAL_MACHINE, _
        strSubKey, _
        strEntryLabel)
 If Left(strCheck, 5) = "Error" Then
  'there was a problem accessing the key, so exit (eg, it might not exist)
  Exit Sub
 End If
 
 'delete the entry
 Call DeleteValue(HKEY_LOCAL_MACHINE, _
      strSubKey, _
      strEntryLabel)
End Sub
Public Sub CreateSubKey(ByVal enmHive As RegistryHives, _
      ByVal strSubKey As String)
 'This procedure will create a sub key in the
 'specified header key.
 
 Dim lngResult As Long
 Dim hKey  As Long
 
 'create the key
 lngResult = RegCreateKey(enmHive, _
        strSubKey & Chr(0), _
        hKey)
 
 'close the key
 lngResult = RegCloseKey(hKey)
End Sub
Public Sub DeleteSubKey(ByVal enmHive As RegistryHives, _
      ByVal strSubKey As String)
 'This procedure will delete a key from the registry. Please note that
 'the procedure will not delete key values.
 
 Dim lngResult As Long  'holds any returned value from an api call
 Dim hKey  As Long  'holds a handle to the specified key
 
 'open the key
 lngResult = RegOpenKeyEx(enmHive, _
        strSubKey & Chr(0), _
        0&, _
        KEY_ALL_ACCESS, _
        hKey)
 
 'delete the key
 lngResult = RegDeleteKey(enmHive, hKey)
 
 'close the key
 lngResult = RegCloseKey(hKey)
End Sub
Public Sub DeleteValue(ByVal enmHive As RegistryHives, _
      ByVal strSubKey As String, _
      Optional ByVal strEntryLabel As String)
 'This will remove any registry key or entry value
 
 Dim lngResult  As Long
 Dim hKey   As Long
 Dim strTotalSubKey As String
 
 'create the full registry subkey and entry label
 strTotalSubKey = strSubKey & Chr(0)
 
 'open the subkey/entry
 lngResult = RegOpenKeyEx(enmHive, _
        strTotalSubKey, _
        0&, _
        KEY_ALL_ACCESS, _
        hKey)
 
 'delete the key/entry from the registry
 lngResult = RegDeleteValue(hKey, strEntryLabel)
 
 'close the handle
 lngResult = RegCloseKey(hKey)
End Sub
Public Sub CreateRegString(ByVal enmHive As RegistryHives, _
       ByVal strSubKey As String, _
       ByVal strEntryLabel As String, _
       ByVal strText As String)
 'This will put some text into the specified key and entry label. This
 'data can be retrieved with the ReadRegString function
 
 Dim lngResult  As Long
 Dim hKey   As Long
 Dim strTotalSubKey As String
 
 'create a complete sub key and entry path to send to the api call
 strTotalSubKey = strSubKey & Chr(0)
 
 'try to open the key first
 lngResult = RegOpenKeyEx(enmHive, _
        strTotalSubKey, _
        0, _
        KEY_READ + KEY_WRITE, _
        hKey)
 
 'if we couldn't open the key, then try and create it
 If (hKey = 0) Then
  'now create the sub key entry if it does not exist
  lngResult = RegCreateKey(enmHive, strTotalSubKey, hKey)
  
  'if no handle was returned, then exit
  If hKey = 0 Then
   Exit Sub
  End If
 End If
 
 'write the text into the key with the specified entry name
 lngResult = RegSetValueEx(hKey, _
        strEntryLabel, _
        0&, _
        REG_SZ, _
        ByVal strText, _
        Len(strText))
 
 'close the opened key and exit
 lngResult = RegCloseKey(hKey)
End Sub
Public Function GetWinDirectories(ByVal enmDirectory As ShellFoldersType) _
         As String
 'This function will return the specfied system directory like the desktop
 'directory, windows directory, temp folder, system directory etc.
 
 'registry entry names
 Const ApplicationData As String = "AppData"
 Const TempInetFiles  As String = "Cache" 'temperory internet files
 Const Cookies   As String = "Cookies"
 Const Desktop   As String = "Desktop"
 Const Favourites  As String = "Favourites"
 Const Fonts    As String = "Fonts"
 Const History   As String = "History"
 Const LocalAppData  As String = "Local AppData"
 Const NetHood   As String = "NetHood"
 Const MyDocuments  As String = "Personal"
 Const PrintHood   As String = "PrintHood"
 Const StartPrograms  As String = "Programs"
 Const Recent   As String = "Recent"
 Const SendTo   As String = "SendTo"
 Const StartMenu   As String = "Start Menu"
 Const StartUp   As String = "Startup"
 Const Templates   As String = "Templates"
 
 
 Dim strResult As String
 Dim errResult As Long
 
 Select Case enmDirectory
  'registry entry names
  Case ApplicationDataDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, ApplicationData)
  
  Case TempInetFilesDir 'temperory internet files
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, TempInetFiles)
  
  Case CookiesDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, Cookies)
  
  Case DesktopDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, Desktop)
  
  Case FavouritesDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, Favourites)
  
  Case FontsDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, Fonts)
  
  Case HistoryDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, History)
  
  Case LocalAppDataDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, LocalAppData)
  
  Case NetHoodDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, NetHood)
  
  Case MyDocumentsDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, MyDocuments)
  
  Case PrintHoodDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, PrintHood)
  
  Case StartProgramsDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, StartPrograms)
  
  Case RecentDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, Recent)
  
  Case SendToDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, SendTo)
  
  Case StartMenuDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, StartMenu)
  
  Case StartupDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, StartUp)
  
  Case TemplatesDir
   strResult = ReadRegString(HKEY_USERS, SHELL_FOLDERS_SUBKEY, Templates)
  
  
  'these next items are not stored in the registry
  Case SystemDir
   strResult = Space(255)
   errResult = GetSystemDirectory(strResult, 255)
   
   'remove the null character
   If (InStr(1, strResult, vbNullChar) > 0) Then
    strResult = Left(strResult, InStr(1, strResult, vbNullChar) - 1)
   End If
   
  Case WindowsDir
   strResult = Space(255)
   errResult = GetWindowsDirectory(strResult, 255)
   
   'remove the null character
   If (InStr(1, strResult, vbNullChar) > 0) Then
    strResult = Left(strResult, InStr(1, strResult, vbNullChar) - 1)
   End If
   
  Case TempDir 'temperory folder is always in the Windows directory
   strResult = Space(255)
   errResult = GetTempDirectory(255, strResult)
   
   'remove the null character and add the name of the temperory folder
   If (InStr(1, strResult, vbNullChar) > 0) Then
    strResult = Left(strResult, InStr(1, strResult, vbNullChar) - 1)
   End If
   
 End Select
 
 'return strResult
 GetWinDirectories = strResult
End Function
Public Function GetRegisteredOwner() As String
 'This function will returned the registered
 'strOwner for the local machine.
 
 Const OwnerKeyLoc As String = "RegisteredOwner"
 
 Dim strOwner  As String
 
 'get the registered gstrOwner
 If IsWinNT Then
  strOwner = ReadRegString(HKEY_LOCAL_MACHINE, _
         WIN_NT_INFO_SUBKEY, _
         OwnerKeyLoc)
 Else
  strOwner = ReadRegString(HKEY_LOCAL_MACHINE, _
         WIN_INFO_SUBKEY, _
         OwnerKeyLoc)
 End If
 
 'return lngResult
 GetRegisteredOwner = strOwner
End Function
Public Function ReadRegString(ByVal enmHive As RegistryHives, _
        ByVal strSubKey As String, _
        Optional ByVal strEntry As String) _
        As String
 'This function will check a registery string entry and
 'return the result.
 
 Dim strText   As String
 Dim lngResult  As Long
 Dim hOpenKey  As Long
 Dim lngBufferSize As Long
 
 'open the registry key
 hOpenKey = GetSubKeyHandle(enmHive, strSubKey)
 
 'check for error
 If hOpenKey = 0 Then
  'return error message
  ReadRegString = "Error : Cannot Open Key"
  Exit Function
 End If
 
 'setup the string to hold the return value
 strText = String(255, vbNullChar)
 lngBufferSize = Len(strText)
 
 'query the information in the key
 lngResult = RegQueryValueEx(hOpenKey, _
        strEntry, _
        0, _
        REG_SZ, _
        ByVal strText, _
        lngBufferSize)
 
 'close access to the key
 lngResult = RegCloseKey(hOpenKey)
 
 'check for no values returned
 If (Left(strText, 1) = vbNullChar) Then
  'return error message
  ReadRegString = "Error : Cannot Retrieve String"
  Exit Function
 Else
  'remove the null character
  If (InStr(1, strText, vbNullChar) > 0) Then
   strText = Left(strText, InStr(1, strText, vbNullChar) - 1)
  End If
 End If
 
 'function successful, return owners name
 ReadRegString = strText
End Function
Public Function ReadRegLong(ByVal enmHive As RegistryHives, _
       ByVal strSubKey As String, _
       ByVal strEntry As String, _
       Optional ByVal enmType As RegistryLongTypes = REG_BINARY) _
       As Long
 'This function will check a registery string
 'entry and return the lngResult.
 
 Dim lngValue  As Long
 Dim lngResult  As Long
 Dim hOpenKey  As Long
 Dim lngBufferSize As Long
 
 'open the registry key
 hOpenKey = GetSubKeyHandle(enmHive, strSubKey)
 
 'check for error
 If hOpenKey = 0 Then
  'return error message
  ReadRegLong = 0
  Exit Function
 End If
 
 lngBufferSize = 4
 
 'query the information in the key
 lngResult = RegQueryValueEx(hOpenKey, _
        strEntry, _
        ByVal 0&, _
        REG_BINARY, _
        lngValue, _
        lngBufferSize)
 
 'close access to the key
 lngResult = RegCloseKey(hOpenKey)
 
 'function successful, return owners name
 ReadRegLong = lngValue
End Function
Private Function GetSubKeyHandle(ByVal enmHive As RegistryHives, _
         ByVal strSubKey As String, _
         Optional ByVal enmAccess As RegistryKeyAccess = KEY_READ) _
         As Long
 'This function returns a handle to the specified registry key
 
 Dim lngResult As Long  'holds any returned error value from an api call
 Dim hKey  As Long  'holds the handle to the specified key
 
 'open the registry key
 lngResult = RegOpenKeyEx(enmHive, strSubKey, 0, enmAccess, hKey)
 
 If lngResult <> ERROR_SUCCESS Then
  'could not create key
  hKey = 0
 End If
  
 'return value
 GetSubKeyHandle = hKey
End Function
Public Function GetSpace(enmSpaceType As MemType, _
       Optional ByVal strDrive As String = "C:\") _
       As Long
 'This function returns the amount of specified memory, either in total
 'or available depending on what was passed.
 'Keep in mind that the information returned is volitile - if you call
 'the function twice, there is no guarentee that the values returned
 'will be the same.
 'Note also, that physical memory is ram memory and memory usage is
 'the amount of ram used.
 
 Const CpuSubKey As String = "PerfStats\StatData"
 Const CpuName As String = "KERNEL\CPUUsage"
 
 Dim enmMemStruc   As MEMORYSTATUS
 Dim lngResult   As Long
 Dim SecPerCluster  As Long
 Dim lngBytPerSector  As Long
 Dim lngFreeClusters  As Long
 Dim lngTotalClusters As Long
 
 'Before calling GlobalMemoryStatus, we have to tell it the length
 'of the structure we are passing it - this is required by the procedure.
 enmMemStruc.dwLength = Len(enmMemStruc)
 Call GlobalMemoryStatus(enmMemStruc)
 
 'get the disk space. The function must be passed the root directory of
 'a drive like "C:\" or "D:\" and must end with a Null character (chr(0) )
 If Len(strDrive) >= 3 Then
  lngResult = GetDiskFreeSpace((Left(strDrive, 3) & Chr(0)), _
          SecPerCluster, _
          lngBytPerSector, _
          lngFreeClusters, _
          lngTotalClusters)
 End If
 
 'save the selected lngResult
 Select Case enmSpaceType
 
 Case CPUUsage 'cpu usage
  lngResult = ReadRegLong(HKEY_DYN_DATA, CpuSubKey, CpuName)
 
 Case MemoryUsage 'ram usage
  lngResult = enmMemStruc.dwMemoryLoad
 
 Case TotalPhysical 'total ram
  lngResult = enmMemStruc.dwTotalPhys
 
 Case AvailablePhysical 'available ram
  lngResult = enmMemStruc.dwAvailPhys
 
 Case TotalPageFile 'total page file
  lngResult = enmMemStruc.dwTotalPageFile
 
 Case AvailablePageFile 'available page file
  lngResult = enmMemStruc.dwAvailPageFile
 
 Case TotalVirtual 'total virtual (swap file)
  lngResult = enmMemStruc.dwTotalVirtual
 
 Case AvailableVirtual 'available virtual
  lngResult = enmMemStruc.dwAvailVirtual
 
 Case TotalDisk 'hard drive space
  lngResult = lngTotalClusters * (lngBytPerSector * SecPerCluster)
 
 Case AvailableDisk 'available hard drive space
  lngResult = lngFreeClusters * (lngBytPerSector * SecPerCluster)
 
 Case Else
  'return -1 as an error code
  lngResult = -1
 End Select
 
 GetSpace = lngResult
End Function
Public Function GetCountry() As String
 'This will return the country from
 'the computers' regional settings
 
 Const CountryKey  As String = "sCountry" 'the registry entry that holds the country name
 Const DEFAULT_COUNTRY As String = "Ireland" 'the default country to return if unable to retrieve from the registry
 
 Dim strCountry   As String  'holds the value of the registry entry
 
 strCountry = ReadRegString(HKEY_USERS, _
        COUNTRY_SUBKEY, _
        CountryKey)
 
 'if it could not get the country, then default to
 'the programmers country
 If UCase(Left(strCountry, 5)) = "ERROR" Then
  strCountry = DEFAULT_COUNTRY
 End If
 
 'return the country
 GetCountry = strCountry
End Function
Public Function ShellFile(ByVal strFilePath As String, _
       Optional enmFocus As VbAppWinStyle = vbNormalFocus)
 'This will open any file with the appropiate program
 'as long as it is registered in the registry and
 'if the function is successful, it will return the
 'applications ID.
 
 Dim strExtention As String  'holds the file extention
 Dim lngDotPos  As Long   'the position of the last . character found in the string
 Dim lngAppId  As Long   'the process id for the started application
 Dim strWindowsDir As String  'the location of the windows directory
 Dim strSubKeyLoc As String  'the location of the registry sub key to open the file type
 Dim strOpenWith  As String  'the program to open the file with
 Dim strMulti()  As String  'the individual files if more than one is passed (multiple parameters)
 Dim intCounter  As Integer  'used to cycle through the file list
 
 'get the windows directory
 strWindowsDir = GetWinDirectories(WindowsDir)
 
 'strip qutoation marks from the file path
 strFilePath = Replace(strFilePath, """", "")
 
 'see if the file is a directory, if so open in
 'explorer
 If HasFileAttrib(strFilePath, vbDirectory) Then
  'open the directory
  lngAppId = Shell(AddFile(strWindowsDir, _
         "Explorer.exe /n,/e," _
         & strFilePath), _
       enmFocus)
  
  ShellFile = lngAppId
  Exit Function
 End If
 
 'get the file extention if any exists (after the last
 'position of the backslash)
 lngDotPos = InStrRev(strFilePath, ".")
 If (lngDotPos > 0) Then
  If (InStr(lngDotPos, strFilePath, "\") = 0) Then
   'file extention exists
   strExtention = Right(strFilePath, _
         Len(strFilePath) - _
         lngDotPos + 1)
  End If
 End If
 
 'if the extention marks any executable file, then
 'simple run it
 Select Case LCase(strExtention)
 Case ".exe", ".com", ".bat", ""
 
  'make sure the file exists
  If (Dir(strFilePath) <> "") And (Trim(strFilePath) <> "") Then
   lngAppId = Shell(strFilePath, enmFocus)
   
   'return a pointer to the application instance
   ShellFile = lngAppId
  End If
  Exit Function
 End Select
 
 'we need to check the executable file types that
 'can run on their own
 strSubKeyLoc = ReadRegString(HKEY_CLASSES_ROOT, _
         strExtention)
 strOpenWith = ReadRegString(HKEY_CLASSES_ROOT, _
        AddFile(strSubKeyLoc, _
          "shell\open\command"))
 
 'make sure no error was returned
 If UCase(Left(strOpenWith, 5)) = "ERROR" Then
  'couldn't open file
  ShellFile = 0
  Exit Function
 End If
 
 'process the string returned so that we can send
 'it to the Shell function
 If InStr(strOpenWith, "%1") > 0 Then
  'replace the parameters with the appropiate
  'file names
  If InStr(strOpenWith, ",") = 0 Then
   'process one file
   strOpenWith = Replace(strOpenWith, _
         "%1", _
         strFilePath)
  Else
   'process multiple files
   strMulti = Split(strFilePath, ",")
   
   For intCounter = LBound(strMulti) To UBound(strMulti)
    'replace each parameter string with the
    'corresponding number of elements found
    strOpenWith = Replace(strOpenWith, _
          "%" & intCounter, _
          strMulti(intCounter))
   Next intCounter
  End If
 Else
  'insert the file name(s) at the end of the
  'name of the program. Please note, that this
  'might not actually work for some programs as
  'the extra parameter may produce an error or be
  'ignored altogether. However this is unlikley
  'as this program path was found in the "Open"
  'section of the program commands.
  strOpenWith = strOpenWith & " " & _
      Chr(34) & strFilePath & Chr(34) 'chr(34) is a double quote character (")
 End If
 
 'replace system path codes with the actual paths (typically on an NT
 'based machine) --NOT case sensitive with vbTextCompare--
 strOpenWith = Replace(strOpenWith, _
       "%SystemDrive%", _
       Left(GetWinDirectories(WindowsDir), 3), _
       Compare:=vbTextCompare)
 strOpenWith = Replace(strOpenWith, _
       "%SystemRoot%", _
       GetWinDirectories(WindowsDir), _
       Compare:=vbTextCompare)
 
 'open the file
 lngAppId = Shell(strOpenWith, enmFocus)
 ShellFile = lngAppId
End Function
Private Function AddFile(ByVal strPath As String, _
       ByVal strFileName As String) _
       As String
 
 'This function takes a file name and a path and will
 'put the two together to form a filepath. This is useful
 'for when the applications' path happens to be the root
 'directory.
 
 If (strPath = "") Then
  'no path was passed
  AddFile = strFileName
  Exit Function
 End If
 
 'check the last character for a backslash
 If Left(strPath, 1) = "\" Then
  'don't insert a backslash
  AddFile = strPath & strFileName
 Else
  'insert a backslash
  AddFile = strPath & "\" & strFileName
 End If
End Function
Private Function FileExists(ByVal strFilePath As String, _
       Optional ByVal enmFlags As VbFileAttribute = vbNormal) _
       As Boolean
 'returns True if the file exists
 
 If ((strFilePath = "") Or _
  (Dir(strFilePath, enmFlags) = "")) Then
  'invalid path/filename
  FileExists = False
 Else
  FileExists = True
 End If
End Function
Private Function HasFileAttrib(ByVal strFilePath As String, _
        Optional ByVal enmFlags As VbFileAttribute) _
        As Boolean
 'returns True if the file specified has the
 'appropiate type signiture, eg, a directory or is
 'read-only. If testing multiple attributes, then
 'the file MUST have all attributes to return True
 
 Dim lngErrNum As Long 'holds any error that occurred trying to access the file
 
 'make sure the file exists without upsetting any
 'stored values when the Dir function is being used
 'externally by another procedure/function
 On Error Resume Next
  'test file access
  GetAttr strFilePath
  lngErrNum = Err
 On Error GoTo 0
 
 'exit if an error occured ("#53 - File Not Found"
 'usually occurs)
 If lngErrNum > 0 Then
  HasFileAttrib = False
  Exit Function
 End If
 
 'test the file for attributes
 If ((GetAttr(strFilePath) And enmFlags) = enmFlags) Then
  HasFileAttrib = True
 Else
  HasFileAttrib = False
 End If
End Function
Private Function IsWinNT() As Boolean
 'Detect if the program is running under an NT based system (NT, 2000, XP)
 
 Const VER_PLATFORM_WIN32_NT  As Long = 2
 
 Dim osiInfo As OSVERSIONINFO 'holds the operating system information
 Dim lngResult As Long    'returned error value from the api call
 
 'get version information
 osiInfo.dwOSVersionInfoSize = Len(osiInfo)
 lngResult = GetVersionEx(osiInfo)
 
 'return True if the test of windows NT is positive
 IsWinNT = (osiInfo.dwPlatformId = VER_PLATFORM_WIN32_NT)
End Function
Public Sub NTMenus(ByVal enmPrivilage As EnumNTSettings, _
     ByVal blnEnable As Boolean)
 'This will enable or disable the windows task manager. Please note that
 'this procedure does not work on any Non-NT based system (win 9x)
 
 Const CHANGE_PASS As String = "DisableChangePassword"
 Const LOCK_WORK_ST As String = "DisableLockWorkStation"
 Const REG_TOOLS  As String = "DisableRegistryTools"
 Const TASK_MANAGER As String = "DisableTaskMgr"
 'disable parts of the Display dialog box
 Const DISPLAY_PAGE As String = "NoDispAppearancePage"
 Const DISPLAY_BPAGE As String = "NoDispBackgroundPage"
 Const DISPLAY_CPL As String = "NoDispCPL"
 Const DISPLAY_SCRSV As String = "NoDispScrSavPage"
 Const DISPLAY_SETT As String = "NoDispSettingsPage"
 
 Dim strValueName As String 'holds the Value to open
 Dim lngFlag   As Long  'holds the value to set the setting
 
 If Not IsWinNT Then
  'cannot change settings unless this is a winnt system
  Exit Sub
 End If
 
 'get the text to for the registry value for the selected setting
 Select Case enmPrivilage
  'items that can be disabled on the Lock Screen
 Case CHANGE_PASSWORD
  strValueName = CHANGE_PASS
  
 Case LOCK_WORKSTATION
   strValueName = LOCK_WORK_ST
   
 Case REGISTRY_TOOLS
  strValueName = REG_TOOLS
  
 Case TASK_MGR
  strValueName = TASK_MANAGER
 
  'the tabs on the Display Properties dialog box
 Case DISP_APPEARANCE_PAGE
  strValueName = DISPLAY_PAGE
  
 Case DISP_BACKGROUND_PAGE
  strValueName = DISPLAY_BPAGE
  
 Case DISP_CPL
  strValueName = DISPLAY_CPL
  
 Case DISP_SCREENSAVER
  strValueName = DISPLAY_SCRSV
  
 Case DISP_SETTINGS
  strValueName = DISPLAY_SETT
  
 Case Else
  'invalid selection
  Exit Sub
 End Select
 
 'get the value settings
 If Not blnEnable Then
  'disable option
  lngFlag = 1
 Else
  'enable option
  lngFlag = 0
 End If
 
 If IsWinNT Then
  'NT registry location
  Call CreateRegLong(HKEY_CURRENT_USER, _
       NT_SETTINGS, _
       strValueName, _
       lngFlag)
  
  If IsW2000 Then
   'windows 2000 needs an additional entry
   Call CreateRegLong(HKEY_CURRENT_USER, _
        W2K_SETTINGS, _
        strValueName, _
        lngFlag)
  End If
 End If
End Sub
Public Sub AutoRestartShell(ByVal blnEnable As Boolean)
 'This will turn on/off whether or not the windows shell restarts if it is
 'shutdown or not. This only works on NT based systems
 
 'in registry hive HKEY_LOCAL_MACHINE
 Const AUTO_RESTART_SUBKEY As String = "Software\Microsoft\Windows NT\" + _
           "CurrentVersion\WinLogon"
 
 Dim lngResult As Long   'holds any returned error value from an api call
 Dim hKey  As Long   'holds a handle to the opened key
 Dim lngData  As Long   'holds the data going into the registry key
 
 'if this is not an NT machine, this won't work
 If Not IsWinNT Then
  Exit Sub
 End If
 
 'get the value of the data going into the registry key
 lngData = Abs(blnEnable)
 
 'set the value to enable or disable the specified setting
 Call CreateRegLong(HKEY_LOCAL_MACHINE, _
      AUTO_RESTART_SUBKEY, _
      "AutoRestartShell", _
      lngData)
End Sub
Public Function IsW2000() As Boolean
 'This will only return True if the version returned by the registry
 'value CurrentVersion is 5
 
 Dim strVersion  As String  'holds the verion number of the operating system
 
 'the the machine NT based (NT, 2000, XP)
 If Not IsWinNT Then
  IsW2000 = False
  Exit Function
 End If
 
 'check the version
 strVersion = ReadRegString(HKEY_LOCAL_MACHINE, _
        WIN_NT_INFO_SUBKEY, _
        "CurrentVersion")
 
 'could we read the registry entry
 If Len(strVersion) < 0 Then
  IsW2000 = False
  Exit Function
 End If
 
 'check the version
 If (strVersion = "") Then
  IsW2000 = False
 
 Else
  If Left(strVersion, 1) = "5" Then
   IsW2000 = True
  Else
   IsW2000 = False
  End If
 End If
End Function
Public Sub OppLocking(ByVal blnEnable As Boolean)
 'This will enable or disable oppertunistic locking on an NT based machine
 
 'in HKEY_LOCAL_MACHINE registry hive
 Const LOCK_OP_SUBKEY As String = "System\CurrentControlSet\Services"
 Const W2K_lOCK_LOCAL As String = LOCK_OP_SUBKEY + "\LanManServer\Parameters"
 Const W2K_LOCK_REMOTE As String = LOCK_OP_SUBKEY + "\MrxSmb\Parameters"
 Const WNT_LOCK_LOCAL As String = LOCK_OP_SUBKEY + "\LanManWorkStation\Parameters"
 Const WNT_LOCK_REMOTE As String = LOCK_OP_SUBKEY + "\LanManServer\Parameters"
 
 Dim lngData    As Long  'holds the numeric value to set to
 
 'make sure we are running on an NT based system
 If Not IsWinNT Then
  Exit Sub
 End If
 
 'what kind of NT based system are we running on
 If IsW2000 Then
  'enable/disable opportunistic locking on windows 2000
  lngData = Abs(blnEnable)
  
  'local locking
  Call CreateRegLong(HKEY_LOCAL_MACHINE, _
       W2K_lOCK_LOCAL, _
       "EnableOpLocks", _
       lngData)
  
  'remote locking
  lngData = Abs(Not blnEnable)
  
  Call CreateRegLong(HKEY_LOCAL_MACHINE, _
       W2K_LOCK_REMOTE, _
       "OplocksDisabled", _
       lngData)
 
 Else
  'enable/disable opportunistic locking on windows NT
  
  lngData = Abs(blnEnable)
  
  'local locking
  Call CreateRegLong(HKEY_LOCAL_MACHINE, _
       WNT_LOCK_LOCAL, _
       "UseOpportunisticLocking", _
       lngData)
  
  'remote locking
  Call CreateRegLong(HKEY_LOCAL_MACHINE, _
       WNT_LOCK_REMOTE, _
       "EnableOpLocks", _
       lngData)
 End If
End Sub
Public Sub CreateRegLong(ByVal enmHive As RegistryHives, _
       ByVal strSubKey As String, _
       ByVal strValueName As String, _
       ByVal lngData As Long, _
       Optional ByVal enmType As RegistryLongTypes = REG_DWORD_LITTLE_ENDIAN)
 'This will create a value in the registry of the specified type
 'and value data
 
 Dim hKey  As Long  'holds a pointer to an open registry key
 Dim lngResult As Long  'holds any returned error value from an api call
 
 'make sure the registry value exists
 Call CreateSubKey(enmHive, strSubKey)
 
 'open the subkey
 hKey = GetSubKeyHandle(enmHive, strSubKey, KEY_SET_VALUE)
 
 'create the registry value
 lngResult = RegSetValueEx(hKey, _
        strValueName, _
        0, _
        enmType, _
        lngData, _
        4)
 
 'close the registry key
 lngResult = RegCloseKey(hKey)
End Sub
Public Sub OpenVbIdeMaximized(ByVal blnEnable As Boolean)
 'This will set the vb ide to open projects maximized by default
 
 'HKEY_CURRENT_USER
 Const VB_IDE_SUB_KEY As String = "\Software\Microsoft\Visual Basic\6.0"
 
 Call CreateRegString(HKEY_CURRENT_USER, _
       VB_IDE_SUB_KEY, _
       "MDIMaximized", _
       Trim(Str(Abs(blnEnable))))
End Sub
Public Sub SaveArray(ByRef varArray() As Variant, _
      ByVal enmHive As RegistryHives, _
      ByVal strSubKey As String, _
      Optional ByVal strArrayName As String = "VB6_Array", _
      Optional ByVal enmDataType As RegistryDataTypes = REG_DT_SZ)
 'This will save an array of the specified data type to the specified
 'registry sub key. The array must be initialised and valid for the
 'data type specified as there is no checking done to validate the data.
 
 Dim lngCounter  As Long   'used to cycle through the array specified
 Dim lngMin   As Long   'holds the lower bound of the array
 Dim lngMax   As Long   'holds the upper bound of the array
 
 'make sure that a valid subkey was passed
 If (Trim(strSubKey) = "") Then
  Exit Sub
 End If
 
 'make sure that the sub key exists in the registry
 Call CreateSubKey(enmHive, strSubKey)
 
 'get the size of the array
 lngMin = LBound(varArray)
 lngMax = UBound(varArray)
 
 'save the bounds in the specified key
 Call CreateRegLong(enmHive, _
      strSubKey, _
      (strArrayName + "LBound"), _
      lngMin, _
      REG_BINARY)
 Call CreateRegLong(enmHive, _
      strSubKey, _
      (strArrayName + "UBound"), _
      lngMax, _
      REG_BINARY)
 
 'save the elements of the array to the registry
 For lngCounter = lngMin To lngMax
  If (enmDataType = REG_DT_SZ) Then
   'save as string
   Call CreateRegString(enmHive, _
         strSubKey, _
         (strArrayName & lngCounter), _
         varArray(lngCounter))
   
  Else
   'save as numeric
   Call CreateRegLong(enmHive, _
        strSubKey, _
        (strArrayName & lngCounter), _
        varArray(lngCounter), _
        enmDataType)
  End If
 Next lngCounter
End Sub
Public Sub LoadArray(ByRef varArray() As Variant, _
      ByVal enmHive As RegistryHives, _
      ByVal strSubKey As String, _
      Optional ByVal strArrayName As String = "VB6_Array", _
      Optional ByVal enmDataType As RegistryDataTypes = REG_DT_SZ)
 'This will load an array saved with the SaveArray procedure above. The
 'data must have been saved using the correct data and datatypes. The array
 'passed to this procedure will be wiped, resized and loaded with whatever
 'information can be retrieved from the registry. It is up to the programmer
 'to ensure that the correct data types are passed to the procedure or the
 'information returned may be corrupt if any information is returned at all.
 
 Dim lngCounter  As Long   'used to cycle through the array specified
 Dim lngMin   As Long   'holds the lower bound of the array
 Dim lngMax   As Long   'holds the upper bound of the array
 
 'make sure that the correct sub key was passed
 If (Trim(strSubKey) = "") Then
  Exit Sub
 End If
 
 'get the size of the array
 lngMin = ReadRegLong(enmHive, _
       strSubKey, _
       (strArrayName + "LBound"), _
       REG_BINARY)
 lngMax = ReadRegLong(enmHive, _
       strSubKey, _
       (strArrayName + "UBound"), _
       REG_BINARY)
 
 'resize the array to accomidate the data
 ReDim varArray(lngMin To lngMax)
 
 For lngCounter = lngMin To lngMax
  If (enmDataType = REG_DT_SZ) Then
   'read string data into the array
   varArray(lngCounter) = ReadRegString(enmHive, _
             strSubKey, _
             (strArrayName & lngCounter))
  
  Else
   'read numeric data into the array
   varArray(lngCounter) = ReadRegLong(enmHive, _
            strSubKey, _
            (strArrayName & lngCounter), _
            enmDataType)
  End If
 Next lngCounter
End Sub
Public Sub SetNumLock(Optional ByVal blnTurnOn As Boolean = True)
 'This will turn the numlock on or off when logging in to Nt/2000/XP
 
 Const NUMLOCK_SUBKEY As String = "Control Panel\Keyboard" 'HKEY_CURRENT_USER
 Const NUMLOCK_VALUE  As String = "InitialKeyboardIndicators"
 
 Dim strOnText As String 'holds the actual string value that turns the numlock on or off
 
 If Not IsWinNT Then
  'this won't work on a non-nt based system
  Exit Sub
 End If
 
 If blnTurnOn Then
  strOnText = "2" 'on
 Else
  strOnText = "0" 'off
 End If
 
 Call CreateRegString(HKEY_CURRENT_USER, _
       NUMLOCK_SUBKEY, _
       NUMLOCK_VALUE, _
       strOnText)
End Sub

Download this snippet    Add to My Saved Code

The Complete Registry Module Comments

No comments have been posted about The Complete Registry Module. Why not be the first to post a comment about The Complete Registry Module.

Post your comment

Subject:
Message:
0/1000 characters