|
|
@ -48,29 +48,35 @@ |
|
|
|
* the full size. These APIs are defined in <wdm.h> and <ntifs.h> |
|
|
|
* the full size. These APIs are defined in <wdm.h> and <ntifs.h> |
|
|
|
* but those headers are meant for driver-level development and |
|
|
|
* but those headers are meant for driver-level development and |
|
|
|
* conflict with the regular user-level headers, so we explicitly |
|
|
|
* conflict with the regular user-level headers, so we explicitly |
|
|
|
* declare them here. Using these APIs also means we must link to |
|
|
|
* declare them here. We get pointers to these functions from |
|
|
|
* ntdll.dll, which is not linked by default in user code. |
|
|
|
* NTDLL.DLL at runtime, to avoid buildtime dependencies on any |
|
|
|
|
|
|
|
* NTDLL import libraries. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
NTSTATUS WINAPI |
|
|
|
typedef NTSTATUS WINAPI (NtCreateSectionFunc) |
|
|
|
NtCreateSection(OUT PHANDLE sh, IN ACCESS_MASK acc, |
|
|
|
(OUT PHANDLE sh, IN ACCESS_MASK acc, |
|
|
|
IN void * oa OPTIONAL, |
|
|
|
IN void * oa OPTIONAL, |
|
|
|
IN PLARGE_INTEGER ms OPTIONAL, |
|
|
|
IN PLARGE_INTEGER ms OPTIONAL, |
|
|
|
IN ULONG pp, IN ULONG aa, IN HANDLE fh OPTIONAL); |
|
|
|
IN ULONG pp, IN ULONG aa, IN HANDLE fh OPTIONAL); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static NtCreateSectionFunc *NtCreateSection; |
|
|
|
|
|
|
|
|
|
|
|
typedef enum _SECTION_INHERIT { |
|
|
|
typedef enum _SECTION_INHERIT { |
|
|
|
ViewShare = 1, |
|
|
|
ViewShare = 1, |
|
|
|
ViewUnmap = 2 |
|
|
|
ViewUnmap = 2 |
|
|
|
} SECTION_INHERIT; |
|
|
|
} SECTION_INHERIT; |
|
|
|
|
|
|
|
|
|
|
|
NTSTATUS WINAPI |
|
|
|
typedef NTSTATUS WINAPI (NtMapViewOfSectionFunc) |
|
|
|
NtMapViewOfSection(IN PHANDLE sh, IN HANDLE ph, |
|
|
|
(IN PHANDLE sh, IN HANDLE ph, |
|
|
|
IN OUT PVOID *addr, IN ULONG_PTR zbits, |
|
|
|
IN OUT PVOID *addr, IN ULONG_PTR zbits, |
|
|
|
IN SIZE_T cs, IN OUT PLARGE_INTEGER off OPTIONAL, |
|
|
|
IN SIZE_T cs, IN OUT PLARGE_INTEGER off OPTIONAL, |
|
|
|
IN OUT PSIZE_T vs, IN SECTION_INHERIT ih, |
|
|
|
IN OUT PSIZE_T vs, IN SECTION_INHERIT ih, |
|
|
|
IN ULONG at, IN ULONG pp); |
|
|
|
IN ULONG at, IN ULONG pp); |
|
|
|
|
|
|
|
|
|
|
|
NTSTATUS WINAPI |
|
|
|
static NtMapViewOfSectionFunc *NtMapViewOfSection; |
|
|
|
NtClose(HANDLE h); |
|
|
|
|
|
|
|
|
|
|
|
typedef NTSTATUS WINAPI (NtCloseFunc)(HANDLE h); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static NtCloseFunc *NtClose; |
|
|
|
|
|
|
|
|
|
|
|
/** getpid() returns int; MinGW defines pid_t but MinGW64 typedefs it
|
|
|
|
/** 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 |
|
|
|
* as int64 which is wrong. MSVC doesn't define it at all, so just |
|
|
@ -4690,6 +4696,21 @@ mdb_env_open2(MDB_env *env, int prev) |
|
|
|
env->me_pidquery = MDB_PROCESS_QUERY_LIMITED_INFORMATION; |
|
|
|
env->me_pidquery = MDB_PROCESS_QUERY_LIMITED_INFORMATION; |
|
|
|
else |
|
|
|
else |
|
|
|
env->me_pidquery = PROCESS_QUERY_INFORMATION; |
|
|
|
env->me_pidquery = PROCESS_QUERY_INFORMATION; |
|
|
|
|
|
|
|
/* Grab functions we need from NTDLL */ |
|
|
|
|
|
|
|
if (!NtCreateSection) { |
|
|
|
|
|
|
|
HMODULE h = GetModuleHandle("NTDLL.DLL"); |
|
|
|
|
|
|
|
if (!h) |
|
|
|
|
|
|
|
return MDB_PROBLEM; |
|
|
|
|
|
|
|
NtClose = GetProcAddress(h, "NtClose"); |
|
|
|
|
|
|
|
if (!NtClose) |
|
|
|
|
|
|
|
return MDB_PROBLEM; |
|
|
|
|
|
|
|
NtMapViewOfSection = GetProcAddress(h, "NtMapViewOfSection"); |
|
|
|
|
|
|
|
if (!NtMapViewOfSectiob) |
|
|
|
|
|
|
|
return MDB_PROBLEM; |
|
|
|
|
|
|
|
NtCreateSection = GetProcAddress(h, "NtCreateSection"); |
|
|
|
|
|
|
|
if (!NtCreateSection) |
|
|
|
|
|
|
|
return MDB_PROBLEM; |
|
|
|
|
|
|
|
} |
|
|
|
#endif /* _WIN32 */ |
|
|
|
#endif /* _WIN32 */ |
|
|
|
|
|
|
|
|
|
|
|
#ifdef BROKEN_FDATASYNC |
|
|
|
#ifdef BROKEN_FDATASYNC |
|
|
|