Skip to content

Commit

Permalink
ITS#8324 More for Win32 NTDLL junk
Browse files Browse the repository at this point in the history
Use GetProcAddress at runtime, avoid buildtime NTDLL link issues
  • Loading branch information
hyc committed Feb 18, 2018
1 parent 4f80c50 commit b372ec4
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 14 deletions.
4 changes: 0 additions & 4 deletions external/db_drivers/liblmdb/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions external/db_drivers/liblmdb/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
37 changes: 29 additions & 8 deletions external/db_drivers/liblmdb/mdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit b372ec4

Please sign in to comment.