Search code examples
cvisual-studiolmdb

Link project with ntdll.dll in Visual Studio


I've trying to build lmdb using Visual Studio, but get the following error:

mdb.obj : error LNK2001: unresolved external symbol _NtMapViewOfSection@40
mdb.obj : error LNK2001: unresolved external symbol _NtClose@4
mdb.obj : error LNK2001: unresolved external symbol _NtCreateSection@28

To the first usage of this functions in code there is a following comment:

/* We use native NT APIs to setup the memory map, so that we can
 * let the DB file grow incrementally instead of always preallocating
 * 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.
 */
NTSTATUS WINAPI
NtCreateSection(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);

How I need to link ntdll.dll in Visual Studio? I understand, that question is stupid, but I can't find solution within a few hours..


Solution

  • Great thanks to @datjko! He was right:

    I believe the version number in trunk was not updated by mistake. Version 0.9.17 was released in Nov 30, 2015 and is available here github.com/LMDB/lmdb/releases/tag/LMDB_0.9.17. As far as I can see, using of functions from ntdll was added to trunk after the release in github.com/LMDB/lmdb/commit/… also in Nov 30, 2015. So, unless you want to testdrive the recent development version I believe you'd better use a recent stable version.

    The problem was solved after following his recommendations.