@@ -17,7 +17,7 @@ var api = {
1717
1818 var pHkey = ref . alloc ( types . PHKEY , new Buffer ( ref . sizeof . pointer ) ) ;
1919 debug ( 'PHKEY LENGTH: ' + pHkey . deref ( ) . length ) ;
20- var result = advApi . RegOpenKeyExA ( preDefinedKey , subKeyName , 0 , accessLevel , pHkey ) ;
20+ var result = advApi . RegOpenKeyExW ( preDefinedKey , subKeyName , 0 , accessLevel , pHkey ) ;
2121 debug ( 'result:' + result ) ;
2222 if ( result !== 0 ) {
2323 throw 'Failed to open key error: ' + error [ result ] ;
@@ -30,9 +30,9 @@ var api = {
3030
3131 // RegOpenKeyEx can also take an HKEY in addition to a predefined value
3232 var advApi2 = ffi . Library ( 'Advapi32' , {
33- RegOpenKeyExA : [ 'long' , [ types . HKEY , 'string' , types . DWORD , types . REGSAM , types . PHKEY ] ]
33+ RegOpenKeyExW : [ 'long' , [ types . HKEY , types . LPCWSTR , types . DWORD , types . REGSAM , types . PHKEY ] ]
3434 } ) ;
35- var result = advApi2 . RegOpenKeyExA ( keyObject . handle . deref ( ) , subKeyName , 0 , accessLevel , pHkey ) ;
35+ var result = advApi2 . RegOpenKeyExW ( keyObject . handle . deref ( ) , subKeyName , 0 , accessLevel , pHkey ) ;
3636
3737 if ( result !== 0 ) {
3838 throw 'Failed to open key error: ' + error [ result ] ;
@@ -44,15 +44,15 @@ var api = {
4444 var pKeyDataLength = ref . alloc ( types . LPDWORD , new Buffer ( ref . sizeof . pointer ) ) ,
4545 pKeyType = ref . alloc ( types . LPDWORD , new Buffer ( ref . sizeof . pointer ) ) ;
4646 // QUERY FOR VALUE SIZE & TYPE
47- var result = advApi . RegQueryValueExA ( key . handle . deref ( ) , valueName , null , pKeyType , null , pKeyDataLength ) ;
47+ var result = advApi . RegQueryValueExW ( key . handle . deref ( ) , valueName , null , pKeyType , null , pKeyDataLength ) ;
4848 // READ VALUE
4949 var value = new Buffer ( pKeyDataLength . readUInt32LE ( ) ) ,
5050 valueType = pKeyType . readUInt32LE ( ) ;
5151 switch ( valueType ) {
5252 case windef . REG_VALUE_TYPE . REG_SZ :
5353 case windef . REG_VALUE_TYPE . REG_EXPAND_SZ :
5454 case windef . REG_VALUE_TYPE . REG_LINK :
55- value . type = types . LPCTSR ;
55+ value . type = types . LPCWSTR ;
5656 break ;
5757 case windef . REG_VALUE_TYPE . REG_BINARY :
5858 value . type = types . PVOID ;
@@ -67,16 +67,14 @@ var api = {
6767 }
6868
6969 // READ VALUE
70- result = advApi . RegQueryValueExA ( key . handle . deref ( ) , valueName , null , pKeyType , value , pKeyDataLength ) ;
70+ result = advApi . RegQueryValueExW ( key . handle . deref ( ) , valueName , null , pKeyType , value , pKeyDataLength ) ;
7171
7272 if ( result !== 0 ) {
7373 throw 'Failed to open key error: ' + error [ result ] ;
7474 }
7575
76- if ( value . type === types . LPTSR ) {
77- // TODO not sure why buffer's utf8 parsing leaves in the unicode null
78- // escape sequence. This is a work-around (at least on node 4.1)
79- value = value . toString ( ) . replace ( '\u0000' , '' ) ;
76+ if ( value . type === types . LPCWSTR ) {
77+ value = types . LPCWSTR . toString ( value ) ;
8078 }
8179
8280 return value ;
@@ -93,24 +91,21 @@ var api = {
9391 case windef . REG_VALUE_TYPE . REG_SZ :
9492 case windef . REG_VALUE_TYPE . REG_EXPAND_SZ :
9593 case windef . REG_VALUE_TYPE . REG_LINK :
96- buffer = new Buffer ( value , 'utf8' ) ;
94+ buffer = types . LPCWSTR . fromString ( value ) ;
9795 byte = ref . alloc ( types . LPBYTE , buffer ) ;
98- debug ( 'content length:' + Buffer . byteLength ( value , 'utf8' ) ) ;
99- debug ( value ) ;
100- debug ( buffer . length ) ;
101- result = advApi . RegSetValueExA ( key . handle . deref ( ) , valueName , null , valueType , byte . deref ( ) , Buffer . byteLength ( value , 'utf8' ) ) ;
96+ result = advApi . RegSetValueExW ( key . handle . deref ( ) , valueName , null , valueType , byte . deref ( ) , buffer . length ) ;
10297 break ;
10398 case windef . REG_VALUE_TYPE . REG_BINARY :
10499 // we assume that the value is a buffer since it should be binary data
105100 buffer = value ;
106101 byte = ref . alloc ( types . LPBYTE , buffer ) ;
107- result = advApi . RegSetValueExA ( key . handle . deref ( ) , valueName , null , valueType , byte . deref ( ) , buffer . length ) ;
102+ result = advApi . RegSetValueExW ( key . handle . deref ( ) , valueName , null , valueType , byte . deref ( ) , buffer . length ) ;
108103 break ;
109104 case windef . REG_VALUE_TYPE . REG_DWORD :
110105 case windef . REG_VALUE_TYPE . REG_DWORD_BIG_ENDIAN :
111106 case windef . REG_VALUE_TYPE . REG_DWORD_LITTLE_ENDIAN :
112107 buffer = new Buffer ( 4 , value ) ;
113- result = advApi . RegSetValueExA ( key . handle . deref ( ) , valueName , null , valueType , byte . deref ( ) , buffer . length ) ;
108+ result = advApi . RegSetValueExW ( key . handle . deref ( ) , valueName , null , valueType , byte . deref ( ) , buffer . length ) ;
114109 break ;
115110 default :
116111 throw 'The type ' + valueType + ' is currently unsupported' ;
@@ -123,21 +118,21 @@ var api = {
123118 createKey : function ( key , subKeyName , accessLevel ) {
124119 var pHkey = ref . alloc ( types . PHKEY , new Buffer ( ref . sizeof . pointer ) ) ;
125120
126- var result = advApi . RegCreateKeyExA ( key . handle . deref ( ) , subKeyName , null , null , windef . REG_OPTION_NON_VOLATILE , accessLevel , null , pHkey , null ) ;
121+ var result = advApi . RegCreateKeyExW ( key . handle . deref ( ) , subKeyName , null , null , windef . REG_OPTION_NON_VOLATILE , accessLevel , null , pHkey , null ) ;
127122
128123 if ( result !== 0 ) {
129124 throw 'Failed to open key error: ' + error [ result ] ;
130125 }
131126 } ,
132127 deleteKey : function ( key , subKeyName ) {
133- var result = advApi . RegDeleteTreeA ( key . handle . deref ( ) , subKeyName ) ;
128+ var result = advApi . RegDeleteTreeW ( key . handle . deref ( ) , subKeyName ) ;
134129
135130 if ( result !== 0 ) {
136- throw 'Failed to open key error ' + result + ':' + error [ result ] ;
131+ throw 'Failed to delete key error ' + result + ':' + error [ result ] ;
137132 }
138133 } ,
139134 deleteValue : function ( key , value ) {
140- var result = advApi . RegDeleteValueA ( key . handle . deref ( ) , value ) ;
135+ var result = advApi . RegDeleteValueW ( key . handle . deref ( ) , value ) ;
141136
142137 if ( result !== 0 ) {
143138 throw 'Failed to delete value error ' + result + ':' + error [ result ] ;
0 commit comments