diff options
| author | Stefan Boberg <[email protected]> | 2023-12-07 12:13:03 +0100 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2023-12-07 12:13:03 +0100 |
| commit | 7d18b385d2051eebecca401d9921344938398514 (patch) | |
| tree | 67af7f82078affc53899a2635f668615fbe7c149 /src | |
| parent | ClangFormat (diff) | |
| download | zen-7d18b385d2051eebecca401d9921344938398514.tar.xz zen-7d18b385d2051eebecca401d9921344938398514.zip | |
implemented FlushDataOnly for MacOS
also added handling of NtFlushBuffersFileEx for certain SDK versions
Diffstat (limited to 'src')
| -rw-r--r-- | src/zenutil/basicfile.cpp | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/zenutil/basicfile.cpp b/src/zenutil/basicfile.cpp index 6e45575f6..df0704fa9 100644 --- a/src/zenutil/basicfile.cpp +++ b/src/zenutil/basicfile.cpp @@ -31,6 +31,9 @@ extern "C" NTSTATUS NTAPI NtFlushBuffersFileEx(HANDLE FileHandle, ULONG Flags, PVOID Parameters, ULONG ParametersSize, PIO_STATUS_BLOCK IoStatusBlock); + + using Decl_NtFlushBuffersFileEx = decltype(NtFlushBuffersFileEx); + Decl_NtFlushBuffersFileEx* Real_NtFlushBuffersFileEx; } #else # include <fcntl.h> @@ -39,11 +42,33 @@ extern "C" # include <unistd.h> #endif +#if ZEN_PLATFORM_MAC +# include <fcntl.h> +#endif + #include <fmt/format.h> #include <gsl/gsl-lite.hpp> namespace zen { +NTSTATUS NTAPI +NtFlushBuffersFileEx(HANDLE FileHandle, ULONG Flags, PVOID Parameters, ULONG ParametersSize, PIO_STATUS_BLOCK IoStatusBlock) +{ + if (!Real_NtFlushBuffersFileEx) + { + Real_NtFlushBuffersFileEx = (Decl_NtFlushBuffersFileEx*)GetProcAddress(GetModuleHandleA("kernelbase.dll"), "NtFlushBuffersFileEx"); + } + + if (Real_NtFlushBuffersFileEx) + { + return Real_NtFlushBuffersFileEx(FileHandle, Flags, Parameters, ParametersSize, IoStatusBlock); + } + + return 0; +} + +////////////////////////////////////////////////////////////////////////// + BasicFile::~BasicFile() { Close(); @@ -371,12 +396,15 @@ BasicFile::FlushDataOnly() { #if ZEN_PLATFORM_WINDOWS IO_STATUS_BLOCK Iosb{}; - NTSTATUS Status = NtFlushBuffersFileEx(m_FileHandle, FLUSH_FLAGS_FILE_DATA_ONLY, nullptr, 0, &Iosb); + NTSTATUS Status = zen::NtFlushBuffersFileEx(m_FileHandle, FLUSH_FLAGS_FILE_DATA_ONLY, nullptr, 0, &Iosb); if (Status != STATUS_SUCCESS) { // warn? } +#elif ZEN_PLATFORM_MAC + int Fd = int(uintptr_t(m_FileHandle)); + fcntl(Fd, F_FULLFSYNC); #else int Fd = int(uintptr_t(m_FileHandle)); fdatasync(Fd); |