https://bugs.winehq.org/show_bug.cgi?id=48620
Bug ID: 48620 Summary: libmdbx (memory-mapped DB) fail on Wine Product: Wine Version: unspecified Hardware: x86 OS: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: ntdll Assignee: wine-bugs@winehq.org Reporter: leo@yuriev.ru Distribution: ---
The libmdbx provides an embedded key-value storage engine (i.e. a database service) and map whole data into memory (i.e. uses a memory mapped file), and I am the main developer of this project. https://github.com/erthink/libmdbx
Native versions of libmdbx work fine on both Linux, Windows, MacOS, FreeBSD, etc. However, the windows version does not work under Wine, for instance, as part of the Miranda NG messenger. Therefore, some users ask me to fix libmdbx, but it is difficult, since there are no such errors in libmdbx.
This is NOT a big problem, as there are relatively few affected users. However, I think it would be better to fix this error as well. In addition, this fix is likely to fix problems in other applications that are compelled to use the Windows native API.
I am not familiar with Wine and do not use it. So I haven't tried debugging the windows version of libmdbx on Wine yet, but decided it would be wise to fill out this report first. I hope someone experienced can explain what's wrong on by simply reading the description below or quickly reviewing the source code.
---
Presumably, the problem with libmdbx is using the Windows native API: NtCreateSection(), NtMapViewOfSection(), NtExtendSection(), NtUnmapViewOfSection(), NtClose(), NtAllocateVirtualMemory(), NtFreeVirtualMemory(). In libmdbx, I am forced to use these functions to increase the data file without unmap it from memory. In libmdbx, I am forced to use these functions to increase the data file without unmap it from memory. It is done by NtExtendSection() when a section created with SECTION_EXTEND_SIZE access.
The next a potential cause of problems in using the functions: NtFsControlFile(FSCTL_GET_EXTERNAL_BACKING), GetFileInformationByHandleEx(FileRemoteProtocolInfo), GetVolumeInformationByHandleW(), GetFinalPathNameByHandleW(). These functions are used via GetProcAddress() to determine the placement of files on network drives.
The last point the NtQuerySystemInformation(0x03 /* SystemTmeOfDayInformation */) is used to determine boot time.
Corresponding source code: https://github.com/erthink/libmdbx/blob/master/src/elements/osal.c https://github.com/erthink/libmdbx/blob/master/src/elements/lck-windows.c
Regards.