https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3cfd8ab775d8e3028b3657907ff27485f7af222c

commit 3cfd8ab775d8e3028b3657907ff27485f7af222c
Author:     Vincent Franchomme <[email protected]>
AuthorDate: Thu Apr 28 21:35:40 2022 +0200
Commit:     Hermès BÉLUSCA - MAÏTO <[email protected]>
CommitDate: Tue May 3 17:30:11 2022 +0200

    [BTRFS][UBTRFS][SHELLBTRFS] Upgrade to 1.7.8 (#4417)
    
    v1.7.8.1 (2021-06-13):
    
    - Fixed bug preventing new directories from appearing in listings
    - Fixed Release version of driver still not working on XP
    
    v1.7.8 (2021-06-09):
    
    - ~~Upgraded zstd to version 1.5.0~~ Not in ReactOS as it introduces 
deprecated code
    - Fixed regression stopping driver from working under XP
    - Fixed compilation on clang
    - Fixed corruption issue when Linux mount option inode_cache had been used
    - Fixed recursion issue involving virtual directory \$Root
---
 dll/shellext/shellbtrfs/iconoverlay.cpp  |  6 +++---
 dll/shellext/shellbtrfs/iconoverlay.h    |  6 +++---
 dll/shellext/shellbtrfs/main.cpp         | 10 +++++-----
 dll/shellext/shellbtrfs/propsheet.cpp    |  6 +++---
 dll/shellext/shellbtrfs/recv.cpp         | 18 +++++++++++++++++
 dll/shellext/shellbtrfs/shellbtrfs.rc    |  8 ++++----
 dll/shellext/shellbtrfs/shellext.h       | 10 +++++-----
 dll/shellext/shellbtrfs/volpropsheet.cpp |  2 +-
 dll/win32/ubtrfs/ubtrfs.rc               |  8 ++++----
 drivers/filesystems/btrfs/balance.c      |  4 ----
 drivers/filesystems/btrfs/btrfs.c        |  4 ++--
 drivers/filesystems/btrfs/btrfs.h        |  1 +
 drivers/filesystems/btrfs/btrfs.inf      |  2 +-
 drivers/filesystems/btrfs/btrfs.rc       |  8 ++++----
 drivers/filesystems/btrfs/btrfs_drv.h    |  6 +++---
 drivers/filesystems/btrfs/dirctrl.c      |  7 +++++++
 drivers/filesystems/btrfs/flushthread.c  |  4 ----
 drivers/filesystems/btrfs/fsctl.c        | 34 ++++++++++++++------------------
 sdk/lib/fslib/btrfslib/btrfslib.c        |  2 --
 19 files changed, 79 insertions(+), 67 deletions(-)

diff --git a/dll/shellext/shellbtrfs/iconoverlay.cpp 
b/dll/shellext/shellbtrfs/iconoverlay.cpp
index 6cfbe4b6492..1c14c2c322b 100644
--- a/dll/shellext/shellbtrfs/iconoverlay.cpp
+++ b/dll/shellext/shellbtrfs/iconoverlay.cpp
@@ -43,7 +43,7 @@ HRESULT __stdcall BtrfsIconOverlay::QueryInterface(REFIID 
riid, void **ppObj) {
     return E_NOINTERFACE;
 }
 
-HRESULT __stdcall BtrfsIconOverlay::GetOverlayInfo(PWSTR pwszIconFile, int 
cchMax, int* pIndex, DWORD* pdwFlags) {
+HRESULT __stdcall BtrfsIconOverlay::GetOverlayInfo(PWSTR pwszIconFile, int 
cchMax, int* pIndex, DWORD* pdwFlags) noexcept {
     if (GetModuleFileNameW(module, pwszIconFile, cchMax) == 0)
         return E_FAIL;
 
@@ -62,7 +62,7 @@ HRESULT __stdcall BtrfsIconOverlay::GetOverlayInfo(PWSTR 
pwszIconFile, int cchMa
     return S_OK;
 }
 
-HRESULT __stdcall BtrfsIconOverlay::GetPriority(int *pPriority) {
+HRESULT __stdcall BtrfsIconOverlay::GetPriority(int *pPriority) noexcept {
     if (!pPriority)
         return E_INVALIDARG;
 
@@ -71,7 +71,7 @@ HRESULT __stdcall BtrfsIconOverlay::GetPriority(int 
*pPriority) {
     return S_OK;
 }
 
-HRESULT __stdcall BtrfsIconOverlay::IsMemberOf(PCWSTR pwszPath, DWORD 
dwAttrib) {
+HRESULT __stdcall BtrfsIconOverlay::IsMemberOf(PCWSTR pwszPath, DWORD 
dwAttrib) noexcept {
     win_handle h;
     NTSTATUS Status;
     IO_STATUS_BLOCK iosb;
diff --git a/dll/shellext/shellbtrfs/iconoverlay.h 
b/dll/shellext/shellbtrfs/iconoverlay.h
index 24276ddcb9c..4defcbd1d60 100644
--- a/dll/shellext/shellbtrfs/iconoverlay.h
+++ b/dll/shellext/shellbtrfs/iconoverlay.h
@@ -51,9 +51,9 @@ public:
 
     // IShellIconOverlayIdentifier
 
-    virtual HRESULT __stdcall GetOverlayInfo(PWSTR pwszIconFile, int cchMax, 
int* pIndex, DWORD* pdwFlags);
-    virtual HRESULT __stdcall GetPriority(int *pPriority);
-    virtual HRESULT __stdcall IsMemberOf(PCWSTR pwszPath, DWORD dwAttrib);
+    virtual HRESULT __stdcall GetOverlayInfo(PWSTR pwszIconFile, int cchMax, 
int* pIndex, DWORD* pdwFlags) noexcept;
+    virtual HRESULT __stdcall GetPriority(int *pPriority) noexcept;
+    virtual HRESULT __stdcall IsMemberOf(PCWSTR pwszPath, DWORD dwAttrib) 
noexcept;
 
 private:
     LONG refcount;
diff --git a/dll/shellext/shellbtrfs/main.cpp b/dll/shellext/shellbtrfs/main.cpp
index 55b4121a090..d19db443165 100644
--- a/dll/shellext/shellbtrfs/main.cpp
+++ b/dll/shellext/shellbtrfs/main.cpp
@@ -243,11 +243,11 @@ void wstring_sprintf(wstring& s, wstring fmt, ...) {
 #pragma warning(pop)
 #endif
 
-extern "C" STDAPI DllCanUnloadNow(void) {
+STDAPI DllCanUnloadNow(void) {
     return objs_loaded == 0 ? S_OK : S_FALSE;
 }
 
-extern "C" STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) 
{
+STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) {
     if (rclsid == CLSID_ShellBtrfsIconHandler) {
         Factory* fact = new Factory;
         if (!fact)
@@ -497,7 +497,7 @@ static void unreg_prop_sheet_handler(const wstring& 
filetype, const wstring& nam
 #endif
 }
 
-extern "C" STDAPI DllRegisterServer(void) {
+STDAPI DllRegisterServer(void) {
     try {
         register_clsid(CLSID_ShellBtrfsIconHandler, 
COM_DESCRIPTION_ICON_HANDLER);
         register_clsid(CLSID_ShellBtrfsContextMenu, 
COM_DESCRIPTION_CONTEXT_MENU);
@@ -520,7 +520,7 @@ extern "C" STDAPI DllRegisterServer(void) {
     return S_OK;
 }
 
-extern "C" STDAPI DllUnregisterServer(void) {
+STDAPI DllUnregisterServer(void) {
     try {
         unreg_prop_sheet_handler(L"Folder", ICON_OVERLAY_NAME);
         unreg_prop_sheet_handler(L"*", ICON_OVERLAY_NAME);
@@ -541,7 +541,7 @@ extern "C" STDAPI DllUnregisterServer(void) {
     return S_OK;
 }
 
-extern "C" STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine) {
+STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine) {
     if (bInstall)
         return DllRegisterServer();
     else
diff --git a/dll/shellext/shellbtrfs/propsheet.cpp 
b/dll/shellext/shellbtrfs/propsheet.cpp
index faa7194e664..f31ce2eb85f 100644
--- a/dll/shellext/shellbtrfs/propsheet.cpp
+++ b/dll/shellext/shellbtrfs/propsheet.cpp
@@ -336,7 +336,7 @@ HRESULT BtrfsPropSheet::load_file_list() {
     totalsize = allocsize = sparsesize = 0;
 
     for (i = 0; i < num_files; i++) {
-        if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / 
sizeof(MAX_PATH))) {
+        if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / 
sizeof(WCHAR))) {
             HRESULT hr;
 
             hr = check_file(fn, i, num_files, &sv);
@@ -704,7 +704,7 @@ void BtrfsPropSheet::apply_changes(HWND hDlg) {
         num_files = DragQueryFileW((HDROP)stgm.hGlobal, 0xFFFFFFFF, nullptr, 
0);
 
         for (i = 0; i < num_files; i++) {
-            if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / 
sizeof(MAX_PATH))) {
+            if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / 
sizeof(WCHAR))) {
                 apply_changes_file(hDlg, fn);
             }
         }
@@ -882,7 +882,7 @@ void BtrfsPropSheet::open_as_admin(HWND hwndDlg) {
     GetModuleFileNameW(module, modfn, sizeof(modfn) / sizeof(WCHAR));
 
     for (i = 0; i < num_files; i++) {
-        if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / 
sizeof(MAX_PATH))) {
+        if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / 
sizeof(WCHAR))) {
             wstring t;
             SHELLEXECUTEINFOW sei;
 
diff --git a/dll/shellext/shellbtrfs/recv.cpp b/dll/shellext/shellbtrfs/recv.cpp
index 0dc3bf859bb..673df5c42fb 100644
--- a/dll/shellext/shellbtrfs/recv.cpp
+++ b/dll/shellext/shellbtrfs/recv.cpp
@@ -1563,6 +1563,11 @@ extern "C" void CALLBACK RecvSubvolGUIW(HWND hwnd, 
HINSTANCE hinst, LPWSTR lpszC
 
         tp->PrivilegeCount = 3;
 
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warray-bounds"
+#endif // __clang__
+
         if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", 
&luid)) {
             free(tp);
             throw last_error(GetLastError());
@@ -1592,6 +1597,10 @@ extern "C" void CALLBACK RecvSubvolGUIW(HWND hwnd, 
HINSTANCE hinst, LPWSTR lpszC
             throw last_error(GetLastError());
         }
 
+#ifdef __clang__
+    #pragma clang diagnostic pop
+#endif // __clang__
+
         file[0] = 0;
 
         memset(&ofn, 0, sizeof(OPENFILENAMEW));
@@ -1636,6 +1645,11 @@ extern "C" void CALLBACK RecvSubvolW(HWND hwnd, 
HINSTANCE hinst, LPWSTR lpszCmdL
 
             tp->PrivilegeCount = 3;
 
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warray-bounds"
+#endif // __clang__
+
             if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", 
&luid)) {
                 free(tp);
                 return;
@@ -1660,6 +1674,10 @@ extern "C" void CALLBACK RecvSubvolW(HWND hwnd, 
HINSTANCE hinst, LPWSTR lpszCmdL
             tp->Privileges[2].Luid = luid;
             tp->Privileges[2].Attributes = SE_PRIVILEGE_ENABLED;
 
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif // __clang__
+
             if (!AdjustTokenPrivileges(token, false, tp, tplen, nullptr, 
nullptr)) {
                 free(tp);
                 return;
diff --git a/dll/shellext/shellbtrfs/shellbtrfs.rc 
b/dll/shellext/shellbtrfs/shellbtrfs.rc
index 26d3d6aa67e..acf070e40f9 100644
--- a/dll/shellext/shellbtrfs/shellbtrfs.rc
+++ b/dll/shellext/shellbtrfs/shellbtrfs.rc
@@ -61,8 +61,8 @@ IDI_ICON1               ICON                    "subvol.ico"
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,7,7,0
- PRODUCTVERSION 1,7,7,0
+ FILEVERSION 1,7,8,0
+ PRODUCTVERSION 1,7,8,0
  FILEFLAGSMASK 0x17L
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -78,12 +78,12 @@ BEGIN
         BLOCK "080904b0"
         BEGIN
             VALUE "FileDescription", "WinBtrfs shell extension"
-            VALUE "FileVersion", "1.7.7"
+            VALUE "FileVersion", "1.7.8"
             VALUE "InternalName", "btrfs"
             VALUE "LegalCopyright", "Copyright (c) Mark Harmstone 2016-21"
             VALUE "OriginalFilename", "shellbtrfs.dll"
             VALUE "ProductName", "WinBtrfs"
-            VALUE "ProductVersion", "1.7.7"
+            VALUE "ProductVersion", "1.7.8"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/dll/shellext/shellbtrfs/shellext.h 
b/dll/shellext/shellbtrfs/shellext.h
index cfa09779213..ed85136f901 100644
--- a/dll/shellext/shellbtrfs/shellext.h
+++ b/dll/shellext/shellbtrfs/shellext.h
@@ -104,10 +104,6 @@ using namespace std;
 extern "C" {
 #endif
 #ifndef __REACTOS__
-NTSYSCALLAPI NTSTATUS NTAPI NtFsControlFile(HANDLE FileHandle, HANDLE Event, 
PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
-                                            PIO_STATUS_BLOCK IoStatusBlock, 
ULONG FsControlCode, PVOID InputBuffer, ULONG InputBufferLength,
-                                            PVOID OutputBuffer, ULONG 
OutputBufferLength);
-
 NTSTATUS NTAPI NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE 
ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer,
                           ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);
 
@@ -115,11 +111,15 @@ NTSTATUS WINAPI NtSetEaFile(HANDLE FileHandle, 
PIO_STATUS_BLOCK IoStatusBlock, P
 
 NTSTATUS WINAPI NtSetSecurityObject(HANDLE Handle, SECURITY_INFORMATION 
SecurityInformation, PSECURITY_DESCRIPTOR SecurityDescriptor);
 
+#ifdef _MSC_VER
+NTSYSCALLAPI NTSTATUS NTAPI NtFsControlFile(HANDLE FileHandle, HANDLE Event, 
PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
+                                            PIO_STATUS_BLOCK IoStatusBlock, 
ULONG FsControlCode, PVOID InputBuffer, ULONG InputBufferLength,
+                                            PVOID OutputBuffer, ULONG 
OutputBufferLength);
+
 NTSTATUS NTAPI NtQueryInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID 
ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass);
 
 NTSTATUS NTAPI NtSetInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID 
ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass);
 
-#ifdef _MSC_VER
 #define FileBasicInformation (FILE_INFORMATION_CLASS)4
 #define FileStandardInformation (FILE_INFORMATION_CLASS)5
 #define FileDispositionInformation (FILE_INFORMATION_CLASS)13
diff --git a/dll/shellext/shellbtrfs/volpropsheet.cpp 
b/dll/shellext/shellbtrfs/volpropsheet.cpp
index a2f50fac2aa..c79bf8b7d30 100644
--- a/dll/shellext/shellbtrfs/volpropsheet.cpp
+++ b/dll/shellext/shellbtrfs/volpropsheet.cpp
@@ -97,7 +97,7 @@ HRESULT __stdcall 
BtrfsVolPropSheet::Initialize(PCIDLIST_ABSOLUTE pidlFolder, ID
         return E_FAIL;
     }
 
-    if (DragQueryFileW((HDROP)stgm.hGlobal, 0, fnbuf, sizeof(fnbuf) / 
sizeof(MAX_PATH))) {
+    if (DragQueryFileW((HDROP)stgm.hGlobal, 0, fnbuf, sizeof(fnbuf) / 
sizeof(WCHAR))) {
         fn = fnbuf;
 
         win_handle h = CreateFileW(fn.c_str(), FILE_TRAVERSE | 
FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 
nullptr,
diff --git a/dll/win32/ubtrfs/ubtrfs.rc b/dll/win32/ubtrfs/ubtrfs.rc
index c12381e9f56..2b17773476b 100644
--- a/dll/win32/ubtrfs/ubtrfs.rc
+++ b/dll/win32/ubtrfs/ubtrfs.rc
@@ -51,8 +51,8 @@ END
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,7,7,0
- PRODUCTVERSION 1,7,7,0
+ FILEVERSION 1,7,8,0
+ PRODUCTVERSION 1,7,8,0
  FILEFLAGSMASK 0x17L
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -68,12 +68,12 @@ BEGIN
         BLOCK "080904b0"
         BEGIN
             VALUE "FileDescription", "Btrfs utility DLL"
-            VALUE "FileVersion", "1.7.7"
+            VALUE "FileVersion", "1.7.8"
             VALUE "InternalName", "ubtrfs"
             VALUE "LegalCopyright", "Copyright (c) Mark Harmstone 2016-21"
             VALUE "OriginalFilename", "ubtrfs.dll"
             VALUE "ProductName", "WinBtrfs"
-            VALUE "ProductVersion", "1.7.7"
+            VALUE "ProductVersion", "1.7.8"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/drivers/filesystems/btrfs/balance.c 
b/drivers/filesystems/btrfs/balance.c
index 6f2b5e55091..143151d001a 100644
--- a/drivers/filesystems/btrfs/balance.c
+++ b/drivers/filesystems/btrfs/balance.c
@@ -68,10 +68,6 @@ typedef struct {
     LIST_ENTRY list_entry;
 } data_reloc_ref;
 
-#ifndef _MSC_VER // not in mingw yet
-#define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED 0x80000000
-#endif
-
 #define BALANCE_UNIT 0x100000 // only read 1 MB at a time
 
 static NTSTATUS 
add_metadata_reloc(_Requires_exclusive_lock_held_(_Curr_->tree_lock) 
device_extension* Vcb, LIST_ENTRY* items, traverse_ptr* tp,
diff --git a/drivers/filesystems/btrfs/btrfs.c 
b/drivers/filesystems/btrfs/btrfs.c
index 6c821f12534..efd80d94357 100644
--- a/drivers/filesystems/btrfs/btrfs.c
+++ b/drivers/filesystems/btrfs/btrfs.c
@@ -397,7 +397,7 @@ static bool get_last_inode(_In_ 
_Requires_exclusive_lock_held_(_Curr_->tree_lock
         return false;
     }
 
-    if (tp.item->key.obj_type == TYPE_INODE_ITEM || (tp.item->key.obj_type == 
TYPE_ROOT_ITEM && !(tp.item->key.obj_id & 0x8000000000000000))) {
+    if ((tp.item->key.obj_type == TYPE_INODE_ITEM || tp.item->key.obj_type == 
TYPE_ROOT_ITEM) && tp.item->key.obj_id <= BTRFS_LAST_FREE_OBJECTID) {
         r->lastinode = tp.item->key.obj_id;
         TRACE("last inode for tree %I64x is %I64x\n", r->id, r->lastinode);
         return true;
@@ -408,7 +408,7 @@ static bool get_last_inode(_In_ 
_Requires_exclusive_lock_held_(_Curr_->tree_lock
 
         TRACE("moving on to %I64x,%x,%I64x\n", tp.item->key.obj_id, 
tp.item->key.obj_type, tp.item->key.offset);
 
-        if (tp.item->key.obj_type == TYPE_INODE_ITEM || (tp.item->key.obj_type 
== TYPE_ROOT_ITEM && !(tp.item->key.obj_id & 0x8000000000000000))) {
+        if ((tp.item->key.obj_type == TYPE_INODE_ITEM || tp.item->key.obj_type 
== TYPE_ROOT_ITEM) && tp.item->key.obj_id <= BTRFS_LAST_FREE_OBJECTID) {
             r->lastinode = tp.item->key.obj_id;
             TRACE("last inode for tree %I64x is %I64x\n", r->id, r->lastinode);
             return true;
diff --git a/drivers/filesystems/btrfs/btrfs.h 
b/drivers/filesystems/btrfs/btrfs.h
index 6ff680234df..b0b7fbd0015 100644
--- a/drivers/filesystems/btrfs/btrfs.h
+++ b/drivers/filesystems/btrfs/btrfs.h
@@ -15,6 +15,7 @@ static const uint64_t superblock_addrs[] = { 0x10000, 
0x4000000, 0x4000000000, 0
 #define BTRFS_MAGIC         0x4d5f53665248425f
 #define MAX_LABEL_SIZE      0x100
 #define SUBVOL_ROOT_INODE   0x100
+#define BTRFS_LAST_FREE_OBJECTID    0xffffffffffffff00
 
 #define TYPE_INODE_ITEM        0x01
 #define TYPE_INODE_REF         0x0C
diff --git a/drivers/filesystems/btrfs/btrfs.inf 
b/drivers/filesystems/btrfs/btrfs.inf
index e0f6148cdae..b5fa3da9136 100644
--- a/drivers/filesystems/btrfs/btrfs.inf
+++ b/drivers/filesystems/btrfs/btrfs.inf
@@ -10,7 +10,7 @@ Signature   = "$Windows NT$"
 Class       = Volume
 ClassGuid   = {71a27cdd-812a-11d0-bec7-08002be2092f}
 Provider    = %Me%
-DriverVer   = 04/12/2021,1.7.7.0
+DriverVer   = 06/07/2021,1.7.8.0
 CatalogFile = btrfs.cat
 
 [DestinationDirs]
diff --git a/drivers/filesystems/btrfs/btrfs.rc 
b/drivers/filesystems/btrfs/btrfs.rc
index b4358b2419d..72a541c3f69 100644
--- a/drivers/filesystems/btrfs/btrfs.rc
+++ b/drivers/filesystems/btrfs/btrfs.rc
@@ -51,8 +51,8 @@ END
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,7,7,0
- PRODUCTVERSION 1,7,7,0
+ FILEVERSION 1,7,8,0
+ PRODUCTVERSION 1,7,8,0
  FILEFLAGSMASK 0x17L
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -68,12 +68,12 @@ BEGIN
         BLOCK "080904b0"
         BEGIN
             VALUE "FileDescription", "WinBtrfs"
-            VALUE "FileVersion", "1.7.7"
+            VALUE "FileVersion", "1.7.8"
             VALUE "InternalName", "btrfs"
             VALUE "LegalCopyright", "Copyright (c) Mark Harmstone 2016-21"
             VALUE "OriginalFilename", "btrfs.sys"
             VALUE "ProductName", "WinBtrfs"
-            VALUE "ProductVersion", "1.7.7"
+            VALUE "ProductVersion", "1.7.8"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/drivers/filesystems/btrfs/btrfs_drv.h 
b/drivers/filesystems/btrfs/btrfs_drv.h
index 106332d77c4..597e5d62794 100644
--- a/drivers/filesystems/btrfs/btrfs_drv.h
+++ b/drivers/filesystems/btrfs/btrfs_drv.h
@@ -126,7 +126,7 @@ C_ASSERT(sizeof(bool) == 1);
 
 #define BTRFS_VOLUME_PREFIX L"\\Device\\Btrfs{"
 
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__clang__)
 #define try __try
 #define except __except
 #define finally __finally
@@ -1633,7 +1633,7 @@ extern BTRFS_UUID boot_uuid;
 // not in mingw yet
 #ifndef _MSC_VER
 typedef struct {
-    FSRTL_COMMON_FCB_HEADER DUMMYSTRUCTNAME;
+    FSRTL_COMMON_FCB_HEADER Header;
     PFAST_MUTEX FastMutex;
     LIST_ENTRY FilterContexts;
     EX_PUSH_LOCK PushLock;
@@ -1652,7 +1652,7 @@ typedef struct {
 #endif
 #else
 typedef struct {
-    FSRTL_COMMON_FCB_HEADER DUMMYSTRUCTNAME;
+    FSRTL_COMMON_FCB_HEADER Header;
     PFAST_MUTEX FastMutex;
     LIST_ENTRY FilterContexts;
     EX_PUSH_LOCK PushLock;
diff --git a/drivers/filesystems/btrfs/dirctrl.c 
b/drivers/filesystems/btrfs/dirctrl.c
index a7f7f0c0953..6b7b66cba4f 100644
--- a/drivers/filesystems/btrfs/dirctrl.c
+++ b/drivers/filesystems/btrfs/dirctrl.c
@@ -727,6 +727,13 @@ next:
     if (!dc)
         return STATUS_NO_MORE_FILES;
 
+    if (dc->root_dir && fileref->parent) { // hide $Root dir unless in 
apparent root, to avoid recursion
+        if (dc->list_entry_index.Flink == &fileref->fcb->dir_children_index)
+            return STATUS_NO_MORE_FILES;
+
+        dc = CONTAINING_RECORD(dc->list_entry_index.Flink, dir_child, 
list_entry_index);
+    }
+
     de->key = dc->key;
     de->name = dc->name;
     de->type = dc->type;
diff --git a/drivers/filesystems/btrfs/flushthread.c 
b/drivers/filesystems/btrfs/flushthread.c
index e6354b36822..565f400c4b5 100644
--- a/drivers/filesystems/btrfs/flushthread.c
+++ b/drivers/filesystems/btrfs/flushthread.c
@@ -46,10 +46,6 @@ typedef struct {
 static NTSTATUS create_chunk(device_extension* Vcb, chunk* c, PIRP Irp);
 static NTSTATUS update_tree_extents(device_extension* Vcb, tree* t, PIRP Irp, 
LIST_ENTRY* rollback);
 
-#ifndef _MSC_VER // not in mingw yet
-#define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED 0x80000000
-#endif
-
 _Function_class_(IO_COMPLETION_ROUTINE)
 static NTSTATUS __stdcall write_completion(PDEVICE_OBJECT DeviceObject, PIRP 
Irp, PVOID conptr) {
     write_context* context = conptr;
diff --git a/drivers/filesystems/btrfs/fsctl.c 
b/drivers/filesystems/btrfs/fsctl.c
index 8ad58df883f..310816c272f 100644
--- a/drivers/filesystems/btrfs/fsctl.c
+++ b/drivers/filesystems/btrfs/fsctl.c
@@ -36,10 +36,6 @@
 
 #define SEF_AVOID_PRIVILEGE_CHECK 0x08 // on MSDN but not in any header 
files(?)
 
-#ifndef _MSC_VER // not in mingw yet
-#define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED 0x80000000
-#endif
-
 #define SEF_SACL_AUTO_INHERIT 0x02
 
 extern LIST_ENTRY VcbList;
@@ -5030,7 +5026,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* 
Vcb, PFILE_OBJECT FileO
 
     ExAcquireResourceSharedLite(fcb->Header.Resource, true);
 
-    try {
+    _SEH2_TRY {
         LIST_ENTRY* le = fcb->extents.Flink;
         extent* first_ext = NULL;
         unsigned int num_extents = 0, first_extent_num = 0, i;
@@ -5067,7 +5063,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* 
Vcb, PFILE_OBJECT FileO
 
         if (!first_ext) {
             Status = STATUS_END_OF_FILE;
-            leave;
+            _SEH2_LEAVE;
         }
 
         out->ExtentCount = num_extents - first_extent_num;
@@ -5090,7 +5086,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* 
Vcb, PFILE_OBJECT FileO
             if (ext->offset > last_off) {
                 if (outlen < sizeof(LARGE_INTEGER) + sizeof(LARGE_INTEGER)) {
                     Status = STATUS_BUFFER_OVERFLOW;
-                    leave;
+                    _SEH2_LEAVE;
                 }
 
                 out->Extents[i].NextVcn.QuadPart = ext->offset >> 
Vcb->sector_shift;
@@ -5103,7 +5099,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* 
Vcb, PFILE_OBJECT FileO
 
             if (outlen < sizeof(LARGE_INTEGER) + sizeof(LARGE_INTEGER)) {
                 Status = STATUS_BUFFER_OVERFLOW;
-                leave;
+                _SEH2_LEAVE;
             }
 
             out->Extents[i].NextVcn.QuadPart = (ext->offset + 
ext->extent_data.decoded_size) >> Vcb->sector_shift;
@@ -5125,7 +5121,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* 
Vcb, PFILE_OBJECT FileO
         if (num_sectors << Vcb->sector_shift > last_off) {
             if (outlen < sizeof(LARGE_INTEGER) + sizeof(LARGE_INTEGER)) {
                 Status = STATUS_BUFFER_OVERFLOW;
-                leave;
+                _SEH2_LEAVE;
             }
 
             out->Extents[i].NextVcn.QuadPart = num_sectors;
@@ -5136,9 +5132,9 @@ static NTSTATUS get_retrieval_pointers(device_extension* 
Vcb, PFILE_OBJECT FileO
         }
 
         Status = STATUS_SUCCESS;
-    } finally {
+    } _SEH2_FINALLY {
         ExReleaseResourceLite(fcb->Header.Resource);
-    }
+    } _SEH2_END;
 
     return Status;
 }
@@ -5235,7 +5231,7 @@ static NTSTATUS get_csum_info(device_extension* Vcb, 
PFILE_OBJECT FileObject, bt
 
     ExAcquireResourceSharedLite(fcb->Header.Resource, true);
 
-    try {
+    _SEH2_TRY {
         LIST_ENTRY* le;
         uint8_t* ptr;
         uint64_t last_off;
@@ -5244,17 +5240,17 @@ static NTSTATUS get_csum_info(device_extension* Vcb, 
PFILE_OBJECT FileObject, bt
 
         if (fcb->ads) {
             Status = STATUS_INVALID_DEVICE_REQUEST;
-            leave;
+            _SEH2_LEAVE;
         }
 
         if (fcb->type == BTRFS_TYPE_DIRECTORY) {
             Status = STATUS_FILE_IS_A_DIRECTORY;
-            leave;
+            _SEH2_LEAVE;
         }
 
         if (fcb->inode_item.flags & BTRFS_INODE_NODATASUM) {
             Status = STATUS_INVALID_DEVICE_REQUEST;
-            leave;
+            _SEH2_LEAVE;
         }
 
         buf->csum_type = Vcb->superblock.csum_type;
@@ -5273,7 +5269,7 @@ static NTSTATUS get_csum_info(device_extension* Vcb, 
PFILE_OBJECT FileObject, bt
                 buf->num_sectors = 0;
                 *retlen = offsetof(btrfs_csum_info, data[0]);
                 Status = STATUS_SUCCESS;
-                leave;
+                _SEH2_LEAVE;
             }
 
             le = le->Flink;
@@ -5284,7 +5280,7 @@ static NTSTATUS get_csum_info(device_extension* Vcb, 
PFILE_OBJECT FileObject, bt
         if (buflen < offsetof(btrfs_csum_info, data[0]) + (buf->csum_length * 
buf->num_sectors)) {
             Status = STATUS_BUFFER_OVERFLOW;
             *retlen = offsetof(btrfs_csum_info, data[0]);
-            leave;
+            _SEH2_LEAVE;
         }
 
         ptr = buf->data;
@@ -5333,9 +5329,9 @@ static NTSTATUS get_csum_info(device_extension* Vcb, 
PFILE_OBJECT FileObject, bt
 
         *retlen = offsetof(btrfs_csum_info, data[0]) + (buf->csum_length * 
buf->num_sectors);
         Status = STATUS_SUCCESS;
-    } finally {
+    } _SEH2_FINALLY {
         ExReleaseResourceLite(fcb->Header.Resource);
-    }
+    } _SEH2_END;
 
     return Status;
 }
diff --git a/sdk/lib/fslib/btrfslib/btrfslib.c 
b/sdk/lib/fslib/btrfslib/btrfslib.c
index 7c07cdc1d63..695f2f00e8f 100644
--- a/sdk/lib/fslib/btrfslib/btrfslib.c
+++ b/sdk/lib/fslib/btrfslib/btrfslib.c
@@ -82,8 +82,6 @@ void blake2b(void *out, size_t outlen, const void* in, size_t 
inlen);
 #ifdef __cplusplus
 extern "C" {
 #endif
-NTSYSCALLAPI NTSTATUS NTAPI NtFsControlFile(HANDLE FileHandle, HANDLE Event, 
PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, 
ULONG FsControlCode, PVOID InputBuffer, ULONG InputBufferLength, PVOID 
OutputBuffer, ULONG OutputBufferLength);
-
 NTSTATUS NTAPI NtWriteFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE 
ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer,
                            ULONG Length, PLARGE_INTEGER ByteOffset, PULONG 
Key);
 

Reply via email to