[SHELLBTRFS] Upgrade to 1.1
[reactos.git] / dll / shellext / shellbtrfs / volpropsheet.cpp
index 9f2ae8d..8189f39 100644 (file)
@@ -50,15 +50,15 @@ HRESULT __stdcall BtrfsVolPropSheet::QueryInterface(REFIID riid, void **ppObj) {
         return S_OK;
     }
 
-    *ppObj = NULL;
+    *ppObj = nullptr;
     return E_NOINTERFACE;
 }
 
 HRESULT __stdcall BtrfsVolPropSheet::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtobj, HKEY hkeyProgID) {
-    HANDLE h;
     ULONG num_files;
-    FORMATETC format = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
+    FORMATETC format = { CF_HDROP, nullptr, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
     HDROP hdrop;
+    WCHAR fnbuf[MAX_PATH];
 
     if (pidlFolder)
         return E_FAIL;
@@ -71,26 +71,28 @@ HRESULT __stdcall BtrfsVolPropSheet::Initialize(PCIDLIST_ABSOLUTE pidlFolder, ID
     if (FAILED(pdtobj->GetData(&format, &stgm)))
         return E_INVALIDARG;
 
-    stgm_set = TRUE;
+    stgm_set = true;
 
     hdrop = (HDROP)GlobalLock(stgm.hGlobal);
 
     if (!hdrop) {
         ReleaseStgMedium(&stgm);
-        stgm_set = FALSE;
+        stgm_set = false;
         return E_INVALIDARG;
     }
 
-    num_files = DragQueryFileW((HDROP)stgm.hGlobal, 0xFFFFFFFF, NULL, 0);
+    num_files = DragQueryFileW((HDROP)stgm.hGlobal, 0xFFFFFFFF, nullptr, 0);
 
     if (num_files > 1) {
         GlobalUnlock(hdrop);
         return E_FAIL;
     }
 
-    if (DragQueryFileW((HDROP)stgm.hGlobal, 0, fn, sizeof(fn) / sizeof(MAX_PATH))) {
-        h = CreateFileW(fn, FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
-                        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
+    if (DragQueryFileW((HDROP)stgm.hGlobal, 0, fnbuf, sizeof(fnbuf) / sizeof(MAX_PATH))) {
+        fn = fnbuf;
+
+        win_handle h = CreateFileW(fn.c_str(), FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr,
+                                   OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr);
 
         if (h != INVALID_HANDLE_VALUE) {
             NTSTATUS Status;
@@ -102,8 +104,8 @@ HRESULT __stdcall BtrfsVolPropSheet::Initialize(PCIDLIST_ABSOLUTE pidlFolder, ID
 
             devices = (btrfs_device*)malloc(devsize);
 
-            while (TRUE) {
-                Status = NtFsControlFile(h, NULL, NULL, NULL, &iosb, FSCTL_BTRFS_GET_DEVICES, NULL, 0, devices, devsize);
+            while (true) {
+                Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_DEVICES, nullptr, 0, devices, devsize);
                 if (Status == STATUS_BUFFER_OVERFLOW) {
                     if (i < 8) {
                         devsize += 1024;
@@ -113,7 +115,6 @@ HRESULT __stdcall BtrfsVolPropSheet::Initialize(PCIDLIST_ABSOLUTE pidlFolder, ID
 
                         i++;
                     } else {
-                        CloseHandle(h);
                         GlobalUnlock(hdrop);
                         return E_FAIL;
                     }
@@ -122,18 +123,15 @@ HRESULT __stdcall BtrfsVolPropSheet::Initialize(PCIDLIST_ABSOLUTE pidlFolder, ID
             }
 
             if (!NT_SUCCESS(Status)) {
-                CloseHandle(h);
                 GlobalUnlock(hdrop);
                 return E_FAIL;
             }
 
-            Status = NtFsControlFile(h, NULL, NULL, NULL, &iosb, FSCTL_BTRFS_GET_UUID, NULL, 0, &uuid, sizeof(BTRFS_UUID));
+            Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_UUID, nullptr, 0, &uuid, sizeof(BTRFS_UUID));
             uuid_set = NT_SUCCESS(Status);
 
-            ignore = FALSE;
+            ignore = false;
             balance = new BtrfsBalance(fn);
-
-            CloseHandle(h);
         } else {
             GlobalUnlock(hdrop);
             return E_FAIL;
@@ -149,94 +147,73 @@ HRESULT __stdcall BtrfsVolPropSheet::Initialize(PCIDLIST_ABSOLUTE pidlFolder, ID
 }
 
 typedef struct {
-    UINT64 dev_id;
-    WCHAR* name;
-    UINT64 alloc;
-    UINT64 size;
+    uint64_t dev_id;
+    wstring name;
+    uint64_t alloc;
+    uint64_t size;
 } dev;
 
-void BtrfsVolPropSheet::FormatUsage(HWND hwndDlg, WCHAR* s, ULONG size, btrfs_usage* usage) {
-    UINT8 i, j;
-    UINT64 num_devs, k, dev_size, dev_alloc, data_size, data_alloc, metadata_size, metadata_alloc;
+void BtrfsVolPropSheet::FormatUsage(HWND hwndDlg, wstring& s, btrfs_usage* usage) {
+    uint8_t i, j;
+    uint64_t num_devs, dev_size, dev_alloc, data_size, data_alloc, metadata_size, metadata_alloc;
     btrfs_device* bd;
-    dev* devs = NULL;
+    vector<dev> devs;
     btrfs_usage* bue;
-    WCHAR t[255], u[255], v[255];
+    wstring t, u, v;
 
-    static const UINT64 types[] = { BLOCK_FLAG_DATA, BLOCK_FLAG_DATA | BLOCK_FLAG_METADATA, BLOCK_FLAG_METADATA, BLOCK_FLAG_SYSTEM };
+    static const uint64_t types[] = { BLOCK_FLAG_DATA, BLOCK_FLAG_DATA | BLOCK_FLAG_METADATA, BLOCK_FLAG_METADATA, BLOCK_FLAG_SYSTEM };
     static const ULONG typestrings[] = { IDS_USAGE_DATA, IDS_USAGE_MIXED, IDS_USAGE_METADATA, IDS_USAGE_SYSTEM };
-    static const UINT64 duptypes[] = { 0, BLOCK_FLAG_DUPLICATE, BLOCK_FLAG_RAID0, BLOCK_FLAG_RAID1, BLOCK_FLAG_RAID10, BLOCK_FLAG_RAID5, BLOCK_FLAG_RAID6 };
+    static const uint64_t duptypes[] = { 0, BLOCK_FLAG_DUPLICATE, BLOCK_FLAG_RAID0, BLOCK_FLAG_RAID1, BLOCK_FLAG_RAID10, BLOCK_FLAG_RAID5, BLOCK_FLAG_RAID6 };
     static const ULONG dupstrings[] = { IDS_SINGLE, IDS_DUP, IDS_RAID0, IDS_RAID1, IDS_RAID10, IDS_RAID5, IDS_RAID6 };
 
-    s[0] = 0;
+    s = L"";
 
     num_devs = 0;
     bd = devices;
 
-    while (TRUE) {
+    while (true) {
         num_devs++;
 
         if (bd->next_entry > 0)
-            bd = (btrfs_device*)((UINT8*)bd + bd->next_entry);
+            bd = (btrfs_device*)((uint8_t*)bd + bd->next_entry);
         else
             break;
     }
 
-    devs = (dev*)malloc(sizeof(dev) * num_devs);
-    memset(devs, 0, sizeof(dev) * num_devs);
-
     bd = devices;
-    k = 0;
 
     dev_size = 0;
 
-    while (TRUE) {
-        if (bd->missing) {
-            if (!LoadStringW(module, IDS_MISSING, u, sizeof(u) / sizeof(WCHAR))) {
-                ShowError(hwndDlg, GetLastError());
-                goto end;
-            }
+    while (true) {
+        dev d;
 
-            devs[k].name = (WCHAR*)malloc((wcslen(u) + 1) * sizeof(WCHAR));
-            wcscpy(devs[k].name, u);
-        } else if (bd->device_number == 0xffffffff) {
-            devs[k].name = (WCHAR*)malloc(bd->namelen + sizeof(WCHAR));
-            memcpy(devs[k].name, bd->name, bd->namelen);
-            devs[k].name[bd->namelen / sizeof(WCHAR)] = 0;
-        } else if (bd->partition_number == 0) {
-            if (!LoadStringW(module, IDS_DISK_NUM, u, sizeof(u) / sizeof(WCHAR))) {
-                ShowError(hwndDlg, GetLastError());
-                goto end;
-            }
-
-            if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), u, bd->device_number) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                goto end;
-
-            devs[k].name = (WCHAR*)malloc((wcslen(t) + 1) * sizeof(WCHAR));
-            wcscpy(devs[k].name, t);
+        if (bd->missing) {
+            if (!load_string(module, IDS_MISSING, d.name))
+                throw last_error(GetLastError());
+        } else if (bd->device_number == 0xffffffff)
+            d.name = wstring(bd->name, bd->namelen / sizeof(WCHAR));
+        else if (bd->partition_number == 0) {
+            if (!load_string(module, IDS_DISK_NUM, u))
+                throw last_error(GetLastError());
+
+            wstring_sprintf(d.name, u, bd->device_number);
         } else {
-            if (!LoadStringW(module, IDS_DISK_PART_NUM, u, sizeof(u) / sizeof(WCHAR))) {
-                ShowError(hwndDlg, GetLastError());
-                goto end;
-            }
-
-            if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), u, bd->device_number, bd->partition_number) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                goto end;
+            if (!load_string(module, IDS_DISK_PART_NUM, u))
+                throw last_error(GetLastError());
 
-            devs[k].name = (WCHAR*)malloc((wcslen(t) + 1) * sizeof(WCHAR));
-            wcscpy(devs[k].name, t);
+            wstring_sprintf(d.name, u, bd->device_number, bd->partition_number);
         }
 
-        devs[k].dev_id = bd->dev_id;
-        devs[k].alloc = 0;
-        devs[k].size = bd->size;
+        d.dev_id = bd->dev_id;
+        d.alloc = 0;
+        d.size = bd->size;
 
-        dev_size += bd->size;
+        devs.push_back(d);
 
-        k++;
+        dev_size += bd->size;
 
         if (bd->next_entry > 0)
-            bd = (btrfs_device*)((UINT8*)bd + bd->next_entry);
+            bd = (btrfs_device*)((uint8_t*)bd + bd->next_entry);
         else
             break;
     }
@@ -246,8 +223,8 @@ void BtrfsVolPropSheet::FormatUsage(HWND hwndDlg, WCHAR* s, ULONG size, btrfs_us
     metadata_size = metadata_alloc = 0;
 
     bue = usage;
-    while (TRUE) {
-        for (k = 0; k < bue->num_devices; k++) {
+    while (true) {
+        for (uint64_t k = 0; k < bue->num_devices; k++) {
             dev_alloc += bue->devices[k].alloc;
 
             if (bue->type & BLOCK_FLAG_DATA) {
@@ -259,250 +236,176 @@ void BtrfsVolPropSheet::FormatUsage(HWND hwndDlg, WCHAR* s, ULONG size, btrfs_us
             }
         }
 
-        if (bue->type & BLOCK_FLAG_DATA) {
+        if (bue->type & BLOCK_FLAG_DATA)
             data_size += bue->size;
-        }
 
-        if (bue->type & BLOCK_FLAG_METADATA) {
+        if (bue->type & BLOCK_FLAG_METADATA)
             metadata_size += bue->size;
-        }
 
         if (bue->next_entry > 0)
-            bue = (btrfs_usage*)((UINT8*)bue + bue->next_entry);
+            bue = (btrfs_usage*)((uint8_t*)bue + bue->next_entry);
         else
             break;
     }
 
     // device size
 
-    if (!LoadStringW(module, IDS_USAGE_DEV_SIZE, u, sizeof(u) / sizeof(WCHAR))) {
-        ShowError(hwndDlg, GetLastError());
-        goto end;
-    }
-
-    format_size(dev_size, v, sizeof(v) / sizeof(WCHAR), FALSE);
+    if (!load_string(module, IDS_USAGE_DEV_SIZE, u))
+        throw last_error(GetLastError());
 
-    if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), u, v) == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
+    format_size(dev_size, v, false);
 
-    if (StringCchCatW(s, size, t) == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
+    wstring_sprintf(t, u, v.c_str());
 
-    if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
+    s += t + L"\r\n";
 
     // device allocated
 
-    if (!LoadStringW(module, IDS_USAGE_DEV_ALLOC, u, sizeof(u) / sizeof(WCHAR))) {
-        ShowError(hwndDlg, GetLastError());
-        goto end;
-    }
+    if (!load_string(module, IDS_USAGE_DEV_ALLOC, u))
+        throw last_error(GetLastError());
 
-    format_size(dev_alloc, v, sizeof(v) / sizeof(WCHAR), FALSE);
+    format_size(dev_alloc, v, false);
 
-    if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), u, v) == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
+    wstring_sprintf(t, u, v.c_str());
 
-    if (StringCchCatW(s, size, t) == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
-
-    if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
+#ifndef __REACTOS__
+    s += t + L"\r\n"s;
+#else
+    s += t + L"\r\n";
+#endif
 
     // device unallocated
 
-    if (!LoadStringW(module, IDS_USAGE_DEV_UNALLOC, u, sizeof(u) / sizeof(WCHAR))) {
-        ShowError(hwndDlg, GetLastError());
-        goto end;
-    }
+    if (!load_string(module, IDS_USAGE_DEV_UNALLOC, u))
+        throw last_error(GetLastError());
 
-    format_size(dev_size - dev_alloc, v, sizeof(v) / sizeof(WCHAR), FALSE);
+    format_size(dev_size - dev_alloc, v, false);
 
-    if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), u, v) == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
+    wstring_sprintf(t, u, v.c_str());
 
-    if (StringCchCatW(s, size, t) == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
-
-    if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
+#ifndef __REACTOS__
+    s += t + L"\r\n"s;
+#else
+    s += t + L"\r\n";
+#endif
 
     // data ratio
 
     if (data_alloc > 0) {
-        if (!LoadStringW(module, IDS_USAGE_DATA_RATIO, u, sizeof(u) / sizeof(WCHAR))) {
-            ShowError(hwndDlg, GetLastError());
-            goto end;
-        }
+        if (!load_string(module, IDS_USAGE_DATA_RATIO, u))
+            throw last_error(GetLastError());
 
-        if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), u, (float)data_alloc / (float)data_size) == STRSAFE_E_INSUFFICIENT_BUFFER)
-            goto end;
+        wstring_sprintf(t, u, (float)data_alloc / (float)data_size);
 
-        if (StringCchCatW(s, size, t) == STRSAFE_E_INSUFFICIENT_BUFFER)
-            goto end;
-
-        if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-            goto end;
+#ifndef __REACTOS__
+        s += t + L"\r\n"s;
+#else
+        s += t + L"\r\n";
+#endif
     }
 
     // metadata ratio
 
-    if (!LoadStringW(module, IDS_USAGE_METADATA_RATIO, u, sizeof(u) / sizeof(WCHAR))) {
-        ShowError(hwndDlg, GetLastError());
-        goto end;
-    }
-
-    if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), u, (float)metadata_alloc / (float)metadata_size) == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
-
-    if (StringCchCatW(s, size, t) == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
+    if (!load_string(module, IDS_USAGE_METADATA_RATIO, u))
+        throw last_error(GetLastError());
 
-    if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
+    wstring_sprintf(t, u, (float)metadata_alloc / (float)metadata_size);
 
-    if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
+    s += t + L"\r\n\r\n";
 
     for (i = 0; i < sizeof(types) / sizeof(types[0]); i++) {
         for (j = 0; j < sizeof(duptypes) / sizeof(duptypes[0]); j++) {
             bue = usage;
 
-            while (TRUE) {
+            while (true) {
                 if ((bue->type & types[i]) == types[i] &&
                     ((duptypes[j] == 0 && (bue->type & (BLOCK_FLAG_DUPLICATE | BLOCK_FLAG_RAID0 | BLOCK_FLAG_RAID1 | BLOCK_FLAG_RAID10 | BLOCK_FLAG_RAID5 | BLOCK_FLAG_RAID6)) == 0)
                     || bue->type & duptypes[j])) {
-                    WCHAR typestring[255], dupstring[255], sizestring[255], usedstring[255];
+                    wstring sizestring, usedstring, typestring, dupstring;
 
                     if (bue->type & BLOCK_FLAG_DATA && bue->type & BLOCK_FLAG_METADATA && (types[i] == BLOCK_FLAG_DATA || types[i] == BLOCK_FLAG_METADATA))
                         break;
 
-                    if (!LoadStringW(module, typestrings[i], typestring, sizeof(typestring) / sizeof(WCHAR))) {
-                        ShowError(hwndDlg, GetLastError());
-                        goto end;
-                    }
-
-                    if (!LoadStringW(module, dupstrings[j], dupstring, sizeof(dupstring) / sizeof(WCHAR))) {
-                        ShowError(hwndDlg, GetLastError());
-                        goto end;
-                    }
+                    if (!load_string(module, typestrings[i], typestring))
+                        throw last_error(GetLastError());
 
-                    format_size(bue->size, sizestring, sizeof(sizestring) / sizeof(WCHAR), FALSE);
-                    format_size(bue->used, usedstring, sizeof(usedstring) / sizeof(WCHAR), FALSE);
+                    if (!load_string(module, dupstrings[j], dupstring))
+                        throw last_error(GetLastError());
 
-                    if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), typestring, dupstring, sizestring, usedstring) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                        goto end;
+                    format_size(bue->size, sizestring, false);
+                    format_size(bue->used, usedstring, false);
 
-                    if (StringCchCatW(s, size, t) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                        goto end;
+                    wstring_sprintf(t, typestring, dupstring.c_str(), sizestring.c_str(), usedstring.c_str());
 
-                    if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-                        goto end;
+                    s += t + L"\r\n";
 
-                    for (k = 0; k < bue->num_devices; k++) {
-                        UINT64 l;
-                        BOOL found = FALSE;
+                    for (uint64_t k = 0; k < bue->num_devices; k++) {
+                        bool found = false;
 
-                        format_size(bue->devices[k].alloc, sizestring, sizeof(sizestring) / sizeof(WCHAR), FALSE);
+                        format_size(bue->devices[k].alloc, sizestring, false);
 
-                        for (l = 0; l < num_devs; l++) {
+                        for (size_t l = 0; l < min((uint64_t)SIZE_MAX, num_devs); l++) {
                             if (devs[l].dev_id == bue->devices[k].dev_id) {
-                                if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), L"%s\t%s", devs[l].name, sizestring) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                                    goto end;
-
-                                if (StringCchCatW(s, size, t) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                                    goto end;
-
-                                if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-                                    goto end;
+                                s += devs[l].name + L"\t" + sizestring + L"\r\n";
 
                                 devs[l].alloc += bue->devices[k].alloc;
 
-                                found = TRUE;
+                                found = true;
                                 break;
                             }
                         }
 
                         if (!found) {
-                            if (!LoadStringW(module, IDS_UNKNOWN_DEVICE, typestring, sizeof(typestring) / sizeof(WCHAR))) {
-                                ShowError(hwndDlg, GetLastError());
-                                goto end;
-                            }
-
-                            if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), typestring, bue->devices[k].dev_id) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                                goto end;
-
-                            if (StringCchCatW(s, size, t) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                                goto end;
+                            if (!load_string(module, IDS_UNKNOWN_DEVICE, typestring))
+                                throw last_error(GetLastError());
 
-                            if (StringCchCatW(s, size, L"\t") == STRSAFE_E_INSUFFICIENT_BUFFER)
-                                goto end;
+                            wstring_sprintf(t, typestring, bue->devices[k].dev_id);
 
-                            if (StringCchCatW(s, size, sizestring) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                                goto end;
-
-                            if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-                                goto end;
+#ifndef __REACTOS__
+                            s += t + L"\t"s + sizestring + L"\r\n"s;
+#else
+                            s += t + L"\t" + sizestring + L"\r\n";
+#endif
                         }
                     }
 
-                    if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-                        goto end;
+                    s += L"\r\n";
 
                     break;
                 }
 
                 if (bue->next_entry > 0)
-                    bue = (btrfs_usage*)((UINT8*)bue + bue->next_entry);
+                    bue = (btrfs_usage*)((uint8_t*)bue + bue->next_entry);
                 else
                     break;
             }
         }
     }
 
-    if (!LoadStringW(module, IDS_USAGE_UNALLOC, t, sizeof(t) / sizeof(WCHAR))) {
-        ShowError(hwndDlg, GetLastError());
-        goto end;
-    }
-
-    if (StringCchCatW(s, size, t) == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
-
-    if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-        goto end;
-
-    for (k = 0; k < num_devs; k++) {
-        WCHAR sizestring[255];
+    if (!load_string(module, IDS_USAGE_UNALLOC, t))
+        throw last_error(GetLastError());
 
-        format_size(devs[k].size - devs[k].alloc, sizestring, sizeof(sizestring) / sizeof(WCHAR), FALSE);
-
-        if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), L"%s\t%s", devs[k].name, sizestring) == STRSAFE_E_INSUFFICIENT_BUFFER)
-            goto end;
-
-        if (StringCchCatW(s, size, t) == STRSAFE_E_INSUFFICIENT_BUFFER)
-            goto end;
+#ifndef __REACTOS__
+    s += t + L"\r\n"s;
+#else
+    s += t + L"\r\n";
+#endif
 
-        if (StringCchCatW(s, size, L"\r\n") == STRSAFE_E_INSUFFICIENT_BUFFER)
-            goto end;
-    }
+    for (size_t k = 0; k < min((uint64_t)SIZE_MAX, num_devs); k++) {
+        wstring sizestring;
 
-end:
-    if (devs) {
-        for (k = 0; k < num_devs; k++) {
-            if (devs[k].name) free(devs[k].name);
-        }
+        format_size(devs[k].size - devs[k].alloc, sizestring, false);
 
-        free(devs);
+        s += devs[k].name + L"\t" + sizestring + L"\r\n";
     }
 }
 
 void BtrfsVolPropSheet::RefreshUsage(HWND hwndDlg) {
-    HANDLE h;
-    WCHAR s[4096];
+    wstring s;
     btrfs_usage* usage;
 
-    h = CreateFileW(fn, FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
-                        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
+    win_handle h = CreateFileW(fn.c_str(), FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr,
+                               OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr);
 
     if (h != INVALID_HANDLE_VALUE) {
         NTSTATUS Status;
@@ -514,8 +417,8 @@ void BtrfsVolPropSheet::RefreshUsage(HWND hwndDlg) {
 
         devices = (btrfs_device*)malloc(devsize);
 
-        while (TRUE) {
-            Status = NtFsControlFile(h, NULL, NULL, NULL, &iosb, FSCTL_BTRFS_GET_DEVICES, NULL, 0, devices, devsize);
+        while (true) {
+            Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_DEVICES, nullptr, 0, devices, devsize);
             if (Status == STATUS_BUFFER_OVERFLOW) {
                 if (i < 8) {
                     devsize += 1024;
@@ -530,18 +433,16 @@ void BtrfsVolPropSheet::RefreshUsage(HWND hwndDlg) {
                 break;
         }
 
-        if (!NT_SUCCESS(Status)) {
-            CloseHandle(h);
+        if (!NT_SUCCESS(Status))
             return;
-        }
 
         i = 0;
         usagesize = 1024;
 
         usage = (btrfs_usage*)malloc(usagesize);
 
-        while (TRUE) {
-            Status = NtFsControlFile(h, NULL, NULL, NULL, &iosb, FSCTL_BTRFS_GET_USAGE, NULL, 0, usage, usagesize);
+        while (true) {
+            Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_USAGE, nullptr, 0, usage, usagesize);
             if (Status == STATUS_BUFFER_OVERFLOW) {
                 if (i < 8) {
                     usagesize += 1024;
@@ -558,100 +459,97 @@ void BtrfsVolPropSheet::RefreshUsage(HWND hwndDlg) {
 
         if (!NT_SUCCESS(Status)) {
             free(usage);
-            CloseHandle(h);
             return;
         }
 
-        ignore = FALSE;
-
-        CloseHandle(h);
+        ignore = false;
     } else
         return;
 
-    FormatUsage(hwndDlg, s, sizeof(s) / sizeof(WCHAR), usage);
+    FormatUsage(hwndDlg, s, usage);
 
-    SetDlgItemTextW(hwndDlg, IDC_USAGE_BOX, s);
+    SetDlgItemTextW(hwndDlg, IDC_USAGE_BOX, s.c_str());
 
     free(usage);
 }
 
 INT_PTR CALLBACK BtrfsVolPropSheet::UsageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
-    switch (uMsg) {
-        case WM_INITDIALOG:
-        {
-            WCHAR s[4096];
-            int i;
-            ULONG usagesize;
-            NTSTATUS Status;
-            HANDLE h;
-            IO_STATUS_BLOCK iosb;
+    try {
+        switch (uMsg) {
+            case WM_INITDIALOG:
+            {
+                wstring s;
+                int i;
+                ULONG usagesize;
+                NTSTATUS Status;
+                IO_STATUS_BLOCK iosb;
 
-            EnableThemeDialogTexture(hwndDlg, ETDT_ENABLETAB);
+                EnableThemeDialogTexture(hwndDlg, ETDT_ENABLETAB);
 
-            h = CreateFileW(fn, FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
-                        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
+                win_handle h = CreateFileW(fn.c_str(), FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr,
+                                        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr);
 
-            if (h != INVALID_HANDLE_VALUE) {
-                btrfs_usage* usage;
+                if (h != INVALID_HANDLE_VALUE) {
+                    btrfs_usage* usage;
 
-                i = 0;
-                usagesize = 1024;
+                    i = 0;
+                    usagesize = 1024;
 
-                usage = (btrfs_usage*)malloc(usagesize);
+                    usage = (btrfs_usage*)malloc(usagesize);
 
-                while (TRUE) {
-                    Status = NtFsControlFile(h, NULL, NULL, NULL, &iosb, FSCTL_BTRFS_GET_USAGE, NULL, 0, usage, usagesize);
-                    if (Status == STATUS_BUFFER_OVERFLOW) {
-                        if (i < 8) {
-                            usagesize += 1024;
+                    while (true) {
+                        Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_USAGE, nullptr, 0, usage, usagesize);
+                        if (Status == STATUS_BUFFER_OVERFLOW) {
+                            if (i < 8) {
+                                usagesize += 1024;
 
-                            free(usage);
-                            usage = (btrfs_usage*)malloc(usagesize);
+                                free(usage);
+                                usage = (btrfs_usage*)malloc(usagesize);
 
-                            i++;
+                                i++;
+                            } else
+                                break;
                         } else
                             break;
-                    } else
-                        break;
-                }
+                    }
 
-                if (!NT_SUCCESS(Status)) {
-                    free(usage);
-                    CloseHandle(h);
-                    break;
-                }
+                    if (!NT_SUCCESS(Status)) {
+                        free(usage);
+                        break;
+                    }
 
-                CloseHandle(h);
+                    FormatUsage(hwndDlg, s, usage);
 
-                FormatUsage(hwndDlg, s, sizeof(s) / sizeof(WCHAR), usage);
+                    SetDlgItemTextW(hwndDlg, IDC_USAGE_BOX, s.c_str());
 
-                SetDlgItemTextW(hwndDlg, IDC_USAGE_BOX, s);
+                    free(usage);
+                }
 
-                free(usage);
+                break;
             }
 
+            case WM_COMMAND:
+                switch (HIWORD(wParam)) {
+                    case BN_CLICKED:
+                        switch (LOWORD(wParam)) {
+                            case IDOK:
+                            case IDCANCEL:
+                                EndDialog(hwndDlg, 0);
+                            return true;
+
+                            case IDC_USAGE_REFRESH:
+                                RefreshUsage(hwndDlg);
+                            return true;
+                        }
+                    break;
+                }
             break;
         }
-
-        case WM_COMMAND:
-            switch (HIWORD(wParam)) {
-                case BN_CLICKED:
-                    switch (LOWORD(wParam)) {
-                        case IDOK:
-                        case IDCANCEL:
-                            EndDialog(hwndDlg, 0);
-                        return TRUE;
-
-                        case IDC_USAGE_REFRESH:
-                            RefreshUsage(hwndDlg);
-                        return TRUE;
-                    }
-                break;
-            }
-        break;
+    } catch (const exception& e) {
+        error_message(hwndDlg, e.what());
     }
 
-    return FALSE;
+    return false;
 }
 
 static INT_PTR CALLBACK stub_UsageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
@@ -667,7 +565,7 @@ static INT_PTR CALLBACK stub_UsageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam
     if (bvps)
         return bvps->UsageDlgProc(hwndDlg, uMsg, wParam, lParam);
     else
-        return FALSE;
+        return false;
 }
 
 void BtrfsVolPropSheet::ShowUsage(HWND hwndDlg) {
@@ -676,15 +574,13 @@ void BtrfsVolPropSheet::ShowUsage(HWND hwndDlg) {
 
 static void add_lv_column(HWND list, int string, int cx) {
     LVCOLUMNW lvc;
-    WCHAR s[255];
+    wstring s;
 
-    if (!LoadStringW(module, string, s, sizeof(s) / sizeof(WCHAR))) {
-        ShowError(GetParent(list), GetLastError());
-        return;
-    }
+    if (!load_string(module, string, s))
+        throw last_error(GetLastError());
 
     lvc.mask = LVCF_TEXT|LVCF_WIDTH;
-    lvc.pszText = s;
+    lvc.pszText = (WCHAR*)s.c_str();
     lvc.cx = cx;
     SendMessageW(list, LVM_INSERTCOLUMNW, 0, (LPARAM)&lvc);
 }
@@ -698,15 +594,15 @@ static int CALLBACK lv_sort(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) {
         return 0;
 }
 
-static UINT64 find_dev_alloc(UINT64 dev_id, btrfs_usage* usage) {
+static uint64_t find_dev_alloc(uint64_t dev_id, btrfs_usage* usage) {
     btrfs_usage* bue;
-    UINT64 alloc;
+    uint64_t alloc;
 
     alloc = 0;
 
     bue = usage;
-    while (TRUE) {
-        UINT64 k;
+    while (true) {
+        uint64_t k;
 
         for (k = 0; k < bue->num_devices; k++) {
             if (bue->devices[k].dev_id == dev_id)
@@ -714,7 +610,7 @@ static UINT64 find_dev_alloc(UINT64 dev_id, btrfs_usage* usage) {
         }
 
         if (bue->next_entry > 0)
-            bue = (btrfs_usage*)((UINT8*)bue + bue->next_entry);
+            bue = (btrfs_usage*)((uint8_t*)bue + bue->next_entry);
         else
             break;
     }
@@ -723,105 +619,97 @@ static UINT64 find_dev_alloc(UINT64 dev_id, btrfs_usage* usage) {
 }
 
 void BtrfsVolPropSheet::RefreshDevList(HWND devlist) {
-    HANDLE h;
     NTSTATUS Status;
     IO_STATUS_BLOCK iosb;
     ULONG usagesize, devsize;
     btrfs_usage* usage;
     btrfs_device* bd;
     int i;
-    UINT64 num_rw_devices;
+    uint64_t num_rw_devices;
+    {
+        win_handle h = CreateFileW(fn.c_str(), FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr,
+                                   OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr);
 
-    h = CreateFileW(fn, FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
-                        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
+        if (h == INVALID_HANDLE_VALUE)
+            throw last_error(GetLastError());
 
-    if (h == INVALID_HANDLE_VALUE) {
-        ShowError(GetParent(devlist), GetLastError());
-        return;
-    }
-
-    i = 0;
-    devsize = 1024;
+        i = 0;
+        devsize = 1024;
 
-    if (devices)
-        free(devices);
+        if (devices)
+            free(devices);
 
-    devices = (btrfs_device*)malloc(devsize);
+        devices = (btrfs_device*)malloc(devsize);
 
-    while (TRUE) {
-        Status = NtFsControlFile(h, NULL, NULL, NULL, &iosb, FSCTL_BTRFS_GET_DEVICES, NULL, 0, devices, devsize);
-        if (Status == STATUS_BUFFER_OVERFLOW) {
-            if (i < 8) {
-                devsize += 1024;
+        while (true) {
+            Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_DEVICES, nullptr, 0, devices, devsize);
+            if (Status == STATUS_BUFFER_OVERFLOW) {
+                if (i < 8) {
+                    devsize += 1024;
 
-                free(devices);
-                devices = (btrfs_device*)malloc(devsize);
+                    free(devices);
+                    devices = (btrfs_device*)malloc(devsize);
 
-                i++;
+                    i++;
+                } else
+                    return;
             } else
-                return;
-        } else
-            break;
-    }
+                break;
+        }
 
-    if (!NT_SUCCESS(Status)) {
-        CloseHandle(h);
-        return;
-    }
+        if (!NT_SUCCESS(Status))
+            return;
 
-    bd = devices;
+        bd = devices;
 
-    i = 0;
-    usagesize = 1024;
+        i = 0;
+        usagesize = 1024;
 
-    usage = (btrfs_usage*)malloc(usagesize);
+        usage = (btrfs_usage*)malloc(usagesize);
 
-    while (TRUE) {
-        Status = NtFsControlFile(h, NULL, NULL, NULL, &iosb, FSCTL_BTRFS_GET_USAGE, NULL, 0, usage, usagesize);
-        if (Status == STATUS_BUFFER_OVERFLOW) {
-            if (i < 8) {
-                usagesize += 1024;
+        while (true) {
+            Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_USAGE, nullptr, 0, usage, usagesize);
+            if (Status == STATUS_BUFFER_OVERFLOW) {
+                if (i < 8) {
+                    usagesize += 1024;
 
-                free(usage);
-                usage = (btrfs_usage*)malloc(usagesize);
+                    free(usage);
+                    usage = (btrfs_usage*)malloc(usagesize);
 
-                i++;
-            } else {
-                free(usage);
-                CloseHandle(h);
-                return;
-            }
-        } else
-            break;
-    }
+                    i++;
+                } else {
+                    free(usage);
+                    return;
+                }
+            } else
+                break;
+        }
 
-    if (!NT_SUCCESS(Status)) {
-        free(usage);
-        CloseHandle(h);
-        return;
+        if (!NT_SUCCESS(Status)) {
+            free(usage);
+            return;
+        }
     }
 
-    CloseHandle(h);
-
     SendMessageW(devlist, LVM_DELETEALLITEMS, 0, 0);
 
     num_rw_devices = 0;
 
     i = 0;
-    while (TRUE) {
+    while (true) {
         LVITEMW lvi;
-        WCHAR s[255], u[255];
-        UINT64 alloc;
+        wstring s, u;
+        uint64_t alloc;
 
         // ID
 
         RtlZeroMemory(&lvi, sizeof(LVITEMW));
         lvi.mask = LVIF_TEXT | LVIF_PARAM;
         lvi.iItem = SendMessageW(devlist, LVM_GETITEMCOUNT, 0, 0);
-        lvi.lParam = bd->dev_id;
+        lvi.lParam = (LPARAM)bd->dev_id;
 
-        StringCchPrintfW(s, sizeof(s) / sizeof(WCHAR), L"%llu", bd->dev_id);
-        lvi.pszText = s;
+        s = to_wstring(bd->dev_id);
+        lvi.pszText = (LPWSTR)s.c_str();
 
         SendMessageW(devlist, LVM_INSERTITEMW, 0, (LPARAM)&lvi);
 
@@ -831,42 +719,31 @@ void BtrfsVolPropSheet::RefreshDevList(HWND devlist) {
         lvi.iSubItem = 1;
 
         if (bd->missing) {
-            if (!LoadStringW(module, IDS_MISSING, u, sizeof(u) / sizeof(WCHAR))) {
-                ShowError(GetParent(devlist), GetLastError());
-                break;
-            }
-
-            wcscpy(s, u);
-        } else if (bd->device_number == 0xffffffff) {
-            memcpy(s, bd->name, bd->namelen);
-            s[bd->namelen / sizeof(WCHAR)] = 0;
-        } else if (bd->partition_number == 0) {
-            if (!LoadStringW(module, IDS_DISK_NUM, u, sizeof(u) / sizeof(WCHAR))) {
-                ShowError(GetParent(devlist), GetLastError());
-                break;
-            }
-
-            if (StringCchPrintfW(s, sizeof(s) / sizeof(WCHAR), u, bd->device_number) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                break;
+            if (!load_string(module, IDS_MISSING, s))
+                throw last_error(GetLastError());
+        } else if (bd->device_number == 0xffffffff)
+            s = wstring(bd->name, bd->namelen / sizeof(WCHAR));
+        else if (bd->partition_number == 0) {
+            if (!load_string(module, IDS_DISK_NUM, u))
+                throw last_error(GetLastError());
+
+            wstring_sprintf(s, u, bd->device_number);
         } else {
-            if (!LoadStringW(module, IDS_DISK_PART_NUM, u, sizeof(u) / sizeof(WCHAR))) {
-                ShowError(GetParent(devlist), GetLastError());
-                break;
-            }
+            if (!load_string(module, IDS_DISK_PART_NUM, u))
+                throw last_error(GetLastError());
 
-            if (StringCchPrintfW(s, sizeof(s) / sizeof(WCHAR), u, bd->device_number, bd->partition_number) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                break;
+            wstring_sprintf(s, u, bd->device_number, bd->partition_number);
         }
 
-        lvi.pszText = s;
+        lvi.pszText = (LPWSTR)s.c_str();
 
         SendMessageW(devlist, LVM_SETITEMW, 0, (LPARAM)&lvi);
 
         // readonly
 
         lvi.iSubItem = 2;
-        LoadStringW(module, bd->readonly ? IDS_DEVLIST_READONLY_YES : IDS_DEVLIST_READONLY_NO, s, sizeof(s) / sizeof(WCHAR));
-        lvi.pszText = s;
+        load_string(module, bd->readonly ? IDS_DEVLIST_READONLY_YES : IDS_DEVLIST_READONLY_NO, s);
+        lvi.pszText = (LPWSTR)s.c_str();
         SendMessageW(devlist, LVM_SETITEMW, 0, (LPARAM)&lvi);
 
         if (!bd->readonly)
@@ -875,8 +752,8 @@ void BtrfsVolPropSheet::RefreshDevList(HWND devlist) {
         // size
 
         lvi.iSubItem = 3;
-        format_size(bd->size, s, sizeof(s) / sizeof(WCHAR), FALSE);
-        lvi.pszText = s;
+        format_size(bd->size, s, false);
+        lvi.pszText = (LPWSTR)s.c_str();
         SendMessageW(devlist, LVM_SETITEMW, 0, (LPARAM)&lvi);
 
         // alloc
@@ -884,21 +761,21 @@ void BtrfsVolPropSheet::RefreshDevList(HWND devlist) {
         alloc = find_dev_alloc(bd->dev_id, usage);
 
         lvi.iSubItem = 4;
-        format_size(alloc, s, sizeof(s) / sizeof(WCHAR), FALSE);
-        lvi.pszText = s;
+        format_size(alloc, s, false);
+        lvi.pszText = (LPWSTR)s.c_str();
         SendMessageW(devlist, LVM_SETITEMW, 0, (LPARAM)&lvi);
 
         // alloc %
 
-        StringCchPrintfW(s, sizeof(s) / sizeof(WCHAR), L"%1.1f%%", (float)alloc * 100.0f / (float)bd->size);
+        wstring_sprintf(s, L"%1.1f%%", (float)alloc * 100.0f / (float)bd->size);
         lvi.iSubItem = 5;
-        lvi.pszText = s;
+        lvi.pszText = (LPWSTR)s.c_str();
         SendMessageW(devlist, LVM_SETITEMW, 0, (LPARAM)&lvi);
 
         i++;
 
         if (bd->next_entry > 0)
-            bd = (btrfs_device*)((UINT8*)bd + bd->next_entry);
+            bd = (btrfs_device*)((uint8_t*)bd + bd->next_entry);
         else
             break;
     }
@@ -912,18 +789,19 @@ void BtrfsVolPropSheet::RefreshDevList(HWND devlist) {
 }
 
 void BtrfsVolPropSheet::ResetStats(HWND hwndDlg) {
-    HANDLE h;
-    WCHAR t[MAX_PATH + 100], sel[10];
+    wstring t, sel;
+    WCHAR modfn[MAX_PATH];
     SHELLEXECUTEINFOW sei;
 
-    _itow(stats_dev, sel, 10);
+    sel = to_wstring(stats_dev);
 
-    t[0] = '"';
-    GetModuleFileNameW(module, t + 1, (sizeof(t) / sizeof(WCHAR)) - 1);
-    wcscat(t, L"\",ResetStats ");
-    wcscat(t, fn);
-    wcscat(t, L"|");
-    wcscat(t, sel);
+    GetModuleFileNameW(module, modfn, sizeof(modfn) / sizeof(WCHAR));
+
+#ifndef __REACTOS__
+    t = L"\""s + modfn + L"\",ResetStats " + fn + L"|" + sel;
+#else
+    t = wstring(L"\"") + modfn + wstring(L"\",ResetStats ") + fn + wstring(L"|") + sel;
+#endif
 
     RtlZeroMemory(&sei, sizeof(sei));
 
@@ -931,20 +809,18 @@ void BtrfsVolPropSheet::ResetStats(HWND hwndDlg) {
     sei.hwnd = hwndDlg;
     sei.lpVerb = L"runas";
     sei.lpFile = L"rundll32.exe";
-    sei.lpParameters = t;
+    sei.lpParameters = t.c_str();
     sei.nShow = SW_SHOW;
     sei.fMask = SEE_MASK_NOCLOSEPROCESS;
 
-    if (!ShellExecuteExW(&sei)) {
-        ShowError(hwndDlg, GetLastError());
-        return;
-    }
+    if (!ShellExecuteExW(&sei))
+        throw last_error(GetLastError());
 
     WaitForSingleObject(sei.hProcess, INFINITE);
     CloseHandle(sei.hProcess);
 
-    h = CreateFileW(fn, FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
-                        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
+    win_handle h = CreateFileW(fn.c_str(), FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr,
+                               OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr);
 
     if (h != INVALID_HANDLE_VALUE) {
         NTSTATUS Status;
@@ -957,8 +833,8 @@ void BtrfsVolPropSheet::ResetStats(HWND hwndDlg) {
         free(devices);
         devices = (btrfs_device*)malloc(devsize);
 
-        while (TRUE) {
-            Status = NtFsControlFile(h, NULL, NULL, NULL, &iosb, FSCTL_BTRFS_GET_DEVICES, NULL, 0, devices, devsize);
+        while (true) {
+            Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_DEVICES, nullptr, 0, devices, devsize);
             if (Status == STATUS_BUFFER_OVERFLOW) {
                 if (i < 8) {
                     devsize += 1024;
@@ -972,84 +848,84 @@ void BtrfsVolPropSheet::ResetStats(HWND hwndDlg) {
             } else
                 break;
         }
-
-        CloseHandle(h);
     }
 
     EndDialog(hwndDlg, 0);
 }
 
 INT_PTR CALLBACK BtrfsVolPropSheet::StatsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
-    switch (uMsg) {
-        case WM_INITDIALOG:
-        {
-            WCHAR s[255], t[255];
-            btrfs_device *bd, *dev = NULL;
-            int i;
-
-            static int stat_ids[] = { IDC_WRITE_ERRS, IDC_READ_ERRS, IDC_FLUSH_ERRS, IDC_CORRUPTION_ERRS, IDC_GENERATION_ERRS };
+    try {
+        switch (uMsg) {
+            case WM_INITDIALOG:
+            {
+                WCHAR s[255];
+                wstring t;
+                btrfs_device *bd, *dev = nullptr;
+                int i;
+
+                static int stat_ids[] = { IDC_WRITE_ERRS, IDC_READ_ERRS, IDC_FLUSH_ERRS, IDC_CORRUPTION_ERRS, IDC_GENERATION_ERRS };
+
+                bd = devices;
+
+                while (true) {
+                    if (bd->dev_id == stats_dev) {
+                        dev = bd;
+                        break;
+                    }
 
-            bd = devices;
+                    if (bd->next_entry > 0)
+                        bd = (btrfs_device*)((uint8_t*)bd + bd->next_entry);
+                    else
+                        break;
+                }
 
-            while (TRUE) {
-                if (bd->dev_id == stats_dev) {
-                    dev = bd;
-                    break;
+                if (!dev) {
+                    EndDialog(hwndDlg, 0);
+                    throw string_error(IDS_CANNOT_FIND_DEVICE);
                 }
 
-                if (bd->next_entry > 0)
-                    bd = (btrfs_device*)((UINT8*)bd + bd->next_entry);
-                else
-                    break;
-            }
+                GetDlgItemTextW(hwndDlg, IDC_DEVICE_ID, s, sizeof(s) / sizeof(WCHAR));
 
-            if (!dev) {
-                EndDialog(hwndDlg, 0);
-                ShowStringError(hwndDlg, IDS_CANNOT_FIND_DEVICE);
-                return FALSE;
-            }
+                wstring_sprintf(t, s, dev->dev_id);
 
-            GetDlgItemTextW(hwndDlg, IDC_DEVICE_ID, s, sizeof(s) / sizeof(WCHAR));
+                SetDlgItemTextW(hwndDlg, IDC_DEVICE_ID, t.c_str());
 
-            if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), s, dev->dev_id) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                return FALSE;
+                for (i = 0; i < 5; i++) {
+                    GetDlgItemTextW(hwndDlg, stat_ids[i], s, sizeof(s) / sizeof(WCHAR));
 
-            SetDlgItemTextW(hwndDlg, IDC_DEVICE_ID, t);
+                    wstring_sprintf(t, s, dev->stats[i]);
 
-            for (i = 0; i < 5; i++) {
-                GetDlgItemTextW(hwndDlg, stat_ids[i], s, sizeof(s) / sizeof(WCHAR));
+                    SetDlgItemTextW(hwndDlg, stat_ids[i], t.c_str());
+                }
 
-                if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), s, dev->stats[i]) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                    return FALSE;
+                SendMessageW(GetDlgItem(hwndDlg, IDC_RESET_STATS), BCM_SETSHIELD, 0, true);
+                EnableWindow(GetDlgItem(hwndDlg, IDC_RESET_STATS), !readonly);
 
-                SetDlgItemTextW(hwndDlg, stat_ids[i], t);
+                break;
             }
 
-            SendMessageW(GetDlgItem(hwndDlg, IDC_RESET_STATS), BCM_SETSHIELD, 0, TRUE);
-            EnableWindow(GetDlgItem(hwndDlg, IDC_RESET_STATS), !readonly);
-
+            case WM_COMMAND:
+                switch (HIWORD(wParam)) {
+                    case BN_CLICKED:
+                        switch (LOWORD(wParam)) {
+                            case IDOK:
+                            case IDCANCEL:
+                                EndDialog(hwndDlg, 0);
+                            return true;
+
+                            case IDC_RESET_STATS:
+                                ResetStats(hwndDlg);
+                            return true;
+                        }
+                    break;
+                }
             break;
         }
-
-        case WM_COMMAND:
-            switch (HIWORD(wParam)) {
-                case BN_CLICKED:
-                    switch (LOWORD(wParam)) {
-                        case IDOK:
-                        case IDCANCEL:
-                            EndDialog(hwndDlg, 0);
-                        return TRUE;
-
-                        case IDC_RESET_STATS:
-                            ResetStats(hwndDlg);
-                        return TRUE;
-                    }
-                break;
-            }
-        break;
+    } catch (const exception& e) {
+        error_message(hwndDlg, e.what());
     }
 
-    return FALSE;
+    return false;
 }
 
 static INT_PTR CALLBACK stub_StatsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
@@ -1065,300 +941,301 @@ static INT_PTR CALLBACK stub_StatsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam
     if (bvps)
         return bvps->StatsDlgProc(hwndDlg, uMsg, wParam, lParam);
     else
-        return FALSE;
+        return false;
 }
 
-void BtrfsVolPropSheet::ShowStats(HWND hwndDlg, UINT64 devid) {
+void BtrfsVolPropSheet::ShowStats(HWND hwndDlg, uint64_t devid) {
     stats_dev = devid;
 
     DialogBoxParamW(module, MAKEINTRESOURCEW(IDD_DEVICE_STATS), hwndDlg, stub_StatsDlgProc, (LPARAM)this);
 }
 
 INT_PTR CALLBACK BtrfsVolPropSheet::DeviceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
-    switch (uMsg) {
-        case WM_INITDIALOG:
-        {
-            HWND devlist;
-            RECT rect;
-            ULONG w;
+    try {
+        switch (uMsg) {
+            case WM_INITDIALOG:
+            {
+                HWND devlist;
+                RECT rect;
+                ULONG w;
 
-            EnableThemeDialogTexture(hwndDlg, ETDT_ENABLETAB);
+                EnableThemeDialogTexture(hwndDlg, ETDT_ENABLETAB);
 
-            devlist = GetDlgItem(hwndDlg, IDC_DEVLIST);
+                devlist = GetDlgItem(hwndDlg, IDC_DEVLIST);
 
-            GetClientRect(devlist, &rect);
-            w = rect.right - rect.left;
+                GetClientRect(devlist, &rect);
+                w = rect.right - rect.left;
 
-            add_lv_column(devlist, IDS_DEVLIST_ALLOC_PC, w * 5 / 44);
-            add_lv_column(devlist, IDS_DEVLIST_ALLOC, w * 6 / 44);
-            add_lv_column(devlist, IDS_DEVLIST_SIZE, w * 6 / 44);
-            add_lv_column(devlist, IDS_DEVLIST_READONLY, w * 7 / 44);
-            add_lv_column(devlist, IDS_DEVLIST_DESC, w * 16 / 44);
-            add_lv_column(devlist, IDS_DEVLIST_ID, w * 4 / 44);
+                add_lv_column(devlist, IDS_DEVLIST_ALLOC_PC, w * 5 / 44);
+                add_lv_column(devlist, IDS_DEVLIST_ALLOC, w * 6 / 44);
+                add_lv_column(devlist, IDS_DEVLIST_SIZE, w * 6 / 44);
+                add_lv_column(devlist, IDS_DEVLIST_READONLY, w * 7 / 44);
+                add_lv_column(devlist, IDS_DEVLIST_DESC, w * 16 / 44);
+                add_lv_column(devlist, IDS_DEVLIST_ID, w * 4 / 44);
 
-            SendMessageW(GetDlgItem(hwndDlg, IDC_DEVICE_ADD), BCM_SETSHIELD, 0, TRUE);
-            SendMessageW(GetDlgItem(hwndDlg, IDC_DEVICE_REMOVE), BCM_SETSHIELD, 0, TRUE);
-            SendMessageW(GetDlgItem(hwndDlg, IDC_DEVICE_RESIZE), BCM_SETSHIELD, 0, TRUE);
+                SendMessageW(GetDlgItem(hwndDlg, IDC_DEVICE_ADD), BCM_SETSHIELD, 0, true);
+                SendMessageW(GetDlgItem(hwndDlg, IDC_DEVICE_REMOVE), BCM_SETSHIELD, 0, true);
+                SendMessageW(GetDlgItem(hwndDlg, IDC_DEVICE_RESIZE), BCM_SETSHIELD, 0, true);
 
-            RefreshDevList(devlist);
+                RefreshDevList(devlist);
 
-            break;
-        }
+                break;
+            }
+
+            case WM_COMMAND:
+                switch (HIWORD(wParam)) {
+                    case BN_CLICKED:
+                        switch (LOWORD(wParam)) {
+                            case IDOK:
+                            case IDCANCEL:
+                                KillTimer(hwndDlg, 1);
+                                EndDialog(hwndDlg, 0);
+                            return true;
 
-        case WM_COMMAND:
-            switch (HIWORD(wParam)) {
-                case BN_CLICKED:
-                    switch (LOWORD(wParam)) {
-                        case IDOK:
-                        case IDCANCEL:
-                            KillTimer(hwndDlg, 1);
-                            EndDialog(hwndDlg, 0);
-                        return TRUE;
-
-                        case IDC_DEVICE_ADD:
-                        {
-                            WCHAR t[MAX_PATH + 100];
-                            SHELLEXECUTEINFOW sei;
-
-                            t[0] = '"';
-                            GetModuleFileNameW(module, t + 1, (sizeof(t) / sizeof(WCHAR)) - 1);
-                            wcscat(t, L"\",AddDevice ");
-                            wcscat(t, fn);
-
-                            RtlZeroMemory(&sei, sizeof(sei));
-
-                            sei.cbSize = sizeof(sei);
-                            sei.hwnd = hwndDlg;
-                            sei.lpVerb = L"runas";
-                            sei.lpFile = L"rundll32.exe";
-                            sei.lpParameters = t;
-                            sei.nShow = SW_SHOW;
-                            sei.fMask = SEE_MASK_NOCLOSEPROCESS;
-
-                            if (!ShellExecuteExW(&sei)) {
-                                ShowError(hwndDlg, GetLastError());
-                                return TRUE;
+                            case IDC_DEVICE_ADD:
+                            {
+                                wstring t;
+                                WCHAR modfn[MAX_PATH];
+                                SHELLEXECUTEINFOW sei;
+
+                                GetModuleFileNameW(module, modfn, sizeof(modfn) / sizeof(WCHAR));
+
+#ifndef __REACTOS__
+                                t = L"\""s + modfn + L"\",AddDevice "s + fn;
+#else
+                                t = wstring(L"\"") + modfn + wstring(L"\",AddDevice ") + fn;
+#endif
+
+                                RtlZeroMemory(&sei, sizeof(sei));
+
+                                sei.cbSize = sizeof(sei);
+                                sei.hwnd = hwndDlg;
+                                sei.lpVerb = L"runas";
+                                sei.lpFile = L"rundll32.exe";
+                                sei.lpParameters = t.c_str();
+                                sei.nShow = SW_SHOW;
+                                sei.fMask = SEE_MASK_NOCLOSEPROCESS;
+
+                                if (!ShellExecuteExW(&sei))
+                                    throw last_error(GetLastError());
+
+                                WaitForSingleObject(sei.hProcess, INFINITE);
+                                CloseHandle(sei.hProcess);
+
+                                RefreshDevList(GetDlgItem(hwndDlg, IDC_DEVLIST));
+
+                                return true;
                             }
 
-                            WaitForSingleObject(sei.hProcess, INFINITE);
-                            CloseHandle(sei.hProcess);
+                            case IDC_DEVICE_REFRESH:
+                                RefreshDevList(GetDlgItem(hwndDlg, IDC_DEVLIST));
+                                return true;
 
-                            RefreshDevList(GetDlgItem(hwndDlg, IDC_DEVLIST));
+                            case IDC_DEVICE_SHOW_STATS:
+                            {
+                                WCHAR sel[MAX_PATH];
+                                HWND devlist;
+                                int index;
+                                LVITEMW lvi;
 
-                            return TRUE;
-                        }
+                                devlist = GetDlgItem(hwndDlg, IDC_DEVLIST);
 
-                        case IDC_DEVICE_REFRESH:
-                            RefreshDevList(GetDlgItem(hwndDlg, IDC_DEVLIST));
-                            return TRUE;
+                                index = SendMessageW(devlist, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
 
-                        case IDC_DEVICE_SHOW_STATS:
-                        {
-                            WCHAR sel[MAX_PATH];
-                            HWND devlist;
-                            int index;
-                            LVITEMW lvi;
+                                if (index == -1)
+                                    return true;
 
-                            devlist = GetDlgItem(hwndDlg, IDC_DEVLIST);
+                                RtlZeroMemory(&lvi, sizeof(LVITEMW));
+                                lvi.mask = LVIF_TEXT;
+                                lvi.iItem = index;
+                                lvi.iSubItem = 0;
+                                lvi.pszText = sel;
+                                lvi.cchTextMax = sizeof(sel) / sizeof(WCHAR);
+                                SendMessageW(devlist, LVM_GETITEMW, 0, (LPARAM)&lvi);
 
-                            index = SendMessageW(devlist, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
+                                ShowStats(hwndDlg, _wtoi(sel));
+                                return true;
+                            }
 
-                            if (index == -1)
-                                return TRUE;
+                            case IDC_DEVICE_REMOVE:
+                            {
+                                wstring t, mess, mess2, title;
+                                WCHAR modfn[MAX_PATH], sel[MAX_PATH], sel2[MAX_PATH];
+                                HWND devlist;
+                                SHELLEXECUTEINFOW sei;
+                                int index;
+                                LVITEMW lvi;
 
-                            RtlZeroMemory(&lvi, sizeof(LVITEMW));
-                            lvi.mask = LVIF_TEXT;
-                            lvi.iItem = index;
-                            lvi.iSubItem = 0;
-                            lvi.pszText = sel;
-                            lvi.cchTextMax = sizeof(sel) / sizeof(WCHAR);
-                            SendMessageW(devlist, LVM_GETITEMW, 0, (LPARAM)&lvi);
+                                devlist = GetDlgItem(hwndDlg, IDC_DEVLIST);
 
-                            ShowStats(hwndDlg, _wtoi(sel));
-                            return TRUE;
-                        }
+                                index = SendMessageW(devlist, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
 
-                        case IDC_DEVICE_REMOVE:
-                        {
-                            WCHAR t[2*MAX_PATH + 100], sel[MAX_PATH], sel2[MAX_PATH], mess[255], mess2[255], title[255];
-                            HWND devlist;
-                            SHELLEXECUTEINFOW sei;
-                            int index;
-                            LVITEMW lvi;
+                                if (index == -1)
+                                    return true;
 
-                            devlist = GetDlgItem(hwndDlg, IDC_DEVLIST);
+                                RtlZeroMemory(&lvi, sizeof(LVITEMW));
+                                lvi.mask = LVIF_TEXT;
+                                lvi.iItem = index;
+                                lvi.iSubItem = 0;
+                                lvi.pszText = sel;
+                                lvi.cchTextMax = sizeof(sel) / sizeof(WCHAR);
+                                SendMessageW(devlist, LVM_GETITEMW, 0, (LPARAM)&lvi);
 
-                            index = SendMessageW(devlist, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
+                                lvi.iSubItem = 1;
+                                lvi.pszText = sel2;
+                                lvi.cchTextMax = sizeof(sel2) / sizeof(WCHAR);
+                                SendMessageW(devlist, LVM_GETITEMW, 0, (LPARAM)&lvi);
 
-                            if (index == -1)
-                                return TRUE;
+                                if (!load_string(module, IDS_REMOVE_DEVICE_CONFIRMATION, mess))
+                                    throw last_error(GetLastError());
 
-                            RtlZeroMemory(&lvi, sizeof(LVITEMW));
-                            lvi.mask = LVIF_TEXT;
-                            lvi.iItem = index;
-                            lvi.iSubItem = 0;
-                            lvi.pszText = sel;
-                            lvi.cchTextMax = sizeof(sel) / sizeof(WCHAR);
-                            SendMessageW(devlist, LVM_GETITEMW, 0, (LPARAM)&lvi);
+                                wstring_sprintf(mess2, mess, sel, sel2);
 
-                            lvi.iSubItem = 1;
-                            lvi.pszText = sel2;
-                            lvi.cchTextMax = sizeof(sel2) / sizeof(WCHAR);
-                            SendMessageW(devlist, LVM_GETITEMW, 0, (LPARAM)&lvi);
+                                if (!load_string(module, IDS_CONFIRMATION_TITLE, title))
+                                    throw last_error(GetLastError());
 
-                            if (!LoadStringW(module, IDS_REMOVE_DEVICE_CONFIRMATION, mess, sizeof(mess) / sizeof(WCHAR))) {
-                                ShowError(hwndDlg, GetLastError());
-                                return TRUE;
-                            }
+                                if (MessageBoxW(hwndDlg, mess2.c_str(), title.c_str(), MB_YESNO) != IDYES)
+                                    return true;
 
-                            if (StringCchPrintfW(mess2, sizeof(mess2) / sizeof(WCHAR), mess, sel, sel2) == STRSAFE_E_INSUFFICIENT_BUFFER)
-                                return TRUE;
+                                GetModuleFileNameW(module, modfn, sizeof(modfn) / sizeof(WCHAR));
 
-                            if (!LoadStringW(module, IDS_CONFIRMATION_TITLE, title, sizeof(title) / sizeof(WCHAR))) {
-                                ShowError(hwndDlg, GetLastError());
-                                return TRUE;
-                            }
+#ifndef __REACTOS__
+                                t = L"\""s + modfn + L"\",RemoveDevice "s + fn + L"|"s + sel;
+#else
+                                t = wstring(L"\"") + modfn + wstring(L"\",RemoveDevice ") + fn + wstring(L"|") + sel;
+#endif
+
+                                RtlZeroMemory(&sei, sizeof(sei));
+
+                                sei.cbSize = sizeof(sei);
+                                sei.hwnd = hwndDlg;
+                                sei.lpVerb = L"runas";
+                                sei.lpFile = L"rundll32.exe";
+                                sei.lpParameters = t.c_str();
+                                sei.nShow = SW_SHOW;
+                                sei.fMask = SEE_MASK_NOCLOSEPROCESS;
 
-                            if (MessageBoxW(hwndDlg, mess2, title, MB_YESNO) != IDYES)
-                                return TRUE;
-
-                            t[0] = '"';
-                            GetModuleFileNameW(module, t + 1, (sizeof(t) / sizeof(WCHAR)) - 1);
-                            wcscat(t, L"\",RemoveDevice ");
-                            wcscat(t, fn);
-                            wcscat(t, L"|");
-                            wcscat(t, sel);
-
-                            RtlZeroMemory(&sei, sizeof(sei));
-
-                            sei.cbSize = sizeof(sei);
-                            sei.hwnd = hwndDlg;
-                            sei.lpVerb = L"runas";
-                            sei.lpFile = L"rundll32.exe";
-                            sei.lpParameters = t;
-                            sei.nShow = SW_SHOW;
-                            sei.fMask = SEE_MASK_NOCLOSEPROCESS;
-
-                            if (!ShellExecuteExW(&sei)) {
-                                ShowError(hwndDlg, GetLastError());
-                                return TRUE;
+                                if (!ShellExecuteExW(&sei))
+                                    throw last_error(GetLastError());
+
+                                WaitForSingleObject(sei.hProcess, INFINITE);
+                                CloseHandle(sei.hProcess);
+
+                                RefreshDevList(GetDlgItem(hwndDlg, IDC_DEVLIST));
+
+                                return true;
                             }
 
-                            WaitForSingleObject(sei.hProcess, INFINITE);
-                            CloseHandle(sei.hProcess);
+                            case IDC_DEVICE_RESIZE:
+                            {
+                                HWND devlist;
+                                int index;
+                                LVITEMW lvi;
+                                wstring t;
+                                WCHAR modfn[MAX_PATH], sel[100];
+                                SHELLEXECUTEINFOW sei;
+
+                                devlist = GetDlgItem(hwndDlg, IDC_DEVLIST);
+
+                                index = SendMessageW(devlist, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
+
+                                if (index == -1)
+                                    return true;
+
+                                RtlZeroMemory(&lvi, sizeof(LVITEMW));
+                                lvi.mask = LVIF_TEXT;
+                                lvi.iItem = index;
+                                lvi.iSubItem = 0;
+                                lvi.pszText = sel;
+                                lvi.cchTextMax = sizeof(sel) / sizeof(WCHAR);
+                                SendMessageW(devlist, LVM_GETITEMW, 0, (LPARAM)&lvi);
+
+                                GetModuleFileNameW(module, modfn, sizeof(modfn) / sizeof(WCHAR));
+
+#ifndef __REACTOS__
+                                t = L"\""s + modfn + L"\",ResizeDevice "s + fn + L"|"s + sel;
+#else
+                                t = wstring(L"\"") + modfn + wstring(L"\",ResizeDevice ") + fn + wstring(L"|") + sel;
+#endif
+
+                                RtlZeroMemory(&sei, sizeof(sei));
+
+                                sei.cbSize = sizeof(sei);
+                                sei.hwnd = hwndDlg;
+                                sei.lpVerb = L"runas";
+                                sei.lpFile = L"rundll32.exe";
+                                sei.lpParameters = t.c_str();
+                                sei.nShow = SW_SHOW;
+                                sei.fMask = SEE_MASK_NOCLOSEPROCESS;
+
+                                if (!ShellExecuteExW(&sei))
+                                    throw last_error(GetLastError());
 
-                            RefreshDevList(GetDlgItem(hwndDlg, IDC_DEVLIST));
+                                WaitForSingleObject(sei.hProcess, INFINITE);
+                                CloseHandle(sei.hProcess);
 
-                            return TRUE;
+                                RefreshDevList(GetDlgItem(hwndDlg, IDC_DEVLIST));
+                            }
                         }
+                    break;
+                }
+            break;
+
+            case WM_NOTIFY:
+                switch (((LPNMHDR)lParam)->code) {
+                    case LVN_ITEMCHANGED:
+                    {
+                        NMLISTVIEW* nmv = (NMLISTVIEW*)lParam;
 
-                        case IDC_DEVICE_RESIZE:
-                        {
+                        EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_SHOW_STATS), nmv->uNewState & LVIS_SELECTED);
+
+                        if (nmv->uNewState & LVIS_SELECTED && !readonly) {
                             HWND devlist;
-                            int index;
+                            btrfs_device* bd;
+                            bool device_readonly = false;
                             LVITEMW lvi;
-                            WCHAR sel[100], t[2*MAX_PATH + 100];
-                            SHELLEXECUTEINFOW sei;
+                            WCHAR sel[MAX_PATH];
+                            uint64_t devid;
 
                             devlist = GetDlgItem(hwndDlg, IDC_DEVLIST);
 
-                            index = SendMessageW(devlist, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
-
-                            if (index == -1)
-                                return TRUE;
-
                             RtlZeroMemory(&lvi, sizeof(LVITEMW));
                             lvi.mask = LVIF_TEXT;
-                            lvi.iItem = index;
+                            lvi.iItem = nmv->iItem;
                             lvi.iSubItem = 0;
                             lvi.pszText = sel;
                             lvi.cchTextMax = sizeof(sel) / sizeof(WCHAR);
                             SendMessageW(devlist, LVM_GETITEMW, 0, (LPARAM)&lvi);
+                            devid = _wtoi(sel);
 
-                            t[0] = '"';
-                            GetModuleFileNameW(module, t + 1, (sizeof(t) / sizeof(WCHAR)) - 1);
-                            wcscat(t, L"\",ResizeDevice ");
-                            wcscat(t, fn);
-                            wcscat(t, L"|");
-                            wcscat(t, sel);
-
-                            RtlZeroMemory(&sei, sizeof(sei));
-
-                            sei.cbSize = sizeof(sei);
-                            sei.hwnd = hwndDlg;
-                            sei.lpVerb = L"runas";
-                            sei.lpFile = L"rundll32.exe";
-                            sei.lpParameters = t;
-                            sei.nShow = SW_SHOW;
-                            sei.fMask = SEE_MASK_NOCLOSEPROCESS;
-
-                            if (!ShellExecuteExW(&sei)) {
-                                ShowError(hwndDlg, GetLastError());
-                                return TRUE;
-                            }
+                            bd = devices;
 
-                            WaitForSingleObject(sei.hProcess, INFINITE);
-                            CloseHandle(sei.hProcess);
+                            while (true) {
+                                if (bd->dev_id == devid) {
+                                    device_readonly = bd->readonly;
+                                    break;
+                                }
 
-                            RefreshDevList(GetDlgItem(hwndDlg, IDC_DEVLIST));
-                        }
-                    }
-                break;
-            }
-        break;
-
-        case WM_NOTIFY:
-            switch (((LPNMHDR)lParam)->code) {
-                case LVN_ITEMCHANGED:
-                {
-                    NMLISTVIEW* nmv = (NMLISTVIEW*)lParam;
-
-                    EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_SHOW_STATS), nmv->uNewState & LVIS_SELECTED);
-
-                    if (nmv->uNewState & LVIS_SELECTED && !readonly) {
-                        HWND devlist;
-                        btrfs_device* bd;
-                        BOOL device_readonly = FALSE;
-                        LVITEMW lvi;
-                        WCHAR sel[MAX_PATH];
-                        UINT64 devid;
-
-                        devlist = GetDlgItem(hwndDlg, IDC_DEVLIST);
-
-                        RtlZeroMemory(&lvi, sizeof(LVITEMW));
-                        lvi.mask = LVIF_TEXT;
-                        lvi.iItem = nmv->iItem;
-                        lvi.iSubItem = 0;
-                        lvi.pszText = sel;
-                        lvi.cchTextMax = sizeof(sel) / sizeof(WCHAR);
-                        SendMessageW(devlist, LVM_GETITEMW, 0, (LPARAM)&lvi);
-                        devid = _wtoi(sel);
-
-                        bd = devices;
-
-                        while (TRUE) {
-                            if (bd->dev_id == devid) {
-                                device_readonly = bd->readonly;
-                                break;
+                                if (bd->next_entry > 0)
+                                    bd = (btrfs_device*)((uint8_t*)bd + bd->next_entry);
+                                else
+                                    break;
                             }
 
-                            if (bd->next_entry > 0)
-                                bd = (btrfs_device*)((UINT8*)bd + bd->next_entry);
-                            else
-                                break;
-                        }
-
-                        EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_RESIZE), !device_readonly);
-                    } else
-                        EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_RESIZE), FALSE);
+                            EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_RESIZE), !device_readonly);
+                        } else
+                            EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_RESIZE), false);
 
-                    break;
+                        break;
+                    }
                 }
-            }
-        break;
+            break;
+        }
+    } catch (const exception& e) {
+        error_message(hwndDlg, e.what());
     }
 
-    return FALSE;
+    return false;
 }
 
 static INT_PTR CALLBACK stub_DeviceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
@@ -1374,7 +1251,7 @@ static INT_PTR CALLBACK stub_DeviceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wPara
     if (bvps)
         return bvps->DeviceDlgProc(hwndDlg, uMsg, wParam, lParam);
     else
-        return FALSE;
+        return false;
 }
 
 void BtrfsVolPropSheet::ShowDevices(HWND hwndDlg) {
@@ -1382,13 +1259,17 @@ void BtrfsVolPropSheet::ShowDevices(HWND hwndDlg) {
 }
 
 void BtrfsVolPropSheet::ShowScrub(HWND hwndDlg) {
-    WCHAR t[MAX_PATH + 100];
+    wstring t;
+    WCHAR modfn[MAX_PATH];
     SHELLEXECUTEINFOW sei;
 
-    t[0] = '"';
-    GetModuleFileNameW(module, t + 1, (sizeof(t) / sizeof(WCHAR)) - 1);
-    wcscat(t, L"\",ShowScrub ");
-    wcscat(t, fn);
+    GetModuleFileNameW(module, modfn, sizeof(modfn) / sizeof(WCHAR));
+
+#ifndef __REACTOS__
+    t = L"\""s + modfn + L"\",ShowScrub "s + fn;
+#else
+    t = wstring(L"\"") + modfn + wstring(L"\",ShowScrub ") + fn;
+#endif
 
     RtlZeroMemory(&sei, sizeof(sei));
 
@@ -1396,146 +1277,151 @@ void BtrfsVolPropSheet::ShowScrub(HWND hwndDlg) {
     sei.hwnd = hwndDlg;
     sei.lpVerb = L"runas";
     sei.lpFile = L"rundll32.exe";
-    sei.lpParameters = t;
+    sei.lpParameters = t.c_str();
     sei.nShow = SW_SHOW;
     sei.fMask = SEE_MASK_NOCLOSEPROCESS;
 
-    if (!ShellExecuteExW(&sei)) {
-        ShowError(hwndDlg, GetLastError());
-        return;
-    }
+    if (!ShellExecuteExW(&sei))
+        throw last_error(GetLastError());
 
     WaitForSingleObject(sei.hProcess, INFINITE);
     CloseHandle(sei.hProcess);
 }
 
 static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
-    switch (uMsg) {
-        case WM_INITDIALOG:
-        {
-            PROPSHEETPAGE* psp = (PROPSHEETPAGE*)lParam;
-            BtrfsVolPropSheet* bps = (BtrfsVolPropSheet*)psp->lParam;
-            btrfs_device* bd;
+    try {
+        switch (uMsg) {
+            case WM_INITDIALOG:
+            {
+                PROPSHEETPAGE* psp = (PROPSHEETPAGE*)lParam;
+                BtrfsVolPropSheet* bps = (BtrfsVolPropSheet*)psp->lParam;
+                btrfs_device* bd;
 
-            EnableThemeDialogTexture(hwndDlg, ETDT_ENABLETAB);
+                EnableThemeDialogTexture(hwndDlg, ETDT_ENABLETAB);
 
-            SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)bps);
+                SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)bps);
 
-            bps->readonly = TRUE;
-            bd = bps->devices;
+                bps->readonly = true;
+                bd = bps->devices;
 
-            while (TRUE) {
-                if (!bd->readonly) {
-                    bps->readonly = FALSE;
-                    break;
+                while (true) {
+                    if (!bd->readonly) {
+                        bps->readonly = false;
+                        break;
+                    }
+
+                    if (bd->next_entry > 0)
+                        bd = (btrfs_device*)((uint8_t*)bd + bd->next_entry);
+                    else
+                        break;
                 }
 
-                if (bd->next_entry > 0)
-                    bd = (btrfs_device*)((UINT8*)bd + bd->next_entry);
-                else
-                    break;
-            }
+                if (bps->uuid_set) {
+                    WCHAR s[255];
+                    wstring t;
 
-            if (bps->uuid_set) {
-                WCHAR s[255], t[255];
+                    GetDlgItemTextW(hwndDlg, IDC_UUID, s, sizeof(s) / sizeof(WCHAR));
 
-                GetDlgItemTextW(hwndDlg, IDC_UUID, s, sizeof(s) / sizeof(WCHAR));
+                    wstring_sprintf(t, s, bps->uuid.uuid[0], bps->uuid.uuid[1], bps->uuid.uuid[2], bps->uuid.uuid[3], bps->uuid.uuid[4], bps->uuid.uuid[5],
+                                    bps->uuid.uuid[6], bps->uuid.uuid[7], bps->uuid.uuid[8], bps->uuid.uuid[9], bps->uuid.uuid[10], bps->uuid.uuid[11],
+                                    bps->uuid.uuid[12], bps->uuid.uuid[13], bps->uuid.uuid[14], bps->uuid.uuid[15]);
 
-                if (StringCchPrintfW(t, sizeof(t) / sizeof(WCHAR), s,
-                    bps->uuid.uuid[0], bps->uuid.uuid[1], bps->uuid.uuid[2], bps->uuid.uuid[3], bps->uuid.uuid[4], bps->uuid.uuid[5], bps->uuid.uuid[6], bps->uuid.uuid[7],
-                    bps->uuid.uuid[8], bps->uuid.uuid[9], bps->uuid.uuid[10], bps->uuid.uuid[11], bps->uuid.uuid[12], bps->uuid.uuid[13], bps->uuid.uuid[14], bps->uuid.uuid[15]
-                    ) != STRSAFE_E_INSUFFICIENT_BUFFER)
-                    SetDlgItemTextW(hwndDlg, IDC_UUID, t);
-                else
+                    SetDlgItemTextW(hwndDlg, IDC_UUID, t.c_str());
+                } else
                     SetDlgItemTextW(hwndDlg, IDC_UUID, L"");
-            } else
-                SetDlgItemTextW(hwndDlg, IDC_UUID, L"");
 
-            SendMessageW(GetDlgItem(hwndDlg, IDC_VOL_SCRUB), BCM_SETSHIELD, 0, TRUE);
+                SendMessageW(GetDlgItem(hwndDlg, IDC_VOL_SCRUB), BCM_SETSHIELD, 0, true);
 
-            return FALSE;
-        }
+                return false;
+            }
 
-        case WM_NOTIFY:
-        {
-            switch (((LPNMHDR)lParam)->code) {
-                case PSN_KILLACTIVE:
-                    SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, FALSE);
+            case WM_NOTIFY:
+            {
+                switch (((LPNMHDR)lParam)->code) {
+                    case PSN_KILLACTIVE:
+                        SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, false);
+                    break;
+                }
                 break;
             }
-            break;
-        }
 
-        case WM_COMMAND:
-        {
-            BtrfsVolPropSheet* bps = (BtrfsVolPropSheet*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+            case WM_COMMAND:
+            {
+                BtrfsVolPropSheet* bps = (BtrfsVolPropSheet*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
 
-            if (bps) {
-                switch (HIWORD(wParam)) {
-                    case BN_CLICKED: {
-                        switch (LOWORD(wParam)) {
-                            case IDC_VOL_SHOW_USAGE:
-                                bps->ShowUsage(hwndDlg);
-                            break;
+                if (bps) {
+                    switch (HIWORD(wParam)) {
+                        case BN_CLICKED: {
+                            switch (LOWORD(wParam)) {
+                                case IDC_VOL_SHOW_USAGE:
+                                    bps->ShowUsage(hwndDlg);
+                                break;
 
-                            case IDC_VOL_BALANCE:
-                                bps->balance->ShowBalance(hwndDlg);
-                            break;
+                                case IDC_VOL_BALANCE:
+                                    bps->balance->ShowBalance(hwndDlg);
+                                break;
 
-                            case IDC_VOL_DEVICES:
-                                bps->ShowDevices(hwndDlg);
-                            break;
+                                case IDC_VOL_DEVICES:
+                                    bps->ShowDevices(hwndDlg);
+                                break;
 
-                            case IDC_VOL_SCRUB:
-                                bps->ShowScrub(hwndDlg);
-                            break;
+                                case IDC_VOL_SCRUB:
+                                    bps->ShowScrub(hwndDlg);
+                                break;
+                            }
                         }
                     }
                 }
-            }
 
-            break;
+                break;
+            }
         }
+    } catch (const exception& e) {
+        error_message(hwndDlg, e.what());
     }
 
-    return FALSE;
+    return false;
 }
 
 HRESULT __stdcall BtrfsVolPropSheet::AddPages(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam) {
-    PROPSHEETPAGE psp;
-    HPROPSHEETPAGE hPage;
-    INITCOMMONCONTROLSEX icex;
-
-    if (ignore)
-        return S_OK;
-
-    icex.dwSize = sizeof(icex);
-    icex.dwICC = ICC_LINK_CLASS;
+    try {
+        PROPSHEETPAGE psp;
+        HPROPSHEETPAGE hPage;
+        INITCOMMONCONTROLSEX icex;
 
-    if (!InitCommonControlsEx(&icex))
-        MessageBoxW(NULL, L"InitCommonControlsEx failed", L"Error", MB_ICONERROR);
-
-    psp.dwSize = sizeof(psp);
-    psp.dwFlags = PSP_USEREFPARENT | PSP_USETITLE;
-    psp.hInstance = module;
-    psp.pszTemplate = MAKEINTRESOURCE(IDD_VOL_PROP_SHEET);
-    psp.hIcon = 0;
-    psp.pszTitle = MAKEINTRESOURCE(IDS_VOL_PROP_SHEET_TITLE);
-    psp.pfnDlgProc = (DLGPROC)PropSheetDlgProc;
-    psp.pcRefParent = (UINT*)&objs_loaded;
-    psp.pfnCallback = NULL;
-    psp.lParam = (LPARAM)this;
-
-    hPage = CreatePropertySheetPage(&psp);
-
-    if (hPage) {
-        if (pfnAddPage(hPage, lParam)) {
-            this->AddRef();
+        if (ignore)
             return S_OK;
+
+        icex.dwSize = sizeof(icex);
+        icex.dwICC = ICC_LINK_CLASS;
+
+        if (!InitCommonControlsEx(&icex))
+            throw string_error(IDS_INITCOMMONCONTROLSEX_FAILED);
+
+        psp.dwSize = sizeof(psp);
+        psp.dwFlags = PSP_USEREFPARENT | PSP_USETITLE;
+        psp.hInstance = module;
+        psp.pszTemplate = MAKEINTRESOURCE(IDD_VOL_PROP_SHEET);
+        psp.hIcon = 0;
+        psp.pszTitle = MAKEINTRESOURCE(IDS_VOL_PROP_SHEET_TITLE);
+        psp.pfnDlgProc = (DLGPROC)PropSheetDlgProc;
+        psp.pcRefParent = (UINT*)&objs_loaded;
+        psp.pfnCallback = nullptr;
+        psp.lParam = (LPARAM)this;
+
+        hPage = CreatePropertySheetPage(&psp);
+
+        if (hPage) {
+            if (pfnAddPage(hPage, lParam)) {
+                this->AddRef();
+                return S_OK;
+            } else
+                DestroyPropertySheetPage(hPage);
         } else
-            DestroyPropertySheetPage(hPage);
-    } else
-        return E_OUTOFMEMORY;
+            return E_OUTOFMEMORY;
+    } catch (const exception& e) {
+        error_message(nullptr, e.what());
+    }
 
     return E_FAIL;
 }
@@ -1549,68 +1435,57 @@ extern "C" {
 #endif
 
 void CALLBACK ResetStatsW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) {
-    HANDLE token, h;
-    NTSTATUS Status;
-    TOKEN_PRIVILEGES tp;
-    LUID luid;
-    UINT64 devid;
-    WCHAR *s, *vol, *dev;
-    IO_STATUS_BLOCK iosb;
+    try {
+        win_handle token;
+        NTSTATUS Status;
+        TOKEN_PRIVILEGES tp;
+        LUID luid;
+        uint64_t devid;
+        wstring cmdline, vol, dev;
+        size_t pipe;
+        IO_STATUS_BLOCK iosb;
 
-    set_dpi_aware();
+        set_dpi_aware();
 
-    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)) {
-        ShowError(hwnd, GetLastError());
-        return;
-    }
+        cmdline = lpszCmdLine;
 
-    if (!LookupPrivilegeValueW(NULL, L"SeManageVolumePrivilege", &luid)) {
-        ShowError(hwnd, GetLastError());
-        goto end;
-    }
+        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token))
+            throw last_error(GetLastError());
 
-    tp.PrivilegeCount = 1;
-    tp.Privileges[0].Luid = luid;
-    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+        if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", &luid))
+            throw last_error(GetLastError());
 
-    if (!AdjustTokenPrivileges(token, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) {
-        ShowError(hwnd, GetLastError());
-        goto end;
-    }
+        tp.PrivilegeCount = 1;
+        tp.Privileges[0].Luid = luid;
+        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
-    s = wcsstr(lpszCmdLine, L"|");
-    if (!s)
-        goto end;
+        if (!AdjustTokenPrivileges(token, false, &tp, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr))
+            throw last_error(GetLastError());
 
-    s[0] = 0;
+        pipe = cmdline.find(L"|");
 
-    vol = lpszCmdLine;
-    dev = &s[1];
+        if (pipe == string::npos)
+            return;
 
-    devid = _wtoi(dev);
-    if (devid == 0)
-        goto end;
+        vol = cmdline.substr(0, pipe);
+        dev = cmdline.substr(pipe + 1);
 
-    h = CreateFileW(vol, FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
-                    OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
+        devid = _wtoi(dev.c_str());
+        if (devid == 0)
+            return;
 
-    if (h == INVALID_HANDLE_VALUE) {
-        ShowError(hwnd, GetLastError());
-        goto end;
-    }
+        win_handle h = CreateFileW(vol.c_str(), FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr,
+                                OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr);
 
-    Status = NtFsControlFile(h, NULL, NULL, NULL, &iosb, FSCTL_BTRFS_RESET_STATS, &devid, sizeof(UINT64), NULL, 0);
-    if (!NT_SUCCESS(Status)) {
-        ShowNtStatusError(hwnd, Status);
+        if (h == INVALID_HANDLE_VALUE)
+            throw last_error(GetLastError());
 
-        CloseHandle(h);
-        goto end;
+        Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_RESET_STATS, &devid, sizeof(uint64_t), nullptr, 0);
+        if (!NT_SUCCESS(Status))
+            throw ntstatus_error(Status);
+    } catch (const exception& e) {
+        error_message(hwnd, e.what());
     }
-
-    CloseHandle(h);
-
-end:
-    CloseHandle(token);
 }
 
 #ifdef __cplusplus