// Path: lib/src/WinRun4J/src/org/boris/winrun4j/PInvoke.java
// public static class ByteArrayBuilder
// {
//     private byte[] array;
// 
//     public void set(byte[] array) {
//         this.array = array;
//     }
// 
//     public byte[] toArray() {
//         return array;
//     }
// }
// 
// Path: lib/src/WinRun4J/src/org/boris/winrun4j/PInvoke.java
// public static class IntPtr
// {
//     public long value;
// 
//     public IntPtr() {
//     }
// 
//     public IntPtr(long value) {
//         this.value = value;
//     }
// 
//     public int intValue() {
//         return (int) value;
//     }
// 
//     public String toString() {
//         return Long.toString(value);
//     }
// }
// 
// Path: lib/src/WinRun4J/src/org/boris/winrun4j/PInvoke.java
// public interface Struct
// {
// }
// 
// Path: lib/src/WinRun4J/src/org/boris/winrun4j/PInvoke.java
// public static class UIntPtr extends IntPtr
// {
//     public UIntPtr() {
//     }
// 
//     public UIntPtr(long value) {
//         this.value = value;
//     }
// }


import org.boris.winrun4j.PInvoke.ByteArrayBuilder;
import org.boris.winrun4j.PInvoke.DllImport;
import org.boris.winrun4j.PInvoke.IntPtr;
import org.boris.winrun4j.PInvoke.Out;
import org.boris.winrun4j.PInvoke.Struct;
import org.boris.winrun4j.PInvoke.UIntPtr;

    @DllImport(entryPoint = "RegOpenKeyExW")
    public static native int openKeyEx(long hKey, String subKey, int options, long samDesired, UIntPtr phkResult);

    @DllImport(entryPoint = "RegEnumKeyExW")
    public static native int enumKeyEx(
            long hkey,
            int index,
            StringBuilder lpName,
            UIntPtr lpcbName,
            long reserved,
            long lpClass,
            long lpcbClass,
            FILETIME lpftLastWriteTime);

    @DllImport(entryPoint = "RegEnumValue")
    public static native int enumValue(
            long hKey,
            int index,
            StringBuilder lpValueName,
            UIntPtr lpcValueName,
            long lpReserved,
            UIntPtr lpType,
            ByteArrayBuilder lpData,
            IntPtr lpcbData);

    public static byte[] queryValueEx(long hKey, String valueName, int maxLen) {
        ByteArrayBuilder bb = new ByteArrayBuilder();
        UIntPtr len = new UIntPtr(maxLen);
        int res = Registry.queryValueEx(hKey, valueName, 0, null, bb, len);
// Path: lib/src/WinRun4J/src/org/boris/winrun4j/PInvoke.java
// public static class ByteArrayBuilder
// {
//     private byte[] array;
// 
//     public void set(byte[] array) {
//         this.array = array;
//     }
// 
//     public byte[] toArray() {
//         return array;
//     }
// }
// 
// Path: lib/src/WinRun4J/src/org/boris/winrun4j/PInvoke.java
// public static class IntPtr
// {
//     public long value;
// 
//     public IntPtr() {
//     }
// 
//     public IntPtr(long value) {
//         this.value = value;
//     }
// 
//     public int intValue() {
//         return (int) value;
//     }
// 
//     public String toString() {
//         return Long.toString(value);
//     }
// }
// 
// Path: lib/src/WinRun4J/src/org/boris/winrun4j/PInvoke.java
// public interface Struct
// {
// }
// 
// Path: lib/src/WinRun4J/src/org/boris/winrun4j/PInvoke.java
// public static class UIntPtr extends IntPtr
// {
//     public UIntPtr() {
//     }
// 
//     public UIntPtr(long value) {
//         this.value = value;
//     }
// }


// Path: lib/src/WinRun4J/src/org/boris/winrun4j/Registry.java
import org.boris.winrun4j.PInvoke.ByteArrayBuilder;
import org.boris.winrun4j.PInvoke.DllImport;
import org.boris.winrun4j.PInvoke.IntPtr;
import org.boris.winrun4j.PInvoke.Out;
import org.boris.winrun4j.PInvoke.Struct;
import org.boris.winrun4j.PInvoke.UIntPtr;


    @DllImport(entryPoint = "RegOpenKeyExW")
    public static native int openKeyEx(long hKey, String subKey, int options, long samDesired, UIntPtr phkResult);

    @DllImport(entryPoint = "RegEnumKeyExW")
    public static native int enumKeyEx(
            long hkey,
            int index,
            StringBuilder lpName,
            UIntPtr lpcbName,
            long reserved,
            long lpClass,
            long lpcbClass,
            FILETIME lpftLastWriteTime);

    @DllImport(entryPoint = "RegEnumValue")
    public static native int enumValue(
            long hKey,
            int index,
            StringBuilder lpValueName,
            UIntPtr lpcValueName,
            long lpReserved,
            UIntPtr lpType,
            ByteArrayBuilder lpData,
            IntPtr lpcbData);

    public static byte[] queryValueEx(long hKey, String valueName, int maxLen) {
        ByteArrayBuilder bb = new ByteArrayBuilder();
        UIntPtr len = new UIntPtr(maxLen);
        int res = Registry.queryValueEx(hKey, valueName, 0, null, bb, len);
        if (res == 0)