Windows: JNA fails to load libraries if SetDefaultDllDirectories() was used
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- java
- Ambito
- operating-systems
Direzione di ricerca
Inizia tracciando il percorso di caricamento delle librerie native di JNA da Native.load fino alla sua chiamata a LoadLibraryExW, quindi riproduci l’esempio fornito dopo aver utilizzato SetDefaultDllDirectories(). Confronta il comportamento dei nomi di libreria relativi con le regole documentate di Windows per i percorsi di ricerca; il lavoro è completato quando l’esempio viene caricato correttamente e la regressione è coperta da un test.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
- Version of JNA and related jars - any since 93ebb9f7
- Version and vendor of the java virtual machine - any
- Operating system - any Windows
- System architecture (CPU type, bitness of the JVM) - any
Example snippet:
public interface Dwmapi extends StdCallLibrary {
}
public interface Kernel32_2 extends StdCallLibrary {
Pointer AddDllDirectory(WString NewDirectory);
boolean SetDefaultDllDirectories(int DirectoryFlags);
}
public static void main(String[] args) {
final Kernel32_2 kernel32 = Native.loadLibrary("kernel32", Kernel32_2.class);
final int LOAD_LIBRARY_DEFAULT_DIRS = 0x00001000;
// SetDefaultDllDirectories() is used to supply another DLL search path.
// But it causes JNA to fail later.
Path pluginsPath = Paths.get("plugins").toAbsolutePath();
kernel32.SetDefaultDllDirectories(LOAD_LIBRARY_DEFAULT_DIRS);
kernel32.AddDllDirectory(new WString(pluginsPath.toString()));
// This is perfectly fine, but fails after SetDefaultDllDirectories().
Native.load("dwmapi", Dwmapi.class);
}
Explanation:
- Since 93ebb9f7, JNA uses
LOAD_WITH_ALTERED_SEARCH_PATHinLoadLibraryExW(). - MSDN says:
If this value is used and lpFileName specifies a relative path, the behavior is undefined - When library name is given like
"dwmapi", this is a relative path. - Windows logs this error, but still tries to proceed - set WinDBG breakpoint to see for yourself:
bp ntdll!LdrpLogRelativePathWithAlteredSearchError "du @rcx"(here, even the function's name is already a proof) - However, if
SetDefaultDllDirectories()was also used,ntdll!LdrpGetDllPathconsiders this a fatal error and returnsSTATUS_INVALID_PARAMETER
TLDR: JNA uses LOAD_WITH_ALTERED_SEARCH_PATH and this is a bug to use it with non-absolute path. However, in most cases it still works, because Windows is kind to interlopers.
- Lingua principale
- Java
- Stelle
- 8.9k
- Fork
- 1.7k
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di java-native-access/jna
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
java-native-access/jna#1740 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 66/100
java-native-access/jna#1738 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
java-native-access/jna#1736 ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 65/100
java-native-access/jna#1717 ·
-
Windows32Exception - The parameter is incorrectForse di nuovo libera @marktech0813 l’ha presa 331 giorni fa e non c’è nessuna pull request aperta. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
java-native-access/jna#1700 · 11 commenti ·
Tutte le issue di java-native-access/jna
Issue simili
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno
-
waiting-for-triage
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
spring-cloud/spring-cloud-openfeign#1443 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 1-3 ore Idoneità per principianti 84/100
ADORSYS-GIS/keycloak-oid4vp-plugin#221 ·
I maintainer di solito rispondono entro 2 giorni
-
status: team-only type: dependency-upgrade
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
spring-projects/spring-boot#52099 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
tchiotludo/akhq#3307 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno