From 049331932f1f956b6365aba4fc39c06d5461bb14 Mon Sep 17 00:00:00 2001 From: Rose <83477269+AtariDreams@users.noreply.github.com> Date: Wed, 8 Jun 2022 10:25:18 -0400 Subject: [PATCH 1/2] Improve filesystem handling Replace SetFilePointerEx with SetFileInformationByHandle --- stl/src/filesys.cpp | 17 ++++++++++------- stl/src/filesystem.cpp | 11 ++++++----- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/stl/src/filesys.cpp b/stl/src/filesys.cpp index 9a68da5480d..b671a078a51 100644 --- a/stl/src/filesys.cpp +++ b/stl/src/filesys.cpp @@ -416,17 +416,20 @@ _FS_DLL int __CLRCALL_PURE_OR_CDECL _Rename(const wchar_t* _Fname1, const wchar_ } _FS_DLL int __CLRCALL_PURE_OR_CDECL _Resize(const wchar_t* _Fname, uintmax_t _Newsize) { // change file size - bool _Ok = false; HANDLE _Handle = _FilesysOpenFile(_Fname, FILE_GENERIC_WRITE, 0); - if (_Handle != INVALID_HANDLE_VALUE) { // set file pointer to new size and trim - LARGE_INTEGER _Large; - _Large.QuadPart = _Newsize; - _Ok = SetFilePointerEx(_Handle, _Large, nullptr, FILE_BEGIN) != 0 && SetEndOfFile(_Handle) != 0; - CloseHandle(_Handle); + if (_Handle == INVALID_HANDLE_VALUE) { + return GetLastError(); } - return _Ok ? 0 : GetLastError(); + + FILE_END_OF_FILE_INFO _File_info; + _File_info.EndOfFile.QuadPart = static_cast(_Newsize); + + const auto _Ok = SetFileInformationByHandle(_Handle, FileEndOfFileInfo, &_File_info, sizeof(_File_info)); + + CloseHandle(_Handle); + return _Ok != 0 ? 0 : GetLastError(); } diff --git a/stl/src/filesystem.cpp b/stl/src/filesystem.cpp index 6ec69b5988e..54634db7987 100644 --- a/stl/src/filesystem.cpp +++ b/stl/src/filesystem.cpp @@ -693,13 +693,14 @@ _Success_(return == __std_win_error::_Success) __std_win_error return _Err; } - LARGE_INTEGER _Large; - _Large.QuadPart = _New_size; - if (SetFilePointerEx(_Handle._Get(), _Large, nullptr, FILE_BEGIN) == 0 || SetEndOfFile(_Handle._Get()) == 0) { - return __std_win_error{GetLastError()}; + FILE_END_OF_FILE_INFO _File_info; + _File_info.EndOfFile.QuadPart = static_cast(_New_size); + + if (SetFileInformationByHandle(_Handle._Get(), FileEndOfFileInfo, &_File_info, sizeof(_File_info)) != 0) { + return __std_win_error::_Success; } - return __std_win_error::_Success; + return __std_win_error{GetLastError()}; } [[nodiscard]] __std_win_error __stdcall __std_fs_space(_In_z_ const wchar_t* const _Target, From fff7955ac0479da9697f7e20d2e582cdf6993cba Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 21 Jun 2022 20:01:55 -0700 Subject: [PATCH 2/2] Directly test `BOOL`. --- stl/src/filesys.cpp | 2 +- stl/src/filesystem.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stl/src/filesys.cpp b/stl/src/filesys.cpp index b671a078a51..d78049bbb62 100644 --- a/stl/src/filesys.cpp +++ b/stl/src/filesys.cpp @@ -429,7 +429,7 @@ _FS_DLL int __CLRCALL_PURE_OR_CDECL _Resize(const wchar_t* _Fname, uintmax_t _Ne const auto _Ok = SetFileInformationByHandle(_Handle, FileEndOfFileInfo, &_File_info, sizeof(_File_info)); CloseHandle(_Handle); - return _Ok != 0 ? 0 : GetLastError(); + return _Ok ? 0 : GetLastError(); } diff --git a/stl/src/filesystem.cpp b/stl/src/filesystem.cpp index 54634db7987..986ca9098a8 100644 --- a/stl/src/filesystem.cpp +++ b/stl/src/filesystem.cpp @@ -696,7 +696,7 @@ _Success_(return == __std_win_error::_Success) __std_win_error FILE_END_OF_FILE_INFO _File_info; _File_info.EndOfFile.QuadPart = static_cast(_New_size); - if (SetFileInformationByHandle(_Handle._Get(), FileEndOfFileInfo, &_File_info, sizeof(_File_info)) != 0) { + if (SetFileInformationByHandle(_Handle._Get(), FileEndOfFileInfo, &_File_info, sizeof(_File_info))) { return __std_win_error::_Success; }