/* Written by Matty You may use this code for whatever you would like however you must keep this header. You may use include this script with your own if you would like. Version 1.01 - Added EnumRegistryValues - Added EnumRegistryKeys Version 1.00 - Initial Release Questions/Concerns/Bugs Email Me : matty@msgplus.net */ // Registry value types var REG_NONE = 0; /* 'No value type' */ var REG_SZ = 1; /* 'Unicode nul terminated string' */ var REG_EXPAND_SZ = 2; /* 'Unicode nul terminated string with expandable items' */ var REG_BINARY = 3; /* 'Free form binary' */ var REG_DWORD = 4; /* '32-bit integer (LE)' */ var REG_DWORD_LITTLE_ENDIAN = 4; /* '32-bit integer (LE)' */ var REG_DWORD_BIG_ENDIAN = 5; /* '32-bit integer (BE)' */ var REG_LINK = 6; /* 'Symbolic unicode link (reserved for system use)' */ var REG_MULTI_SZ = 7; /* 'Multiple unicode strings' */ var REG_RESOURCE_LIST = 8; /* 'Resource list in the resource map' */ var REG_FULL_RESOURCE_DESCRIPTOR = 9; /* 'Resource list in the hardware description' */ var REG_RESOURCE_REQUIREMENTS_LIST = 10; /* '' */ var REG_QWORD = 11; /* '64-bit integer (LE)' */ var REG_QWORD_LITTLE_ENDIAN = 11; /* '64-bit integer (LE)' */ // Registry key locations var HKEY_CLASSES_ROOT = 0x80000000; var HKEY_CURRENT_USER = 0x80000001; var HKEY_LOCAL_MACHINE = 0x80000002; var HKEY_USERS = 0x80000003; var HKEY_PERFORMANCE_DATA = 0x80000004; var HKEY_PERFORMANCE_TEXT = 0x80000050; var HKEY_PERFORMANCE_NLSTEXT = 0x80000060; var HKEY_CURRENT_CONFIG = 0x80000005; var HKEY_DYN_DATA = 0x80000006; var KEY_READ = 0x20019; var KEY_WRITE = 0x20006; var KEY_EXECUTE = 0x20019; var KEY_ALL_ACCESS = 0xf003f; var REG_OPTION_NON_VOLATILE = 0; var ERROR_SUCCESS = 0; var ERROR_NO_MORE_ITEMS = 259; function CreateKey(lKeyLocation, sKey){ var hKey = Interop.Allocate(4); var lRetVal = Interop.Call('advapi32.dll', 'RegCreateKeyW', lKeyLocation, sKey, hKey); if (lRetVal == ERROR_SUCCESS) { CloseKey(hKey.ReadDWORD(0)); return true; } else{ return false; } } function DeleteKey(lKeyLocation, sKey){ var hKey = Interop.Allocate(4); var lRetVal = Interop.Call('advapi32.dll', 'RegDeleteKeyW', lKeyLocation, sKey); if (lRetVal == ERROR_SUCCESS) { CloseKey(hKey.ReadDWORD(0)); return true; } else{ return false; } } function DeleteKeyValue(lKeyLocation, sKey, sKeyName){ var hKey = Interop.Allocate(4); var lRetVal = Interop.Call('advapi32.dll', 'RegOpenKeyExW', lKeyLocation, sKeyName, 0, KEY_WRITE, hKey) if (lRetVal == ERROR_SUCCESS) { lRetVal = Interop.Call('advapi32.dll', 'RegDeleteValueW', hKey.ReadDWORD(0), sKeyName); if (lRetVal == ERROR_SUCCESS) { CloseKey(hKey.ReadDWORD(0)); return true; }else{ return false; } }else{ return false; } } function KeyExist(lKeyLocation, sKey){ var hKey = Interop.Allocate(4); var lRetVal = Interop.Call('advapi32.dll', 'RegOpenKeyExW', lKeyLocation, sKey, 0, KEY_READ, hKey); if (lRetVal == ERROR_SUCCESS){ CloseKey(hKey.ReadDWORD(0)); return true; }else{ return false; } } function KeyValueExist(lKeyLocation, sKey, sKeyName){ var hKey = Interop.Allocate(4); var buff_size = 255; var lBufferSize = Interop.Allocate(4); lBufferSize.WriteDWORD(0, 2 * buff_size); var lBuffer = Interop.Allocate(2 * (buff_size + 2)); var lRetVal = Interop.Call('advapi32.dll', 'RegOpenKeyExW', lKeyLocation, sKey, 0, KEY_READ, hKey); if (lRetVal == ERROR_SUCCESS){ var lpType = Interop.Allocate(4); lRetVal = Interop.Call('advapi32.dll', 'RegQueryValueExW', hKey.ReadDWORD(0), sKeyName, 0, lpType, lBuffer, lBufferSize); if (lRetVal == ERROR_SUCCESS){ CloseKey(hKey.ReadDWORD(0)); return true; }else{ return false; } }else{ return false; } } function _getKey(lKeyLocation, sKey, sKeyName){ // RegOpenKeyEx API doesn't support the special alias HKEY_CURRENT_CONFIG if (lKeyLocation === HKEY_CURRENT_CONFIG) { lKeyLocation = HKEY_LOCAL_MACHINE; sKey = "System\\CurrentControlSet\\Hardware Profiles\\Current\\" + sKey; } // Open the specified key and get the handle var hKey = Interop.Allocate(4); var lRetVal = Interop.Call('Advapi32', 'RegOpenKeyExW', lKeyLocation, sKey, 0, KEY_READ, hKey.DataPtr); if (lRetVal === ERROR_SUCCESS) { // Obtain the correct length of the needed buffer // This is forgotten, skipped, or a fixed width is used in extremely large amounts of sources var lBufferSize = Interop.Allocate(4); var lRetVal = Interop.Call('Advapi32', 'RegQueryValueExW', hKey.ReadDWORD(0), sKeyName, 0, REG_NONE, 0, lBufferSize.DataPtr); if (lRetVal === ERROR_SUCCESS) { // Read the actual data from the registry and fill the buffer with it var lpType = Interop.Allocate(4); var lBuffer = Interop.Allocate(Math.max(4, lBufferSize.ReadDWORD(0))); lRetVal = Interop.Call('Advapi32', 'RegQueryValueExW', hKey.ReadDWORD(0), sKeyName, 0, lpType.DataPtr, lBuffer.DataPtr, lBufferSize.DataPtr); CloseKey(hKey.ReadDWORD(0)); if (lRetVal === ERROR_SUCCESS) { if (lpType.ReadDWORD(0) === REG_DWORD_BIG_ENDIAN) { return (lBuffer.GetAt(0) & 0xFF) + (lBuffer.GetAt(1) & 0xFF)*2 + (lBuffer.GetAt(2) & 0xFF)*4 + (lBuffer.GetAt(3) & 0xFF)*8; } else if (lpType.ReadDWORD(0) == REG_SZ || lpType.ReadDWORD(0) == REG_EXPAND_SZ || lpType.ReadDWORD(0) == REG_MULTI_SZ){ return lBuffer.ReadString(0); } else if (lpType.ReadDWORD(0) == REG_DWORD){ return lBuffer.ReadDWORD(0); } else if (lpType.ReadDWORD(0) == REG_BINARY){ return lBuffer.ReadString(0); } } } } } function _setKey(lKeyLocation, sKey, sKeyName, lpType){ // RegOpenKeyEx API doesn't support the special alias HKEY_CURRENT_CONFIG if (lKeyLocation === HKEY_CURRENT_CONFIG) { lKeyLocation = HKEY_LOCAL_MACHINE; sKey = "System\\CurrentControlSet\\Hardware Profiles\\Current\\" + sKey; } // Open the specified key and get the handle var hKey = Interop.Allocate(4); var lRetVal = Interop.Call('Advapi32', 'RegOpenKeyExW', lKeyLocation, sKey, 0, KEY_READ, hKey.DataPtr); if (lRetVal === ERROR_SUCCESS) { // Obtain the correct length of the needed buffer // This is forgotten, skipped, or a fixed width is used in extremely large amounts of sources var lBufferSize = Interop.Allocate(4); var lRetVal = Interop.Call('Advapi32', 'RegQueryValueExW', hKey.ReadDWORD(0), sKeyName, 0, REG_NONE, 0, lBufferSize.DataPtr); if (lRetVal === ERROR_SUCCESS) { // Read the actual data from the registry and fill the buffer with it var lpType = Interop.Allocate(4); var lBuffer = Interop.Allocate(Math.max(4, lBufferSize.ReadDWORD(0))); lRetVal = Interop.Call('Advapi32', 'RegQueryValueExW', hKey.ReadDWORD(0), sKeyName, 0, lpType.DataPtr, lBuffer.DataPtr, lBufferSize.DataPtr); CloseKey(hKey.ReadDWORD(0)); if (lRetVal === ERROR_SUCCESS) { if (lpType.ReadDWORD(0) === REG_DWORD_BIG_ENDIAN) { return (lBuffer.GetAt(0) & 0xFF) + (lBuffer.GetAt(1) & 0xFF)*2 + (lBuffer.GetAt(2) & 0xFF)*4 + (lBuffer.GetAt(3) & 0xFF)*8; } else if (lpType.ReadDWORD(0) == REG_SZ || lpType.ReadDWORD(0) == REG_EXPAND_SZ || lpType.ReadDWORD(0) == REG_MULTI_SZ){ return lBuffer.ReadString(0); } else if (lpType.ReadDWORD(0) == REG_DWORD){ return lBuffer.ReadDWORD(0); } else if (lpType.ReadDWORD(0) == REG_BINARY){ return lBuffer.ReadString(0); } } } } } function SetDWordValue(lKeyLocation, sKey, sKeyName, lKeyValue) { var nResult = false; var hKey = Interop.Allocate(4); var lRetVal = Interop.Call('Advapi32', 'RegCreateKeyExW', lKeyLocation, sKey, 0, 0, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, hKey.DataPtr, 0); if (lRetVal === ERROR_SUCCESS) { var pKeyValue = Interop.Allocate(4); pKeyValue.WriteDWORD(0, lKeyValue & 0xFFFFFFFF); var lRetVal = Interop.Call('Advapi32', 'RegSetValueExW', hKey.ReadDWORD(0), sKeyName, 0, REG_DWORD, pKeyValue.DataPtr, 4); var nResult = lRetVal === ERROR_SUCCESS; CloseKey(hKey.ReadDWORD(0)); } return nResult; } function SetStringValue(lKeyLocation, sKey, sKeyName, sKeyValue){ var hKey = Interop.Allocate(4); var buff_size = 255; var lBufferSize = Interop.Allocate(4); lBufferSize.WriteDWORD(0, buff_size); var lRetVal = Interop.Call('advapi32.dll', 'RegOpenKeyExW', lKeyLocation, sKey, 0, KEY_WRITE, hKey); if (lRetVal == ERROR_SUCCESS){ lRetVal = Interop.Call('advapi32.dll', 'RegSetValueExW', hKey.ReadDWORD(0), sKeyName, 0, REG_SZ, sKeyValue, lBufferSize.ReadDWORD(0)); if (lRetVal == ERROR_SUCCESS){ CloseKey(hKey.ReadDWORD(0)); return true; }else{ return false; } }else{ return false; } } function SetBinaryValue(lKeyLocation, sKey, sKeyName, sKeyValue){ } function EnumRegistryKeys(lKeyLocation, sKey){ var hKey = Interop.Allocate(4); var lpName = Interop.Allocate((255+1) * 2); var lpcName = Interop.Allocate(4); lpcName.WriteDWORD(0, 255); var lpftLastWriteTime = Interop.Allocate(8); var sReturnArray = new Array() var lIndex = 0; var lRetVal = Interop.Call('advapi32.dll', 'RegOpenKeyExW', lKeyLocation, sKey, 0, KEY_READ, hKey); if (lRetVal == ERROR_SUCCESS){ while (Interop.Call('advapi32', 'RegEnumKeyExW', hKey.ReadDWORD(0), lIndex, lpName, lpcName, 0, 0, 0, lpftLastWriteTime) != ERROR_NO_MORE_ITEMS){ sReturnArray[lIndex] = lpName.ReadString(0); lIndex++; lpcName.WriteDWORD(0, 255); lpName = Interop.Allocate((255+1) * 2); } CloseKey(hKey.ReadDWORD(0)); return sReturnArray; } } function EnumRegistryValues(lKeyLocation, sKey){ var hKey = Interop.Allocate(4); var lpName = Interop.Allocate((255+1) * 2); var lpcName = Interop.Allocate(4); lpcName.WriteDWORD(0, 255); var lpType = Interop.Allocate(4); var lpData = Interop.Allocate(4); var lpftLastWriteTime = Interop.Allocate(8); var sReturnArray = new Array() var lIndex = 0; var lRetVal = Interop.Call('advapi32.dll', 'RegOpenKeyExW', lKeyLocation, sKey, 0, KEY_READ, hKey); if (lRetVal == ERROR_SUCCESS){ while (Interop.Call('advapi32', 'RegEnumValueW', hKey.ReadDWORD(0), lIndex, lpName, lpcName, 0, lpType, lpData, lpftLastWriteTime) != ERROR_NO_MORE_ITEMS){ sReturnArray[lIndex] = lpName.ReadString(0); lIndex++; lpcName.WriteDWORD(0, 255); lpName = Interop.Allocate((255+1) * 2); } CloseKey(hKey.ReadDWORD(0)); return sReturnArray; } } function CloseKey(hKey){ return Interop.Call('advapi32.dll', 'RegCloseKey', hKey); }