ReactOS  0.4.15-dev-4916-gd519b11
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 
227 static DWORD WINAPI send_thread(LPVOID lpParameter) {
228  BtrfsSend* bs = (BtrfsSend*)lpParameter;
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);
307 
308  if (!GetSaveFileNameW(&ofn))
309  return;
310 
312 }
313 
315  BROWSEINFOW bi;
316  PIDLIST_ABSOLUTE root, pidl;
317  HRESULT hr;
318  WCHAR parent[MAX_PATH], volpathw[MAX_PATH];
321  btrfs_get_file_ids bgfi;
322 
323  if (!GetVolumePathNameW(subvol.c_str(), volpathw, (sizeof(volpathw) / sizeof(WCHAR)) - 1))
325 
326  hr = SHParseDisplayName(volpathw, 0, &root, 0, 0);
327  if (FAILED(hr))
329 
330  memset(&bi, 0, sizeof(BROWSEINFOW));
331 
332  bi.hwndOwner = hwnd;
333  bi.pidlRoot = root;
335 
336  pidl = SHBrowseForFolderW(&bi);
337 
338  if (!pidl)
339  return;
340 
341  if (!SHGetPathFromIDListW(pidl, parent))
343 
344  {
346  if (h == INVALID_HANDLE_VALUE)
348 
349  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_FILE_IDS, nullptr, 0, &bgfi, sizeof(btrfs_get_file_ids));
350  if (!NT_SUCCESS(Status))
352  }
353 
354  if (bgfi.inode != 0x100 || bgfi.top)
356 
358 }
359 
361  BROWSEINFOW bi;
362  PIDLIST_ABSOLUTE root, pidl;
363  HRESULT hr;
364  WCHAR path[MAX_PATH], volpathw[MAX_PATH];
367  btrfs_get_file_ids bgfi;
368 
369  if (!GetVolumePathNameW(subvol.c_str(), volpathw, (sizeof(volpathw) / sizeof(WCHAR)) - 1))
371 
372  hr = SHParseDisplayName(volpathw, 0, &root, 0, 0);
373  if (FAILED(hr))
375 
376  memset(&bi, 0, sizeof(BROWSEINFOW));
377 
378  bi.hwndOwner = hwnd;
379  bi.pidlRoot = root;
381 
382  pidl = SHBrowseForFolderW(&bi);
383 
384  if (!pidl)
385  return;
386 
387  if (!SHGetPathFromIDListW(pidl, path))
389 
390  {
392  if (h == INVALID_HANDLE_VALUE)
394 
395  Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_FILE_IDS, nullptr, 0, &bgfi, sizeof(btrfs_get_file_ids));
396  if (!NT_SUCCESS(Status))
398  }
399 
400  if (bgfi.inode != 0x100 || bgfi.top)
402 
404 }
405 
407  LRESULT sel;
409 
410  sel = SendMessageW(cl, LB_GETCURSEL, 0, 0);
411 
412  if (sel == LB_ERR)
413  return;
414 
415  SendMessageW(cl, LB_DELETESTRING, sel, 0);
416 
417  if (SendMessageW(cl, LB_GETCURSEL, 0, 0) == LB_ERR)
419 }
420 
422  try {
423  switch (uMsg) {
424  case WM_INITDIALOG:
425  this->hwnd = hwndDlg;
426 
427  GetDlgItemTextW(hwndDlg, IDCANCEL, closetext, sizeof(closetext) / sizeof(WCHAR));
428  break;
429 
430  case WM_COMMAND:
431  switch (HIWORD(wParam)) {
432  case BN_CLICKED:
433  switch (LOWORD(wParam)) {
434  case IDOK:
435  StartSend(hwndDlg);
436  return true;
437 
438  case IDCANCEL:
439  if (started) {
441 
442  if (stream != INVALID_HANDLE_VALUE) {
444  FILE_DISPOSITION_INFO fdi;
446 
447  fdi.DeleteFile = true;
448 
449  Status = NtSetInformationFile(stream, &iosb, &fdi, sizeof(FILE_DISPOSITION_INFO), FileDispositionInformation);
450 
452 
453  if (!NT_SUCCESS(Status))
454  throw ntstatus_error(Status);
455  }
456 
457  if (dirh != INVALID_HANDLE_VALUE)
458  CloseHandle(dirh);
459 
460  started = false;
461 
463 
464  EnableWindow(GetDlgItem(hwnd, IDOK), true);
467  } else
468  EndDialog(hwndDlg, 1);
469  return true;
470 
471  case IDC_BROWSE:
472  Browse(hwndDlg);
473  return true;
474 
475  case IDC_INCREMENTAL:
477 
480  return true;
481 
482  case IDC_PARENT_BROWSE:
483  BrowseParent(hwndDlg);
484  return true;
485 
486  case IDC_CLONE_ADD:
487  AddClone(hwndDlg);
488  return true;
489 
490  case IDC_CLONE_REMOVE:
491  RemoveClone(hwndDlg);
492  return true;
493  }
494  break;
495 
496  case LBN_SELCHANGE:
497  switch (LOWORD(wParam)) {
498  case IDC_CLONE_LIST:
500  return true;
501  }
502  break;
503  }
504  break;
505  }
506  } catch (const exception& e) {
507  error_message(hwnd, e.what());
508  }
509 
510  return false;
511 }
512 
514  BtrfsSend* bs;
515 
516  if (uMsg == WM_INITDIALOG) {
518  bs = (BtrfsSend*)lParam;
519  } else
521 
522  if (bs)
523  return bs->SendDlgProc(hwndDlg, uMsg, wParam, lParam);
524  else
525  return false;
526 }
527 
529  subvol = path;
530 
532  throw last_error(GetLastError());
533 }
534 
535 extern "C" void CALLBACK SendSubvolGUIW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) {
536  try {
539  LUID luid;
540 
541  set_dpi_aware();
542 
544  throw last_error(GetLastError());
545 
546  if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", &luid))
547  throw last_error(GetLastError());
548 
549  tp.PrivilegeCount = 1;
550  tp.Privileges[0].Luid = luid;
551  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
552 
553  if (!AdjustTokenPrivileges(token, false, &tp, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr))
554  throw last_error(GetLastError());
555 
556  BtrfsSend bs;
557 
558  bs.Open(hwnd, lpszCmdLine);
559  } catch (const exception& e) {
560  error_message(hwnd, e.what());
561  }
562 }
563 
564 static void send_subvol(const wstring& subvol, const wstring& file, const wstring& parent, const vector<wstring>& clones) {
565  char* buf;
566  win_handle dirh, stream;
567  ULONG i;
568  btrfs_send_subvol* bss;
573 
574  buf = (char*)malloc(SEND_BUFFER_LEN);
575 
576  try {
578  if (dirh == INVALID_HANDLE_VALUE)
579  throw last_error(GetLastError());
580 
581  stream = CreateFileW(file.c_str(), FILE_WRITE_DATA | DELETE, 0, nullptr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
583  throw last_error(GetLastError());
584 
585  try {
586  size_t bss_size = offsetof(btrfs_send_subvol, clones[0]) + (clones.size() * sizeof(HANDLE));
587  bss = (btrfs_send_subvol*)malloc(bss_size);
588  memset(bss, 0, bss_size);
589 
590  if (parent != L"") {
591  HANDLE parenth;
592 
594  if (parenth == INVALID_HANDLE_VALUE)
595  throw last_error(GetLastError());
596 
597  bss->parent = parenth;
598  } else
599  bss->parent = nullptr;
600 
601  bss->num_clones = (ULONG)clones.size();
602 
603  for (i = 0; i < bss->num_clones; i++) {
604  HANDLE h;
605 
607  if (h == INVALID_HANDLE_VALUE) {
608  auto le = GetLastError();
609  ULONG j;
610 
611  for (j = 0; j < i; j++) {
612  CloseHandle(bss->clones[j]);
613  }
614 
615  if (bss->parent) CloseHandle(bss->parent);
616 
617  throw last_error(le);
618  }
619 
620  bss->clones[i] = h;
621  }
622 
623  Status = NtFsControlFile(dirh, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_SEND_SUBVOL, bss, (ULONG)bss_size, nullptr, 0);
624 
625  for (i = 0; i < bss->num_clones; i++) {
626  CloseHandle(bss->clones[i]);
627  }
628 
629  if (bss->parent) CloseHandle(bss->parent);
630 
631  if (!NT_SUCCESS(Status))
632  throw ntstatus_error(Status);
633 
634  memcpy(header.magic, BTRFS_SEND_MAGIC, sizeof(header.magic));
635  header.version = 1;
636 
637  if (!WriteFile(stream, &header, sizeof(header), nullptr, nullptr))
638  throw last_error(GetLastError());
639 
640  do {
641  Status = NtFsControlFile(dirh, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_READ_SEND_BUFFER, nullptr, 0, buf, SEND_BUFFER_LEN);
642 
643  if (NT_SUCCESS(Status))
644  WriteFile(stream, buf, (DWORD)iosb.Information, nullptr, nullptr);
645  } while (NT_SUCCESS(Status));
646 
647  if (Status != STATUS_END_OF_FILE)
648  throw ntstatus_error(Status);
649 
650  end.length = 0;
651  end.cmd = BTRFS_SEND_CMD_END;
652  end.csum = 0x9dc96c50;
653 
654  if (!WriteFile(stream, &end, sizeof(end), nullptr, nullptr))
655  throw last_error(GetLastError());
656 
658  } catch (...) {
659  FILE_DISPOSITION_INFO fdi;
660 
661  fdi.DeleteFile = true;
662 
663  Status = NtSetInformationFile(stream, &iosb, &fdi, sizeof(FILE_DISPOSITION_INFO), FileDispositionInformation);
664  if (!NT_SUCCESS(Status))
665  throw ntstatus_error(Status);
666 
667  throw;
668  }
669  } catch (...) {
670  free(buf);
671  throw;
672  }
673 
674  free(buf);
675 }
676 
677 extern "C" void CALLBACK SendSubvolW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) {
679  wstring subvol = L"", parent = L"", file = L"";
680  vector<wstring> clones;
681 
682  command_line_to_args(lpszCmdLine, args);
683 
684  if (args.size() >= 2) {
686  LUID luid;
687 
688  {
690 
692  return;
693 
694  if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", &luid))
695  return;
696 
697  tp.PrivilegeCount = 1;
698  tp.Privileges[0].Luid = luid;
699  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
700 
701  if (!AdjustTokenPrivileges(token, false, &tp, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr))
702  return;
703  }
704 
705  for (unsigned int i = 0; i < args.size(); i++) {
706  if (args[i][0] == '-') {
707  if (args[i][2] == 0 && i < args.size() - 1) {
708  if (args[i][1] == 'p') {
709  parent = args[i+1];
710  i++;
711  } else if (args[i][1] == 'c') {
712  clones.push_back(args[i+1]);
713  i++;
714  }
715  }
716  } else {
717  if (subvol == L"")
718  subvol = args[i];
719  else if (file == L"")
720  file = args[i];
721  }
722  }
723 
724  if (subvol != L"" && file != L"") {
725  try {
726  send_subvol(subvol, file, parent, clones);
727  } catch (const exception& e) {
728  cerr << "Error: " << e.what() << endl;
729  }
730  }
731  }
732 }
bool started
Definition: send.h:55
#define OFN_EXPLORER
Definition: commdlg.h:104
#define IDS_SEND_CANT_OPEN_FILE
Definition: resource.h:178
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
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
#define IDOK
Definition: winuser.h:824
#define CloseHandle
Definition: compat.h:598
HMODULE module
Definition: main.cpp:47
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 IDC_CLONE_REMOVE
Definition: resource.h:291
#define args
Definition: format.c:66
wstring format_ntstatus(NTSTATUS Status)
Definition: main.cpp:184
BOOL WINAPI TerminateThread(IN HANDLE hThread, IN DWORD dwExitCode)
Definition: thread.c:587
HRESULT hr
Definition: shlfolder.c:183
#define IDC_SEND_STATUS
Definition: resource.h:329
#define LB_ADDSTRING
Definition: winuser.h:2018
#define IDS_SEND_PARENT_NOT_READONLY
Definition: resource.h:190
#define IDS_SEND_GET_FILE_INFO_FAILED
Definition: resource.h:184
DWORD Thread()
Definition: send.cpp:30
HWND hwndOwner
Definition: commdlg.h:330
#define IDS_SEND_NOT_READONLY
Definition: resource.h:185
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
GLsizei const GLchar ** path
Definition: glext.h:7234
#define IDS_SEND_SUCCESS
Definition: resource.h:182
#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:1004
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:564
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1294
#define CALLBACK
Definition: compat.h:35
static INT_PTR CALLBACK stub_SendDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: send.cpp:513
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:1127
#define INVALID_HANDLE_VALUE
Definition: compat.h:590
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
WCHAR file[MAX_PATH]
Definition: send.h:57
#define IDC_STREAM_DEST
Definition: resource.h:327
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:1154
#define GetWindowLongPtrW
Definition: winuser.h:4809
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
int32_t INT_PTR
Definition: typedefs.h:64
Definition: match.c:390
#define LBN_SELCHANGE
Definition: winuser.h:2062
#define IDS_SEND_WRITING
Definition: resource.h:192
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
WPARAM wParam
Definition: combotst.c:138
#define IDC_CLONE_ADD
Definition: resource.h:287
BOOL WINAPI GetSaveFileNameW(LPOPENFILENAMEW ofn)
Definition: filedlg.c:4742
#define FILE_SHARE_READ
Definition: compat.h:136
#define IDS_SHPARSEDISPLAYNAME_FAILED
Definition: resource.h:188
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
#define IDC_PARENT_BROWSE
Definition: resource.h:282
DWORD nMaxFile
Definition: commdlg.h:337
#define STATUS_END_OF_FILE
Definition: shellext.h:67
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define FILE_TRAVERSE
Definition: nt_native.h:643
#define IDC_INCREMENTAL
Definition: resource.h:321
#define SE_PRIVILEGE_ENABLED
Definition: setypes.h:63
#define L(x)
Definition: ntvdm.h:50
void RemoveClone(HWND hwnd)
Definition: send.cpp:406
Definition: send.h:27
void error_message(HWND hwnd, const char *msg)
Definition: main.cpp:783
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:2412
#define e
Definition: ke_i.h:82
#define IDS_SEND_FSCTL_BTRFS_READ_SEND_BUFFER_FAILED
Definition: resource.h:181
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:332
#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:528
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:137
void BrowseParent(HWND hwnd)
Definition: send.cpp:314
#define offsetof(TYPE, MEMBER)
#define IDS_NOT_SUBVOL
Definition: resource.h:186
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:2037
#define LB_GETCOUNT
Definition: winuser.h:2025
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define FILE_WRITE_DATA
Definition: nt_native.h:631
#define OPEN_EXISTING
Definition: compat.h:634
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:2965
Status
Definition: gdiplustypes.h:24
void AddClone(HWND hwnd)
Definition: send.cpp:360
#define TOKEN_QUERY
Definition: setypes.h:924
NTSYSAPI NTSTATUS NTAPI NtFsControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
r parent
Definition: btrfs.c:2979
BOOL WINAPI GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation)
Definition: fileinfo.c:458
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:79
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:734
#define MAX_PATH
Definition: compat.h:34
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:270
#define BN_CLICKED
Definition: winuser.h:1912
PVOID HANDLE
Definition: typedefs.h:73
unsigned long DWORD
Definition: ntddk_ex.h:95
#define IDS_SEND_FSCTL_BTRFS_SEND_SUBVOL_FAILED
Definition: resource.h:180
#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:1151
void CALLBACK SendSubvolGUIW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
Definition: send.cpp:535
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
GLuint GLuint end
Definition: gl.h:1545
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
#define LB_GETTEXT
Definition: winuser.h:2036
struct tagOFNW OPENFILENAMEW
Definition: parse.h:22
GLuint GLuint stream
Definition: glext.h:7522
#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 GetCurrentProcess()
Definition: compat.h:618
#define WM_COMMAND
Definition: winuser.h:1727
PCIDLIST_ABSOLUTE pidlRoot
Definition: shlobj.h:1128
#define BTRFS_SEND_CMD_END
Definition: btrfs.h:565
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
wstring subvol
Definition: send.h:60
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define BTRFS_SEND_MAGIC
Definition: btrfs.h:593
LPITEMIDLIST WINAPI SHBrowseForFolderW(LPBROWSEINFOW lpbi)
Definition: brsfolder.c:1398
UINT ulFlags
Definition: shlobj.h:1131
#define BIF_RETURNONLYFSDIRS
Definition: shlobj.h:1144
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
LPSTR lpstrFile
Definition: commdlg.h:336
#define IDS_SEND_CANCEL
Definition: resource.h:191
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:1381
void command_line_to_args(LPWSTR cmdline, vector< wstring > &args)
Definition: main.cpp:645
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define LB_GETCURSEL
Definition: winuser.h:2026
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:179
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:331
#define CreateFileW
Definition: compat.h:600
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:183
size_type size() const
Definition: _vector.h:192
#define HIWORD(l)
Definition: typedefs.h:247
unsigned int ULONG
Definition: retypes.h:1
static HINSTANCE hinst
Definition: edit.c:551
#define IDS_SHGETPATHFROMIDLIST_FAILED
Definition: resource.h:189
#define malloc
Definition: debug_ros.c:4
#define SetWindowLongPtrW
Definition: winuser.h:5326
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
INT_PTR SendDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: send.cpp:421
#define IDS_GET_FILE_IDS_FAILED
Definition: resource.h:187
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define IDCANCEL
Definition: winuser.h:825
LONG_PTR LRESULT
Definition: windef.h:209
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4022
void CALLBACK SendSubvolW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
Definition: send.cpp:677
static struct msdos_boot_sector bs
Definition: mkdosfs.c:539
void clear()
Definition: _vector.h:653
#define LB_DELETESTRING
Definition: winuser.h:2019
#define memset(x, y, z)
Definition: compat.h:39
#define TOKEN_ADJUST_PRIVILEGES
Definition: setypes.h:926
void set_dpi_aware()
Definition: main.cpp:50
#define WM_INITDIALOG
Definition: winuser.h:1726
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
NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
Definition: iofunc.c:3096
#define DELETE
Definition: nt_native.h:57
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
DWORD Flags
Definition: commdlg.h:342
Definition: fci.c:126
#define IDS_RECV_GETVOLUMEPATHNAME_FAILED
Definition: resource.h:169