ReactOS 0.4.16-dev-250-g3ecd236
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 {
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
151
152 end.length = 0;
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 (...) {
181
182 throw;
183 }
184
187 } catch (...) {
188 free(buf);
189 buf = nullptr;
190
191 started = false;
192
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
217
218 wstring success;
219
221
223
224 return 0;
225}
226
227static 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
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
282
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);
305 ofn.nMaxFile = sizeof(file) / sizeof(WCHAR);
307
308 if (!GetSaveFileNameW(&ofn))
309 return;
310
312}
313
315 BROWSEINFOW bi;
317 HRESULT hr;
318 WCHAR parent[MAX_PATH], volpathw[MAX_PATH];
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;
363 HRESULT hr;
364 WCHAR path[MAX_PATH], volpathw[MAX_PATH];
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
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
459
460 started = false;
461
463
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
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
535extern "C" void CALLBACK SendSubvolGUIW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) {
536 try {
539 LUID luid;
540
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
557
558 bs.Open(hwnd, lpszCmdLine);
559 } catch (const exception& e) {
560 error_message(hwnd, e.what());
561 }
562}
563
564static 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;
573
574 buf = (char*)malloc(SEND_BUFFER_LEN);
575
576 try {
578 if (dirh == INVALID_HANDLE_VALUE)
579 throw last_error(GetLastError());
580
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
648 throw ntstatus_error(Status);
649
650 end.length = 0;
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
677extern "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}
basic_ostream< _CharT, _Traits > &_STLP_CALL endl(basic_ostream< _CharT, _Traits > &__os)
Definition: _ostream.h:357
#define msg(x)
Definition: auth_time.c:54
LONG NTSTATUS
Definition: precomp.h:26
#define IDC_BROWSE
Definition: resource.h:21
EXTERN_C LPITEMIDLIST WINAPI SHBrowseForFolderW(LPBROWSEINFOW lpbi)
Definition: brfolder.cpp:1361
struct _root root
#define FSCTL_BTRFS_SEND_SUBVOL
Definition: btrfsioctl.h:36
#define FSCTL_BTRFS_GET_FILE_IDS
Definition: btrfsioctl.h:7
#define FSCTL_BTRFS_READ_SEND_BUFFER
Definition: btrfsioctl.h:37
Definition: send.h:27
DWORD Thread()
Definition: send.cpp:30
void Browse(HWND hwnd)
Definition: send.cpp:295
void AddClone(HWND hwnd)
Definition: send.cpp:360
WCHAR closetext[255]
Definition: send.h:57
vector< wstring > clones
Definition: send.h:62
wstring subvol
Definition: send.h:60
HANDLE thread
Definition: send.h:58
void StartSend(HWND hwnd)
Definition: send.cpp:233
HWND hwnd
Definition: send.h:59
bool incremental
Definition: send.h:56
void Open(HWND hwnd, WCHAR *path)
Definition: send.cpp:528
void RemoveClone(HWND hwnd)
Definition: send.cpp:406
INT_PTR SendDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: send.cpp:421
WCHAR file[MAX_PATH]
Definition: send.h:57
void BrowseParent(HWND hwnd)
Definition: send.cpp:314
bool started
Definition: send.h:55
HANDLE dirh
Definition: send.h:58
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define OFN_EXPLORER
Definition: commdlg.h:104
struct tagOFNW OPENFILENAMEW
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
void set_dpi_aware()
Definition: main.cpp:50
void error_message(HWND hwnd, const char *msg)
Definition: main.cpp:783
wstring format_ntstatus(NTSTATUS Status)
Definition: main.cpp:184
void command_line_to_args(LPWSTR cmdline, vector< wstring > &args)
Definition: main.cpp:645
wstring utf8_to_utf16(const string_view &utf8)
Definition: main.cpp:734
#define IDS_SEND_NOT_READONLY
Definition: resource.h:185
#define IDC_STREAM_DEST
Definition: resource.h:327
#define IDC_CLONE_REMOVE
Definition: resource.h:291
#define IDS_SEND_FSCTL_BTRFS_SEND_SUBVOL_FAILED
Definition: resource.h:180
#define IDC_PARENT_BROWSE
Definition: resource.h:282
#define IDS_SEND_SUCCESS
Definition: resource.h:182
#define IDS_RECV_GETVOLUMEPATHNAME_FAILED
Definition: resource.h:169
#define IDC_CLONE_LIST
Definition: resource.h:332
#define IDS_SEND_CANT_OPEN_DIR
Definition: resource.h:179
#define IDS_SEND_WRITING
Definition: resource.h:192
#define IDC_PARENT_SUBVOL
Definition: resource.h:331
#define IDC_SEND_STATUS
Definition: resource.h:329
#define IDS_SEND_FSCTL_BTRFS_READ_SEND_BUFFER_FAILED
Definition: resource.h:181
#define IDD_SEND_SUBVOL
Definition: resource.h:88
#define IDS_NOT_SUBVOL
Definition: resource.h:186
#define IDS_SEND_CANCEL
Definition: resource.h:191
#define IDS_SEND_WRITEFILE_FAILED
Definition: resource.h:183
#define IDS_SHPARSEDISPLAYNAME_FAILED
Definition: resource.h:188
#define IDS_SEND_GET_FILE_INFO_FAILED
Definition: resource.h:184
#define IDS_SEND_CANT_OPEN_FILE
Definition: resource.h:178
#define IDS_GET_FILE_IDS_FAILED
Definition: resource.h:187
#define IDS_SEND_PARENT_NOT_READONLY
Definition: resource.h:190
#define IDC_CLONE_ADD
Definition: resource.h:287
#define IDC_INCREMENTAL
Definition: resource.h:321
#define IDS_SHGETPATHFROMIDLIST_FAILED
Definition: resource.h:189
BOOL WINAPI LookupPrivilegeValueW(LPCWSTR lpSystemName, LPCWSTR lpPrivilegeName, PLUID lpLuid)
Definition: misc.c:782
BOOL WINAPI AdjustTokenPrivileges(HANDLE TokenHandle, BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength)
Definition: security.c:374
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:294
BOOL WINAPI GetSaveFileNameW(LPOPENFILENAMEW ofn)
Definition: filedlg.c:4801
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define GetCurrentProcess()
Definition: compat.h:759
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define CALLBACK
Definition: compat.h:35
#define FILE_SHARE_READ
Definition: compat.h:136
BOOL WINAPI GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation)
Definition: fileinfo.c:458
BOOL WINAPI SetEndOfFile(HANDLE hFile)
Definition: fileinfo.c:1004
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
BOOL WINAPI GetVolumePathNameW(IN LPCWSTR lpszFileName, IN LPWSTR lpszVolumePathName, IN DWORD cchBufferLength)
Definition: volume.c:815
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
BOOL WINAPI TerminateThread(IN HANDLE hThread, IN DWORD dwExitCode)
Definition: thread.c:587
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
Definition: btrfs.c:2996
r parent
Definition: btrfs.c:3010
#define BTRFS_SEND_CMD_END
Definition: btrfs.h:565
#define BTRFS_SEND_MAGIC
Definition: btrfs.h:593
unsigned long DWORD
Definition: ntddk_ex.h:95
@ FileDispositionInformation
Definition: from_kernel.h:74
Status
Definition: gdiplustypes.h:25
GLdouble s
Definition: gl.h:2039
GLuint GLuint end
Definition: gl.h:1545
GLdouble GLdouble t
Definition: gl.h:2047
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLsizei len
Definition: glext.h:6722
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
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
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
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
#define FAILED(hr)
Definition: intsafe.h:51
#define cerr
Definition: iostream.cpp:39
format_message(j_common_ptr cinfo, char *buffer)
Definition: jerror.c:158
#define e
Definition: ke_i.h:82
static struct msdos_boot_sector bs
Definition: mkdosfs.c:539
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define FILE_FLAG_BACKUP_SEMANTICS
Definition: disk.h:41
#define OPEN_ALWAYS
Definition: disk.h:70
static HINSTANCE hinst
Definition: edit.c:551
static PIO_STATUS_BLOCK iosb
Definition: file.c:98
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
Definition: muireg.c:10
unsigned int UINT
Definition: ndis.h:50
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define FILE_WRITE_DATA
Definition: nt_native.h:631
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
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 FILE_SHARE_DELETE
Definition: nt_native.h:682
#define FILE_TRAVERSE
Definition: nt_native.h:643
#define DELETE
Definition: nt_native.h:57
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)
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
Definition: pidl.c:1400
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1348
#define offsetof(TYPE, MEMBER)
#define memset(x, y, z)
Definition: compat.h:39
static INT_PTR CALLBACK stub_SendDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: send.cpp:513
#define SEND_BUFFER_LEN
Definition: send.cpp:28
void CALLBACK SendSubvolW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
Definition: send.cpp:677
static DWORD WINAPI send_thread(LPVOID lpParameter)
Definition: send.cpp:227
static void send_subvol(const wstring &subvol, const wstring &file, const wstring &parent, const vector< wstring > &clones)
Definition: send.cpp:564
void CALLBACK SendSubvolGUIW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
Definition: send.cpp:535
#define STATUS_END_OF_FILE
Definition: shellext.h:67
HRESULT hr
Definition: shlfolder.c:183
#define BIF_RETURNONLYFSDIRS
Definition: shlobj.h:1217
#define BIF_USENEWUI
Definition: shlobj.h:1224
#define BIF_NONEWFOLDERBUTTON
Definition: shlobj.h:1227
OPENFILENAME ofn
Definition: sndrec32.cpp:56
Definition: match.c:390
HANDLE clones[1]
Definition: btrfsioctl.h:270
Definition: fci.c:127
Definition: parse.h:23
PCIDLIST_ABSOLUTE pidlRoot
Definition: shlobj.h:1201
UINT ulFlags
Definition: shlobj.h:1204
HWND hwndOwner
Definition: shlobj.h:1200
HWND hwndOwner
Definition: commdlg.h:330
HINSTANCE hInstance
Definition: commdlg.h:331
LPSTR lpstrFile
Definition: commdlg.h:336
DWORD Flags
Definition: commdlg.h:342
DWORD lStructSize
Definition: commdlg.h:329
DWORD nMaxFile
Definition: commdlg.h:337
void push_back(const _Tp &__x=_STLP_DEFAULT_CONSTRUCTED(_Tp))
Definition: _vector.h:379
size_type size() const
Definition: _vector.h:192
void clear()
Definition: _vector.h:653
#define GWLP_USERDATA
Definition: treelist.c:63
int32_t INT_PTR
Definition: typedefs.h:64
PVOID HANDLE
Definition: typedefs.h:73
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
#define success(from, fromstr, to, tostr)
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define LB_ERR
Definition: winuser.h:2435
#define LB_GETCOUNT
Definition: winuser.h:2041
#define GetWindowLongPtrW
Definition: winuser.h:4832
#define IDCANCEL
Definition: winuser.h:834
#define LB_GETTEXT
Definition: winuser.h:2052
#define WM_COMMAND
Definition: winuser.h:1743
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
#define WM_INITDIALOG
Definition: winuser.h:1742
#define LB_ADDSTRING
Definition: winuser.h:2034
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:833
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define LB_DELETESTRING
Definition: winuser.h:2035
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define LB_GETTEXTLEN
Definition: winuser.h:2053
#define LBN_SELCHANGE
Definition: winuser.h:2078
#define BN_CLICKED
Definition: winuser.h:1928
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define LB_GETCURSEL
Definition: winuser.h:2042
#define SetWindowLongPtrW
Definition: winuser.h:5358
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
#define TOKEN_ADJUST_PRIVILEGES
Definition: setypes.h:930
#define TOKEN_QUERY
Definition: setypes.h:928
#define SE_PRIVILEGE_ENABLED
Definition: setypes.h:63
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184