On 2020-01-29 13:01, Trey Harris wrote:
On Wed, Jan 29, 2020 at 15:28 ToddAndMargo via perl6-users
<perl6-us...@perl.org <mailto:perl6-us...@perl.org>> wrote:
"Todd" would convert to
84 00 111 00 100 00 100 00 00 00
I’m sorry, you misunderstood me. I wasn’t asking how to convert text
into UTF. I was asking for an example of the 3-byte UTF plus 32-bit null
cbData field. “Todd\0” is not 3-bytes + null, it’s 4 bytes + null. (You
can see that from your groupings above—every two pairs make an octet,
and there are 5 pairs. That’s 40 bits, not 32.)
Also, I assume you used that because it’s your name—could you use an
example from the actual registry dataset like what you’re processing,
please, and not one that you’ve invented yourself? I’m trying to see how
it’s _used_ in real life, not how you’re imagining it could be used.
Hi Trey,
In the following example, I am not messing
with a key that Widows actually uses, but should,
don't you think?
The registry hive is: HKEY_LOCAL_MACHINE
The key location is: SOFTWARE\Microsoft\Windows NT\CurrentVersion
The key is: BestLookingEngineer
The key type is: REG_SZ (means a string)
and the "True" turns on debugging
perl6 -I. -e "use NativeConstants; use WinReg :WinRegSetValue; say
WinRegSetValue( HKEY_LOCAL_MACHINE, Q[SOFTWARE\Microsoft\Windows
NT\CurrentVersion], Q[BestLookingEngineer], REG_SZ, 'Todd', True );"
WinRegSetValue Debug
ValueType REG_SZ (1)
KeyName BestLookingEngineer
lpValueName 66 101 115 116 76 111 111 107 105 110 103 69 110 103
105 110 101 101 114 0
dsType 1
ValueData Todd
lpData 84 111 100 100 0
lpData.elems 5
cdData 10
lpValueName is comes from
sub to-UTF16-c-str( Str $RakuStr ) returns CArray[uint16] is
export( :to-UTF16-c-str ) {
# Converts a UTF8 Raku string into a UTF16 little endian C string
# Note: C Strings are always terminated with a nul. WinAPI will
malfunction without it
my $CStr = CArray[uint16].new();
$CStr = CArray[uint16].new( $RakuStr.encode.list, 0 ); # add a
nul to the end
return $CStr;
}
I have yet to figure out a way to break
my $CStr = CArray[uint16].new();
into bytes for analysis, but it is UTF16 little endian.
The "W" at the end of "RegSetValueExW" requires it.
In the real world, I check the LUA key
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"EnableLUA"=dword:00000000
to make sure it is zero, so I can mount and dismount
hidden drive partitions. The same module will
unset the LUA for you on a prompt.
-T