diff --git a/src/lck-windows.c b/src/lck-windows.c index c019a6d5..24fa0996 100644 --- a/src/lck-windows.c +++ b/src/lck-windows.c @@ -663,6 +663,7 @@ MDBX_srwlock_function mdbx_srwlock_Init, mdbx_srwlock_AcquireShared, MDBX_GetFileInformationByHandleEx mdbx_GetFileInformationByHandleEx; MDBX_GetVolumeInformationByHandleW mdbx_GetVolumeInformationByHandleW; MDBX_GetFinalPathNameByHandleW mdbx_GetFinalPathNameByHandleW; +MDBX_SetFileInformationByHandle mdbx_SetFileInformationByHandle; MDBX_NtFsControlFile mdbx_NtFsControlFile; static void mdbx_winnt_import(void) { @@ -699,6 +700,10 @@ static void mdbx_winnt_import(void) { (MDBX_GetFinalPathNameByHandleW)GetProcAddress( hKernel32dll, "GetFinalPathNameByHandleW"); + mdbx_SetFileInformationByHandle = + (MDBX_SetFileInformationByHandle)GetProcAddress( + hKernel32dll, "SetFileInformationByHandle"); + const HINSTANCE hNtdll = GetModuleHandleA("ntdll.dll"); mdbx_NtFsControlFile = (MDBX_NtFsControlFile)GetProcAddress(hNtdll, "NtFsControlFile"); diff --git a/src/osal.c b/src/osal.c index 4f9aad27..2358b323 100644 --- a/src/osal.c +++ b/src/osal.c @@ -741,11 +741,21 @@ int mdbx_filesize(mdbx_filehandle_t fd, uint64_t *length) { int mdbx_ftruncate(mdbx_filehandle_t fd, uint64_t length) { #if defined(_WIN32) || defined(_WIN64) - LARGE_INTEGER li; - li.QuadPart = length; - return (SetFilePointerEx(fd, li, NULL, FILE_BEGIN) && SetEndOfFile(fd)) - ? MDBX_SUCCESS - : GetLastError(); + if (mdbx_SetFileInformationByHandle) { + FILE_END_OF_FILE_INFO EndOfFileInfo; + EndOfFileInfo.EndOfFile.QuadPart = length; + return mdbx_SetFileInformationByHandle(fd, FileEndOfFileInfo, + &EndOfFileInfo, + sizeof(FILE_END_OF_FILE_INFO)) + ? MDBX_SUCCESS + : GetLastError(); + } else { + LARGE_INTEGER li; + li.QuadPart = length; + return (SetFilePointerEx(fd, li, NULL, FILE_BEGIN) && SetEndOfFile(fd)) + ? MDBX_SUCCESS + : GetLastError(); + } #else STATIC_ASSERT_MSG(sizeof(off_t) >= sizeof(size_t), "libmdbx requires 64-bit file I/O on 64-bit systems"); diff --git a/src/osal.h b/src/osal.h index 9f9d1a44..101605be 100644 --- a/src/osal.h +++ b/src/osal.h @@ -627,6 +627,12 @@ typedef DWORD(WINAPI *MDBX_GetFinalPathNameByHandleW)(_In_ HANDLE hFile, _In_ DWORD dwFlags); extern MDBX_GetFinalPathNameByHandleW mdbx_GetFinalPathNameByHandleW; +typedef BOOL(WINAPI *MDBX_SetFileInformationByHandle)( + _In_ HANDLE hFile, _In_ FILE_INFO_BY_HANDLE_CLASS FileInformationClass, + _Out_ LPVOID lpFileInformation, _In_ DWORD dwBufferSize); + +extern MDBX_SetFileInformationByHandle mdbx_SetFileInformationByHandle; + typedef NTSTATUS(NTAPI *MDBX_NtFsControlFile)( IN HANDLE FileHandle, IN OUT HANDLE Event, IN OUT PVOID /* PIO_APC_ROUTINE */ ApcRoutine, IN OUT PVOID ApcContext,