ReactOS 0.4.16-dev-300-g2aadf2e
propsheet.cpp
Go to the documentation of this file.
1/* Copyright (c) Mark Harmstone 2016-17
2 *
3 * This file is part of WinBtrfs.
4 *
5 * WinBtrfs is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public Licence as published by
7 * the Free Software Foundation, either version 3 of the Licence, or
8 * (at your option) any later version.
9 *
10 * WinBtrfs is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public Licence for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public Licence
16 * along with WinBtrfs. If not, see <http://www.gnu.org/licenses/>. */
17
18#define ISOLATION_AWARE_ENABLED 1
19#define STRSAFE_NO_DEPRECATE
20
21#include "shellext.h"
22#ifndef __REACTOS__
23#include <windows.h>
24#include <strsafe.h>
25#include <winternl.h>
26#else
27#define WIN32_NO_STATUS
28#include <windef.h>
29#include <winbase.h>
30#include <strsafe.h>
31#include <ndk/iofuncs.h>
32#include <ndk/iotypes.h>
33#endif
34
35#define NO_SHLWAPI_STRFCNS
36#include <shlwapi.h>
37#include <uxtheme.h>
38
39#include "propsheet.h"
40#include "resource.h"
41
42#define SUBVOL_ROOT_INODE 0x100
43
44#ifndef __REACTOS__
45#ifndef __MINGW32__ // in winternl.h in mingw
46
50
51#define FileAccessInformation (FILE_INFORMATION_CLASS)8
52
60
61#define FileStandardInformation (FILE_INFORMATION_CLASS)5
62
63typedef struct _FILE_FS_SIZE_INFORMATION {
69
70#endif
71#endif
72
74 if (riid == IID_IUnknown || riid == IID_IShellPropSheetExt) {
75 *ppObj = static_cast<IShellPropSheetExt*>(this);
76 AddRef();
77 return S_OK;
78 } else if (riid == IID_IShellExtInit) {
79 *ppObj = static_cast<IShellExtInit*>(this);
80 AddRef();
81 return S_OK;
82 }
83
84 *ppObj = nullptr;
85 return E_NOINTERFACE;
86}
87
88void BtrfsPropSheet::do_search(const wstring& fn) {
89 wstring ss;
91
92#ifndef __REACTOS__
93 ss = fn + L"\\*"s;
94#else
95 ss = fn + wstring(L"\\*");
96#endif
97
98 fff_handle h = FindFirstFileW(ss.c_str(), &ffd);
100 return;
101
102 do {
103 if (ffd.cFileName[0] != '.' || ((ffd.cFileName[1] != 0) && (ffd.cFileName[1] != '.' || ffd.cFileName[2] != 0))) {
104 wstring fn2;
105
106#ifndef __REACTOS__
107 fn2 = fn + L"\\"s + ffd.cFileName;
108#else
109 fn2 = fn + wstring(L"\\") + ffd.cFileName;
110#endif
111
112 if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
114 else {
117
118 if (fh != INVALID_HANDLE_VALUE) {
121 btrfs_inode_info bii2;
122
123 memset(&bii2, 0, sizeof(bii2));
124
125 Status = NtFsControlFile(fh, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_INODE_INFO, nullptr, 0, &bii2, sizeof(btrfs_inode_info));
126
127 if (NT_SUCCESS(Status)) {
128 sizes[0] += bii2.inline_length;
129 sizes[1] += bii2.disk_size_uncompressed;
130 sizes[2] += bii2.disk_size_zlib;
131 sizes[3] += bii2.disk_size_lzo;
132 sizes[4] += bii2.disk_size_zstd;
134 sparsesize += bii2.sparse_size;
135 num_extents += bii2.num_extents == 0 ? 0 : (bii2.num_extents - 1);
136 }
137
139
140 Status = NtQueryInformationFile(fh, &iosb, &fsi, sizeof(fsi), FileStandardInformation);
141
142 if (NT_SUCCESS(Status)) {
143 if (bii2.inline_length > 0)
145 else
147 }
148 }
149 }
150 }
151 } while (FindNextFileW(h, &ffd));
152}
153
155 while (!search_list.empty()) {
157
159 }
160
161 thread = nullptr;
162
163 return 0;
164}
165
167 BtrfsPropSheet* bps = (BtrfsPropSheet*)lpParameter;
168
169 return bps->search_list_thread();
170}
171
172HRESULT BtrfsPropSheet::check_file(const wstring& fn, UINT i, UINT num_files, UINT* sv) {
178 btrfs_inode_info bii2;
179
182
183 if (h == INVALID_HANDLE_VALUE)
184 return E_FAIL;
185
187 if (!NT_SUCCESS(Status))
188 return E_FAIL;
189
192
194
195 if (!readonly && num_files == 1 && !can_change_perms)
196 show_admin_button = true;
197
200
201 memset(&bii2, 0, sizeof(bii2));
202
203 Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_INODE_INFO, nullptr, 0, &bii2, sizeof(btrfs_inode_info));
204
205 if (NT_SUCCESS(Status) && !bii2.top) {
206 LARGE_INTEGER filesize;
207
208 if (i == 0) {
209 subvol = bii2.subvol;
210 inode = bii2.inode;
211 type = bii2.type;
212 uid = bii2.st_uid;
213 gid = bii2.st_gid;
214 rdev = bii2.st_rdev;
215 } else {
216 if (subvol != bii2.subvol)
217 various_subvols = true;
218
219 if (inode != bii2.inode)
220 various_inodes = true;
221
222 if (type != bii2.type)
223 various_types = true;
224
225 if (uid != bii2.st_uid)
226 various_uids = true;
227
228 if (gid != bii2.st_gid)
229 various_gids = true;
230 }
231
232 if (bii2.inline_length > 0) {
233 totalsize += bii2.inline_length;
234 sizes[0] += bii2.inline_length;
235 }
236
237 if (bii2.disk_size_uncompressed > 0) {
239 sizes[1] += bii2.disk_size_uncompressed;
240 }
241
242 if (bii2.disk_size_zlib > 0) {
244 sizes[2] += bii2.disk_size_zlib;
245 }
246
247 if (bii2.disk_size_lzo > 0) {
248 totalsize += bii2.disk_size_lzo;
249 sizes[3] += bii2.disk_size_lzo;
250 }
251
252 if (bii2.disk_size_zstd > 0) {
254 sizes[4] += bii2.disk_size_zstd;
255 }
256
257 sparsesize += bii2.sparse_size;
258 num_extents += bii2.num_extents == 0 ? 0 : (bii2.num_extents - 1);
259
261
263
264 if (!NT_SUCCESS(Status))
265 throw ntstatus_error(Status);
266
267 if (bii2.inline_length > 0)
269 else
271
272 min_mode |= ~bii2.st_mode;
273 max_mode |= bii2.st_mode;
274 min_flags |= ~bii2.flags;
275 max_flags |= bii2.flags;
278
279 if (bii2.inode == SUBVOL_ROOT_INODE) {
281
282 has_subvols = true;
283
284 if (*sv == 0)
285 ro_subvol = ro;
286 else {
287 if (ro_subvol != ro)
288 various_ro = true;
289 }
290
291 (*sv)++;
292 }
293
294 ignore = false;
295
296 if (bii2.type != BTRFS_TYPE_DIRECTORY && GetFileSizeEx(h, &filesize)) {
297 if (filesize.QuadPart != 0)
298 can_change_nocow = false;
299 }
300
301 {
303
305
306 if (NT_SUCCESS(Status))
308
309 if (sector_size == 0)
310 sector_size = 4096;
311 }
312 } else
313 return E_FAIL;
314
315 return S_OK;
316}
317
319 UINT num_files, i, sv = 0;
321
322 num_files = DragQueryFileW((HDROP)stgm.hGlobal, 0xFFFFFFFF, nullptr, 0);
323
324 min_mode = 0;
325 max_mode = 0;
326 min_flags = 0;
327 max_flags = 0;
331
332 can_change_perms = true;
333 can_change_nocow = true;
334
335 sizes[0] = sizes[1] = sizes[2] = sizes[3] = sizes[4] = 0;
337
338 for (i = 0; i < num_files; i++) {
339 if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / sizeof(WCHAR))) {
340 HRESULT hr;
341
342 hr = check_file(fn, i, num_files, &sv);
343 if (FAILED(hr))
344 return hr;
345 } else
346 return E_FAIL;
347 }
348
349 min_mode = ~min_mode;
350 min_flags = ~min_flags;
351
352 mode = min_mode;
354
357
358 return S_OK;
359}
360
362 try {
363 FORMATETC format = { CF_HDROP, nullptr, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
364 HDROP hdrop;
365 HRESULT hr;
366
367 if (pidlFolder)
368 return E_FAIL;
369
370 if (!pdtobj)
371 return E_FAIL;
372
373 stgm.tymed = TYMED_HGLOBAL;
374
375 if (FAILED(pdtobj->GetData(&format, &stgm)))
376 return E_INVALIDARG;
377
378 stgm_set = true;
379
380 hdrop = (HDROP)GlobalLock(stgm.hGlobal);
381
382 if (!hdrop) {
384 stgm_set = false;
385 return E_INVALIDARG;
386 }
387
388 try {
389 hr = load_file_list();
390 if (FAILED(hr))
391 return hr;
392
393 if (search_list.size() > 0) {
394 thread = CreateThread(nullptr, 0, global_search_list_thread, this, 0, nullptr);
395
396 if (!thread)
397 throw last_error(GetLastError());
398 }
399 } catch (...) {
400 GlobalUnlock(hdrop);
401 throw;
402 }
403
404 GlobalUnlock(hdrop);
405 } catch (const exception& e) {
406 error_message(nullptr, e.what());
407
408 return E_FAIL;
409 }
410
411 return S_OK;
412}
413
418 UINT sv = 0;
420 btrfs_inode_info bii2;
422
423 min_mode = 0;
424 max_mode = 0;
425 min_flags = 0;
426 max_flags = 0;
430
431 can_change_perms = true;
432 can_change_nocow = true;
433
436
437 if (h == INVALID_HANDLE_VALUE)
438 throw last_error(GetLastError());
439
441 if (!NT_SUCCESS(Status))
442 throw ntstatus_error(Status);
443
446
448
451
452 memset(&bii2, 0, sizeof(bii2));
453
454 Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_INODE_INFO, nullptr, 0, &bii2, sizeof(btrfs_inode_info));
455
456 if (!NT_SUCCESS(Status))
457 throw ntstatus_error(Status);
458
459 if (!bii2.top) {
460 LARGE_INTEGER filesize;
461
462 subvol = bii2.subvol;
463 inode = bii2.inode;
464 type = bii2.type;
465 uid = bii2.st_uid;
466 gid = bii2.st_gid;
467 rdev = bii2.st_rdev;
468
469 if (bii2.inline_length > 0) {
470 totalsize += bii2.inline_length;
471 sizes[0] += bii2.inline_length;
472 }
473
474 if (bii2.disk_size_uncompressed > 0) {
476 sizes[1] += bii2.disk_size_uncompressed;
477 }
478
479 if (bii2.disk_size_zlib > 0) {
481 sizes[2] += bii2.disk_size_zlib;
482 }
483
484 if (bii2.disk_size_lzo > 0) {
485 totalsize += bii2.disk_size_lzo;
486 sizes[3] += bii2.disk_size_lzo;
487 }
488
489 if (bii2.disk_size_zstd > 0) {
491 sizes[4] += bii2.disk_size_zstd;
492 }
493
494 sparsesize += bii2.sparse_size;
495
497
499
500 if (!NT_SUCCESS(Status))
501 throw ntstatus_error(Status);
502
503 if (bii2.inline_length > 0)
505 else
507
508 min_mode |= ~bii2.st_mode;
509 max_mode |= bii2.st_mode;
510 min_flags |= ~bii2.flags;
511 max_flags |= bii2.flags;
514
515 if (bii2.inode == SUBVOL_ROOT_INODE) {
517
518 has_subvols = true;
519
520 if (sv == 0)
521 ro_subvol = ro;
522 else {
523 if (ro_subvol != ro)
524 various_ro = true;
525 }
526
527 sv++;
528 }
529
530 ignore = false;
531
532 if (bii2.type != BTRFS_TYPE_DIRECTORY && GetFileSizeEx(h, &filesize)) {
533 if (filesize.QuadPart != 0)
534 can_change_nocow = false;
535 }
536 } else
537 return;
538
539 min_mode = ~min_mode;
540 min_flags = ~min_flags;
541
542 mode = min_mode;
544
547
548 if (search_list.size() > 0) {
549 thread = CreateThread(nullptr, 0, global_search_list_thread, this, 0, nullptr);
550
551 if (!thread)
552 throw last_error(GetLastError());
553 }
554
555 this->filename = cmdline;
556}
557
559 switch (type) {
560 case BTRFS_TYPE_FILE:
561 return IDS_INODE_FILE;
562
564 return IDS_INODE_DIR;
565
567 return IDS_INODE_CHAR;
568
570 return IDS_INODE_BLOCK;
571
572 case BTRFS_TYPE_FIFO:
573 return IDS_INODE_FIFO;
574
576 return IDS_INODE_SOCKET;
577
579 return IDS_INODE_SYMLINK;
580
581 default:
582 return IDS_INODE_UNKNOWN;
583 }
584}
585
589
590 if (state == BST_CHECKED) {
591 flags |= flag;
592 flags_set |= flag;
593 } else if (state == BST_UNCHECKED) {
594 flags &= ~flag;
595 flags_set |= flag;
596 } else if (state == BST_INDETERMINATE) {
597 flags_set = ~flag;
598 }
599
601 EnableWindow(GetDlgItem(hDlg, IDC_COMPRESS), false);
603 } else {
606 }
607
609
610 flags_changed = true;
611
612 SendMessageW(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0);
613}
614
615void BtrfsPropSheet::apply_changes_file(HWND hDlg, const wstring& fn) {
620 btrfs_inode_info bii2;
622
624 perms |= FILE_WRITE_ATTRIBUTES;
625
627 perms |= WRITE_DAC;
628
629 if (mode_set & S_ISUID && (((min_mode & S_ISUID) != (max_mode & S_ISUID)) || ((min_mode & S_ISUID) != (mode & S_ISUID))))
630 perms |= WRITE_OWNER;
631
632 h = CreateFileW(fn.c_str(), perms, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr,
634
635 if (h == INVALID_HANDLE_VALUE)
636 throw last_error(GetLastError());
637
638 ZeroMemory(&bsii, sizeof(btrfs_set_inode_info));
639
640 Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_INODE_INFO, nullptr, 0, &bii2, sizeof(btrfs_inode_info));
641
642 if (!NT_SUCCESS(Status))
643 throw ntstatus_error(Status);
644
645 if (bii2.inode == SUBVOL_ROOT_INODE && ro_changed) {
647 FILE_BASIC_INFO fbi;
648
649 if (!GetFileInformationByHandle(h, &bhfi))
650 throw last_error(GetLastError());
651
652 memset(&fbi, 0, sizeof(fbi));
653 fbi.FileAttributes = bhfi.dwFileAttributes;
654
655 if (ro_subvol)
656 fbi.FileAttributes |= FILE_ATTRIBUTE_READONLY;
657 else
658 fbi.FileAttributes &= ~FILE_ATTRIBUTE_READONLY;
659
660 Status = NtSetInformationFile(h, &iosb, &fbi, sizeof(FILE_BASIC_INFO), FileBasicInformation);
661 if (!NT_SUCCESS(Status))
662 throw ntstatus_error(Status);
663 }
664
666 if (flags_changed) {
667 bsii.flags_changed = true;
668 bsii.flags = (bii2.flags & ~flags_set) | (flags & flags_set);
669 }
670
671 if (perms_changed) {
672 bsii.mode_changed = true;
673 bsii.st_mode = (bii2.st_mode & ~mode_set) | (mode & mode_set);
674 }
675
676 if (uid_changed) {
677 bsii.uid_changed = true;
678 bsii.st_uid = uid;
679 }
680
681 if (gid_changed) {
682 bsii.gid_changed = true;
683 bsii.st_gid = gid;
684 }
685
687 bsii.compression_type_changed = true;
689 }
690
691 Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_SET_INODE_INFO, &bsii, sizeof(btrfs_set_inode_info), nullptr, 0);
692
693 if (!NT_SUCCESS(Status))
694 throw ntstatus_error(Status);
695 }
696}
697
699 UINT num_files, i;
700 WCHAR fn[MAX_PATH]; // FIXME - is this long enough?
701
702 if (various_uids)
703 uid_changed = false;
704
705 if (various_gids)
706 gid_changed = false;
707
709 return;
710
711 if (filename[0] != 0)
713 else {
714 num_files = DragQueryFileW((HDROP)stgm.hGlobal, 0xFFFFFFFF, nullptr, 0);
715
716 for (i = 0; i < num_files; i++) {
717 if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / sizeof(WCHAR))) {
718 apply_changes_file(hDlg, fn);
719 }
720 }
721 }
722
723 flags_changed = false;
724 perms_changed = false;
725 uid_changed = false;
726 gid_changed = false;
727 ro_changed = false;
728}
729
731 wstring s, size_on_disk, cr, frag;
732 WCHAR old_text[1024];
733 float ratio;
734
735 format_size(totalsize, size_on_disk, true);
736
737 wstring_sprintf(s, size_format, size_on_disk.c_str());
738
739 if (allocsize == sparsesize || totalsize == 0)
740 ratio = 0.0f;
741 else
742 ratio = 100.0f * (1.0f - ((float)totalsize / (float)(allocsize - sparsesize)));
743
744 wstring_sprintf(cr, cr_format, ratio);
745
746 GetDlgItemTextW(hwndDlg, IDC_SIZE_ON_DISK, old_text, sizeof(old_text) / sizeof(WCHAR));
747
748 if (s != old_text)
749 SetDlgItemTextW(hwndDlg, IDC_SIZE_ON_DISK, s.c_str());
750
751 GetDlgItemTextW(hwndDlg, IDC_COMPRESSION_RATIO, old_text, sizeof(old_text) / sizeof(WCHAR));
752
753 if (cr != old_text)
754 SetDlgItemTextW(hwndDlg, IDC_COMPRESSION_RATIO, cr.c_str());
755
756 uint64_t extent_size = (allocsize - sparsesize - sizes[0]) / (sector_size == 0 ? 4096 : sector_size);
757
758 if (num_extents == 0 || extent_size <= 1)
759 ratio = 0.0f;
760 else
761 ratio = 100.0f * ((float)num_extents / (float)(extent_size - 1));
762
763 wstring_sprintf(frag, frag_format, ratio);
764
765 GetDlgItemTextW(hwndDlg, IDC_FRAGMENTATION, old_text, sizeof(old_text) / sizeof(WCHAR));
766
767 if (frag != old_text)
768 SetDlgItemTextW(hwndDlg, IDC_FRAGMENTATION, frag.c_str());
769}
770
772 if (state == BST_CHECKED) {
773 mode |= flag;
774 mode_set |= flag;
775 } else if (state == BST_UNCHECKED) {
776 mode &= ~flag;
777 mode_set |= flag;
778 } else if (state == BST_INDETERMINATE) {
779 mode_set = ~flag;
780 }
781
782 perms_changed = true;
783
784 SendMessageW(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0);
785}
786
788 if (this->uid != uid) {
789 this->uid = uid;
790 uid_changed = true;
791
792 SendMessageW(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0);
793 }
794}
795
797 if (this->gid != gid) {
798 this->gid = gid;
799 gid_changed = true;
800
801 SendMessageW(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0);
802 }
803}
804
806 wstring size;
807 WCHAR old_text[1024];
808 int i;
810
811 for (i = 0; i < 5; i++) {
812 format_size(sizes[i], size, true);
813
814 GetDlgItemTextW(hDlg, items[i], old_text, sizeof(old_text) / sizeof(WCHAR));
815
816 if (size != old_text)
817 SetDlgItemTextW(hDlg, items[i], size.c_str());
818 }
819}
820
822 try {
823 switch (uMsg) {
824 case WM_INITDIALOG:
825 {
827
829
830 bps->update_size_details_dialog(hwndDlg);
831
832 if (bps->thread)
833 SetTimer(hwndDlg, 1, 250, nullptr);
834
835 return true;
836 }
837
838 case WM_COMMAND:
839 if (HIWORD(wParam) == BN_CLICKED && (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)) {
840 EndDialog(hwndDlg, 0);
841 return true;
842 }
843 break;
844
845 case WM_TIMER:
846 {
848
849 if (bps) {
850 bps->update_size_details_dialog(hwndDlg);
851
852 if (!bps->thread)
853 KillTimer(hwndDlg, 1);
854 }
855
856 break;
857 }
858 }
859 } catch (const exception& e) {
860 error_message(hwndDlg, e.what());
861 }
862
863 return false;
864}
865
866static void set_check_box(HWND hwndDlg, ULONG id, uint64_t min, uint64_t max) {
867 if (min && max) {
869 } else if (!min && !max) {
871 } else {
873
875 style &= ~BS_AUTOCHECKBOX;
878
880 }
881}
882
884 ULONG num_files, i;
885 WCHAR fn[MAX_PATH], modfn[MAX_PATH];
886
887 num_files = DragQueryFileW((HDROP)stgm.hGlobal, 0xFFFFFFFF, nullptr, 0);
888
889 if (num_files == 0)
890 return;
891
892 GetModuleFileNameW(module, modfn, sizeof(modfn) / sizeof(WCHAR));
893
894 for (i = 0; i < num_files; i++) {
895 if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / sizeof(WCHAR))) {
896 wstring t;
898
899#ifndef __REACTOS__
900 t = L"\""s + modfn + L"\",ShowPropSheet "s + fn;
901#else
902 t = wstring(L"\"") + modfn + wstring(L"\",ShowPropSheet ") + fn;
903#endif
904
905 RtlZeroMemory(&sei, sizeof(sei));
906
907 sei.cbSize = sizeof(sei);
908 sei.hwnd = hwndDlg;
909 sei.lpVerb = L"runas";
910 sei.lpFile = L"rundll32.exe";
911 sei.lpParameters = t.c_str();
912 sei.nShow = SW_SHOW;
914
915 if (!ShellExecuteExW(&sei))
916 throw last_error(GetLastError());
917
920
922 init_propsheet(hwndDlg);
923 }
924 }
925}
926
927// based on functions in sys/sysmacros.h
928#define major(rdev) ((((rdev) >> 8) & 0xFFF) | ((uint32_t)((rdev) >> 32) & ~0xFFF))
929#define minor(rdev) (((rdev) & 0xFF) | ((uint32_t)((rdev) >> 12) & ~0xFF))
930
932 wstring s;
933 ULONG sr;
934 int i;
935 HWND comptype;
936
941
942 if (various_subvols) {
944 throw last_error(GetLastError());
945 } else
946 wstring_sprintf(s, L"%llx", subvol);
947
948 SetDlgItemTextW(hwndDlg, IDC_SUBVOL, s.c_str());
949
950 if (various_inodes) {
952 throw last_error(GetLastError());
953 } else
954 wstring_sprintf(s, L"%llx", inode);
955
956 SetDlgItemTextW(hwndDlg, IDC_INODE, s.c_str());
957
958 if (various_types)
959 sr = IDS_VARIOUS;
960 else
962
963 if (various_inodes) {
964 if (sr == IDS_INODE_CHAR)
966 else if (sr == IDS_INODE_BLOCK)
968 }
969
970 if (sr == IDS_INODE_UNKNOWN) {
971 wstring t;
972
973 if (!load_string(module, sr, t))
974 throw last_error(GetLastError());
975
977 } else if (sr == IDS_INODE_CHAR || sr == IDS_INODE_BLOCK) {
978 wstring t;
979
980 if (!load_string(module, sr, t))
981 throw last_error(GetLastError());
982
984 } else {
985 if (!load_string(module, sr, s))
986 throw last_error(GetLastError());
987 }
988
989 SetDlgItemTextW(hwndDlg, IDC_TYPE, s.c_str());
990
991 if (size_format[0] == 0)
992 GetDlgItemTextW(hwndDlg, IDC_SIZE_ON_DISK, size_format, sizeof(size_format) / sizeof(WCHAR));
993
994 if (cr_format[0] == 0)
995 GetDlgItemTextW(hwndDlg, IDC_COMPRESSION_RATIO, cr_format, sizeof(cr_format) / sizeof(WCHAR));
996
997 if (frag_format[0] == 0)
998 GetDlgItemTextW(hwndDlg, IDC_FRAGMENTATION, frag_format, sizeof(frag_format) / sizeof(WCHAR));
999
1000 set_size_on_disk(hwndDlg);
1001
1002 if (thread)
1003 SetTimer(hwndDlg, 1, 250, nullptr);
1004
1007
1009 EnableWindow(GetDlgItem(hwndDlg, IDC_COMPRESS), false);
1011 EnableWindow(GetDlgItem(hwndDlg, IDC_NODATACOW), false);
1012
1013 comptype = GetDlgItem(hwndDlg, IDC_COMPRESS_TYPE);
1014
1015 while (SendMessageW(comptype, CB_GETCOUNT, 0, 0) > 0) {
1016 SendMessageW(comptype, CB_DELETESTRING, 0, 0);
1017 }
1018
1020 SendMessageW(comptype, CB_ADDSTRING, 0, (LPARAM)L"");
1021 SendMessageW(comptype, CB_SETCURSEL, 0, 0);
1022 }
1023
1024 i = 0;
1025 while (comp_types[i] != 0) {
1026 wstring t;
1027
1028 if (!load_string(module, comp_types[i], t))
1029 throw last_error(GetLastError());
1030
1031 SendMessageW(comptype, CB_ADDSTRING, 0, (LPARAM)t.c_str());
1032
1033 i++;
1034 }
1035
1039 }
1040
1042
1043 i = 0;
1044 while (perm_controls[i] != 0) {
1045 set_check_box(hwndDlg, perm_controls[i], min_mode & perms[i], max_mode & perms[i]);
1046 i++;
1047 }
1048
1049 if (various_uids) {
1051 throw last_error(GetLastError());
1052
1053 EnableWindow(GetDlgItem(hwndDlg, IDC_UID), 0);
1054 } else
1055 s = to_wstring(uid);
1056
1057 SetDlgItemTextW(hwndDlg, IDC_UID, s.c_str());
1058
1059 if (various_gids) {
1061 throw last_error(GetLastError());
1062
1063 EnableWindow(GetDlgItem(hwndDlg, IDC_GID), 0);
1064 } else
1065 s = to_wstring(gid);
1066
1067 SetDlgItemTextW(hwndDlg, IDC_GID, s.c_str());
1068
1070
1071 if (has_subvols)
1073
1074 if (!can_change_nocow)
1076
1077 if (!can_change_perms) {
1078 i = 0;
1079 while (perm_controls[i] != 0) {
1080 EnableWindow(GetDlgItem(hwndDlg, perm_controls[i]), 0);
1081 i++;
1082 }
1083
1084 EnableWindow(GetDlgItem(hwndDlg, IDC_UID), 0);
1085 EnableWindow(GetDlgItem(hwndDlg, IDC_GID), 0);
1086 EnableWindow(GetDlgItem(hwndDlg, IDC_SETUID), 0);
1087 }
1088
1089 if (readonly) {
1091 EnableWindow(GetDlgItem(hwndDlg, IDC_COMPRESS), 0);
1093 }
1094
1095 if (show_admin_button) {
1098 } else
1100}
1101
1103 try {
1104 switch (uMsg) {
1105 case WM_INITDIALOG:
1106 {
1108 BtrfsPropSheet* bps = (BtrfsPropSheet*)psp->lParam;
1109
1111
1113
1114 bps->init_propsheet(hwndDlg);
1115
1116 return false;
1117 }
1118
1119 case WM_COMMAND:
1120 {
1122
1123 if (bps && !bps->readonly) {
1124 switch (HIWORD(wParam)) {
1125 case BN_CLICKED: {
1126 switch (LOWORD(wParam)) {
1127 case IDC_NODATACOW:
1129 break;
1130
1131 case IDC_COMPRESS:
1133
1135 break;
1136
1137 case IDC_USERR:
1138 bps->change_perm_flag(hwndDlg, S_IRUSR, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1139 break;
1140
1141 case IDC_USERW:
1142 bps->change_perm_flag(hwndDlg, S_IWUSR, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1143 break;
1144
1145 case IDC_USERX:
1146 bps->change_perm_flag(hwndDlg, S_IXUSR, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1147 break;
1148
1149 case IDC_GROUPR:
1150 bps->change_perm_flag(hwndDlg, S_IRGRP, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1151 break;
1152
1153 case IDC_GROUPW:
1154 bps->change_perm_flag(hwndDlg, S_IWGRP, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1155 break;
1156
1157 case IDC_GROUPX:
1158 bps->change_perm_flag(hwndDlg, S_IXGRP, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1159 break;
1160
1161 case IDC_OTHERR:
1162 bps->change_perm_flag(hwndDlg, S_IROTH, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1163 break;
1164
1165 case IDC_OTHERW:
1166 bps->change_perm_flag(hwndDlg, S_IWOTH, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1167 break;
1168
1169 case IDC_OTHERX:
1170 bps->change_perm_flag(hwndDlg, S_IXOTH, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1171 break;
1172
1173 case IDC_SETUID:
1174 bps->change_perm_flag(hwndDlg, S_ISUID, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1175 break;
1176
1177 case IDC_SETGID:
1178 bps->change_perm_flag(hwndDlg, S_ISGID, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1179 break;
1180
1181 case IDC_STICKY:
1182 bps->change_perm_flag(hwndDlg, S_ISVTX, IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
1183 break;
1184
1185 case IDC_SUBVOL_RO:
1186 switch (IsDlgButtonChecked(hwndDlg, LOWORD(wParam))) {
1187 case BST_CHECKED:
1188 bps->ro_subvol = true;
1189 bps->ro_changed = true;
1190 break;
1191
1192 case BST_UNCHECKED:
1193 bps->ro_subvol = false;
1194 bps->ro_changed = true;
1195 break;
1196
1197 case BST_INDETERMINATE:
1198 bps->ro_changed = false;
1199 break;
1200 }
1201
1202 SendMessageW(GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0);
1203 break;
1204
1205 case IDC_OPEN_ADMIN:
1206 bps->open_as_admin(hwndDlg);
1207 break;
1208 }
1209
1210 break;
1211 }
1212
1213 case EN_CHANGE: {
1214 switch (LOWORD(wParam)) {
1215 case IDC_UID: {
1216 WCHAR s[255];
1217
1218 GetDlgItemTextW(hwndDlg, LOWORD(wParam), s, sizeof(s) / sizeof(WCHAR));
1219
1220 bps->change_uid(hwndDlg, _wtoi(s));
1221 break;
1222 }
1223
1224 case IDC_GID: {
1225 WCHAR s[255];
1226
1227 GetDlgItemTextW(hwndDlg, LOWORD(wParam), s, sizeof(s) / sizeof(WCHAR));
1228
1229 bps->change_gid(hwndDlg, _wtoi(s));
1230 break;
1231 }
1232 }
1233
1234 break;
1235 }
1236
1237 case CBN_SELCHANGE: {
1238 switch (LOWORD(wParam)) {
1239 case IDC_COMPRESS_TYPE: {
1240 auto sel = SendMessageW(GetDlgItem(hwndDlg, LOWORD(wParam)), CB_GETCURSEL, 0, 0);
1241
1242 if (bps->min_compression_type != bps->max_compression_type) {
1243 if (sel == 0)
1244 bps->compress_type_changed = false;
1245 else {
1246 bps->compress_type = (uint8_t)(sel - 1);
1247 bps->compress_type_changed = true;
1248 }
1249 } else {
1250 bps->compress_type = (uint8_t)sel;
1251 bps->compress_type_changed = true;
1252 }
1253
1254 SendMessageW(GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0);
1255
1256 break;
1257 }
1258 }
1259
1260 break;
1261 }
1262 }
1263 }
1264
1265 break;
1266 }
1267
1268 case WM_NOTIFY:
1269 {
1270 switch (((LPNMHDR)lParam)->code) {
1271 case PSN_KILLACTIVE:
1272 SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, false);
1273 break;
1274
1275 case PSN_APPLY: {
1277
1278 bps->apply_changes(hwndDlg);
1280 break;
1281 }
1282
1283 case NM_CLICK:
1284 case NM_RETURN: {
1285 if (((LPNMHDR)lParam)->hwndFrom == GetDlgItem(hwndDlg, IDC_SIZE_ON_DISK)) {
1286 PNMLINK pNMLink = (PNMLINK)lParam;
1287
1288 if (pNMLink->item.iLink == 0)
1290 }
1291 break;
1292 }
1293 }
1294 }
1295
1296 case WM_TIMER:
1297 {
1299
1300 if (bps) {
1301 bps->set_size_on_disk(hwndDlg);
1302
1303 if (!bps->thread)
1304 KillTimer(hwndDlg, 1);
1305 }
1306
1307 break;
1308 }
1309 }
1310 } catch (const exception& e) {
1311 error_message(hwndDlg, e.what());
1312 }
1313
1314 return false;
1315}
1316
1318 try {
1319 PROPSHEETPAGEW psp;
1320 HPROPSHEETPAGE hPage;
1322
1323 if (ignore)
1324 return S_OK;
1325
1326 icex.dwSize = sizeof(icex);
1327 icex.dwICC = ICC_LINK_CLASS;
1328
1329 if (!InitCommonControlsEx(&icex))
1331
1332 psp.dwSize = sizeof(psp);
1334 psp.hInstance = module;
1336 psp.hIcon = 0;
1339 psp.pcRefParent = (UINT*)&objs_loaded;
1340 psp.pfnCallback = nullptr;
1341 psp.lParam = (LPARAM)this;
1342
1343 hPage = CreatePropertySheetPageW(&psp);
1344
1345 if (hPage) {
1346 if (pfnAddPage(hPage, lParam)) {
1347 this->AddRef();
1348 return S_OK;
1349 } else
1351 } else
1352 return E_OUTOFMEMORY;
1353 } catch (const exception& e) {
1354 error_message(nullptr, e.what());
1355 }
1356
1357 return E_FAIL;
1358}
1359
1361 return S_OK;
1362}
1363
1364#ifdef __cplusplus
1365extern "C" {
1366#endif
1367
1368void CALLBACK ShowPropSheetW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow) {
1369 try {
1370 BtrfsPropSheet bps;
1371 PROPSHEETPAGEW psp;
1372 PROPSHEETHEADERW psh;
1374 wstring title;
1375
1376 set_dpi_aware();
1377
1379
1380 bps.set_cmdline(lpszCmdLine);
1381
1382 icex.dwSize = sizeof(icex);
1383 icex.dwICC = ICC_LINK_CLASS;
1384
1385 if (!InitCommonControlsEx(&icex))
1387
1388 psp.dwSize = sizeof(psp);
1389 psp.dwFlags = PSP_USETITLE;
1390 psp.hInstance = module;
1392 psp.hIcon = 0;
1395 psp.pfnCallback = nullptr;
1396 psp.lParam = (LPARAM)&bps;
1397
1398 memset(&psh, 0, sizeof(PROPSHEETHEADERW));
1399
1400 psh.dwSize = sizeof(PROPSHEETHEADERW);
1402 psh.hwndParent = hwnd;
1403 psh.hInstance = psp.hInstance;
1404 psh.pszCaption = title.c_str();
1405 psh.nPages = 1;
1406 psh.ppsp = &psp;
1407
1408 if (PropertySheetW(&psh) < 0)
1409 throw last_error(GetLastError());
1410 } catch (const exception& e) {
1411 error_message(hwnd, e.what());
1412 }
1413}
1414
1415#ifdef __cplusplus
1416}
1417#endif
unsigned char BOOLEAN
Arabic default style
Definition: afstyles.h:94
static int state
Definition: maze.c:121
LONG NTSTATUS
Definition: precomp.h:26
#define CF_HDROP
Definition: constants.h:410
const GUID IID_IUnknown
#define FSCTL_BTRFS_SET_INODE_INFO
Definition: btrfsioctl.h:11
#define FSCTL_BTRFS_GET_INODE_INFO
Definition: btrfsioctl.h:10
bool various_uids
Definition: propsheet.h:181
void change_perm_flag(HWND hDlg, ULONG perm, UINT state)
Definition: propsheet.cpp:771
uint8_t max_compression_type
Definition: propsheet.h:179
void change_gid(HWND hDlg, uint32_t gid)
Definition: propsheet.cpp:796
bool can_change_nocow
Definition: propsheet.h:173
STGMEDIUM stgm
Definition: propsheet.h:187
uint64_t sizes[5]
Definition: propsheet.h:190
void change_uid(HWND hDlg, uint32_t uid)
Definition: propsheet.cpp:787
uint32_t mode_set
Definition: propsheet.h:176
bool can_change_perms
Definition: propsheet.h:172
bool various_inodes
Definition: propsheet.h:181
virtual HRESULT __stdcall AddPages(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam)
Definition: propsheet.cpp:1317
void init_propsheet(HWND hwndDlg)
Definition: propsheet.cpp:931
WCHAR size_format[255]
Definition: propsheet.h:174
DWORD search_list_thread()
Definition: propsheet.cpp:154
uint64_t totalsize
Definition: propsheet.h:190
bool show_admin_button
Definition: propsheet.h:182
HRESULT __stdcall QueryInterface(REFIID riid, void **ppObj)
Definition: propsheet.cpp:73
bool various_types
Definition: propsheet.h:181
void do_search(const wstring &fn)
Definition: propsheet.cpp:88
HANDLE thread
Definition: propsheet.h:175
bool perms_changed
Definition: propsheet.h:189
uint8_t min_compression_type
Definition: propsheet.h:179
void apply_changes(HWND hDlg)
Definition: propsheet.cpp:698
void set_size_on_disk(HWND hwndDlg)
Definition: propsheet.cpp:730
bool has_subvols
Definition: propsheet.h:181
ULONG __stdcall AddRef()
Definition: propsheet.h:136
bool gid_changed
Definition: propsheet.h:189
uint32_t uid
Definition: propsheet.h:180
virtual HRESULT __stdcall Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID)
Definition: propsheet.cpp:361
WCHAR cr_format[255]
Definition: propsheet.h:174
HRESULT load_file_list()
Definition: propsheet.cpp:318
uint32_t max_mode
Definition: propsheet.h:176
bool various_gids
Definition: propsheet.h:181
uint64_t num_extents
Definition: propsheet.h:190
uint64_t min_flags
Definition: propsheet.h:177
uint32_t sector_size
Definition: propsheet.h:193
uint64_t rdev
Definition: propsheet.h:178
uint64_t flags_set
Definition: propsheet.h:177
void set_cmdline(const wstring &cmdline)
Definition: propsheet.cpp:414
uint64_t sparsesize
Definition: propsheet.h:190
WCHAR frag_format[255]
Definition: propsheet.h:174
bool various_subvols
Definition: propsheet.h:181
HRESULT check_file(const wstring &fn, UINT i, UINT num_files, UINT *sv)
Definition: propsheet.cpp:172
void apply_changes_file(HWND hDlg, const wstring &fn)
Definition: propsheet.cpp:615
bool flags_changed
Definition: propsheet.h:189
virtual HRESULT __stdcall ReplacePage(UINT uPageID, LPFNADDPROPSHEETPAGE pfnReplacePage, LPARAM lParam)
Definition: propsheet.cpp:1360
bool compress_type_changed
Definition: propsheet.h:181
uint64_t subvol
Definition: propsheet.h:178
void open_as_admin(HWND hwndDlg)
Definition: propsheet.cpp:883
bool uid_changed
Definition: propsheet.h:189
uint32_t gid
Definition: propsheet.h:180
deque< wstring > search_list
Definition: propsheet.h:191
uint32_t min_mode
Definition: propsheet.h:176
void change_inode_flag(HWND hDlg, uint64_t flag, UINT state)
Definition: propsheet.cpp:586
uint64_t max_flags
Definition: propsheet.h:177
uint8_t compress_type
Definition: propsheet.h:179
uint64_t allocsize
Definition: propsheet.h:190
void update_size_details_dialog(HWND hDlg)
Definition: propsheet.cpp:805
void pop_front()
Definition: _deque.h:722
void push_back(const value_type &__t=_STLP_DEFAULT_CONSTRUCTED(_Tp))
Definition: _deque.h:668
bool empty() const
Definition: _deque.h:473
size_type size() const
Definition: _deque.h:471
reference front()
Definition: _deque.h:458
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:900
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define DLGPROC
Definition: maze.c:62
UINT32 uint32_t
Definition: types.h:75
UINT64 uint64_t
Definition: types.h:77
#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
void wstring_sprintf(wstring &s, wstring fmt,...)
Definition: main.cpp:225
void format_size(uint64_t size, wstring &s, bool show_bytes)
Definition: main.cpp:65
#define IDS_STANDALONE_PROPSHEET_TITLE
Definition: resource.h:127
#define IDC_TYPE
Definition: resource.h:223
#define IDC_STICKY
Definition: resource.h:234
#define IDC_NODATACOW
Definition: resource.h:220
#define IDD_PROP_SHEET
Definition: resource.h:15
#define IDC_GROUPW
Definition: resource.h:215
#define IDC_OTHERX
Definition: resource.h:219
#define IDC_FRAGMENTATION
Definition: resource.h:242
#define IDS_COMPRESS_ANY
Definition: resource.h:124
#define IDC_GID
Definition: resource.h:210
#define IDC_COMPRESS
Definition: resource.h:224
#define IDS_PROP_SHEET_TITLE
Definition: resource.h:16
#define IDS_INODE_SYMLINK
Definition: resource.h:26
#define IDC_SIZE_INLINE
Definition: resource.h:227
#define IDC_SUBVOL
Definition: resource.h:221
#define IDS_INODE_UNKNOWN
Definition: resource.h:27
#define IDC_GROUPX
Definition: resource.h:218
#define IDC_OPEN_ADMIN
Definition: resource.h:276
#define IDC_SIZE_UNCOMPRESSED
Definition: resource.h:229
#define IDS_COMPRESS_ZSTD
Definition: resource.h:200
#define IDS_INODE_CHAR_SIMPLE
Definition: resource.h:39
#define IDC_GROUPR
Definition: resource.h:212
#define IDC_USERW
Definition: resource.h:214
#define IDS_VARIOUS
Definition: resource.h:38
#define IDS_COMPRESS_LZO
Definition: resource.h:126
#define IDS_INODE_BLOCK
Definition: resource.h:23
#define IDS_INODE_DIR
Definition: resource.h:20
#define IDC_SIZE_LZO
Definition: resource.h:236
#define IDC_SIZE_ON_DISK
Definition: resource.h:225
#define IDC_UID
Definition: resource.h:209
#define IDD_SIZE_DETAILS
Definition: resource.h:8
#define IDS_INODE_SOCKET
Definition: resource.h:25
#define IDC_SIZE_ZSTD
Definition: resource.h:239
#define IDC_OTHERW
Definition: resource.h:216
#define IDC_USERX
Definition: resource.h:217
#define IDC_INODE
Definition: resource.h:222
#define IDS_INITCOMMONCONTROLSEX_FAILED
Definition: resource.h:205
#define IDC_SIZE_ZLIB
Definition: resource.h:232
#define IDC_COMPRESSION_RATIO
Definition: resource.h:240
#define IDS_COMPRESS_ZLIB
Definition: resource.h:125
#define IDS_INODE_FIFO
Definition: resource.h:24
#define IDS_INODE_BLOCK_SIMPLE
Definition: resource.h:40
#define IDS_INODE_CHAR
Definition: resource.h:22
#define IDC_USERR
Definition: resource.h:211
#define IDC_OTHERR
Definition: resource.h:213
#define IDC_SETGID
Definition: resource.h:231
#define IDC_SETUID
Definition: resource.h:228
#define IDS_INODE_FILE
Definition: resource.h:18
#define IDC_SUBVOL_RO
Definition: resource.h:320
#define IDC_COMPRESS_TYPE
Definition: resource.h:318
HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage)
Definition: propsheet.c:3086
INT_PTR WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh)
Definition: propsheet.c:2916
BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
Definition: propsheet.c:3155
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define GetFileSizeEx
Definition: compat.h:757
#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
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
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 WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2033
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
Definition: shellole.c:622
#define INFINITE
Definition: serial.h:102
#define ETDT_ENABLETAB
Definition: dxdiag.c:30
unsigned long DWORD
Definition: ntddk_ex.h:95
@ FileBasicInformation
Definition: from_kernel.h:65
@ FileFsSizeInformation
Definition: from_kernel.h:221
Status
Definition: gdiplustypes.h:25
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble s
Definition: gl.h:2039
GLdouble GLdouble t
Definition: gl.h:2047
GLsizeiptr size
Definition: glext.h:5919
GLenum mode
Definition: glext.h:6217
GLbitfield flags
Definition: glext.h:7161
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 flag
Definition: glfuncs.h:52
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
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
#define ss
Definition: i386-dis.c:441
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
REFIID riid
Definition: atlbase.h:39
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
const char * filename
Definition: ioapi.h:137
#define e
Definition: ke_i.h:82
#define FILE_FLAG_OPEN_REPARSE_POINT
Definition: disk.h:39
#define FILE_FLAG_BACKUP_SEMANTICS
Definition: disk.h:41
static HINSTANCE hinst
Definition: edit.c:551
static PIO_STATUS_BLOCK iosb
Definition: file.c:98
static float(__cdecl *square_half_float)(float x
#define min(a, b)
Definition: monoChain.cc:55
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
BYTE uint8_t
Definition: msvideo1.c:66
static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
Definition: muireg.c:10
unsigned int UINT
Definition: ndis.h:50
#define uint8_t
Definition: nsiface.idl:59
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define WRITE_DAC
Definition: nt_native.h:59
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
ULONG ACCESS_MASK
Definition: nt_native.h:40
#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
NTSYSAPI NTSTATUS NTAPI NtQueryInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, OUT PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
#define FILE_TRAVERSE
Definition: nt_native.h:643
#define FILE_WRITE_ATTRIBUTES
Definition: nt_native.h:649
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define WRITE_OWNER
Definition: nt_native.h:60
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 MAXIMUM_ALLOWED
Definition: nt_native.h:83
#define L(x)
Definition: ntvdm.h:50
static TCHAR * items[]
Definition: page1.c:45
#define LOWORD(l)
Definition: pedump.c:82
#define BS_AUTO3STATE
Definition: pedump.c:657
#define S_IXGRP
Definition: propsheet.h:49
#define S_IROTH
Definition: propsheet.h:53
#define BTRFS_INODE_COMPRESS
Definition: propsheet.h:87
#define S_ISUID
Definition: propsheet.h:65
#define S_IXOTH
Definition: propsheet.h:61
#define BTRFS_INODE_NODATASUM
Definition: propsheet.h:76
#define S_IRGRP
Definition: propsheet.h:41
#define S_IWOTH
Definition: propsheet.h:57
LONG objs_loaded
Definition: main.cpp:48
#define S_IRUSR
Definition: propsheet.h:29
#define S_ISVTX
Definition: propsheet.h:73
#define BTRFS_INODE_NODATACOW
Definition: propsheet.h:77
#define S_ISGID
Definition: propsheet.h:69
#define S_IWUSR
Definition: propsheet.h:33
#define S_IWGRP
Definition: propsheet.h:45
#define S_IXUSR
Definition: propsheet.h:37
#define PSM_CHANGED
Definition: prsht.h:164
#define PSP_USEREFPARENT
Definition: prsht.h:29
#define PSP_USETITLE
Definition: prsht.h:26
#define PSN_KILLACTIVE
Definition: prsht.h:116
#define PSN_APPLY
Definition: prsht.h:117
#define PSNRET_NOERROR
Definition: prsht.h:129
#define PSH_PROPSHEETPAGE
Definition: prsht.h:43
BOOL(CALLBACK * LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE, LPARAM)
Definition: prsht.h:327
struct _PROPSHEETHEADERW PROPSHEETHEADERW
static char title[]
Definition: ps.c:92
struct tagNMLINK * PNMLINK
#define BCM_SETSHIELD
Definition: commctrl.h:4658
#define NM_CLICK
Definition: commctrl.h:130
#define NM_RETURN
Definition: commctrl.h:132
#define ICC_LINK_CLASS
Definition: commctrl.h:74
#define REFIID
Definition: guiddef.h:118
#define WM_NOTIFY
Definition: richedit.h:61
#define memset(x, y, z)
Definition: compat.h:39
#define SEE_MASK_NOCLOSEPROCESS
Definition: shellapi.h:31
static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: propsheet.cpp:1102
void CALLBACK ShowPropSheetW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
Definition: propsheet.cpp:1368
static ULONG inode_type_to_string_ref(uint8_t type)
Definition: propsheet.cpp:558
struct _FILE_STANDARD_INFORMATION * PFILE_STANDARD_INFORMATION
#define SUBVOL_ROOT_INODE
Definition: propsheet.cpp:42
static INT_PTR CALLBACK SizeDetailsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: propsheet.cpp:821
static DWORD WINAPI global_search_list_thread(LPVOID lpParameter)
Definition: propsheet.cpp:166
struct _FILE_ACCESS_INFORMATION FILE_ACCESS_INFORMATION
#define FileAccessInformation
Definition: propsheet.cpp:51
#define minor(rdev)
Definition: propsheet.cpp:929
struct _FILE_ACCESS_INFORMATION * PFILE_ACCESS_INFORMATION
#define FileStandardInformation
Definition: propsheet.cpp:61
struct _FILE_STANDARD_INFORMATION FILE_STANDARD_INFORMATION
struct _FILE_FS_SIZE_INFORMATION FILE_FS_SIZE_INFORMATION
static void set_check_box(HWND hwndDlg, ULONG id, uint64_t min, uint64_t max)
Definition: propsheet.cpp:866
struct _FILE_FS_SIZE_INFORMATION * PFILE_FS_SIZE_INFORMATION
#define major(rdev)
Definition: propsheet.cpp:928
#define BTRFS_TYPE_FILE
Definition: shellext.h:85
NTSTATUS NTAPI NtQueryVolumeInformationFile(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FsInformation, ULONG Length, FS_INFORMATION_CLASS FsInformationClass)
#define BTRFS_TYPE_DIRECTORY
Definition: shellext.h:86
#define BTRFS_TYPE_SOCKET
Definition: shellext.h:90
#define BTRFS_TYPE_FIFO
Definition: shellext.h:89
#define BTRFS_TYPE_SYMLINK
Definition: shellext.h:91
#define BTRFS_TYPE_CHARDEV
Definition: shellext.h:87
#define BTRFS_TYPE_BLOCKDEV
Definition: shellext.h:88
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2434
HRESULT hr
Definition: shlfolder.c:183
TCHAR * cmdline
Definition: stretchblt.cpp:32
LARGE_INTEGER TotalAllocationUnits
Definition: from_kernel.h:263
LARGE_INTEGER AvailableAllocationUnits
Definition: from_kernel.h:264
LARGE_INTEGER AllocationSize
Definition: propsheet.cpp:54
LPCPROPSHEETPAGEW ppsp
Definition: prsht.h:308
HINSTANCE hInstance
Definition: prsht.h:296
DWORD dwSize
Definition: prsht.h:293
DWORD dwFlags
Definition: prsht.h:294
HWND hwndParent
Definition: prsht.h:295
LPCWSTR pszCaption
Definition: prsht.h:301
DLGPROC pfnDlgProc
Definition: prsht.h:226
DWORD dwSize
Definition: prsht.h:214
DWORD dwFlags
Definition: prsht.h:215
LPARAM lParam
Definition: prsht.h:227
HICON hIcon
Definition: prsht.h:222
LPCWSTR pszTemplate
Definition: prsht.h:218
struct _PROPSHEETPAGEW *UINT * pcRefParent
Definition: prsht.h:229
LPCWSTR pszTitle
Definition: prsht.h:225
HINSTANCE hInstance
Definition: prsht.h:216
LPCWSTR lpParameters
Definition: shellapi.h:334
uint32_t st_mode
Definition: btrfsioctl.h:76
uint64_t disk_size_zlib
Definition: btrfsioctl.h:81
uint32_t inline_length
Definition: btrfsioctl.h:79
uint64_t st_rdev
Definition: btrfsioctl.h:77
uint64_t sparse_size
Definition: btrfsioctl.h:85
uint32_t num_extents
Definition: btrfsioctl.h:86
uint64_t disk_size_lzo
Definition: btrfsioctl.h:82
uint64_t disk_size_zstd
Definition: btrfsioctl.h:84
uint32_t st_gid
Definition: btrfsioctl.h:75
uint64_t flags
Definition: btrfsioctl.h:78
uint32_t st_uid
Definition: btrfsioctl.h:74
uint64_t inode
Definition: btrfsioctl.h:71
uint64_t disk_size_uncompressed
Definition: btrfsioctl.h:80
uint8_t compression_type
Definition: btrfsioctl.h:83
uint64_t subvol
Definition: btrfsioctl.h:70
uint8_t compression_type
Definition: btrfsioctl.h:98
BOOL compression_type_changed
Definition: btrfsioctl.h:99
Definition: inflate.c:139
Definition: format.c:58
Definition: fs.h:78
int iLink
Definition: commctrl.h:4758
#define max(a, b)
Definition: svc.c:63
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define GWLP_USERDATA
Definition: treelist.c:63
int32_t INT_PTR
Definition: typedefs.h:64
#define __stdcall
Definition: typedefs.h:25
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
LONGLONG QuadPart
Definition: typedefs.h:114
HRESULT WINAPI EnableThemeDialogTexture(_In_ HWND hwnd, _In_ DWORD dwFlags)
Definition: uxthemesupp.c:55
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
#define ZeroMemory
Definition: winbase.h:1737
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:2364
#define BST_INDETERMINATE
Definition: winuser.h:198
#define SW_HIDE
Definition: winuser.h:771
#define GetWindowLongPtrW
Definition: winuser.h:4832
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define IDCANCEL
Definition: winuser.h:834
#define BST_UNCHECKED
Definition: winuser.h:199
#define WM_COMMAND
Definition: winuser.h:1743
#define CB_SETCURSEL
Definition: winuser.h:1964
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
#define WM_INITDIALOG
Definition: winuser.h:1742
#define CB_GETCOUNT
Definition: winuser.h:1945
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:833
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define CBN_SELCHANGE
Definition: winuser.h:1982
#define BM_SETCHECK
Definition: winuser.h:1924
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define WM_TIMER
Definition: winuser.h:1745
#define CB_ADDSTRING
Definition: winuser.h:1939
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
HWND WINAPI GetParent(_In_ HWND)
#define DWLP_MSGRESULT
Definition: winuser.h:873
#define BN_CLICKED
Definition: winuser.h:1928
#define SW_SHOW
Definition: winuser.h:778
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define CB_GETCURSEL
Definition: winuser.h:1946
#define SetWindowLongPtrW
Definition: winuser.h:5358
#define CB_DELETESTRING
Definition: winuser.h:1940
#define GWL_STYLE
Definition: winuser.h:855
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define BST_CHECKED
Definition: winuser.h:197
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 EN_CHANGE
Definition: winuser.h:2025
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184