ReactOS  0.4.14-dev-608-gd495a4f
balance.cpp
Go to the documentation of this file.
1 /* Copyright (c) Mark Harmstone 2016-17
2  *
3  * This file is part of WinBtrfs.
4  *
5  * WinBtrfs is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public Licence as published by
7  * the Free Software Foundation, either version 3 of the Licence, or
8  * (at your option) any later version.
9  *
10  * WinBtrfs is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU Lesser General Public Licence for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public Licence
16  * along with WinBtrfs. If not, see <http://www.gnu.org/licenses/>. */
17 
18 #include "shellext.h"
19 #include "balance.h"
20 #include "resource.h"
21 #ifndef __REACTOS__
22 #include "../btrfsioctl.h"
23 #else
24 #include "btrfsioctl.h"
25 #endif
26 #include <shlobj.h>
27 #include <uxtheme.h>
28 #include <stdio.h>
29 #ifndef __REACTOS__
30 #include <strsafe.h>
31 #include <winternl.h>
32 #else
33 #define WIN32_NO_STATUS
34 #include <windef.h>
35 #include <winbase.h>
36 #include <strsafe.h>
37 #include <ndk/iofuncs.h>
38 #include <ndk/iotypes.h>
39 #endif
40 
41 #define NO_SHLWAPI_STRFCNS
42 #include <shlwapi.h>
43 #include <uxtheme.h>
44 
46 
48  if (u >= 0xa && u <= 0xf)
49  return (uint8_t)(u - 0xa + 'a');
50  else
51  return (uint8_t)(u + '0');
52 }
53 
54 static void serialize(void* data, ULONG len, WCHAR* s) {
55  uint8_t* d;
56 
57  d = (uint8_t*)data;
58 
59  while (true) {
60  *s = hex_digit((uint8_t)(*d >> 4)); s++;
61  *s = hex_digit(*d & 0xf); s++;
62 
63  d++;
64  len--;
65 
66  if (len == 0) {
67  *s = 0;
68  return;
69  }
70  }
71 }
72 
74  wstring t;
75  WCHAR modfn[MAX_PATH], u[600];
78 
79  GetModuleFileNameW(module, modfn, sizeof(modfn) / sizeof(WCHAR));
80 
81 #ifndef __REACTOS__
82  t = L"\""s + modfn + L"\",StartBalance "s + fn + L" "s;
83 #else
84  t = wstring(L"\"") + modfn + wstring(L"\",StartBalance ") + fn + wstring(L" ");
85 #endif
86 
87  RtlCopyMemory(&bsb.opts[0], &data_opts, sizeof(btrfs_balance_opts));
90 
91  if (IsDlgButtonChecked(hwndDlg, IDC_DATA) == BST_CHECKED)
93  else
95 
98  else
100 
101  if (IsDlgButtonChecked(hwndDlg, IDC_SYSTEM) == BST_CHECKED)
103  else
105 
106  serialize(&bsb, sizeof(btrfs_start_balance), u);
107 
108  t += u;
109 
110  RtlZeroMemory(&sei, sizeof(sei));
111 
112  sei.cbSize = sizeof(sei);
113  sei.hwnd = hwndDlg;
114  sei.lpVerb = L"runas";
115  sei.lpFile = L"rundll32.exe";
116  sei.lpParameters = t.c_str();
117  sei.nShow = SW_SHOW;
119 
120  if (!ShellExecuteExW(&sei))
121  throw last_error(GetLastError());
122 
123  cancelling = false;
124  removing = false;
125  shrinking = false;
127 
128  EnableWindow(GetDlgItem(hwndDlg, IDC_PAUSE_BALANCE), true);
129  EnableWindow(GetDlgItem(hwndDlg, IDC_CANCEL_BALANCE), true);
131  EnableWindow(GetDlgItem(hwndDlg, IDC_DATA), false);
132  EnableWindow(GetDlgItem(hwndDlg, IDC_METADATA), false);
133  EnableWindow(GetDlgItem(hwndDlg, IDC_SYSTEM), false);
137 
138  EnableWindow(GetDlgItem(hwndDlg, IDC_START_BALANCE), false);
139 
141  CloseHandle(sei.hProcess);
142 }
143 
145  WCHAR modfn[MAX_PATH];
146  wstring t;
147  SHELLEXECUTEINFOW sei;
148 
149  GetModuleFileNameW(module, modfn, sizeof(modfn) / sizeof(WCHAR));
150 
151 #ifndef __REACTOS__
152  t = L"\""s + modfn + L"\",PauseBalance " + fn;
153 #else
154  t = wstring(L"\"") + modfn + wstring(L"\",PauseBalance ") + fn;
155 #endif
156 
157  RtlZeroMemory(&sei, sizeof(sei));
158 
159  sei.cbSize = sizeof(sei);
160  sei.hwnd = hwndDlg;
161  sei.lpVerb = L"runas";
162  sei.lpFile = L"rundll32.exe";
163  sei.lpParameters = t.c_str();
164  sei.nShow = SW_SHOW;
166 
167  if (!ShellExecuteExW(&sei))
168  throw last_error(GetLastError());
169 
171  CloseHandle(sei.hProcess);
172 }
173 
175  WCHAR modfn[MAX_PATH];
176  wstring t;
177  SHELLEXECUTEINFOW sei;
178 
179  GetModuleFileNameW(module, modfn, sizeof(modfn) / sizeof(WCHAR));
180 
181 #ifndef __REACTOS__
182  t = L"\""s + modfn + L"\",StopBalance " + fn;
183 #else
184  t = wstring(L"\"") + modfn + wstring(L"\",StopBalance ") + fn;
185 #endif
186 
187  RtlZeroMemory(&sei, sizeof(sei));
188 
189  sei.cbSize = sizeof(sei);
190  sei.hwnd = hwndDlg;
191  sei.lpVerb = L"runas";
192  sei.lpFile = L"rundll32.exe";
193  sei.lpParameters = t.c_str();
194  sei.nShow = SW_SHOW;
196 
197  if (!ShellExecuteExW(&sei))
198  throw last_error(GetLastError());
199 
200  cancelling = true;
201 
203  CloseHandle(sei.hProcess);
204 }
205 
207  bool balancing = false;
208  wstring s, t;
209 
210  {
213 
214  if (h != INVALID_HANDLE_VALUE) {
217 
218  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_QUERY_BALANCE, nullptr, 0, &bqb, sizeof(btrfs_query_balance));
219 
220  if (!NT_SUCCESS(Status))
221  throw ntstatus_error(Status);
222  } else
223  throw last_error(GetLastError());
224  }
225 
226  if (cancelling)
228 
230 
231  if (!balancing) {
233  int resid;
234 
235  EnableWindow(GetDlgItem(hwndDlg, IDC_PAUSE_BALANCE), false);
236  EnableWindow(GetDlgItem(hwndDlg, IDC_CANCEL_BALANCE), false);
237  SendMessageW(GetDlgItem(hwndDlg, IDC_BALANCE_PROGRESS), PBM_SETSTATE, PBST_NORMAL, 0);
238  EnableWindow(GetDlgItem(hwndDlg, IDC_BALANCE_PROGRESS), false);
239  EnableWindow(GetDlgItem(hwndDlg, IDC_DATA), true);
240  EnableWindow(GetDlgItem(hwndDlg, IDC_METADATA), true);
241  EnableWindow(GetDlgItem(hwndDlg, IDC_SYSTEM), true);
242 
247 
249  }
250 
251  EnableWindow(GetDlgItem(hwndDlg, IDC_DATA_OPTIONS), IsDlgButtonChecked(hwndDlg, IDC_DATA) == BST_CHECKED ? true : false);
253  EnableWindow(GetDlgItem(hwndDlg, IDC_SYSTEM_OPTIONS), IsDlgButtonChecked(hwndDlg, IDC_SYSTEM) == BST_CHECKED ? true : false);
254 
256  if (removing)
258  else if (shrinking)
260  else
261  resid = IDS_BALANCE_FAILED;
262 
263  if (!load_string(module, resid, s))
264  throw last_error(GetLastError());
265 
267 
268  SetDlgItemTextW(hwndDlg, IDC_BALANCE_STATUS, t.c_str());
269  } else {
270  if (cancelling)
274  else
275  resid = IDS_NO_BALANCE;
276 
277  if (!load_string(module, resid, s))
278  throw last_error(GetLastError());
279 
280  SetDlgItemTextW(hwndDlg, IDC_BALANCE_STATUS, s.c_str());
281  }
282 
284  IsDlgButtonChecked(hwndDlg, IDC_METADATA) == BST_CHECKED || IsDlgButtonChecked(hwndDlg, IDC_SYSTEM) == BST_CHECKED) ? true: false);
285 
287  cancelling = false;
288  }
289 
290  return;
291  }
292 
294  EnableWindow(GetDlgItem(hwndDlg, IDC_PAUSE_BALANCE), true);
295  EnableWindow(GetDlgItem(hwndDlg, IDC_CANCEL_BALANCE), true);
297  EnableWindow(GetDlgItem(hwndDlg, IDC_DATA), false);
298  EnableWindow(GetDlgItem(hwndDlg, IDC_METADATA), false);
299  EnableWindow(GetDlgItem(hwndDlg, IDC_SYSTEM), false);
300 
304 
308 
309  EnableWindow(GetDlgItem(hwndDlg, IDC_START_BALANCE), false);
310  }
311 
314 
316  SendMessageW(GetDlgItem(hwndDlg, IDC_BALANCE_PROGRESS), PBM_SETSTATE, PBST_PAUSED, 0);
318  SendMessageW(GetDlgItem(hwndDlg, IDC_BALANCE_PROGRESS), PBM_SETSTATE, PBST_NORMAL, 0);
319 
321 
324  throw last_error(GetLastError());
325 
327  (float)(bqb.total_chunks - bqb.chunks_left) * 100.0f / (float)bqb.total_chunks);
328 
329  removing = true;
330  shrinking = false;
331  } else if (bqb.status & BTRFS_BALANCE_SHRINKING) {
333  throw last_error(GetLastError());
334 
336  (float)(bqb.total_chunks - bqb.chunks_left) * 100.0f / (float)bqb.total_chunks);
337 
338  removing = false;
339  shrinking = true;
340  } else {
342  throw last_error(GetLastError());
343 
345  (float)(bqb.total_chunks - bqb.chunks_left) * 100.0f / (float)bqb.total_chunks);
346 
347  removing = false;
348  shrinking = false;
349  }
350 
351  SetDlgItemTextW(hwndDlg, IDC_BALANCE_STATUS, t.c_str());
352 }
353 
355  btrfs_balance_opts* opts;
356 
357  switch (opts_type) {
358  case 1:
359  opts = &data_opts;
360  break;
361 
362  case 2:
363  opts = &metadata_opts;
364  break;
365 
366  case 3:
367  opts = &system_opts;
368  break;
369 
370  default:
371  return;
372  }
373 
374  RtlZeroMemory(opts, sizeof(btrfs_balance_opts));
375 
376  if (IsDlgButtonChecked(hwndDlg, IDC_PROFILES) == BST_CHECKED) {
378 
386  }
387 
388  if (IsDlgButtonChecked(hwndDlg, IDC_DEVID) == BST_CHECKED) {
390 
391  auto sel = SendMessageW(GetDlgItem(hwndDlg, IDC_DEVID_COMBO), CB_GETCURSEL, 0, 0);
392 
393  if (sel == CB_ERR)
395  else {
396  btrfs_device* bd = devices;
397  int i = 0;
398 
399  while (true) {
400  if (i == sel) {
401  opts->devid = bd->dev_id;
402  break;
403  }
404 
405  i++;
406 
407  if (bd->next_entry > 0)
408  bd = (btrfs_device*)((uint8_t*)bd + bd->next_entry);
409  else
410  break;
411  }
412 
413  if (opts->devid == 0)
415  }
416  }
417 
418  if (IsDlgButtonChecked(hwndDlg, IDC_DRANGE) == BST_CHECKED) {
419  WCHAR s[255];
420 
422 
423  GetWindowTextW(GetDlgItem(hwndDlg, IDC_DRANGE_START), s, sizeof(s) / sizeof(WCHAR));
424  opts->drange_start = _wtoi64(s);
425 
426  GetWindowTextW(GetDlgItem(hwndDlg, IDC_DRANGE_END), s, sizeof(s) / sizeof(WCHAR));
427  opts->drange_end = _wtoi64(s);
428 
429  if (opts->drange_end < opts->drange_start)
431  }
432 
433  if (IsDlgButtonChecked(hwndDlg, IDC_VRANGE) == BST_CHECKED) {
434  WCHAR s[255];
435 
437 
438  GetWindowTextW(GetDlgItem(hwndDlg, IDC_VRANGE_START), s, sizeof(s) / sizeof(WCHAR));
439  opts->vrange_start = _wtoi64(s);
440 
441  GetWindowTextW(GetDlgItem(hwndDlg, IDC_VRANGE_END), s, sizeof(s) / sizeof(WCHAR));
442  opts->vrange_end = _wtoi64(s);
443 
444  if (opts->vrange_end < opts->vrange_start)
446  }
447 
448  if (IsDlgButtonChecked(hwndDlg, IDC_LIMIT) == BST_CHECKED) {
449  WCHAR s[255];
450 
452 
453  GetWindowTextW(GetDlgItem(hwndDlg, IDC_LIMIT_START), s, sizeof(s) / sizeof(WCHAR));
454  opts->limit_start = _wtoi64(s);
455 
456  GetWindowTextW(GetDlgItem(hwndDlg, IDC_LIMIT_END), s, sizeof(s) / sizeof(WCHAR));
457  opts->limit_end = _wtoi64(s);
458 
459  if (opts->limit_end < opts->limit_start)
461  }
462 
463  if (IsDlgButtonChecked(hwndDlg, IDC_STRIPES) == BST_CHECKED) {
464  WCHAR s[255];
465 
467 
468  GetWindowTextW(GetDlgItem(hwndDlg, IDC_STRIPES_START), s, sizeof(s) / sizeof(WCHAR));
469  opts->stripes_start = (uint8_t)_wtoi(s);
470 
471  GetWindowTextW(GetDlgItem(hwndDlg, IDC_STRIPES_END), s, sizeof(s) / sizeof(WCHAR));
472  opts->stripes_end = (uint8_t)_wtoi(s);
473 
474  if (opts->stripes_end < opts->stripes_start)
476  }
477 
478  if (IsDlgButtonChecked(hwndDlg, IDC_USAGE) == BST_CHECKED) {
479  WCHAR s[255];
480 
482 
483  GetWindowTextW(GetDlgItem(hwndDlg, IDC_USAGE_START), s, sizeof(s) / sizeof(WCHAR));
484  opts->usage_start = (uint8_t)_wtoi(s);
485 
486  GetWindowTextW(GetDlgItem(hwndDlg, IDC_USAGE_END), s, sizeof(s) / sizeof(WCHAR));
487  opts->usage_end = (uint8_t)_wtoi(s);
488 
489  if (opts->usage_end < opts->usage_start)
491  }
492 
493  if (IsDlgButtonChecked(hwndDlg, IDC_CONVERT) == BST_CHECKED) {
495 
496  auto sel = SendMessageW(GetDlgItem(hwndDlg, IDC_CONVERT_COMBO), CB_GETCURSEL, 0, 0);
497 
498  if (sel == CB_ERR || (unsigned int)sel >= sizeof(convtypes2) / sizeof(convtypes2[0]))
500  else {
501  opts->convert = convtypes2[sel];
502 
504  }
505  }
506 
507  EndDialog(hwndDlg, 0);
508 }
509 
511  try {
512  switch (uMsg) {
513  case WM_INITDIALOG:
514  {
515  HWND devcb, convcb;
516  btrfs_device* bd;
517  btrfs_balance_opts* opts;
518  static int convtypes[] = { IDS_SINGLE2, IDS_DUP, IDS_RAID0, IDS_RAID1, IDS_RAID5, IDS_RAID6, IDS_RAID10, 0 };
519  int i, num_devices = 0, num_writeable_devices = 0;
520  wstring s, u;
521  bool balance_started = balance_status & (BTRFS_BALANCE_RUNNING | BTRFS_BALANCE_PAUSED);
522 
523  switch (opts_type) {
524  case 1:
525  opts = balance_started ? &bqb.data_opts : &data_opts;
526  break;
527 
528  case 2:
529  opts = balance_started ? &bqb.metadata_opts : &metadata_opts;
530  break;
531 
532  case 3:
533  opts = balance_started ? &bqb.system_opts : &system_opts;
534  break;
535 
536  default:
537  return true;
538  }
539 
541 
542  devcb = GetDlgItem(hwndDlg, IDC_DEVID_COMBO);
543 
545  throw last_error(GetLastError());
546 
547  bd = devices;
548  while (true) {
549  wstring t, v;
550 
551  if (bd->device_number == 0xffffffff)
552  s = wstring(bd->name, bd->namelen);
553  else if (bd->partition_number == 0) {
555  throw last_error(GetLastError());
556 
558  } else {
560  throw last_error(GetLastError());
561 
563  }
564 
565  wstring_sprintf(t, u, bd->dev_id, s.c_str());
566 
567  SendMessage(devcb, CB_ADDSTRING, 0, (LPARAM)t.c_str());
568 
569  if (opts->devid == bd->dev_id)
570  SendMessage(devcb, CB_SETCURSEL, num_devices, 0);
571 
572  num_devices++;
573 
574  if (!bd->readonly)
575  num_writeable_devices++;
576 
577  if (bd->next_entry > 0)
578  bd = (btrfs_device*)((uint8_t*)bd + bd->next_entry);
579  else
580  break;
581  }
582 
583  convcb = GetDlgItem(hwndDlg, IDC_CONVERT_COMBO);
584 
585  if (num_writeable_devices == 0)
586  num_writeable_devices = num_devices;
587 
588  i = 0;
589  while (convtypes[i] != 0) {
590  if (!load_string(module, convtypes[i], s))
591  throw last_error(GetLastError());
592 
593  SendMessage(convcb, CB_ADDSTRING, 0, (LPARAM)s.c_str());
594 
595  if (opts->convert == convtypes2[i])
596  SendMessage(convcb, CB_SETCURSEL, i, 0);
597 
598  i++;
599 
600  if (num_writeable_devices < 2 && i == 2)
601  break;
602  else if (num_writeable_devices < 3 && i == 4)
603  break;
604  else if (num_writeable_devices < 4 && i == 5)
605  break;
606  }
607 
608  // profiles
609 
618 
619  EnableWindow(GetDlgItem(hwndDlg, IDC_PROFILES_SINGLE), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_PROFILES ? true : false);
620  EnableWindow(GetDlgItem(hwndDlg, IDC_PROFILES_DUP), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_PROFILES ? true : false);
621  EnableWindow(GetDlgItem(hwndDlg, IDC_PROFILES_RAID0), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_PROFILES ? true : false);
622  EnableWindow(GetDlgItem(hwndDlg, IDC_PROFILES_RAID1), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_PROFILES ? true : false);
623  EnableWindow(GetDlgItem(hwndDlg, IDC_PROFILES_RAID10), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_PROFILES ? true : false);
624  EnableWindow(GetDlgItem(hwndDlg, IDC_PROFILES_RAID5), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_PROFILES ? true : false);
625  EnableWindow(GetDlgItem(hwndDlg, IDC_PROFILES_RAID6), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_PROFILES ? true : false);
626  EnableWindow(GetDlgItem(hwndDlg, IDC_PROFILES), balance_started ? false : true);
627 
628  // usage
629 
631 
632  s = to_wstring(opts->usage_start);
633  SetDlgItemTextW(hwndDlg, IDC_USAGE_START, s.c_str());
635 
636  s = to_wstring(opts->usage_end);
637  SetDlgItemTextW(hwndDlg, IDC_USAGE_END, s.c_str());
639 
640  EnableWindow(GetDlgItem(hwndDlg, IDC_USAGE_START), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_USAGE ? true : false);
641  EnableWindow(GetDlgItem(hwndDlg, IDC_USAGE_START_SPINNER), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_USAGE ? true : false);
642  EnableWindow(GetDlgItem(hwndDlg, IDC_USAGE_END), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_USAGE ? true : false);
643  EnableWindow(GetDlgItem(hwndDlg, IDC_USAGE_END_SPINNER), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_USAGE ? true : false);
644  EnableWindow(GetDlgItem(hwndDlg, IDC_USAGE), balance_started ? false : true);
645 
646  // devid
647 
648  if (num_devices < 2 || balance_started)
649  EnableWindow(GetDlgItem(hwndDlg, IDC_DEVID), false);
650 
652  EnableWindow(devcb, (opts->flags & BTRFS_BALANCE_OPTS_DEVID && num_devices >= 2 && !balance_started) ? true : false);
653 
654  // drange
655 
657 
658  s = to_wstring(opts->drange_start);
659  SetDlgItemTextW(hwndDlg, IDC_DRANGE_START, s.c_str());
660 
661  s = to_wstring(opts->drange_end);
662  SetDlgItemTextW(hwndDlg, IDC_DRANGE_END, s.c_str());
663 
664  EnableWindow(GetDlgItem(hwndDlg, IDC_DRANGE_START), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_DRANGE ? true : false);
665  EnableWindow(GetDlgItem(hwndDlg, IDC_DRANGE_END), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_DRANGE ? true : false);
666  EnableWindow(GetDlgItem(hwndDlg, IDC_DRANGE), balance_started ? false : true);
667 
668  // vrange
669 
671 
672  s = to_wstring(opts->vrange_start);
673  SetDlgItemTextW(hwndDlg, IDC_VRANGE_START, s.c_str());
674 
675  s = to_wstring(opts->vrange_end);
676  SetDlgItemTextW(hwndDlg, IDC_VRANGE_END, s.c_str());
677 
678  EnableWindow(GetDlgItem(hwndDlg, IDC_VRANGE_START), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_VRANGE ? true : false);
679  EnableWindow(GetDlgItem(hwndDlg, IDC_VRANGE_END), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_VRANGE ? true : false);
680  EnableWindow(GetDlgItem(hwndDlg, IDC_VRANGE), balance_started ? false : true);
681 
682  // limit
683 
685 
686  s = to_wstring(opts->limit_start);
687  SetDlgItemTextW(hwndDlg, IDC_LIMIT_START, s.c_str());
689 
690  s = to_wstring(opts->limit_end);
691  SetDlgItemTextW(hwndDlg, IDC_LIMIT_END, s.c_str());
692  SendMessageW(GetDlgItem(hwndDlg, IDC_LIMIT_END_SPINNER), UDM_SETRANGE32, 0, 0x7fffffff);
693 
694  EnableWindow(GetDlgItem(hwndDlg, IDC_LIMIT_START), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_LIMIT ? true : false);
695  EnableWindow(GetDlgItem(hwndDlg, IDC_LIMIT_START_SPINNER), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_LIMIT ? true : false);
696  EnableWindow(GetDlgItem(hwndDlg, IDC_LIMIT_END), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_LIMIT ? true : false);
697  EnableWindow(GetDlgItem(hwndDlg, IDC_LIMIT_END_SPINNER), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_LIMIT ? true : false);
698  EnableWindow(GetDlgItem(hwndDlg, IDC_LIMIT), balance_started ? false : true);
699 
700  // stripes
701 
703 
704  s = to_wstring(opts->stripes_start);
705  SetDlgItemTextW(hwndDlg, IDC_STRIPES_START, s.c_str());
707 
708  s = to_wstring(opts->stripes_end);
709  SetDlgItemTextW(hwndDlg, IDC_STRIPES_END, s.c_str());
711 
712  EnableWindow(GetDlgItem(hwndDlg, IDC_STRIPES_START), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_STRIPES ? true : false);
713  EnableWindow(GetDlgItem(hwndDlg, IDC_STRIPES_START_SPINNER), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_STRIPES ? true : false);
714  EnableWindow(GetDlgItem(hwndDlg, IDC_STRIPES_END), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_STRIPES ? true : false);
715  EnableWindow(GetDlgItem(hwndDlg, IDC_STRIPES_END_SPINNER), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_STRIPES ? true : false);
716  EnableWindow(GetDlgItem(hwndDlg, IDC_STRIPES), balance_started ? false : true);
717 
718  // convert
719 
722 
723  EnableWindow(GetDlgItem(hwndDlg, IDC_SOFT), !balance_started && opts->flags & BTRFS_BALANCE_OPTS_CONVERT ? true : false);
724  EnableWindow(convcb, !balance_started && opts->flags & BTRFS_BALANCE_OPTS_CONVERT ? true : false);
725  EnableWindow(GetDlgItem(hwndDlg, IDC_CONVERT), balance_started ? false : true);
726 
727  break;
728  }
729 
730  case WM_COMMAND:
731  switch (HIWORD(wParam)) {
732  case BN_CLICKED:
733  switch (LOWORD(wParam)) {
734  case IDOK:
736  EndDialog(hwndDlg, 0);
737  else
738  SaveBalanceOpts(hwndDlg);
739  return true;
740 
741  case IDCANCEL:
742  EndDialog(hwndDlg, 0);
743  return true;
744 
745  case IDC_PROFILES: {
746  bool enabled = IsDlgButtonChecked(hwndDlg, IDC_PROFILES) == BST_CHECKED ? true : false;
747 
755  break;
756  }
757 
758  case IDC_USAGE: {
759  bool enabled = IsDlgButtonChecked(hwndDlg, IDC_USAGE) == BST_CHECKED ? true : false;
760 
765  break;
766  }
767 
768  case IDC_DEVID: {
769  bool enabled = IsDlgButtonChecked(hwndDlg, IDC_DEVID) == BST_CHECKED ? true : false;
770 
772  break;
773  }
774 
775  case IDC_DRANGE: {
776  bool enabled = IsDlgButtonChecked(hwndDlg, IDC_DRANGE) == BST_CHECKED ? true : false;
777 
780  break;
781  }
782 
783  case IDC_VRANGE: {
784  bool enabled = IsDlgButtonChecked(hwndDlg, IDC_VRANGE) == BST_CHECKED ? true : false;
785 
788  break;
789  }
790 
791  case IDC_LIMIT: {
792  bool enabled = IsDlgButtonChecked(hwndDlg, IDC_LIMIT) == BST_CHECKED ? true : false;
793 
798  break;
799  }
800 
801  case IDC_STRIPES: {
802  bool enabled = IsDlgButtonChecked(hwndDlg, IDC_STRIPES) == BST_CHECKED ? true : false;
803 
808  break;
809  }
810 
811  case IDC_CONVERT: {
812  bool enabled = IsDlgButtonChecked(hwndDlg, IDC_CONVERT) == BST_CHECKED ? true : false;
813 
816  break;
817  }
818  }
819  break;
820  }
821  break;
822  }
823  } catch (const exception& e) {
824  error_message(hwndDlg, e.what());
825  }
826 
827  return false;
828 }
829 
831  BtrfsBalance* bb;
832 
833  if (uMsg == WM_INITDIALOG) {
835  bb = (BtrfsBalance*)lParam;
836  } else {
838  }
839 
840  if (bb)
841  return bb->BalanceOptsDlgProc(hwndDlg, uMsg, wParam, lParam);
842  else
843  return false;
844 }
845 
847  opts_type = type;
849 }
850 
852  try {
853  switch (uMsg) {
854  case WM_INITDIALOG:
855  {
857 
861 
865  cancelling = false;
866  RefreshBalanceDlg(hwndDlg, true);
867 
868  if (readonly) {
869  EnableWindow(GetDlgItem(hwndDlg, IDC_START_BALANCE), false);
870  EnableWindow(GetDlgItem(hwndDlg, IDC_PAUSE_BALANCE), false);
871  EnableWindow(GetDlgItem(hwndDlg, IDC_CANCEL_BALANCE), false);
872  }
873 
877 
878  SetTimer(hwndDlg, 1, 1000, nullptr);
879 
880  break;
881  }
882 
883  case WM_COMMAND:
884  switch (HIWORD(wParam)) {
885  case BN_CLICKED:
886  switch (LOWORD(wParam)) {
887  case IDOK:
888  case IDCANCEL:
889  KillTimer(hwndDlg, 1);
890  EndDialog(hwndDlg, 0);
891  return true;
892 
893  case IDC_DATA:
894  EnableWindow(GetDlgItem(hwndDlg, IDC_DATA_OPTIONS), IsDlgButtonChecked(hwndDlg, IDC_DATA) == BST_CHECKED ? true : false);
895 
897  IsDlgButtonChecked(hwndDlg, IDC_METADATA) == BST_CHECKED || IsDlgButtonChecked(hwndDlg, IDC_SYSTEM) == BST_CHECKED) ? true: false);
898  return true;
899 
900  case IDC_METADATA:
902 
904  IsDlgButtonChecked(hwndDlg, IDC_METADATA) == BST_CHECKED || IsDlgButtonChecked(hwndDlg, IDC_SYSTEM) == BST_CHECKED) ? true: false);
905  return true;
906 
907  case IDC_SYSTEM:
908  EnableWindow(GetDlgItem(hwndDlg, IDC_SYSTEM_OPTIONS), IsDlgButtonChecked(hwndDlg, IDC_SYSTEM) == BST_CHECKED ? true : false);
909 
911  IsDlgButtonChecked(hwndDlg, IDC_METADATA) == BST_CHECKED || IsDlgButtonChecked(hwndDlg, IDC_SYSTEM) == BST_CHECKED) ? true: false);
912  return true;
913 
914  case IDC_DATA_OPTIONS:
915  ShowBalanceOptions(hwndDlg, 1);
916  return true;
917 
919  ShowBalanceOptions(hwndDlg, 2);
920  return true;
921 
922  case IDC_SYSTEM_OPTIONS:
923  ShowBalanceOptions(hwndDlg, 3);
924  return true;
925 
926  case IDC_START_BALANCE:
927  StartBalance(hwndDlg);
928  return true;
929 
930  case IDC_PAUSE_BALANCE:
931  PauseBalance(hwndDlg);
932  RefreshBalanceDlg(hwndDlg, false);
933  return true;
934 
935  case IDC_CANCEL_BALANCE:
936  StopBalance(hwndDlg);
937  RefreshBalanceDlg(hwndDlg, false);
938  return true;
939  }
940  break;
941  }
942  break;
943 
944  case WM_TIMER:
945  RefreshBalanceDlg(hwndDlg, false);
946  break;
947  }
948  } catch (const exception& e) {
949  error_message(hwndDlg, e.what());
950  }
951 
952  return false;
953 }
954 
956  BtrfsBalance* bb;
957 
958  if (uMsg == WM_INITDIALOG) {
960  bb = (BtrfsBalance*)lParam;
961  } else {
963  }
964 
965  if (bb)
966  return bb->BalanceDlgProc(hwndDlg, uMsg, wParam, lParam);
967  else
968  return false;
969 }
970 
972  btrfs_device* bd;
973 
974  if (devices) {
975  free(devices);
976  devices = nullptr;
977  }
978 
979  {
982 
983  if (h != INVALID_HANDLE_VALUE) {
986  ULONG devsize, i;
987 
988  i = 0;
989  devsize = 1024;
990 
991  devices = (btrfs_device*)malloc(devsize);
992 
993  while (true) {
994  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_DEVICES, nullptr, 0, devices, devsize);
996  if (i < 8) {
997  devsize += 1024;
998 
999  free(devices);
1000  devices = (btrfs_device*)malloc(devsize);
1001 
1002  i++;
1003  } else
1004  return;
1005  } else
1006  break;
1007  }
1008 
1009  if (!NT_SUCCESS(Status))
1010  throw ntstatus_error(Status);
1011  } else
1012  throw last_error(GetLastError());
1013  }
1014 
1015  readonly = true;
1016  bd = devices;
1017 
1018  while (true) {
1019  if (!bd->readonly) {
1020  readonly = false;
1021  break;
1022  }
1023 
1024  if (bd->next_entry > 0)
1025  bd = (btrfs_device*)((uint8_t*)bd + bd->next_entry);
1026  else
1027  break;
1028  }
1029 
1031 }
1032 
1034  if (c >= 'a' && c <= 'f')
1035  return (uint8_t)(c - 'a' + 0xa);
1036  else if (c >= 'A' && c <= 'F')
1037  return (uint8_t)(c - 'A' + 0xa);
1038  else
1039  return (uint8_t)(c - '0');
1040 }
1041 
1042 static void unserialize(void* data, ULONG len, WCHAR* s) {
1043  uint8_t* d;
1044 
1045  d = (uint8_t*)data;
1046 
1047  while (s[0] != 0 && s[1] != 0 && len > 0) {
1048  *d = (uint8_t)(from_hex_digit(s[0]) << 4) | from_hex_digit(s[1]);
1049 
1050  s += 2;
1051  d++;
1052  len--;
1053  }
1054 }
1055 
1056 #ifdef __REACTOS__
1057 extern "C" {
1058 #endif
1059 
1060 void CALLBACK StartBalanceW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) {
1061  try {
1062  WCHAR *s, *vol, *block;
1063  win_handle h, token;
1064  btrfs_start_balance bsb;
1066  LUID luid;
1067 
1068  s = wcsstr(lpszCmdLine, L" ");
1069  if (!s)
1070  return;
1071 
1072  s[0] = 0;
1073 
1074  vol = lpszCmdLine;
1075  block = &s[1];
1076 
1077  RtlZeroMemory(&bsb, sizeof(btrfs_start_balance));
1078  unserialize(&bsb, sizeof(btrfs_start_balance), block);
1079 
1081  throw last_error(GetLastError());
1082 
1083  if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", &luid))
1084  throw last_error(GetLastError());
1085 
1086  tp.PrivilegeCount = 1;
1087  tp.Privileges[0].Luid = luid;
1088  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
1089 
1090  if (!AdjustTokenPrivileges(token, false, &tp, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr))
1091  throw last_error(GetLastError());
1092 
1095 
1096  if (h != INVALID_HANDLE_VALUE) {
1097  NTSTATUS Status;
1099 
1100  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_START_BALANCE, &bsb, sizeof(btrfs_start_balance), nullptr, 0);
1101 
1103  btrfs_query_scrub bqs;
1104  NTSTATUS Status2;
1105 
1106  Status2 = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_QUERY_SCRUB, nullptr, 0, &bqs, sizeof(btrfs_query_scrub));
1107 
1108  if ((NT_SUCCESS(Status2) || Status2 == STATUS_BUFFER_OVERFLOW) && bqs.status != BTRFS_SCRUB_STOPPED)
1110  }
1111 
1112  if (!NT_SUCCESS(Status))
1113  throw ntstatus_error(Status);
1114  } else
1115  throw last_error(GetLastError());
1116  } catch (const exception& e) {
1117  error_message(hwnd, e.what());
1118  }
1119 }
1120 
1121 void CALLBACK PauseBalanceW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) {
1122  try {
1123  win_handle h, token;
1125  LUID luid;
1126 
1128  throw last_error(GetLastError());
1129 
1130  if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", &luid))
1131  throw last_error(GetLastError());
1132 
1133  tp.PrivilegeCount = 1;
1134  tp.Privileges[0].Luid = luid;
1135  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
1136 
1137  if (!AdjustTokenPrivileges(token, false, &tp, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr))
1138  throw last_error(GetLastError());
1139 
1142 
1143  if (h != INVALID_HANDLE_VALUE) {
1144  NTSTATUS Status;
1146  btrfs_query_balance bqb2;
1147 
1148  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_QUERY_BALANCE, nullptr, 0, &bqb2, sizeof(btrfs_query_balance));
1149  if (!NT_SUCCESS(Status))
1150  throw ntstatus_error(Status);
1151 
1152  if (bqb2.status & BTRFS_BALANCE_PAUSED)
1153  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_RESUME_BALANCE, nullptr, 0, nullptr, 0);
1154  else if (bqb2.status & BTRFS_BALANCE_RUNNING)
1155  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_PAUSE_BALANCE, nullptr, 0, nullptr, 0);
1156  else
1157  return;
1158 
1159  if (!NT_SUCCESS(Status))
1160  throw ntstatus_error(Status);
1161  } else
1162  throw last_error(GetLastError());
1163  } catch (const exception& e) {
1164  error_message(hwnd, e.what());
1165  }
1166 }
1167 
1168 void CALLBACK StopBalanceW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) {
1169  try {
1170  win_handle h, token;
1172  LUID luid;
1173 
1175  throw last_error(GetLastError());
1176 
1177  if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", &luid))
1178  throw last_error(GetLastError());
1179 
1180  tp.PrivilegeCount = 1;
1181  tp.Privileges[0].Luid = luid;
1182  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
1183 
1184  if (!AdjustTokenPrivileges(token, false, &tp, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr))
1185  throw last_error(GetLastError());
1186 
1189 
1190  if (h != INVALID_HANDLE_VALUE) {
1191  NTSTATUS Status;
1193  btrfs_query_balance bqb2;
1194 
1195  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_QUERY_BALANCE, nullptr, 0, &bqb2, sizeof(btrfs_query_balance));
1196  if (!NT_SUCCESS(Status))
1197  throw ntstatus_error(Status);
1198 
1200  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_STOP_BALANCE, nullptr, 0, nullptr, 0);
1201  else
1202  return;
1203 
1204  if (!NT_SUCCESS(Status))
1205  throw ntstatus_error(Status);
1206  } else
1207  throw last_error(GetLastError());
1208  } catch (const exception& e) {
1209  error_message(hwnd, e.what());
1210  }
1211 }
1212 
1213 #ifdef __REACTOS__
1214 } /* extern "C" */
1215 #endif
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
static unsigned int block
Definition: xmlmemory.c:118
void StartBalance(HWND hwndDlg)
Definition: balance.cpp:73
static WCHAR hex_digit(uint8_t u)
Definition: balance.cpp:47
#define FSCTL_BTRFS_QUERY_BALANCE
Definition: btrfsioctl.h:15
#define FSCTL_BTRFS_RESUME_BALANCE
Definition: btrfsioctl.h:17
WCHAR name[1]
Definition: btrfsioctl.h:112
#define IDS_NO_BALANCE
Definition: resource.h:61
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:609
#define IDC_LIMIT_START
Definition: resource.h:276
uint64_t total_chunks
Definition: btrfsioctl.h:169
static PIO_STATUS_BLOCK iosb
Definition: file.c:98
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define IDS_RAID10
Definition: resource.h:47
BOOL WINAPI CheckDlgButton(_In_ HWND, _In_ int, _In_ UINT)
#define IDC_USAGE_END_SPINNER
Definition: resource.h:254
#define IDC_STRIPES
Definition: resource.h:295
#define PBM_SETRANGE32
Definition: commctrl.h:2184
USHORT namelen
Definition: btrfsioctl.h:111
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
#define BTRFS_SCRUB_STOPPED
Definition: btrfsioctl.h:194
#define IDOK
Definition: winuser.h:824
#define IDD_BALANCE
Definition: resource.h:19
#define true
Definition: stdbool.h:37
#define CloseHandle
Definition: compat.h:406
btrfs_balance_opts metadata_opts
Definition: btrfsioctl.h:172
BOOL WINAPI LookupPrivilegeValueW(LPCWSTR lpSystemName, LPCWSTR lpPrivilegeName, PLUID lpLuid)
Definition: misc.c:782
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
#define IDS_USAGE_END_BEFORE_START
Definition: resource.h:69
wstring format_ntstatus(NTSTATUS Status)
Definition: main.cpp:184
#define IDC_DATA
Definition: resource.h:264
static INT_PTR CALLBACK stub_BalanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: balance.cpp:955
#define IDS_BALANCE_RUNNING
Definition: resource.h:64
#define IDC_LIMIT_END_SPINNER
Definition: resource.h:290
#define BTRFS_BALANCE_OPTS_PROFILES
Definition: btrfsioctl.h:130
#define BTRFS_BALANCE_STOPPED
Definition: btrfsioctl.h:159
#define SEE_MASK_NOCLOSEPROCESS
Definition: shellapi.h:31
#define IDC_USAGE_START_SPINNER
Definition: resource.h:252
#define IDC_STRIPES_START
Definition: resource.h:299
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
uint32_t next_entry
Definition: btrfsioctl.h:102
#define IDC_DEVID_COMBO
Definition: resource.h:257
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
#define IDC_PROFILES_RAID5
Definition: resource.h:249
#define free
Definition: debug_ros.c:5
#define IDC_METADATA_OPTIONS
Definition: resource.h:278
const GLint * first
Definition: glext.h:5794
uint64_t chunks_left
Definition: btrfsioctl.h:168
LONG NTSTATUS
Definition: precomp.h:26
static uint8_t from_hex_digit(WCHAR c)
Definition: balance.cpp:1033
#define IDS_BALANCE_FAILED_REMOVAL
Definition: resource.h:101
#define CALLBACK
Definition: compat.h:27
btrfs_balance_opts data_opts
Definition: balance.h:50
GLdouble GLdouble t
Definition: gl.h:2047
uint16_t stripes_end
Definition: btrfsioctl.h:153
#define IDS_STRIPES_END_BEFORE_START
Definition: resource.h:68
#define IDS_VRANGE_END_BEFORE_START
Definition: resource.h:66
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define INVALID_HANDLE_VALUE
Definition: compat.h:399
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define BTRFS_BALANCE_OPTS_VRANGE
Definition: btrfsioctl.h:133
#define PBM_SETPOS
Definition: commctrl.h:2180
static INT_PTR CALLBACK stub_BalanceOptsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: balance.cpp:830
NTSYSCALLAPI NTSTATUS NTAPI NtFsControlFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG FsControlCode, PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength)
UINT_PTR WPARAM
Definition: windef.h:207
#define BCM_SETSHIELD
Definition: commctrl.h:4649
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
int32_t INT_PTR
Definition: typedefs.h:62
#define IDC_PROFILES
Definition: resource.h:239
btrfs_balance_opts data_opts
Definition: btrfsioctl.h:171
#define BTRFS_BALANCE_RUNNING
Definition: btrfsioctl.h:160
#define IDS_BALANCE_PAUSED_SHRINK
Definition: resource.h:194
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: glext.h:7750
#define SetWindowLongPtr
Definition: treelist.c:70
#define CB_GETCURSEL
Definition: winuser.h:1925
#define IDS_BALANCE_CANCELLED_SHRINK
Definition: resource.h:195
#define IDC_DATA_OPTIONS
Definition: resource.h:271
WPARAM wParam
Definition: combotst.c:138
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
bool removing
Definition: balance.h:54
uint64_t limit_start
Definition: btrfsioctl.h:150
#define FILE_SHARE_READ
Definition: compat.h:125
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
#define IDC_STRIPES_END
Definition: resource.h:303
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
#define BLOCK_FLAG_SINGLE
Definition: btrfsioctl.h:140
#define IDS_LIMIT_END_BEFORE_START
Definition: resource.h:67
#define IDC_BALANCE_STATUS
Definition: resource.h:287
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define BTRFS_BALANCE_OPTS_USAGE
Definition: btrfsioctl.h:136
#define IDC_DEVID
Definition: resource.h:256
#define FILE_TRAVERSE
Definition: nt_native.h:643
#define SE_PRIVILEGE_ENABLED
Definition: setypes.h:63
uint64_t vrange_start
Definition: btrfsioctl.h:148
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
ULONG device_number
Definition: btrfsioctl.h:108
static void unserialize(void *data, ULONG len, WCHAR *s)
Definition: balance.cpp:1042
uint32_t balance_status
Definition: balance.h:49
#define BTRFS_BALANCE_OPTS_CONVERT
Definition: btrfsioctl.h:137
void error_message(HWND hwnd, const char *msg)
Definition: main.cpp:785
#define IDS_RAID5
Definition: resource.h:48
static uint64_t convtypes2[]
Definition: balance.cpp:45
#define e
Definition: ke_i.h:82
btrfs_balance_opts metadata_opts
Definition: balance.h:50
#define IDC_VRANGE
Definition: resource.h:267
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat token
Definition: glfuncs.h:210
#define FSCTL_BTRFS_PAUSE_BALANCE
Definition: btrfsioctl.h:16
#define IDS_RAID0
Definition: resource.h:45
bool called_from_RemoveDevice
Definition: balance.h:59
#define IDC_METADATA
Definition: resource.h:266
#define GWLP_USERDATA
Definition: treelist.c:63
#define IDC_LIMIT_END
Definition: resource.h:293
#define IDC_PROFILES_RAID1
Definition: resource.h:247
#define CB_ADDSTRING
Definition: winuser.h:1918
#define IDS_DISK_PART_NUM
Definition: resource.h:103
#define IDS_DISK_NUM
Definition: resource.h:102
#define ETDT_ENABLETAB
Definition: dxdiag.c:30
#define BLOCK_FLAG_RAID10
Definition: shellext.h:81
LONG_PTR LPARAM
Definition: windef.h:208
#define IDC_CONVERT
Definition: resource.h:305
#define IDC_PROFILES_SINGLE
Definition: resource.h:241
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2235
bool called_from_ShrinkDevice
Definition: balance.h:59
ULONG partition_number
Definition: btrfsioctl.h:109
#define UDM_SETRANGE32
Definition: commctrl.h:2147
#define SW_SHOW
Definition: winuser.h:769
#define IDS_BALANCE_FAILED_SHRINK
Definition: resource.h:197
#define FSCTL_BTRFS_STOP_BALANCE
Definition: btrfsioctl.h:18
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define IDC_PROFILES_RAID6
Definition: resource.h:250
#define OPEN_EXISTING
Definition: compat.h:434
#define IDC_LIMIT
Definition: resource.h:265
#define CB_ERR
Definition: winuser.h:2410
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
void CALLBACK StartBalanceW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
Definition: balance.cpp:1060
wstring fn
Definition: balance.h:56
#define IDC_LIMIT_START_SPINNER
Definition: resource.h:269
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
Definition: btrfs.c:2855
#define BTRFS_BALANCE_OPTS_SOFT
Definition: btrfsioctl.h:138
#define IDC_DRANGE_START
Definition: resource.h:258
#define IDC_SOFT
Definition: resource.h:309
#define IDC_VRANGE_END
Definition: resource.h:281
void wstring_sprintf(wstring &s, wstring fmt,...)
Definition: main.cpp:225
#define BLOCK_FLAG_RAID0
Definition: shellext.h:78
uint64_t limit_end
Definition: btrfsioctl.h:151
void SaveBalanceOpts(HWND hwndDlg)
Definition: balance.cpp:354
btrfs_query_balance bqb
Definition: balance.h:52
void ShowBalance(HWND hwndDlg)
Definition: balance.cpp:971
#define d
Definition: ke_i.h:81
#define IDS_BALANCE_RUNNING_REMOVAL
Definition: resource.h:85
#define TOKEN_QUERY
Definition: setypes.h:874
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
HRESULT WINAPI EnableThemeDialogTexture(_In_ HWND hwnd, _In_ DWORD dwFlags)
Definition: uxthemesupp.c:55
#define IDS_DUP
Definition: resource.h:44
#define WM_TIMER
Definition: winuser.h:1724
uint64_t drange_end
Definition: btrfsioctl.h:147
#define FSCTL_BTRFS_QUERY_SCRUB
Definition: btrfsioctl.h:24
HANDLE WINAPI GetCurrentProcess(VOID)
Definition: proc.c:1138
#define MAX_PATH
Definition: compat.h:26
#define BTRFS_BALANCE_OPTS_LIMIT
Definition: btrfsioctl.h:134
const GLubyte * c
Definition: glext.h:8905
_Check_return_ __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wtoi64(_In_z_ const wchar_t *_Str)
#define BN_CLICKED
Definition: winuser.h:1907
#define IDS_BALANCE_CANCELLED_REMOVAL
Definition: resource.h:89
#define IDS_RAID6
Definition: resource.h:49
#define BTRFS_BALANCE_SHRINKING
Definition: btrfsioctl.h:164
#define BLOCK_FLAG_RAID6
Definition: shellext.h:83
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
void ShowBalanceOptions(HWND hwndDlg, uint8_t type)
Definition: balance.cpp:846
#define IDS_BALANCE_FAILED
Definition: resource.h:100
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
#define IDC_USAGE
Definition: resource.h:251
#define IDC_START_BALANCE
Definition: resource.h:291
#define IDD_BALANCE_OPTIONS
Definition: resource.h:17
#define BTRFS_BALANCE_OPTS_ENABLED
Definition: btrfsioctl.h:129
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define IDC_VRANGE_START
Definition: resource.h:286
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
static const WCHAR L[]
Definition: oid.c:1250
#define BTRFS_BALANCE_ERROR
Definition: btrfsioctl.h:163
#define BTRFS_BALANCE_REMOVAL
Definition: btrfsioctl.h:162
#define BTRFS_BALANCE_OPTS_DRANGE
Definition: btrfsioctl.h:132
#define IDC_SYSTEM
Definition: resource.h:268
#define IDS_DEVID_LIST
Definition: resource.h:63
#define IDC_CANCEL_BALANCE
Definition: resource.h:297
GLenum GLsizei len
Definition: glext.h:6722
GLdouble s
Definition: gl.h:2039
btrfs_balance_opts opts[3]
Definition: btrfsioctl.h:177
INT_PTR CALLBACK BalanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: balance.cpp:851
#define CB_SETCURSEL
Definition: winuser.h:1943
#define WM_COMMAND
Definition: winuser.h:1722
#define BST_UNCHECKED
Definition: winuser.h:199
#define IDS_BALANCE_PAUSED_REMOVAL
Definition: resource.h:87
BYTE uint8_t
Definition: msvideo1.c:66
BOOL WINAPI AdjustTokenPrivileges(HANDLE TokenHandle, BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength)
Definition: security.c:376
#define IDC_PROFILES_RAID10
Definition: resource.h:248
bool shrinking
Definition: balance.h:55
btrfs_device * devices
Definition: balance.h:57
Status
Definition: gdiplustypes.h:24
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define IDC_PROFILES_RAID0
Definition: resource.h:244
bool cancelling
Definition: balance.h:53
uint8_t opts_type
Definition: balance.h:51
void RefreshBalanceDlg(HWND hwndDlg, bool first)
Definition: balance.cpp:206
UINT64 uint64_t
Definition: types.h:77
const GLdouble * v
Definition: gl.h:2040
uint16_t stripes_start
Definition: btrfsioctl.h:152
#define uint8_t
Definition: nsiface.idl:59
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
btrfs_balance_opts system_opts
Definition: btrfsioctl.h:173
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1408
#define IDS_SINGLE2
Definition: resource.h:62
#define IDC_STRIPES_START_SPINNER
Definition: resource.h:298
#define IDC_DRANGE_END
Definition: resource.h:263
void StopBalance(HWND hwndDlg)
Definition: balance.cpp:174
LPCWSTR lpParameters
Definition: shellapi.h:331
#define IDS_BALANCE_SCRUB_RUNNING
Definition: resource.h:117
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define IDS_BALANCE_RUNNING_SHRINK
Definition: resource.h:193
uint64_t vrange_end
Definition: btrfsioctl.h:149
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int UINT
Definition: ndis.h:50
bool readonly
Definition: balance.h:58
uint64_t drange_start
Definition: btrfsioctl.h:146
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:296
static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
Definition: muireg.c:10
#define FSCTL_BTRFS_GET_DEVICES
Definition: btrfsioctl.h:12
#define BST_CHECKED
Definition: winuser.h:197
uint64_t dev_id
Definition: btrfsioctl.h:103
#define CreateFileW
Definition: compat.h:408
void PauseBalance(HWND hwndDlg)
Definition: balance.cpp:144
btrfs_balance_opts system_opts
Definition: balance.h:50
#define IDC_USAGE_START
Definition: resource.h:253
#define SendMessage
Definition: winuser.h:5818
#define FILE_FLAG_BACKUP_SEMANTICS
Definition: disk.h:41
#define IDC_STRIPES_END_SPINNER
Definition: resource.h:301
#define FILE_FLAG_OPEN_REPARSE_POINT
Definition: disk.h:39
#define IDC_USAGE_END
Definition: resource.h:255
#define BTRFS_BALANCE_OPTS_DEVID
Definition: btrfsioctl.h:131
#define HIWORD(l)
Definition: typedefs.h:246
unsigned int ULONG
Definition: retypes.h:1
#define IDS_BALANCE_COMPLETE_SHRINK
Definition: resource.h:196
static HINSTANCE hinst
Definition: edit.c:551
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define malloc
Definition: debug_ros.c:4
#define IDS_DRANGE_END_BEFORE_START
Definition: resource.h:65
#define IDS_BALANCE_COMPLETE_REMOVAL
Definition: resource.h:91
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define BLOCK_FLAG_DUPLICATE
Definition: shellext.h:80
#define GetWindowLongPtr
Definition: treelist.c:73
#define IDS_RAID1
Definition: resource.h:46
#define BLOCK_FLAG_RAID5
Definition: shellext.h:82
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define IDCANCEL
Definition: winuser.h:825
INT_PTR CALLBACK BalanceOptsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: balance.cpp:510
void CALLBACK StopBalanceW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
Definition: balance.cpp:1168
#define BTRFS_BALANCE_PAUSED
Definition: btrfsioctl.h:161
static void serialize(void *data, ULONG len, WCHAR *s)
Definition: balance.cpp:54
#define INFINITE
Definition: serial.h:102
#define IDS_BALANCE_COMPLETE
Definition: resource.h:71
#define TOKEN_ADJUST_PRIVILEGES
Definition: setypes.h:876
#define IDS_BALANCE_PAUSED
Definition: resource.h:72
#define WM_INITDIALOG
Definition: winuser.h:1721
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
#define IDC_CONVERT_COMBO
Definition: resource.h:307
#define IDC_PAUSE_BALANCE
Definition: resource.h:294
#define BTRFS_BALANCE_OPTS_STRIPES
Definition: btrfsioctl.h:135
#define IDC_BALANCE_PROGRESS
Definition: resource.h:261
#define IDC_DRANGE
Definition: resource.h:259
void CALLBACK PauseBalanceW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
Definition: balance.cpp:1121
#define IDS_BALANCE_CANCELLED
Definition: resource.h:73
#define IDC_PROFILES_DUP
Definition: resource.h:242
#define IDC_SYSTEM_OPTIONS
Definition: resource.h:283
#define FSCTL_BTRFS_START_BALANCE
Definition: btrfsioctl.h:14
#define BLOCK_FLAG_RAID1
Definition: shellext.h:79
#define STATUS_DEVICE_NOT_READY
Definition: shellext.h:70