I would love to look into that, however, my son needs all my free time and
I do have very little knowledge about NativeCall.
I hope I will find time in the next days to learn more of this stuff, but I
will not much help :-(


On Fri, 27 Dec 2019 at 07:31, ToddAndMargo via perl6-users <
perl6-users@perl.org> wrote:

> This is how far I have gotten:
>
> Note that is I use a "0" in
>
> $RtnCode = RegQueryValueExW( HKEY_LOCAL_MACHINE, $lpValueName, 1,
> REG_DWORD, $lpData, $lpcbData );
>
> The program dies with no return code.
>
> -T
>
>
>
>          K:\Windows\NtUtil>perl6 -I. -e "use WinMount :GetLUA; say
> GetLUA();"
>          RegOpenKeyExW
>          RegOpenKeyExW   RtnCode 161
>
>          RegQueryValueExW
>          1
>          2
>          RegQueryValueExW   RtnCode 87
>          lpData pointer 0
>          lpcbData data length 0
>
>          RegCloseKey
>          RegCloseKey   RtnCode 6
>
>          True
>
>
>
>
>
>          # unit module WinMount;
>          # WinMount.pm6
>
>          #`{
>
>             Utilities to mount and dismound drive partitions
>             Note: LUA must be unset (0x00000000) for mount to function
> prpoperly
>
>             raku -I. -c WinMount.pm6
>
>          }
>
>          use NativeCall;
>          use WinPopUps :WinMsg;
>
>
>          # Reference to types and values:
> http://dsource.org/projects/tango/ticket/820
>
>          constant BYTE    := uint8;
>          constant WCHAR   := uint16;
>          constant DWORD   := int32;
>          constant REGSAM  := int32;
>          constant WCHARS  := CArray[WCHAR];
>          constant BYTES   := CArray[BYTE];
>
>          constant HKEY_CURRENT_USER  = 0x80000001;
>          constant HKEY_LOCAL_MACHINE = 0x80000002;
>          constant KEY_QUERY_VALUE   = 1;
>          constant ERROR_SUCCESS     = 0; # Yeah, I know. The Win-Api
> uses 0 for success and other values to indicate errors
>          constant REG_SZ = 1;
>
>          constant KEY_READ      = 0x20019;
>          constant KEY_SET_VALUE = 0x0002;
>          constant REG_DWORD     = 0x00000004;
>
>
>
>          sub to-c-str( Str $str ) returns CArray[WCHAR]  is export(
> :to-c-str ) {
>             my @str := CArray[WCHAR].new;
>             for ( $str.comb ).kv -> $i, $char { @str[$i] = $char.ord; }
>             @str[ $str.chars ] = 0;
>             @str;
>          }
>
>
>          sub wstr( Str $str ) returns WCHARS  is export( :wstr ) {
>              CArray[WCHAR].new( $str.comb.map: *.ord )
>          }
>
>
>          sub GetLUA() is export( :GetLUA ) {
>
>          #`{
>
>          Returns the LUA value in the registry to True (0x00000001) or
> False (0x00000000)
>
>
>
> [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
>                    "EnableLUA"=dword:00000000
>
>              https://docs.perl6.org/language/nativecall
>
>          }
>
>             my Str $SubName = &?ROUTINE.name;
>             my Str $OS      = $*KERNEL.name;
>             if not $OS eq "win32" { say "Sorry, $SubName only work in
> Windows."; exit; }
>
>             my Bool  $LUA = True;
>             my       $RtnCode;
>
>             my Str   $SubKey =
> '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System';
>             my Str   $Key = $SubKey ~ '\EnableLUA';
>
>             my       $lpSubKey    = wstr( $SubKey );
>             my       $lpValueName = wstr( $Key );
>             # my $lpSubKey    = CArray[uint8].new($Key.encode.list);
>             # my $lpValueName = CArray[uint8].new($SubKey.encode.list);
>
>
>             my int32 $Handle;
>             my int32 $ulOptions = 0;
>             my int32 $lpData;
>             my int32 $lpcbData;
>
>
>          #`{
>              Open the key:
>
>
> https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regopenkeyexw
>
>
> https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-key-security-and-access-rights
>              C++
>              LSTATUS RegOpenKeyExW(
>                 HKEY    hKey,          # Hive name (HKEY_LOCAL_MACHINE)
>                 LPCWSTR lpSubKey,      # path to the
> key(/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System/EnableLUA)
>                 DWORD   ulOptions,     # 0
>                 REGSAM  samDesired,    # KEY_READ (0x20019),
> KEY_SET_VALUE (0x0002)
>                 PHKEY   phkResult      # A pointer to a variable that
> receives a handle to the opened key
>              );
>          }
>             say "RegOpenKeyExW";
>             sub RegOpenKeyExW( DWORD, WCHARS, DWORD, DWORD, DWORD is rw)
> is native("Kernel32.dll") returns DWORD { * };
>             $RtnCode = RegOpenKeyExW( HKEY_LOCAL_MACHINE, $lpSubKey,
> $ulOptions, KEY_READ, $Handle );
>             say "RegOpenKeyExW   RtnCode $RtnCode\n";
>
>
>
>          #`{
>              Read the key:
>              use RegQueryValueExW if you know key and value name
>
>
> https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regqueryvalueexw
>              C++
>              LSTATUS RegQueryValueExW(
>                 HKEY    hKey,          # Hive name (HKEY_LOCAL_MACHINE)
>                 LPCWSTR lpValueName,   # path to the
> key(\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA)
>                 LPDWORD lpReserved,    # give it "int32" without the
> quotes to give it a NULL
>                 LPDWORD lpType,        # Registry Value Type (REG_DWORD
> which is 32 bit)
>                 LPBYTE  lpData,        # Pointer to the return value
>                 LPDWORD lpcbData       # number of bytes in the return
> value
>              );
>          }
>             say "RegQueryValueExW";
>             sub RegQueryValueExW( DWORD, WCHARS, DWORD, DWORD, DWORD is
> rw, DWORD is rw ) is native("Kernel32.dll") returns DWORD { * };
>          say "1";
>             $RtnCode = RegQueryValueExW( HKEY_LOCAL_MACHINE,
> $lpValueName, 1, REG_DWORD, $lpData, $lpcbData );
>          say "2";
>             say "RegQueryValueExW   RtnCode $RtnCode\nlpData pointer
> $lpData\nlpcbData data length $lpcbData\n";
>
>
>
>          #`{
>              Close the key
>
>
> https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regclosekey
>              C++
>              LSTATUS RegCloseKey(
>                 HKEY hKey    # handle to the open key to be closed.  See
> RegOpenKeyExW phkResult
>              );
>          }
>             say "RegCloseKey";
>             sub RegCloseKey( DWORD ) is native("Kernel32.dll") returns
> DWORD { * };
>             $RtnCode = RegCloseKey( $Handle );
>             say "RegCloseKey   RtnCode $RtnCode\n";
>
>
>             return $LUA;
>          }
>

Reply via email to