From fb2eb4ee611e410fce46900b9dfdcabf63681237 Mon Sep 17 00:00:00 2001 From: Kaalu <7735979+JakovBradvica@users.noreply.github.com> Date: Wed, 6 Jun 2018 16:35:48 +0200 Subject: [PATCH 1/5] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added .toString('binary') to make ä/ü/ö/etc characters readable. //avoiding null escape --- registry.js | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 registry.js diff --git a/registry.js b/registry.js new file mode 100644 index 0000000..491386f --- /dev/null +++ b/registry.js @@ -0,0 +1,148 @@ +/* global Buffer */ +'use strict'; +var ffi = require('ffi'), + types = require('./types'), + advApi = require('./native/adv_api'), + Key = require('./key'), + ref = require('ref'), + error = require('./error'), + windef = require('./windef'), + debug = require('debug')('windows-registry'); + +var api = { + openKeyFromPredefined: function (preDefinedKey, subKeyName, accessLevel) { + if (preDefinedKey < 0x80000000 || preDefinedKey > 0x80000006) { + throw 'The key ' + preDefinedKey + ' is not valid. Use the windef module for the list of predefined keys'; + } + + var pHkey = ref.alloc(types.PHKEY, new Buffer(ref.sizeof.pointer)); + console.log('PHKEY LENGTH: ' + pHkey.deref().length); + var result = advApi.RegOpenKeyExA(preDefinedKey, subKeyName, 0, accessLevel, pHkey); + debug('result:' + result); + if (result !== 0) { + throw 'Failed to open key error: ' + error[result]; + } + + return new Key(pHkey, subKeyName); + }, + openKeyFromKeyObject: function (keyObject, subKeyName, accessLevel) { + var pHkey = ref.alloc(types.PHKEY, new Buffer(ref.sizeof.pointer)); + + // RegOpenKeyEx can also take an HKEY in addition to a predefined value + var advApi2 = ffi.Library('Advapi32', { + RegOpenKeyExA: ['long', [types.HKEY, 'string', types.DWORD, types.REGSAM, types.PHKEY]] + }); + var result = advApi2.RegOpenKeyExA(keyObject.handle.deref(), subKeyName, 0, accessLevel, pHkey); + + if (result !== 0) { + throw 'Failed to open key error: ' + error[result]; + } + + return new Key(pHkey, subKeyName); + }, + queryValueForKeyObject: function (key, valueName) { + var pKeyDataLength = ref.alloc(types.LPDWORD, new Buffer(ref.sizeof.pointer)), + pKeyType = ref.alloc(types.LPDWORD, new Buffer(ref.sizeof.pointer)); + // QUERY FOR VALUE SIZE & TYPE + var result = advApi.RegQueryValueExA(key.handle.deref(), valueName, null, pKeyType, null, pKeyDataLength); + // READ VALUE + var value = new Buffer(pKeyDataLength.readUInt32LE()), + valueType = pKeyType.readUInt32LE(); + switch (valueType) { + case windef.REG_VALUE_TYPE.REG_SZ: + case windef.REG_VALUE_TYPE.REG_EXPAND_SZ: + case windef.REG_VALUE_TYPE.REG_LINK: + value.type = types.LPCTSR; + break; + case windef.REG_VALUE_TYPE.REG_BINARY: + value.type = types.PVOID; + break; + case windef.REG_VALUE_TYPE.REG_DWORD: + case windef.REG_VALUE_TYPE.REG_DWORD_BIG_ENDIAN: + case windef.REG_VALUE_TYPE.REG_DWORD_LITTLE_ENDIAN: + value.type = types.DWORD; + break; + default: + throw 'The Value Type: ' + valueType + ' is currently unsupported'; + } + + // READ VALUE + result = advApi.RegQueryValueExA(key.handle.deref(), valueName, null, pKeyType, value, pKeyDataLength); + + if (result !== 0) { + throw 'Failed to open key error: ' + error[result]; + } + + if (value.type === types.LPTSR) { + // TODO not sure why buffer's utf8 parsing leaves in the unicode null + // escape sequence. This is a work-around (at least on node 4.1) + value = value.toString('binary').replace('\u0000', ''); + } + + return value; + }, + setValueForKeyObject: function (key, valueName, valueType, value) { + if (valueType < 1 || valueType > 8) { + throw 'Invalid valueType parameter: ' + valueType + ' use values from windef.REG_VALUE_TYPE'; + } + var buffer, + byte, + result; + + switch (valueType) { + case windef.REG_VALUE_TYPE.REG_SZ: + case windef.REG_VALUE_TYPE.REG_EXPAND_SZ: + case windef.REG_VALUE_TYPE.REG_LINK: + buffer = new Buffer(value, 'utf8'); + byte = ref.alloc(types.LPBYTE, buffer); + debug('content length:' + Buffer.byteLength(value, 'utf8')); + debug(value); + debug(buffer.length); + result = advApi.RegSetValueExA(key.handle.deref(), valueName, null, valueType, byte.deref(), Buffer.byteLength(value, 'utf8')); + break; + case windef.REG_VALUE_TYPE.REG_BINARY: + // we assume that the value is a buffer since it should be binary data + buffer = value; + byte = ref.alloc(types.LPBYTE, buffer); + result = advApi.RegSetValueExA(key.handle.deref(), valueName, null, valueType, byte.deref(), buffer.length); + break; + case windef.REG_VALUE_TYPE.REG_DWORD: + case windef.REG_VALUE_TYPE.REG_DWORD_BIG_ENDIAN: + case windef.REG_VALUE_TYPE.REG_DWORD_LITTLE_ENDIAN: + buffer = new Buffer(4, value); + result = advApi.RegSetValueExA(key.handle.deref(), valueName, null, valueType, byte.deref(), buffer.length); + break; + default: + throw 'The type ' + valueType + ' is currently unsupported'; + } + + if (result !== 0) { + throw 'Failed to open key error: ' + error[result]; + } + }, + createKey: function (key, subKeyName, accessLevel) { + var pHkey = ref.alloc(types.PHKEY, new Buffer(ref.sizeof.pointer)); + + var result = advApi.RegCreateKeyExA(key.handle.deref(), subKeyName, null, null, windef.REG_OPTION_NON_VOLATILE, accessLevel, null, pHkey, null); + + if (result !== 0) { + throw 'Failed to open key error: ' + error[result]; + } + }, + deleteKey: function (key, subKeyName) { + var result = advApi.RegDeleteTreeA(key.handle.deref(), subKeyName); + + if (result !== 0) { + throw 'Failed to open key error ' + result + ':' + error[result]; + } + }, + closeKey: function (key) { + var result = advApi.RegCloseKey(key.handle.deref()); + + if (result !== 0) { + throw 'Failed to open key error ' + result + ':' + error[result]; + } + } +}; + +module.exports = api; From 0f1c072c00e039c10b0ff370065aa7d25892dc21 Mon Sep 17 00:00:00 2001 From: Kaalu <7735979+JakovBradvica@users.noreply.github.com> Date: Wed, 6 Jun 2018 16:42:46 +0200 Subject: [PATCH 2/5] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added .toString('binary') to allow special characters such as ä/ü/ö/ //etc --- lib/registry.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/registry.js b/lib/registry.js index cf10632..491386f 100644 --- a/lib/registry.js +++ b/lib/registry.js @@ -76,7 +76,7 @@ var api = { if (value.type === types.LPTSR) { // TODO not sure why buffer's utf8 parsing leaves in the unicode null // escape sequence. This is a work-around (at least on node 4.1) - value = value.toString().replace('\u0000', ''); + value = value.toString('binary').replace('\u0000', ''); } return value; @@ -136,13 +136,6 @@ var api = { throw 'Failed to open key error ' + result + ':' + error[result]; } }, - deleteValue: function (key, value) { - var result = advApi.RegDeleteValueA(key.handle.deref(), value); - - if (result !== 0) { - throw 'Failed to delete value error ' + result + ':' + error[result]; - } - }, closeKey: function (key) { var result = advApi.RegCloseKey(key.handle.deref()); From 737210a5c5baf6bc414e7fe3d41440796e0ae273 Mon Sep 17 00:00:00 2001 From: Kaalu <7735979+JakovBradvica@users.noreply.github.com> Date: Wed, 6 Jun 2018 16:49:29 +0200 Subject: [PATCH 3/5] Add files via upload --- lib/registry.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/registry.js b/lib/registry.js index 491386f..ab6fe57 100644 --- a/lib/registry.js +++ b/lib/registry.js @@ -136,6 +136,13 @@ var api = { throw 'Failed to open key error ' + result + ':' + error[result]; } }, + deleteValue: function (key, value) { + var result = advApi.RegDeleteValueA(key.handle.deref(), value); + + if (result !== 0) { + throw 'Failed to delete value error ' + result + ':' + error[result]; + } + }, closeKey: function (key) { var result = advApi.RegCloseKey(key.handle.deref()); From 8e16c9e2a3163f30201669814c4a9a7eecab888b Mon Sep 17 00:00:00 2001 From: Kaalu <7735979+JakovBradvica@users.noreply.github.com> Date: Wed, 6 Jun 2018 16:56:24 +0200 Subject: [PATCH 4/5] Add files via upload . --- lib/registry.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/registry.js b/lib/registry.js index ab6fe57..a400cd9 100644 --- a/lib/registry.js +++ b/lib/registry.js @@ -137,11 +137,11 @@ var api = { } }, deleteValue: function (key, value) { - var result = advApi.RegDeleteValueA(key.handle.deref(), value); + var result = advApi.RegDeleteValueA(key.handle.deref(), value); if (result !== 0) { throw 'Failed to delete value error ' + result + ':' + error[result]; - } + } }, closeKey: function (key) { var result = advApi.RegCloseKey(key.handle.deref()); From f785f57c5ffb6dab0f6bff4c77e1a890fcf82c82 Mon Sep 17 00:00:00 2001 From: Kaalu <7735979+JakovBradvica@users.noreply.github.com> Date: Wed, 6 Jun 2018 16:57:19 +0200 Subject: [PATCH 5/5] Delete registry.js --- registry.js | 148 ---------------------------------------------------- 1 file changed, 148 deletions(-) delete mode 100644 registry.js diff --git a/registry.js b/registry.js deleted file mode 100644 index 491386f..0000000 --- a/registry.js +++ /dev/null @@ -1,148 +0,0 @@ -/* global Buffer */ -'use strict'; -var ffi = require('ffi'), - types = require('./types'), - advApi = require('./native/adv_api'), - Key = require('./key'), - ref = require('ref'), - error = require('./error'), - windef = require('./windef'), - debug = require('debug')('windows-registry'); - -var api = { - openKeyFromPredefined: function (preDefinedKey, subKeyName, accessLevel) { - if (preDefinedKey < 0x80000000 || preDefinedKey > 0x80000006) { - throw 'The key ' + preDefinedKey + ' is not valid. Use the windef module for the list of predefined keys'; - } - - var pHkey = ref.alloc(types.PHKEY, new Buffer(ref.sizeof.pointer)); - console.log('PHKEY LENGTH: ' + pHkey.deref().length); - var result = advApi.RegOpenKeyExA(preDefinedKey, subKeyName, 0, accessLevel, pHkey); - debug('result:' + result); - if (result !== 0) { - throw 'Failed to open key error: ' + error[result]; - } - - return new Key(pHkey, subKeyName); - }, - openKeyFromKeyObject: function (keyObject, subKeyName, accessLevel) { - var pHkey = ref.alloc(types.PHKEY, new Buffer(ref.sizeof.pointer)); - - // RegOpenKeyEx can also take an HKEY in addition to a predefined value - var advApi2 = ffi.Library('Advapi32', { - RegOpenKeyExA: ['long', [types.HKEY, 'string', types.DWORD, types.REGSAM, types.PHKEY]] - }); - var result = advApi2.RegOpenKeyExA(keyObject.handle.deref(), subKeyName, 0, accessLevel, pHkey); - - if (result !== 0) { - throw 'Failed to open key error: ' + error[result]; - } - - return new Key(pHkey, subKeyName); - }, - queryValueForKeyObject: function (key, valueName) { - var pKeyDataLength = ref.alloc(types.LPDWORD, new Buffer(ref.sizeof.pointer)), - pKeyType = ref.alloc(types.LPDWORD, new Buffer(ref.sizeof.pointer)); - // QUERY FOR VALUE SIZE & TYPE - var result = advApi.RegQueryValueExA(key.handle.deref(), valueName, null, pKeyType, null, pKeyDataLength); - // READ VALUE - var value = new Buffer(pKeyDataLength.readUInt32LE()), - valueType = pKeyType.readUInt32LE(); - switch (valueType) { - case windef.REG_VALUE_TYPE.REG_SZ: - case windef.REG_VALUE_TYPE.REG_EXPAND_SZ: - case windef.REG_VALUE_TYPE.REG_LINK: - value.type = types.LPCTSR; - break; - case windef.REG_VALUE_TYPE.REG_BINARY: - value.type = types.PVOID; - break; - case windef.REG_VALUE_TYPE.REG_DWORD: - case windef.REG_VALUE_TYPE.REG_DWORD_BIG_ENDIAN: - case windef.REG_VALUE_TYPE.REG_DWORD_LITTLE_ENDIAN: - value.type = types.DWORD; - break; - default: - throw 'The Value Type: ' + valueType + ' is currently unsupported'; - } - - // READ VALUE - result = advApi.RegQueryValueExA(key.handle.deref(), valueName, null, pKeyType, value, pKeyDataLength); - - if (result !== 0) { - throw 'Failed to open key error: ' + error[result]; - } - - if (value.type === types.LPTSR) { - // TODO not sure why buffer's utf8 parsing leaves in the unicode null - // escape sequence. This is a work-around (at least on node 4.1) - value = value.toString('binary').replace('\u0000', ''); - } - - return value; - }, - setValueForKeyObject: function (key, valueName, valueType, value) { - if (valueType < 1 || valueType > 8) { - throw 'Invalid valueType parameter: ' + valueType + ' use values from windef.REG_VALUE_TYPE'; - } - var buffer, - byte, - result; - - switch (valueType) { - case windef.REG_VALUE_TYPE.REG_SZ: - case windef.REG_VALUE_TYPE.REG_EXPAND_SZ: - case windef.REG_VALUE_TYPE.REG_LINK: - buffer = new Buffer(value, 'utf8'); - byte = ref.alloc(types.LPBYTE, buffer); - debug('content length:' + Buffer.byteLength(value, 'utf8')); - debug(value); - debug(buffer.length); - result = advApi.RegSetValueExA(key.handle.deref(), valueName, null, valueType, byte.deref(), Buffer.byteLength(value, 'utf8')); - break; - case windef.REG_VALUE_TYPE.REG_BINARY: - // we assume that the value is a buffer since it should be binary data - buffer = value; - byte = ref.alloc(types.LPBYTE, buffer); - result = advApi.RegSetValueExA(key.handle.deref(), valueName, null, valueType, byte.deref(), buffer.length); - break; - case windef.REG_VALUE_TYPE.REG_DWORD: - case windef.REG_VALUE_TYPE.REG_DWORD_BIG_ENDIAN: - case windef.REG_VALUE_TYPE.REG_DWORD_LITTLE_ENDIAN: - buffer = new Buffer(4, value); - result = advApi.RegSetValueExA(key.handle.deref(), valueName, null, valueType, byte.deref(), buffer.length); - break; - default: - throw 'The type ' + valueType + ' is currently unsupported'; - } - - if (result !== 0) { - throw 'Failed to open key error: ' + error[result]; - } - }, - createKey: function (key, subKeyName, accessLevel) { - var pHkey = ref.alloc(types.PHKEY, new Buffer(ref.sizeof.pointer)); - - var result = advApi.RegCreateKeyExA(key.handle.deref(), subKeyName, null, null, windef.REG_OPTION_NON_VOLATILE, accessLevel, null, pHkey, null); - - if (result !== 0) { - throw 'Failed to open key error: ' + error[result]; - } - }, - deleteKey: function (key, subKeyName) { - var result = advApi.RegDeleteTreeA(key.handle.deref(), subKeyName); - - if (result !== 0) { - throw 'Failed to open key error ' + result + ':' + error[result]; - } - }, - closeKey: function (key) { - var result = advApi.RegCloseKey(key.handle.deref()); - - if (result !== 0) { - throw 'Failed to open key error ' + result + ':' + error[result]; - } - } -}; - -module.exports = api;