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;
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;
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;
i++;
} else {
- CloseHandle(h);
GlobalUnlock(hdrop);
return E_FAIL;
}
}
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;
}
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;
}
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) {
}
}
- 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;
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;
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;
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) {
if (bvps)
return bvps->UsageDlgProc(hwndDlg, uMsg, wParam, lParam);
else
- return FALSE;
+ return false;
}
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);
}
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)
}
if (bue->next_entry > 0)
- bue = (btrfs_usage*)((UINT8*)bue + bue->next_entry);
+ bue = (btrfs_usage*)((uint8_t*)bue + bue->next_entry);
else
break;
}
}
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);
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)
// 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
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;
}
}
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));
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;
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;
} 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) {
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) {
if (bvps)
return bvps->DeviceDlgProc(hwndDlg, uMsg, wParam, lParam);
else
- return FALSE;
+ return false;
}
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));
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;
}
#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