Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add RegLoadAppKeyW #1377

Merged
merged 2 commits into from Aug 24, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGES.md
Expand Up @@ -7,7 +7,7 @@ Next Release (5.10.0)

Features
--------

* [#1377](https://github.com/java-native-access/jna/pull/1377): Add `RegLoadAppKey` to `c.s.j.p.win32.Advapi32` and `registryLoadAppKey` to `c.s.j.p.win32.Advapi32Util` - [@mfilippov](https://github.com/mfilippov).

Bug Fixes
---------
Expand Down
23 changes: 23 additions & 0 deletions contrib/platform/src/com/sun/jna/platform/win32/Advapi32.java
Expand Up @@ -82,6 +82,7 @@ public interface Advapi32 extends StdCallLibrary {
int RRF_RT_REG_NONE = 0x00000001;
int RRF_RT_REG_QWORD = 0x00000040;
int RRF_RT_REG_SZ = 0x00000002;
int REG_PROCESS_APPKEY = 0x00000001;

/**
* LOGON_WITH_PROFILE: 0x00000001<br>
Expand Down Expand Up @@ -854,6 +855,28 @@ boolean GetTokenInformation(HANDLE tokenHandle,
int RegOpenKeyEx(HKEY hKey, String lpSubKey, int ulOptions,
int samDesired, HKEYByReference phkResult);

/**
* The RegLoadAppKey function loads the specified registry hive
* as an application hive.
*
* @param lpFile
* The name of the hive file.
* If the file does not exist, an empty hive file is created
* with the specified name.
* @param phkResult
* Pointer to the handle for the root key of the loaded hive.
* @param samDesired
* Access mask that specifies the desired access rights to the
* @param dwOptions
* If this parameter is REG_PROCESS_APPKEY,
* the hive cannot be loaded again while it is loaded by the caller.
* This prevents access to this registry hive by another caller.
* @param Reserved
* Reserved; must be zero.
*/
int RegLoadAppKey(String lpFile, HKEYByReference phkResult,
int samDesired, int dwOptions, int Reserved);

/**
* Establishes a connection to a predefined registry key on another
* computer.
Expand Down
22 changes: 22 additions & 0 deletions contrib/platform/src/com/sun/jna/platform/win32/Advapi32Util.java
Expand Up @@ -2076,6 +2076,28 @@ public static HKEYByReference registryGetKey(HKEY root, String keyPath,
return phkKey;
}

/**
* Loads the specified registry hive as an application hive.
*
* @param fileName
* Path to the file
* @param samDesired
* Access mask that specifies the desired access rights to the
* @param dwOptions
* If this parameter is REG_PROCESS_APPKEY,
* the hive cannot be loaded again while it is loaded by the caller.
* This prevents access to this registry hive by another caller.
*/
public static HKEYByReference registryLoadAppKey(String fileName, int samDesired, int dwOptions) {
HKEYByReference phkKey = new HKEYByReference();
int rc = Advapi32.INSTANCE.RegLoadAppKey(fileName, phkKey, samDesired, dwOptions, 0);
if (rc != W32Errors.ERROR_SUCCESS) {
throw new Win32Exception(rc);
}

return phkKey;
}

/**
* Close the registry key
*
Expand Down
Expand Up @@ -29,6 +29,7 @@

import java.io.File;
import java.io.FileWriter;
import java.nio.file.Files;
import java.util.Map;
import java.util.TreeMap;

Expand Down Expand Up @@ -605,6 +606,17 @@ public void testRegistryGetCloseKey() {
Advapi32Util.registryDeleteKey(WinReg.HKEY_CURRENT_USER, "Software", "JNA");
}

public void testRegistryLoadAppKey() throws Exception {
File tempDir = Files.createTempDirectory("testRegistryLoadAppKey").toFile();
File registryFile = new File(tempDir, "privateregistry.bin");
HKEYByReference phkKey = Advapi32Util.registryLoadAppKey(registryFile.getAbsolutePath(), WinNT.KEY_ALL_ACCESS, 0);
Advapi32Util.registryCreateKey(phkKey.getValue(), "Test");
Advapi32Util.registryDeleteKey(phkKey.getValue(), "Test");
Advapi32Util.registryCloseKey(phkKey.getValue());
registryFile.delete();
tempDir.delete();
}

public void testRegistryGetValues() {
String uu = "A\\u00ea\\u00f1\\u00fcC";
Advapi32Util.registryCreateKey(WinReg.HKEY_CURRENT_USER, "Software", "JNA");
Expand Down
Expand Up @@ -673,8 +673,14 @@ private Path createTestCrl() {
crlBuilder.addExtension(Extension.cRLNumber, false, new CRLNumber(new BigInteger("2")));
X509CRLHolder holder = crlBuilder.build(caSigner);

try (OutputStream fos = Files.newOutputStream(tempFile)) {
OutputStream fos = null;
try {
fos = Files.newOutputStream(tempFile);
fos.write(holder.getEncoded());
} finally {
if (fos != null) {
fos.close();
}
}

return tempFile;
Expand Down