aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2018-02-20 17:48:42 +0200
committerRiccardo Spagni <ric@spagni.net>2018-02-20 17:48:42 +0200
commitde79aba488e976f37f2c5d5896e03f87e38a1a9a (patch)
tree80c5172c7ce2a8aa638d95c47a049527f9a55ba5
parentMerge pull request #3290 (diff)
parentITS#8324 More for Win32 NTDLL junk (diff)
downloadmonero-de79aba488e976f37f2c5d5896e03f87e38a1a9a.tar.xz
Merge pull request #3292
b372ec43 ITS#8324 More for Win32 NTDLL junk (Howard Chu)
-rw-r--r--external/db_drivers/liblmdb/CMakeLists.txt4
-rw-r--r--external/db_drivers/liblmdb/Makefile4
-rw-r--r--external/db_drivers/liblmdb/mdb.c37
3 files changed, 31 insertions, 14 deletions
diff --git a/external/db_drivers/liblmdb/CMakeLists.txt b/external/db_drivers/liblmdb/CMakeLists.txt
index 3ca489a4a..cb2501ee5 100644
--- a/external/db_drivers/liblmdb/CMakeLists.txt
+++ b/external/db_drivers/liblmdb/CMakeLists.txt
@@ -46,10 +46,6 @@ add_library(lmdb
target_link_libraries(lmdb
PRIVATE
${CMAKE_THREAD_LIBS_INIT})
-if(WIN32)
- target_link_libraries(lmdb
- -lntdll)
-endif()
if(${ARCH_WIDTH} EQUAL 32)
target_compile_definitions(lmdb
PUBLIC -DMDB_VL32)
diff --git a/external/db_drivers/liblmdb/Makefile b/external/db_drivers/liblmdb/Makefile
index 42a5f034a..186168038 100644
--- a/external/db_drivers/liblmdb/Makefile
+++ b/external/db_drivers/liblmdb/Makefile
@@ -24,8 +24,8 @@ W = -W -Wall -Wno-unused-parameter -Wbad-function-cast -Wuninitialized
THREADS = -pthread
OPT = -O2 -g
CFLAGS = $(THREADS) $(OPT) $(W) $(XCFLAGS)
-LDLIBS = # -lntdll # Windows needs ntdll
-SOLIBS = # -lntdll
+LDLIBS =
+SOLIBS =
prefix = /usr/local
exec_prefix = $(prefix)
bindir = $(exec_prefix)/bin
diff --git a/external/db_drivers/liblmdb/mdb.c b/external/db_drivers/liblmdb/mdb.c
index bb0420453..dde428c43 100644
--- a/external/db_drivers/liblmdb/mdb.c
+++ b/external/db_drivers/liblmdb/mdb.c
@@ -47,29 +47,35 @@
* the full size. These APIs are defined in <wdm.h> and <ntifs.h>
* but those headers are meant for driver-level development and
* conflict with the regular user-level headers, so we explicitly
- * declare them here. Using these APIs also means we must link to
- * ntdll.dll, which is not linked by default in user code.
+ * declare them here. We get pointers to these functions from
+ * NTDLL.DLL at runtime, to avoid buildtime dependencies on any
+ * NTDLL import libraries.
*/
-NTSTATUS WINAPI
-NtCreateSection(OUT PHANDLE sh, IN ACCESS_MASK acc,
+typedef NTSTATUS WINAPI (NtCreateSectionFunc)
+ (OUT PHANDLE sh, IN ACCESS_MASK acc,
IN void * oa OPTIONAL,
IN PLARGE_INTEGER ms OPTIONAL,
IN ULONG pp, IN ULONG aa, IN HANDLE fh OPTIONAL);
+static NtCreateSectionFunc *NtCreateSection;
+
typedef enum _SECTION_INHERIT {
ViewShare = 1,
ViewUnmap = 2
} SECTION_INHERIT;
-NTSTATUS WINAPI
-NtMapViewOfSection(IN PHANDLE sh, IN HANDLE ph,
+typedef NTSTATUS WINAPI (NtMapViewOfSectionFunc)
+ (IN PHANDLE sh, IN HANDLE ph,
IN OUT PVOID *addr, IN ULONG_PTR zbits,
IN SIZE_T cs, IN OUT PLARGE_INTEGER off OPTIONAL,
IN OUT PSIZE_T vs, IN SECTION_INHERIT ih,
IN ULONG at, IN ULONG pp);
-NTSTATUS WINAPI
-NtClose(HANDLE h);
+static NtMapViewOfSectionFunc *NtMapViewOfSection;
+
+typedef NTSTATUS WINAPI (NtCloseFunc)(HANDLE h);
+
+static NtCloseFunc *NtClose;
/** getpid() returns int; MinGW defines pid_t but MinGW64 typedefs it
* as int64 which is wrong. MSVC doesn't define it at all, so just
@@ -4397,6 +4403,21 @@ mdb_env_open2(MDB_env *env, int prev)
env->me_pidquery = MDB_PROCESS_QUERY_LIMITED_INFORMATION;
else
env->me_pidquery = PROCESS_QUERY_INFORMATION;
+ /* Grab functions we need from NTDLL */
+ if (!NtCreateSection) {
+ HMODULE h = GetModuleHandle("NTDLL.DLL");
+ if (!h)
+ return MDB_PANIC;
+ NtClose = (NtCloseFunc *)GetProcAddress(h, "NtClose");
+ if (!NtClose)
+ return MDB_PANIC;
+ NtMapViewOfSection = (NtMapViewOfSectionFunc *)GetProcAddress(h, "NtMapViewOfSection");
+ if (!NtMapViewOfSection)
+ return MDB_PANIC;
+ NtCreateSection = (NtCreateSectionFunc *)GetProcAddress(h, "NtCreateSection");
+ if (!NtCreateSection)
+ return MDB_PANIC;
+ }
#endif /* _WIN32 */
#ifdef BROKEN_FDATASYNC