ReactOS  0.4.14-dev-583-g2a1ba2c
send.cpp
Go to the documentation of this file.
1 /* Copyright (c) Mark Harmstone 2017
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 "send.h"
20 #include "resource.h"
21 #include <stddef.h>
22 #include <shlobj.h>
23 #ifdef __REACTOS__
24 #undef DeleteFile
25 #endif
26 #include <iostream>
27 
28 #define SEND_BUFFER_LEN 1048576
29 
31  try {
34  btrfs_send_subvol* bss;
37  ULONG i;
38 
39  buf = (char*)malloc(SEND_BUFFER_LEN);
40 
41  try {
45 
46  try {
47  size_t bss_size = offsetof(btrfs_send_subvol, clones[0]) + (clones.size() * sizeof(HANDLE));
48  bss = (btrfs_send_subvol*)malloc(bss_size);
49  memset(bss, 0, bss_size);
50 
51  if (incremental) {
53  HANDLE parenth;
54 
55  parent[0] = 0;
56 
58 
60  if (parenth == INVALID_HANDLE_VALUE)
62 
63  bss->parent = parenth;
64  } else
65  bss->parent = nullptr;
66 
67  bss->num_clones = (ULONG)clones.size();
68 
69  for (i = 0; i < bss->num_clones; i++) {
70  HANDLE h;
71 
73  if (h == INVALID_HANDLE_VALUE) {
74  auto le = GetLastError();
75  ULONG j;
76 
77  for (j = 0; j < i; j++) {
78  CloseHandle(bss->clones[j]);
79  }
80 
81  if (bss->parent) CloseHandle(bss->parent);
82 
83  throw string_error(IDS_SEND_CANT_OPEN_DIR, clones[i].c_str(), le, format_message(le).c_str());
84  }
85 
86  bss->clones[i] = h;
87  }
88 
89  Status = NtFsControlFile(dirh, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_SEND_SUBVOL, bss, (ULONG)bss_size, nullptr, 0);
90 
91  for (i = 0; i < bss->num_clones; i++) {
92  CloseHandle(bss->clones[i]);
93  }
94 
95  if (!NT_SUCCESS(Status)) {
99  auto le = GetLastError();
100  if (bss->parent) CloseHandle(bss->parent);
102  }
103 
104  if (!(fileinfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
105  if (bss->parent) CloseHandle(bss->parent);
107  }
108 
109  if (bss->parent) {
111  auto le = GetLastError();
112  CloseHandle(bss->parent);
114  }
115 
116  if (!(fileinfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
117  CloseHandle(bss->parent);
119  }
120  }
121  }
122 
123  if (bss->parent) CloseHandle(bss->parent);
125  }
126 
127  if (bss->parent) CloseHandle(bss->parent);
128 
132 
133  try {
134  memcpy(header.magic, BTRFS_SEND_MAGIC, sizeof(header.magic));
135  header.version = 1;
136 
137  if (!WriteFile(stream, &header, sizeof(header), nullptr, nullptr))
139 
140  do {
141  Status = NtFsControlFile(dirh, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_READ_SEND_BUFFER, nullptr, 0, buf, SEND_BUFFER_LEN);
142 
143  if (NT_SUCCESS(Status)) {
144  if (!WriteFile(stream, buf, (DWORD)iosb.Information, nullptr, nullptr))
146  }
147  } while (NT_SUCCESS(Status));
148 
149  if (Status != STATUS_END_OF_FILE)
151 
152  end.length = 0;
153  end.cmd = BTRFS_SEND_CMD_END;
154  end.csum = 0x9dc96c50;
155 
156  if (!WriteFile(stream, &end, sizeof(end), nullptr, nullptr))
158 
160  } catch (...) {
161  FILE_DISPOSITION_INFO fdi;
162 
163  fdi.DeleteFile = true;
164 
165  Status = NtSetInformationFile(stream, &iosb, &fdi, sizeof(FILE_DISPOSITION_INFO), FileDispositionInformation);
166 
169 
170  if (!NT_SUCCESS(Status))
171  throw ntstatus_error(Status);
172 
173  throw;
174  }
175 
178  } catch (...) {
179  CloseHandle(dirh);
181 
182  throw;
183  }
184 
185  CloseHandle(dirh);
187  } catch (...) {
188  free(buf);
189  buf = nullptr;
190 
191  started = false;
192 
194  EnableWindow(GetDlgItem(hwnd, IDOK), true);
197 
198  throw;
199  }
200  } catch (const exception& e) {
201  auto msg = utf8_to_utf16(e.what());
202 
204  return 0;
205  }
206 
207 
208  free(buf);
209  buf = nullptr;
210 
211  started = false;
212 
214  EnableWindow(GetDlgItem(hwnd, IDOK), true);
217 
218  wstring success;
219 
221 
223 
224  return 0;
225 }
226 
229 
230  return bs->Thread();
231 }
232 
234  wstring s;
235  HWND cl;
236 
237  if (started)
238  return;
239 
240  GetDlgItemTextW(hwnd, IDC_STREAM_DEST, file, sizeof(file) / sizeof(WCHAR));
241 
242  if (file[0] == 0)
243  return;
244 
245  if (incremental) {
247 
249 
250  if (parent[0] == 0)
251  return;
252  }
253 
254  started = true;
255 
256  wstring writing;
257 
259 
260  SetDlgItemTextW(hwnd, IDC_SEND_STATUS, writing.c_str());
261 
263  SetDlgItemTextW(hwnd, IDCANCEL, s.c_str());
264 
265  EnableWindow(GetDlgItem(hwnd, IDOK), false);
268 
269  clones.clear();
270 
272  auto num_clones = SendMessageW(cl, LB_GETCOUNT, 0, 0);
273 
274  if (num_clones != LB_ERR) {
275  for (unsigned int i = 0; i < (unsigned int)num_clones; i++) {
276  WCHAR* t;
277 
278  auto len = SendMessageW(cl, LB_GETTEXTLEN, i, 0);
279  t = (WCHAR*)malloc((len + 1) * sizeof(WCHAR));
280 
281  SendMessageW(cl, LB_GETTEXT, i, (LPARAM)t);
282 
283  clones.push_back(t);
284 
285  free(t);
286  }
287  }
288 
289  thread = CreateThread(nullptr, 0, send_thread, this, 0, nullptr);
290 
291  if (!thread)
292  throw last_error(GetLastError());
293 }
294 
297 
298  file[0] = 0;
299 
300  memset(&ofn, 0, sizeof(OPENFILENAMEW));
301  ofn.lStructSize = sizeof(OPENFILENAMEW);
302  ofn.hwndOwner = hwnd;
303  ofn.hInstance = module;
304  ofn.lpstrFile = file;
305  ofn.nMaxFile = sizeof(file) / sizeof(WCHAR);
306 
307  if (!GetSaveFileNameW(&ofn))
308  return;
309 
311 }
312 
314  BROWSEINFOW bi;
315  PIDLIST_ABSOLUTE root, pidl;
316  HRESULT hr;
317  WCHAR parent[MAX_PATH], volpathw[MAX_PATH];
320  btrfs_get_file_ids bgfi;
321 
322  if (!GetVolumePathNameW(subvol.c_str(), volpathw, (sizeof(volpathw) / sizeof(WCHAR)) - 1))
324 
325  hr = SHParseDisplayName(volpathw, 0, &root, 0, 0);
326  if (FAILED(hr))
328 
329  memset(&bi, 0, sizeof(BROWSEINFOW));
330 
331  bi.hwndOwner = hwnd;
332  bi.pidlRoot = root;
334 
335  pidl = SHBrowseForFolderW(&bi);
336 
337  if (!pidl)
338  return;
339 
340  if (!SHGetPathFromIDListW(pidl, parent))
342 
343  {
345  if (h == INVALID_HANDLE_VALUE)
347 
348  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_FILE_IDS, nullptr, 0, &bgfi, sizeof(btrfs_get_file_ids));
349  if (!NT_SUCCESS(Status))
351  }
352 
353  if (bgfi.inode != 0x100 || bgfi.top)
355 
357 }
358 
360  BROWSEINFOW bi;
361  PIDLIST_ABSOLUTE root, pidl;
362  HRESULT hr;
363  WCHAR path[MAX_PATH], volpathw[MAX_PATH];
366  btrfs_get_file_ids bgfi;
367 
368  if (!GetVolumePathNameW(subvol.c_str(), volpathw, (sizeof(volpathw) / sizeof(WCHAR)) - 1))
370 
371  hr = SHParseDisplayName(volpathw, 0, &root, 0, 0);
372  if (FAILED(hr))
374 
375  memset(&bi, 0, sizeof(BROWSEINFOW));
376 
377  bi.hwndOwner = hwnd;
378  bi.pidlRoot = root;
380 
381  pidl = SHBrowseForFolderW(&bi);
382 
383  if (!pidl)
384  return;
385 
386  if (!SHGetPathFromIDListW(pidl, path))
388 
389  {
391  if (h == INVALID_HANDLE_VALUE)
393 
394  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_FILE_IDS, nullptr, 0, &bgfi, sizeof(btrfs_get_file_ids));
395  if (!NT_SUCCESS(Status))
397  }
398 
399  if (bgfi.inode != 0x100 || bgfi.top)
401 
403 }
404 
406  LRESULT sel;
408 
409  sel = SendMessageW(cl, LB_GETCURSEL, 0, 0);
410 
411  if (sel == LB_ERR)
412  return;
413 
414  SendMessageW(cl, LB_DELETESTRING, sel, 0);
415 
416  if (SendMessageW(cl, LB_GETCURSEL, 0, 0) == LB_ERR)
418 }
419 
421  try {
422  switch (uMsg) {
423  case WM_INITDIALOG:
424  this->hwnd = hwndDlg;
425 
426  GetDlgItemTextW(hwndDlg, IDCANCEL, closetext, sizeof(closetext) / sizeof(WCHAR));
427  break;
428 
429  case WM_COMMAND:
430  switch (HIWORD(wParam)) {
431  case BN_CLICKED:
432  switch (LOWORD(wParam)) {
433  case IDOK:
434  StartSend(hwndDlg);
435  return true;
436 
437  case IDCANCEL:
438  if (started) {
440 
441  if (stream != INVALID_HANDLE_VALUE) {
443  FILE_DISPOSITION_INFO fdi;
445 
446  fdi.DeleteFile = true;
447 
448  Status = NtSetInformationFile(stream, &iosb, &fdi, sizeof(FILE_DISPOSITION_INFO), FileDispositionInformation);
449 
451 
452  if (!NT_SUCCESS(Status))
453  throw ntstatus_error(Status);
454  }
455 
456  if (dirh != INVALID_HANDLE_VALUE)
457  CloseHandle(dirh);
458 
459  started = false;
460 
462 
463  EnableWindow(GetDlgItem(hwnd, IDOK), true);
466  } else
467  EndDialog(hwndDlg, 1);
468  return true;
469 
470  case IDC_BROWSE:
471  Browse(hwndDlg);
472  return true;
473 
474  case IDC_INCREMENTAL:
476 
479  return true;
480 
481  case IDC_PARENT_BROWSE:
482  BrowseParent(hwndDlg);
483  return true;
484 
485  case IDC_CLONE_ADD:
486  AddClone(hwndDlg);
487  return true;
488 
489  case IDC_CLONE_REMOVE:
490  RemoveClone(hwndDlg);
491  return true;
492  }
493  break;
494 
495  case LBN_SELCHANGE:
496  switch (LOWORD(wParam)) {
497  case IDC_CLONE_LIST:
499  return true;
500  }
501  break;
502  }
503  break;
504  }
505  } catch (const exception& e) {
506  error_message(hwnd, e.what());
507  }
508 
509  return false;
510 }
511 
513  BtrfsSend* bs;
514 
515  if (uMsg == WM_INITDIALOG) {
517  bs = (BtrfsSend*)lParam;
518  } else
520 
521  if (bs)
522  return bs->SendDlgProc(hwndDlg, uMsg, wParam, lParam);
523  else
524  return false;
525 }
526 
528  subvol = path;
529 
531  throw last_error(GetLastError());
532 }
533 
534 #ifdef __REACTOS__
535 extern "C" {
536 #endif
537 
538 void CALLBACK SendSubvolGUIW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) {
539  try {
542  LUID luid;
543 
544  set_dpi_aware();
545 
547  throw last_error(GetLastError());
548 
549  if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", &luid))
550  throw last_error(GetLastError());
551 
552  tp.PrivilegeCount = 1;
553  tp.Privileges[0].Luid = luid;
554  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
555 
556  if (!AdjustTokenPrivileges(token, false, &tp, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr))
557  throw last_error(GetLastError());
558 
559  BtrfsSend bs;
560 
561  bs.Open(hwnd, lpszCmdLine);
562  } catch (const exception& e) {
563  error_message(hwnd, e.what());
564  }
565 }
566 
567 #ifdef __REACTOS__
568 } /* extern "C" */
569 #endif
570 
571 static void send_subvol(const wstring& subvol, const wstring& file, const wstring& parent, const vector<wstring>& clones) {
572  char* buf;
573  win_handle dirh, stream;
574  ULONG i;
575  btrfs_send_subvol* bss;
580 
581  buf = (char*)malloc(SEND_BUFFER_LEN);
582 
583  try {
585  if (dirh == INVALID_HANDLE_VALUE)
586  throw last_error(GetLastError());
587 
588  stream = CreateFileW(file.c_str(), FILE_WRITE_DATA | DELETE, 0, nullptr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
590  throw last_error(GetLastError());
591 
592  try {
593  size_t bss_size = offsetof(btrfs_send_subvol, clones[0]) + (clones.size() * sizeof(HANDLE));
594  bss = (btrfs_send_subvol*)malloc(bss_size);
595  memset(bss, 0, bss_size);
596 
597  if (parent != L"") {
598  HANDLE parenth;
599 
601  if (parenth == INVALID_HANDLE_VALUE)
602  throw last_error(GetLastError());
603 
604  bss->parent = parenth;
605  } else
606  bss->parent = nullptr;
607 
608  bss->num_clones = (ULONG)clones.size();
609 
610  for (i = 0; i < bss->num_clones; i++) {
611  HANDLE h;
612 
614  if (h == INVALID_HANDLE_VALUE) {
615  auto le = GetLastError();
616  ULONG j;
617 
618  for (j = 0; j < i; j++) {
619  CloseHandle(bss->clones[j]);
620  }
621 
622  if (bss->parent) CloseHandle(bss->parent);
623 
624  throw last_error(le);
625  }
626 
627  bss->clones[i] = h;
628  }
629 
630  Status = NtFsControlFile(dirh, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_SEND_SUBVOL, bss, (ULONG)bss_size, nullptr, 0);
631 
632  for (i = 0; i < bss->num_clones; i++) {
633  CloseHandle(bss->clones[i]);
634  }
635 
636  if (bss->parent) CloseHandle(bss->parent);
637 
638  if (!NT_SUCCESS(Status))
639  throw ntstatus_error(Status);
640 
641  memcpy(header.magic, BTRFS_SEND_MAGIC, sizeof(header.magic));
642  header.version = 1;
643 
644  if (!WriteFile(stream, &header, sizeof(header), nullptr, nullptr))
645  throw last_error(GetLastError());
646 
647  do {
648  Status = NtFsControlFile(dirh, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_READ_SEND_BUFFER, nullptr, 0, buf, SEND_BUFFER_LEN);
649 
650  if (NT_SUCCESS(Status))
651  WriteFile(stream, buf, (DWORD)iosb.Information, nullptr, nullptr);
652  } while (NT_SUCCESS(Status));
653 
654  if (Status != STATUS_END_OF_FILE)
655  throw ntstatus_error(Status);
656 
657  end.length = 0;
658  end.cmd = BTRFS_SEND_CMD_END;
659  end.csum = 0x9dc96c50;
660 
661  if (!WriteFile(stream, &end, sizeof(end), nullptr, nullptr))
662  throw last_error(GetLastError());
663 
665  } catch (...) {
666  FILE_DISPOSITION_INFO fdi;
667 
668  fdi.DeleteFile = true;
669 
670  Status = NtSetInformationFile(stream, &iosb, &fdi, sizeof(FILE_DISPOSITION_INFO), FileDispositionInformation);
671  if (!NT_SUCCESS(Status))
672  throw ntstatus_error(Status);
673 
674  throw;
675  }
676  } catch (...) {
677  free(buf);
678  throw;
679  }
680 
681  free(buf);
682 }
683 
684 #ifdef __REACTOS__
685 extern "C" {
686 #endif
687 
688 void CALLBACK SendSubvolW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) {
690  wstring subvol = L"", parent = L"", file = L"";
691  vector<wstring> clones;
692 
693  command_line_to_args(lpszCmdLine, args);
694 
695  if (args.size() >= 2) {
697  LUID luid;
698 
699  {
701 
703  return;
704 
705  if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", &luid))
706  return;
707 
708  tp.PrivilegeCount = 1;
709  tp.Privileges[0].Luid = luid;
710  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
711 
712  if (!AdjustTokenPrivileges(token, false, &tp, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr))
713  return;
714  }
715 
716  for (unsigned int i = 0; i < args.size(); i++) {
717  if (args[i][0] == '-') {
718  if (args[i][2] == 0 && i < args.size() - 1) {
719  if (args[i][1] == 'p') {
720  parent = args[i+1];
721  i++;
722  } else if (args[i][1] == 'c') {
723  clones.push_back(args[i+1]);
724  i++;
725  }
726  }
727  } else {
728  if (subvol == L"")
729  subvol = args[i];
730  else if (file == L"")
731  file = args[i];
732  }
733  }
734 
735  if (subvol != L"" && file != L"") {
736  try {
737  send_subvol(subvol, file, parent, clones);
738  } catch (const exception& e) {
739  cerr << "Error: " << e.what() << endl;
740  }
741  }
742  }
743 }
744 
745 #ifdef __REACTOS__
746 } /* extern "C" */
747 #endif
bool started
Definition: send.h:55
#define IDS_SEND_CANT_OPEN_FILE
Definition: resource.h:176
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
static PIO_STATUS_BLOCK iosb
Definition: file.c:98
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2265
#define IDOK
Definition: winuser.h:824
#define CloseHandle
Definition: compat.h:406
HMODULE module
Definition: main.cpp:47
BOOL WINAPI LookupPrivilegeValueW(LPCWSTR lpSystemName, LPCWSTR lpPrivilegeName, PLUID lpLuid)
Definition: misc.c:782
NTSTATUS NTAPI NtSetInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass)
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
#define IDC_CLONE_REMOVE
Definition: resource.h:289
wstring format_ntstatus(NTSTATUS Status)
Definition: main.cpp:184
BOOL WINAPI TerminateThread(IN HANDLE hThread, IN DWORD dwExitCode)
Definition: thread.c:586
HRESULT hr
Definition: shlfolder.c:183
#define IDC_SEND_STATUS
Definition: resource.h:325
#define LB_ADDSTRING
Definition: winuser.h:2013
#define IDS_SEND_PARENT_NOT_READONLY
Definition: resource.h:188
#define IDS_SEND_GET_FILE_INFO_FAILED
Definition: resource.h:182
DWORD Thread()
Definition: send.cpp:30
HWND hwndOwner
Definition: commdlg.h:330
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define IDS_SEND_NOT_READONLY
Definition: resource.h:183
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
GLsizei const GLchar ** path
Definition: glext.h:7234
#define IDS_SEND_SUCCESS
Definition: resource.h:180
#define IDC_BROWSE
Definition: resource.h:21
#define free
Definition: debug_ros.c:5
struct _root root
BOOL WINAPI SetEndOfFile(HANDLE hFile)
Definition: fileinfo.c:1154
LONG NTSTATUS
Definition: precomp.h:26
static void send_subvol(const wstring &subvol, const wstring &file, const wstring &parent, const vector< wstring > &clones)
Definition: send.cpp:571
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1280
#define CALLBACK
Definition: compat.h:27
static INT_PTR CALLBACK stub_SendDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: send.cpp:512
GLdouble GLdouble t
Definition: gl.h:2047
OPENFILENAME ofn
Definition: main.cpp:37
#define SEND_BUFFER_LEN
Definition: send.cpp:28
HWND hwndOwner
Definition: shlobj.h:1118
#define INVALID_HANDLE_VALUE
Definition: compat.h:399
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
WCHAR file[MAX_PATH]
Definition: send.h:57
#define IDC_STREAM_DEST
Definition: resource.h:323
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)
BOOL WINAPI GetVolumePathNameW(IN LPCWSTR lpszFileName, IN LPWSTR lpszVolumePathName, IN DWORD cchBufferLength)
Definition: volume.c:815
UINT_PTR WPARAM
Definition: windef.h:207
#define BIF_NONEWFOLDERBUTTON
Definition: shlobj.h:1145
GLuint GLuint end
Definition: gl.h:1545
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
int32_t INT_PTR
Definition: typedefs.h:62
Definition: match.c:390
#define LBN_SELCHANGE
Definition: winuser.h:2057
#define IDS_SEND_WRITING
Definition: resource.h:190
#define SetWindowLongPtr
Definition: treelist.c:70
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
WPARAM wParam
Definition: combotst.c:138
#define IDC_CLONE_ADD
Definition: resource.h:285
BOOL WINAPI GetSaveFileNameW(LPOPENFILENAMEW ofn)
Definition: filedlg.c:4630
#define FILE_SHARE_READ
Definition: compat.h:125
#define IDS_SHPARSEDISPLAYNAME_FAILED
Definition: resource.h:186
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
#define IDC_PARENT_BROWSE
Definition: resource.h:280
DWORD nMaxFile
Definition: commdlg.h:337
#define STATUS_END_OF_FILE
Definition: shellext.h:67
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
#define FILE_TRAVERSE
Definition: nt_native.h:643
#define IDC_INCREMENTAL
Definition: resource.h:317
#define SE_PRIVILEGE_ENABLED
Definition: setypes.h:63
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
void RemoveClone(HWND hwnd)
Definition: send.cpp:405
Definition: send.h:27
void error_message(HWND hwnd, const char *msg)
Definition: main.cpp:785
bool incremental
Definition: send.h:56
basic_ostream< _CharT, _Traits > &_STLP_CALL endl(basic_ostream< _CharT, _Traits > &__os)
Definition: _ostream.h:357
#define LB_ERR
Definition: winuser.h:2407
#define e
Definition: ke_i.h:82
#define IDS_SEND_FSCTL_BTRFS_READ_SEND_BUFFER_FAILED
Definition: resource.h:179
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 IDC_CLONE_LIST
Definition: resource.h:328
#define GWLP_USERDATA
Definition: treelist.c:63
#define FSCTL_BTRFS_SEND_SUBVOL
Definition: btrfsioctl.h:36
void Open(HWND hwnd, WCHAR *path)
Definition: send.cpp:527
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:136
void BrowseParent(HWND hwnd)
Definition: send.cpp:313
#define offsetof(TYPE, MEMBER)
#define IDS_NOT_SUBVOL
Definition: resource.h:184
LONG_PTR LPARAM
Definition: windef.h:208
void StartSend(HWND hwnd)
Definition: send.cpp:233
HINSTANCE hInstance
Definition: commdlg.h:331
#define LB_GETTEXTLEN
Definition: winuser.h:2032
#define LB_GETCOUNT
Definition: winuser.h:2020
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define FILE_WRITE_DATA
Definition: nt_native.h:631
#define OPEN_EXISTING
Definition: compat.h:434
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 GLint GLint j
Definition: glfuncs.h:250
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
Definition: btrfs.c:2855
LPCITEMIDLIST pidlRoot
Definition: shlobj.h:1119
void AddClone(HWND hwnd)
Definition: send.cpp:359
#define TOKEN_QUERY
Definition: setypes.h:874
r parent
Definition: btrfs.c:2869
BOOL WINAPI GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation)
Definition: fileinfo.c:608
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_STLP_DECLSPEC _Stl_aligned_buffer< ostream > cerr
Definition: iostream.cpp:102
LONG HRESULT
Definition: typedefs.h:77
HANDLE WINAPI GetCurrentProcess(VOID)
Definition: proc.c:1138
void push_back(const _Tp &__x=_STLP_DEFAULT_CONSTRUCTED(_Tp))
Definition: _vector.h:379
vector< wstring > clones
Definition: send.h:62
wstring utf8_to_utf16(const string_view &utf8)
Definition: main.cpp:736
#define MAX_PATH
Definition: compat.h:26
DWORD lStructSize
Definition: commdlg.h:329
#define WINAPI
Definition: msvc.h:6
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
HANDLE clones[1]
Definition: btrfsioctl.h:269
#define BN_CLICKED
Definition: winuser.h:1907
PVOID HANDLE
Definition: typedefs.h:71
unsigned long DWORD
Definition: ntddk_ex.h:95
#define IDS_SEND_FSCTL_BTRFS_SEND_SUBVOL_FAILED
Definition: resource.h:178
#define FSCTL_BTRFS_READ_SEND_BUFFER
Definition: btrfsioctl.h:37
#define success(from, fromstr, to, tostr)
static DWORD WINAPI send_thread(LPVOID lpParameter)
Definition: send.cpp:227
#define OPEN_ALWAYS
Definition: disk.h:70
#define BIF_USENEWUI
Definition: shlobj.h:1142
void CALLBACK SendSubvolGUIW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
Definition: send.cpp:538
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
#define LB_GETTEXT
Definition: winuser.h:2031
static const WCHAR L[]
Definition: oid.c:1250
struct tagOFNW OPENFILENAMEW
Definition: parse.h:22
GLuint GLuint stream
Definition: glext.h:7522
LPVOID lpParameter
Definition: kernel32.h:241
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
format_message(j_common_ptr cinfo, char *buffer)
Definition: jerror.c:158
HWND hwnd
Definition: send.h:59
GLdouble s
Definition: gl.h:2039
#define FSCTL_BTRFS_GET_FILE_IDS
Definition: btrfsioctl.h:7
#define WM_COMMAND
Definition: winuser.h:1722
#define BTRFS_SEND_CMD_END
Definition: btrfs.h:543
BOOL WINAPI AdjustTokenPrivileges(HANDLE TokenHandle, BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength)
Definition: security.c:376
#define IDD_SEND_SUBVOL
Definition: resource.h:88
Status
Definition: gdiplustypes.h:24
wstring subvol
Definition: send.h:60
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define BTRFS_SEND_MAGIC
Definition: btrfs.h:571
LPITEMIDLIST WINAPI SHBrowseForFolderW(LPBROWSEINFOW lpbi)
Definition: brsfolder.c:1156
UINT ulFlags
Definition: shlobj.h:1122
#define BIF_RETURNONLYFSDIRS
Definition: shlobj.h:1135
LPSTR lpstrFile
Definition: commdlg.h:336
#define IDS_SEND_CANCEL
Definition: resource.h:189
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
Definition: pidl.c:1367
void command_line_to_args(LPWSTR cmdline, vector< wstring > &args)
Definition: main.cpp:647
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define LB_GETCURSEL
Definition: winuser.h:2021
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:296
#define IDS_SEND_CANT_OPEN_DIR
Definition: resource.h:177
static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
Definition: muireg.c:10
void Browse(HWND hwnd)
Definition: send.cpp:295
#define IDC_PARENT_SUBVOL
Definition: resource.h:327
#define CreateFileW
Definition: compat.h:408
HANDLE dirh
Definition: send.h:58
#define msg(x)
Definition: auth_time.c:54
#define FILE_FLAG_BACKUP_SEMANTICS
Definition: disk.h:41
WCHAR closetext[255]
Definition: send.h:57
#define IDS_SEND_WRITEFILE_FAILED
Definition: resource.h:181
size_type size() const
Definition: _vector.h:192
#define HIWORD(l)
Definition: typedefs.h:246
unsigned int ULONG
Definition: retypes.h:1
static HINSTANCE hinst
Definition: edit.c:551
#define IDS_SHGETPATHFROMIDLIST_FAILED
Definition: resource.h:187
#define malloc
Definition: debug_ros.c:4
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define GetWindowLongPtr
Definition: treelist.c:73
INT_PTR SendDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: send.cpp:420
#define IDS_GET_FILE_IDS_FAILED
Definition: resource.h:185
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define IDCANCEL
Definition: winuser.h:825
LONG_PTR LRESULT
Definition: windef.h:209
void CALLBACK SendSubvolW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
Definition: send.cpp:688
static struct msdos_boot_sector bs
Definition: mkdosfs.c:539
void clear()
Definition: _vector.h:653
#define LB_DELETESTRING
Definition: winuser.h:2014
#define memset(x, y, z)
Definition: compat.h:39
#define TOKEN_ADJUST_PRIVILEGES
Definition: setypes.h:876
#define args
Definition: format.c:66
void set_dpi_aware()
Definition: main.cpp:50
#define WM_INITDIALOG
Definition: winuser.h:1721
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
struct CFHEADER header
Definition: fdi.c:101
HANDLE thread
Definition: send.h:58
#define DELETE
Definition: nt_native.h:57
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
Definition: fci.c:126
#define IDS_RECV_GETVOLUMEPATHNAME_FAILED
Definition: resource.h:167