ReactOS 0.4.15-dev-7842-g558ab78
BtrfsSend Class Reference

#include <send.h>

Collaboration diagram for BtrfsSend:

Public Member Functions

 BtrfsSend ()
 
 ~BtrfsSend ()
 
void Open (HWND hwnd, WCHAR *path)
 
INT_PTR SendDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
DWORD Thread ()
 

Private Member Functions

void StartSend (HWND hwnd)
 
void Browse (HWND hwnd)
 
void BrowseParent (HWND hwnd)
 
void AddClone (HWND hwnd)
 
void RemoveClone (HWND hwnd)
 

Private Attributes

bool started
 
bool incremental
 
WCHAR file [MAX_PATH]
 
WCHAR closetext [255]
 
HANDLE thread
 
HANDLE dirh
 
HANDLE stream
 
HWND hwnd
 
wstring subvol
 
charbuf
 
vector< wstring > clones
 

Detailed Description

Definition at line 27 of file send.h.

Constructor & Destructor Documentation

◆ BtrfsSend()

BtrfsSend::BtrfsSend ( )
inline

Definition at line 29 of file send.h.

29 {
30 started = false;
31 file[0] = 0;
34 subvol = L"";
35 buf = nullptr;
36 incremental = false;
37 }
wstring subvol
Definition: send.h:60
bool incremental
Definition: send.h:56
bool started
Definition: send.h:55
HANDLE dirh
Definition: send.h:58
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define L(x)
Definition: ntvdm.h:50
Definition: fci.c:127
Definition: parse.h:23

◆ ~BtrfsSend()

BtrfsSend::~BtrfsSend ( )
inline

Definition at line 39 of file send.h.

39 {
40 if (buf)
41 free(buf);
42 }
#define free
Definition: debug_ros.c:5

Member Function Documentation

◆ AddClone()

void BtrfsSend::AddClone ( HWND  hwnd)
private

Definition at line 360 of file send.cpp.

360 {
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}
LONG NTSTATUS
Definition: precomp.h:26
struct _root root
#define FSCTL_BTRFS_GET_FILE_IDS
Definition: btrfsioctl.h:7
HWND hwnd
Definition: send.h:59
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
wstring format_ntstatus(NTSTATUS Status)
Definition: main.cpp:184
#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_NOT_SUBVOL
Definition: resource.h:186
#define IDS_SHPARSEDISPLAYNAME_FAILED
Definition: resource.h:188
#define IDS_GET_FILE_IDS_FAILED
Definition: resource.h:187
#define IDS_SHGETPATHFROMIDLIST_FAILED
Definition: resource.h:189
#define OPEN_EXISTING
Definition: compat.h:775
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define FILE_SHARE_READ
Definition: compat.h:136
BOOL WINAPI GetVolumePathNameW(IN LPCWSTR lpszFileName, IN LPWSTR lpszVolumePathName, IN DWORD cchBufferLength)
Definition: volume.c:815
LPITEMIDLIST WINAPI SHBrowseForFolderW(LPBROWSEINFOW lpbi)
Definition: brsfolder.c:1419
Status
Definition: gdiplustypes.h:25
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
#define FAILED(hr)
Definition: intsafe.h:51
format_message(j_common_ptr cinfo, char *buffer)
Definition: jerror.c:158
#define FILE_FLAG_BACKUP_SEMANTICS
Definition: disk.h:41
static PIO_STATUS_BLOCK iosb
Definition: file.c:98
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
#define FILE_TRAVERSE
Definition: nt_native.h:643
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)
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
Definition: pidl.c:1396
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1344
#define memset(x, y, z)
Definition: compat.h:39
HRESULT hr
Definition: shlfolder.c:183
#define BIF_RETURNONLYFSDIRS
Definition: shlobj.h:1210
#define BIF_USENEWUI
Definition: shlobj.h:1217
#define BIF_NONEWFOLDERBUTTON
Definition: shlobj.h:1220
PCIDLIST_ABSOLUTE pidlRoot
Definition: shlobj.h:1194
UINT ulFlags
Definition: shlobj.h:1197
HWND hwndOwner
Definition: shlobj.h:1193
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
#define LB_ADDSTRING
Definition: winuser.h:2031
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by SendDlgProc().

◆ Browse()

void BtrfsSend::Browse ( HWND  hwnd)
private

Definition at line 295 of file send.cpp.

295 {
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}
WCHAR file[MAX_PATH]
Definition: send.h:57
#define OFN_EXPLORER
Definition: commdlg.h:104
struct tagOFNW OPENFILENAMEW
#define IDC_STREAM_DEST
Definition: resource.h:327
BOOL WINAPI GetSaveFileNameW(LPOPENFILENAMEW ofn)
Definition: filedlg.c:4801
OPENFILENAME ofn
Definition: sndrec32.cpp:56
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
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)

Referenced by SendDlgProc().

◆ BrowseParent()

void BtrfsSend::BrowseParent ( HWND  hwnd)
private

Definition at line 314 of file send.cpp.

314 {
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}
#define IDC_PARENT_SUBVOL
Definition: resource.h:331
r parent
Definition: btrfs.c:3010

Referenced by SendDlgProc().

◆ Open()

void BtrfsSend::Open ( HWND  hwnd,
WCHAR path 
)

Definition at line 528 of file send.cpp.

528 {
529 subvol = path;
530
532 throw last_error(GetLastError());
533}
#define IDD_SEND_SUBVOL
Definition: resource.h:88
static INT_PTR CALLBACK stub_SendDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: send.cpp:513
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)

◆ RemoveClone()

void BtrfsSend::RemoveClone ( HWND  hwnd)
private

Definition at line 406 of file send.cpp.

406 {
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}
#define IDC_CLONE_REMOVE
Definition: resource.h:291
LONG_PTR LRESULT
Definition: windef.h:209
#define LB_ERR
Definition: winuser.h:2432
#define LB_DELETESTRING
Definition: winuser.h:2032
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define LB_GETCURSEL
Definition: winuser.h:2039

Referenced by SendDlgProc().

◆ SendDlgProc()

INT_PTR BtrfsSend::SendDlgProc ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 421 of file send.cpp.

421 {
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}
#define IDC_BROWSE
Definition: resource.h:21
void Browse(HWND hwnd)
Definition: send.cpp:295
void AddClone(HWND hwnd)
Definition: send.cpp:360
WCHAR closetext[255]
Definition: send.h:57
HANDLE thread
Definition: send.h:58
void StartSend(HWND hwnd)
Definition: send.cpp:233
void RemoveClone(HWND hwnd)
Definition: send.cpp:406
void BrowseParent(HWND hwnd)
Definition: send.cpp:314
WPARAM wParam
Definition: combotst.c:138
void error_message(HWND hwnd, const char *msg)
Definition: main.cpp:783
#define IDC_PARENT_BROWSE
Definition: resource.h:282
#define IDC_CLONE_ADD
Definition: resource.h:287
#define IDC_INCREMENTAL
Definition: resource.h:321
#define CloseHandle
Definition: compat.h:739
BOOL WINAPI TerminateThread(IN HANDLE hThread, IN DWORD dwExitCode)
Definition: thread.c:587
@ FileDispositionInformation
Definition: from_kernel.h:74
#define e
Definition: ke_i.h:82
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 LOWORD(l)
Definition: pedump.c:82
#define HIWORD(l)
Definition: typedefs.h:247
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
#define IDCANCEL
Definition: winuser.h:831
#define WM_COMMAND
Definition: winuser.h:1740
#define WM_INITDIALOG
Definition: winuser.h:1739
#define IDOK
Definition: winuser.h:830
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define LBN_SELCHANGE
Definition: winuser.h:2075
#define BN_CLICKED
Definition: winuser.h:1925
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)

◆ StartSend()

void BtrfsSend::StartSend ( HWND  hwnd)
private

Definition at line 233 of file send.cpp.

233 {
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}
vector< wstring > clones
Definition: send.h:62
#define malloc
Definition: debug_ros.c:4
#define IDS_SEND_WRITING
Definition: resource.h:192
#define IDC_SEND_STATUS
Definition: resource.h:329
#define IDS_SEND_CANCEL
Definition: resource.h:191
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
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
GLdouble s
Definition: gl.h:2039
GLdouble GLdouble t
Definition: gl.h:2047
GLenum GLsizei len
Definition: glext.h:6722
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
static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
Definition: muireg.c:10
static DWORD WINAPI send_thread(LPVOID lpParameter)
Definition: send.cpp:227
void push_back(const _Tp &__x=_STLP_DEFAULT_CONSTRUCTED(_Tp))
Definition: _vector.h:379
void clear()
Definition: _vector.h:653
#define LB_GETCOUNT
Definition: winuser.h:2038
#define LB_GETTEXT
Definition: winuser.h:2049
#define LB_GETTEXTLEN
Definition: winuser.h:2050

Referenced by SendDlgProc().

◆ Thread()

DWORD BtrfsSend::Thread ( )

Definition at line 30 of file send.cpp.

30 {
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}
#define msg(x)
Definition: auth_time.c:54
#define FSCTL_BTRFS_SEND_SUBVOL
Definition: btrfsioctl.h:36
#define FSCTL_BTRFS_READ_SEND_BUFFER
Definition: btrfsioctl.h:37
wstring utf8_to_utf16(const string_view &utf8)
Definition: main.cpp:734
#define IDS_SEND_NOT_READONLY
Definition: resource.h:185
#define IDS_SEND_FSCTL_BTRFS_SEND_SUBVOL_FAILED
Definition: resource.h:180
#define IDS_SEND_SUCCESS
Definition: resource.h:182
#define IDS_SEND_FSCTL_BTRFS_READ_SEND_BUFFER_FAILED
Definition: resource.h:181
#define IDS_SEND_WRITEFILE_FAILED
Definition: resource.h:183
#define IDS_SEND_GET_FILE_INFO_FAILED
Definition: resource.h:184
#define IDS_SEND_CANT_OPEN_FILE
Definition: resource.h:178
#define IDS_SEND_PARENT_NOT_READONLY
Definition: resource.h:190
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
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
#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
GLuint GLuint end
Definition: gl.h:1545
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 memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define OPEN_ALWAYS
Definition: disk.h:70
#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
#define DELETE
Definition: nt_native.h:57
#define offsetof(TYPE, MEMBER)
#define SEND_BUFFER_LEN
Definition: send.cpp:28
#define STATUS_END_OF_FILE
Definition: shellext.h:67
HANDLE clones[1]
Definition: btrfsioctl.h:270
size_type size() const
Definition: _vector.h:192
PVOID HANDLE
Definition: typedefs.h:73
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define success(from, fromstr, to, tostr)

Member Data Documentation

◆ buf

char* BtrfsSend::buf
private

Definition at line 61 of file send.h.

◆ clones

vector<wstring> BtrfsSend::clones
private

Definition at line 62 of file send.h.

Referenced by StartSend(), and Thread().

◆ closetext

WCHAR BtrfsSend::closetext[255]
private

Definition at line 57 of file send.h.

Referenced by SendDlgProc(), and Thread().

◆ dirh

HANDLE BtrfsSend::dirh
private

Definition at line 58 of file send.h.

Referenced by BtrfsSend(), SendDlgProc(), and Thread().

◆ file

WCHAR BtrfsSend::file[MAX_PATH]
private

Definition at line 57 of file send.h.

Referenced by Browse().

◆ hwnd

HWND BtrfsSend::hwnd
private

Definition at line 59 of file send.h.

Referenced by AddClone(), Browse(), and BrowseParent().

◆ incremental

bool BtrfsSend::incremental
private

Definition at line 56 of file send.h.

Referenced by BtrfsSend(), SendDlgProc(), StartSend(), and Thread().

◆ started

bool BtrfsSend::started
private

Definition at line 55 of file send.h.

Referenced by BtrfsSend(), SendDlgProc(), StartSend(), and Thread().

◆ stream

HANDLE BtrfsSend::stream
private

Definition at line 58 of file send.h.

◆ subvol

wstring BtrfsSend::subvol
private

Definition at line 60 of file send.h.

Referenced by AddClone(), BrowseParent(), BtrfsSend(), Open(), and Thread().

◆ thread

HANDLE BtrfsSend::thread
private

Definition at line 58 of file send.h.

Referenced by SendDlgProc(), and StartSend().


The documentation for this class was generated from the following files: