ReactOS 0.4.15-dev-7897-g78dc504
BtrfsPropSheet Class Reference

#include <propsheet.h>

Inheritance diagram for BtrfsPropSheet:
Collaboration diagram for BtrfsPropSheet:

Public Member Functions

 BtrfsPropSheet ()
 
virtual ~BtrfsPropSheet ()
 
HRESULT __stdcall QueryInterface (REFIID riid, void **ppObj)
 
ULONG __stdcall AddRef ()
 
ULONG __stdcall Release ()
 
virtual HRESULT __stdcall Initialize (PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID)
 
virtual HRESULT __stdcall AddPages (LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam)
 
virtual HRESULT __stdcall ReplacePage (UINT uPageID, LPFNADDPROPSHEETPAGE pfnReplacePage, LPARAM lParam)
 
void init_propsheet (HWND hwndDlg)
 
void change_inode_flag (HWND hDlg, uint64_t flag, UINT state)
 
void change_perm_flag (HWND hDlg, ULONG perm, UINT state)
 
void change_uid (HWND hDlg, uint32_t uid)
 
void change_gid (HWND hDlg, uint32_t gid)
 
void apply_changes (HWND hDlg)
 
void set_size_on_disk (HWND hwndDlg)
 
DWORD search_list_thread ()
 
void do_search (const wstring &fn)
 
void update_size_details_dialog (HWND hDlg)
 
void open_as_admin (HWND hwndDlg)
 
void set_cmdline (const wstring &cmdline)
 
HRESULT Initialize ([in] PCIDLIST_ABSOLUTE pidlFolder, [in] IDataObject *pdtobj, [in] HKEY hkeyProgID)
 
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 

Public Attributes

bool readonly
 
bool can_change_perms
 
bool can_change_nocow
 
WCHAR size_format [255]
 
WCHAR cr_format [255]
 
WCHAR frag_format [255]
 
HANDLE thread
 
uint32_t min_mode
 
uint32_t max_mode
 
uint32_t mode
 
uint32_t mode_set
 
uint64_t min_flags
 
uint64_t max_flags
 
uint64_t flags
 
uint64_t flags_set
 
uint64_t subvol
 
uint64_t inode
 
uint64_t rdev
 
uint8_t type
 
uint8_t min_compression_type
 
uint8_t max_compression_type
 
uint8_t compress_type
 
uint32_t uid
 
uint32_t gid
 
bool various_subvols
 
bool various_inodes
 
bool various_types
 
bool various_uids
 
bool various_gids
 
bool compress_type_changed
 
bool has_subvols
 
bool ro_subvol
 
bool various_ro
 
bool ro_changed
 
bool show_admin_button
 

Private Member Functions

void apply_changes_file (HWND hDlg, const wstring &fn)
 
HRESULT check_file (const wstring &fn, UINT i, UINT num_files, UINT *sv)
 
HRESULT load_file_list ()
 
- Private Member Functions inherited from IShellPropSheetExt
HRESULT AddPages ([in] LPFNSVADDPROPSHEETPAGE pfnAddPage, [in] LPARAM lParam)
 
HRESULT ReplacePage ([in] EXPPS uPageID, [in] LPFNSVADDPROPSHEETPAGE pfnReplaceWith, [in] LPARAM lParam)
 
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 

Private Attributes

LONG refcount
 
bool ignore
 
STGMEDIUM stgm
 
bool stgm_set
 
bool flags_changed
 
bool perms_changed
 
bool uid_changed
 
bool gid_changed
 
uint64_t sizes [5]
 
uint64_t totalsize
 
uint64_t allocsize
 
uint64_t sparsesize
 
uint64_t num_extents
 
deque< wstring > search_list
 
wstring filename
 
uint32_t sector_size
 

Additional Inherited Members

- Public Types inherited from IShellExtInit
typedef IShellExtInitLPSHELLEXTINIT
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Private Types inherited from IShellPropSheetExt
enum  tagSHELLPROPSHEETEXTPAGEID { EXPPS_FILETYPES = 0x1 }
 
typedef UINT EXPPS
 
- Private Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 

Detailed Description

Definition at line 91 of file propsheet.h.

Constructor & Destructor Documentation

◆ BtrfsPropSheet()

BtrfsPropSheet::BtrfsPropSheet ( )
inline

Definition at line 93 of file propsheet.h.

93 {
94 refcount = 0;
95 ignore = true;
96 stgm_set = false;
97 readonly = false;
98 flags_changed = false;
99 perms_changed = false;
100 uid_changed = false;
101 gid_changed = false;
102 compress_type_changed = false;
103 ro_changed = false;
104 can_change_perms = false;
105 show_admin_button = false;
106 thread = nullptr;
107 mode = mode_set = 0;
108 flags = flags_set = 0;
109 has_subvols = false;
110 filename = L"";
111
112 sizes[0] = sizes[1] = sizes[2] = sizes[3] = sizes[4] = 0;
114 num_extents = 0;
115 sector_size = 0;
116 size_format[0] = 0;
117 cr_format[0] = 0;
118 frag_format[0] = 0;
119
121 }
#define InterlockedIncrement
Definition: armddk.h:53
uint64_t sizes[5]
Definition: propsheet.h:190
uint32_t mode_set
Definition: propsheet.h:176
bool can_change_perms
Definition: propsheet.h:172
WCHAR size_format[255]
Definition: propsheet.h:174
uint64_t totalsize
Definition: propsheet.h:190
bool show_admin_button
Definition: propsheet.h:182
HANDLE thread
Definition: propsheet.h:175
bool perms_changed
Definition: propsheet.h:189
bool has_subvols
Definition: propsheet.h:181
bool gid_changed
Definition: propsheet.h:189
WCHAR cr_format[255]
Definition: propsheet.h:174
uint64_t num_extents
Definition: propsheet.h:190
uint32_t sector_size
Definition: propsheet.h:193
uint64_t flags_set
Definition: propsheet.h:177
uint64_t sparsesize
Definition: propsheet.h:190
WCHAR frag_format[255]
Definition: propsheet.h:174
bool flags_changed
Definition: propsheet.h:189
bool compress_type_changed
Definition: propsheet.h:181
bool uid_changed
Definition: propsheet.h:189
uint64_t allocsize
Definition: propsheet.h:190
GLenum mode
Definition: glext.h:6217
GLbitfield flags
Definition: glext.h:7161
const char * filename
Definition: ioapi.h:137
#define L(x)
Definition: ntvdm.h:50
LONG objs_loaded
Definition: main.cpp:48

◆ ~BtrfsPropSheet()

virtual BtrfsPropSheet::~BtrfsPropSheet ( )
inlinevirtual

Definition at line 123 of file propsheet.h.

123 {
124 if (stgm_set) {
125 GlobalUnlock(stgm.hGlobal);
127 }
128
130 }
#define InterlockedDecrement
Definition: armddk.h:52
STGMEDIUM stgm
Definition: propsheet.h:187
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2033
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190

Member Function Documentation

◆ AddPages()

HRESULT __stdcall BtrfsPropSheet::AddPages ( LPFNADDPROPSHEETPAGE  pfnAddPage,
LPARAM  lParam 
)
virtual

Definition at line 1317 of file propsheet.cpp.

1317 {
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}
ULONG __stdcall AddRef()
Definition: propsheet.h:136
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:893
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define DLGPROC
Definition: maze.c:62
void error_message(HWND hwnd, const char *msg)
Definition: main.cpp:783
#define IDD_PROP_SHEET
Definition: resource.h:15
#define IDS_PROP_SHEET_TITLE
Definition: resource.h:16
#define IDS_INITCOMMONCONTROLSEX_FAILED
Definition: resource.h:205
HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage)
Definition: propsheet.c:3083
BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
Definition: propsheet.c:3152
#define S_OK
Definition: intsafe.h:52
#define e
Definition: ke_i.h:82
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
unsigned int UINT
Definition: ndis.h:50
static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: propsheet.cpp:1102
#define PSP_USEREFPARENT
Definition: prsht.h:29
#define PSP_USETITLE
Definition: prsht.h:26
#define ICC_LINK_CLASS
Definition: commctrl.h:74
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
LONG_PTR LPARAM
Definition: windef.h:208
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

◆ AddRef()

ULONG __stdcall BtrfsPropSheet::AddRef ( void  )
inline

Implements IUnknown.

Definition at line 136 of file propsheet.h.

136 {
138 }

Referenced by AddPages(), and QueryInterface().

◆ apply_changes()

void BtrfsPropSheet::apply_changes ( HWND  hDlg)

Definition at line 698 of file propsheet.cpp.

698 {
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}
bool various_uids
Definition: propsheet.h:181
bool various_gids
Definition: propsheet.h:181
void apply_changes_file(HWND hDlg, const wstring &fn)
Definition: propsheet.cpp:615
#define MAX_PATH
Definition: compat.h:34
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
Definition: shellole.c:622
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 GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by PropSheetDlgProc().

◆ apply_changes_file()

void BtrfsPropSheet::apply_changes_file ( HWND  hDlg,
const wstring &  fn 
)
private

Definition at line 615 of file propsheet.cpp.

615 {
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}
LONG NTSTATUS
Definition: precomp.h:26
#define FSCTL_BTRFS_SET_INODE_INFO
Definition: btrfsioctl.h:11
#define FSCTL_BTRFS_GET_INODE_INFO
Definition: btrfsioctl.h:10
uint32_t uid
Definition: propsheet.h:180
uint32_t max_mode
Definition: propsheet.h:176
uint32_t gid
Definition: propsheet.h:180
uint32_t min_mode
Definition: propsheet.h:176
uint8_t compress_type
Definition: propsheet.h:179
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileW
Definition: compat.h:741
#define FILE_SHARE_READ
Definition: compat.h:136
BOOL WINAPI GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation)
Definition: fileinfo.c:458
@ FileBasicInformation
Definition: from_kernel.h:65
Status
Definition: gdiplustypes.h:25
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
#define FILE_FLAG_OPEN_REPARSE_POINT
Definition: disk.h:39
#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 WRITE_DAC
Definition: nt_native.h:59
#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 FILE_WRITE_ATTRIBUTES
Definition: nt_native.h:649
#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 SUBVOL_ROOT_INODE
Definition: propsheet.cpp:42
#define S_ISUID
Definition: propsheet.h:65
#define memset(x, y, z)
Definition: compat.h:39
uint32_t st_mode
Definition: btrfsioctl.h:76
uint64_t flags
Definition: btrfsioctl.h:78
uint64_t inode
Definition: btrfsioctl.h:71
uint8_t compression_type
Definition: btrfsioctl.h:98
BOOL compression_type_changed
Definition: btrfsioctl.h:99
uint32_t ULONG
Definition: typedefs.h:59
#define ZeroMemory
Definition: winbase.h:1712
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by apply_changes().

◆ change_gid()

void BtrfsPropSheet::change_gid ( HWND  hDlg,
uint32_t  gid 
)

Definition at line 796 of file propsheet.cpp.

796 {
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}
#define PSM_CHANGED
Definition: prsht.h:164
UINT_PTR WPARAM
Definition: windef.h:207
HWND WINAPI GetParent(_In_ HWND)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by PropSheetDlgProc().

◆ change_inode_flag()

void BtrfsPropSheet::change_inode_flag ( HWND  hDlg,
uint64_t  flag,
UINT  state 
)

Definition at line 586 of file propsheet.cpp.

586 {
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}
static int state
Definition: maze.c:121
#define IDC_NODATACOW
Definition: resource.h:220
#define IDC_COMPRESS
Definition: resource.h:224
#define IDC_COMPRESS_TYPE
Definition: resource.h:318
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
#define BTRFS_INODE_COMPRESS
Definition: propsheet.h:87
#define BTRFS_INODE_NODATASUM
Definition: propsheet.h:76
#define BTRFS_INODE_NODATACOW
Definition: propsheet.h:77
#define BST_INDETERMINATE
Definition: winuser.h:198
#define BST_UNCHECKED
Definition: winuser.h:199
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define BST_CHECKED
Definition: winuser.h:197

Referenced by PropSheetDlgProc().

◆ change_perm_flag()

void BtrfsPropSheet::change_perm_flag ( HWND  hDlg,
ULONG  perm,
UINT  state 
)

Definition at line 771 of file propsheet.cpp.

771 {
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}

Referenced by PropSheetDlgProc().

◆ change_uid()

void BtrfsPropSheet::change_uid ( HWND  hDlg,
uint32_t  uid 
)

Definition at line 787 of file propsheet.cpp.

787 {
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}

Referenced by PropSheetDlgProc().

◆ check_file()

HRESULT BtrfsPropSheet::check_file ( const wstring &  fn,
UINT  i,
UINT  num_files,
UINT sv 
)
private

Definition at line 172 of file propsheet.cpp.

172 {
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}
uint8_t max_compression_type
Definition: propsheet.h:179
bool can_change_nocow
Definition: propsheet.h:173
bool various_inodes
Definition: propsheet.h:181
bool various_types
Definition: propsheet.h:181
uint8_t min_compression_type
Definition: propsheet.h:179
uint64_t min_flags
Definition: propsheet.h:177
uint64_t rdev
Definition: propsheet.h:178
bool various_subvols
Definition: propsheet.h:181
uint64_t subvol
Definition: propsheet.h:178
deque< wstring > search_list
Definition: propsheet.h:191
uint64_t max_flags
Definition: propsheet.h:177
void push_back(const value_type &__t=_STLP_DEFAULT_CONSTRUCTED(_Tp))
Definition: _deque.h:668
#define GetFileSizeEx
Definition: compat.h:757
@ FileFsSizeInformation
Definition: from_kernel.h:221
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
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_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define MAXIMUM_ALLOWED
Definition: nt_native.h:83
#define FileAccessInformation
Definition: propsheet.cpp:51
#define FileStandardInformation
Definition: propsheet.cpp:61
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
LARGE_INTEGER AllocationSize
Definition: propsheet.cpp:54
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
uint32_t st_uid
Definition: btrfsioctl.h:74
uint64_t disk_size_uncompressed
Definition: btrfsioctl.h:80
uint8_t compression_type
Definition: btrfsioctl.h:83
uint64_t subvol
Definition: btrfsioctl.h:70
Definition: fs.h:78
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by load_file_list().

◆ do_search()

void BtrfsPropSheet::do_search ( const wstring &  fn)

Definition at line 88 of file propsheet.cpp.

88 {
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}
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
GLdouble s
Definition: gl.h:2039
#define ss
Definition: i386-dis.c:441

Referenced by search_list_thread().

◆ init_propsheet()

void BtrfsPropSheet::init_propsheet ( HWND  hwndDlg)

Definition at line 931 of file propsheet.cpp.

931 {
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}
void set_size_on_disk(HWND hwndDlg)
Definition: propsheet.cpp:730
void wstring_sprintf(wstring &s, wstring fmt,...)
Definition: main.cpp:225
#define IDC_TYPE
Definition: resource.h:223
#define IDC_STICKY
Definition: resource.h:234
#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_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 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 IDC_SIZE_ON_DISK
Definition: resource.h:225
#define IDC_UID
Definition: resource.h:209
#define IDC_OTHERW
Definition: resource.h:216
#define IDC_USERX
Definition: resource.h:217
#define IDC_INODE
Definition: resource.h:222
#define IDC_COMPRESSION_RATIO
Definition: resource.h:240
#define IDS_COMPRESS_ZLIB
Definition: resource.h:125
#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 IDC_SUBVOL_RO
Definition: resource.h:320
GLdouble GLdouble t
Definition: gl.h:2047
static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
Definition: muireg.c:10
static ULONG inode_type_to_string_ref(uint8_t type)
Definition: propsheet.cpp:558
#define minor(rdev)
Definition: propsheet.cpp:929
static void set_check_box(HWND hwndDlg, ULONG id, uint64_t min, uint64_t max)
Definition: propsheet.cpp:866
#define major(rdev)
Definition: propsheet.cpp:928
#define S_IXGRP
Definition: propsheet.h:49
#define S_IROTH
Definition: propsheet.h:53
#define S_IXOTH
Definition: propsheet.h:61
#define S_IRGRP
Definition: propsheet.h:41
#define S_IWOTH
Definition: propsheet.h:57
#define S_IRUSR
Definition: propsheet.h:29
#define S_ISVTX
Definition: propsheet.h:73
#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 BCM_SETSHIELD
Definition: commctrl.h:4653
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
#define SW_HIDE
Definition: winuser.h:768
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define CB_SETCURSEL
Definition: winuser.h:1961
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
#define CB_GETCOUNT
Definition: winuser.h:1942
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define CB_ADDSTRING
Definition: winuser.h:1936
#define SW_SHOW
Definition: winuser.h:775
#define CB_DELETESTRING
Definition: winuser.h:1937

Referenced by open_as_admin(), and PropSheetDlgProc().

◆ Initialize()

HRESULT __stdcall BtrfsPropSheet::Initialize ( PCIDLIST_ABSOLUTE  pidlFolder,
IDataObject pdtobj,
HKEY  hkeyProgID 
)
virtual

Implements IShellExtInit.

Definition at line 361 of file propsheet.cpp.

361 {
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}
#define CF_HDROP
Definition: constants.h:410
HRESULT load_file_list()
Definition: propsheet.cpp:318
size_type size() const
Definition: _deque.h:471
#define E_INVALIDARG
Definition: ddrawi.h:101
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
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
#define FAILED(hr)
Definition: intsafe.h:51
static DWORD WINAPI global_search_list_thread(LPVOID lpParameter)
Definition: propsheet.cpp:166
HRESULT hr
Definition: shlfolder.c:183

◆ load_file_list()

HRESULT BtrfsPropSheet::load_file_list ( )
private

Definition at line 318 of file propsheet.cpp.

318 {
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}
HRESULT check_file(const wstring &fn, UINT i, UINT num_files, UINT *sv)
Definition: propsheet.cpp:172

Referenced by Initialize(), and open_as_admin().

◆ open_as_admin()

void BtrfsPropSheet::open_as_admin ( HWND  hwndDlg)

Definition at line 883 of file propsheet.cpp.

883 {
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}
void init_propsheet(HWND hwndDlg)
Definition: propsheet.cpp:931
#define CloseHandle
Definition: compat.h:739
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
#define INFINITE
Definition: serial.h:102
#define SEE_MASK_NOCLOSEPROCESS
Definition: shellapi.h:31
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2391
LPCWSTR lpParameters
Definition: shellapi.h:333
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262

Referenced by PropSheetDlgProc().

◆ QueryInterface()

HRESULT __stdcall BtrfsPropSheet::QueryInterface ( REFIID  riid,
void **  ppObj 
)

Implements IUnknown.

Definition at line 73 of file propsheet.cpp.

73 {
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}
const GUID IID_IUnknown
REFIID riid
Definition: atlbase.h:39
#define E_NOINTERFACE
Definition: winerror.h:2364

Referenced by Factory::CreateInstance().

◆ Release()

ULONG __stdcall BtrfsPropSheet::Release ( void  )
inline

Implements IUnknown.

Definition at line 140 of file propsheet.h.

140 {
142
143 if (rc == 0)
144 delete this;
145
146 return rc;
147 }
long LONG
Definition: pedump.c:60

◆ ReplacePage()

HRESULT __stdcall BtrfsPropSheet::ReplacePage ( UINT  uPageID,
LPFNADDPROPSHEETPAGE  pfnReplacePage,
LPARAM  lParam 
)
virtual

Definition at line 1360 of file propsheet.cpp.

1360 {
1361 return S_OK;
1362}

◆ search_list_thread()

DWORD BtrfsPropSheet::search_list_thread ( )

Definition at line 154 of file propsheet.cpp.

154 {
155 while (!search_list.empty()) {
157
159 }
160
161 thread = nullptr;
162
163 return 0;
164}
void do_search(const wstring &fn)
Definition: propsheet.cpp:88
void pop_front()
Definition: _deque.h:722
bool empty() const
Definition: _deque.h:473
reference front()
Definition: _deque.h:458

Referenced by global_search_list_thread().

◆ set_cmdline()

void BtrfsPropSheet::set_cmdline ( const wstring &  cmdline)

Definition at line 414 of file propsheet.cpp.

414 {
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}
TCHAR * cmdline
Definition: stretchblt.cpp:32

Referenced by ShowPropSheetW().

◆ set_size_on_disk()

void BtrfsPropSheet::set_size_on_disk ( HWND  hwndDlg)

Definition at line 730 of file propsheet.cpp.

730 {
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}
UINT64 uint64_t
Definition: types.h:77
void format_size(uint64_t size, wstring &s, bool show_bytes)
Definition: main.cpp:65
static float(__cdecl *square_half_float)(float x

Referenced by init_propsheet(), and PropSheetDlgProc().

◆ update_size_details_dialog()

void BtrfsPropSheet::update_size_details_dialog ( HWND  hDlg)

Definition at line 805 of file propsheet.cpp.

805 {
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}
#define IDC_SIZE_INLINE
Definition: resource.h:227
#define IDC_SIZE_UNCOMPRESSED
Definition: resource.h:229
#define IDC_SIZE_LZO
Definition: resource.h:236
#define IDC_SIZE_ZSTD
Definition: resource.h:239
#define IDC_SIZE_ZLIB
Definition: resource.h:232
GLsizeiptr size
Definition: glext.h:5919
static TCHAR * items[]
Definition: page1.c:45

Referenced by SizeDetailsDlgProc().

Member Data Documentation

◆ allocsize

uint64_t BtrfsPropSheet::allocsize
private

◆ can_change_nocow

bool BtrfsPropSheet::can_change_nocow

Definition at line 173 of file propsheet.h.

Referenced by check_file(), init_propsheet(), load_file_list(), and set_cmdline().

◆ can_change_perms

bool BtrfsPropSheet::can_change_perms

Definition at line 172 of file propsheet.h.

Referenced by BtrfsPropSheet(), check_file(), init_propsheet(), load_file_list(), and set_cmdline().

◆ compress_type

uint8_t BtrfsPropSheet::compress_type

Definition at line 179 of file propsheet.h.

Referenced by apply_changes_file(), init_propsheet(), and PropSheetDlgProc().

◆ compress_type_changed

bool BtrfsPropSheet::compress_type_changed

Definition at line 181 of file propsheet.h.

Referenced by apply_changes(), apply_changes_file(), BtrfsPropSheet(), and PropSheetDlgProc().

◆ cr_format

WCHAR BtrfsPropSheet::cr_format[255]

Definition at line 174 of file propsheet.h.

Referenced by BtrfsPropSheet(), init_propsheet(), and set_size_on_disk().

◆ filename

wstring BtrfsPropSheet::filename
private

Definition at line 192 of file propsheet.h.

◆ flags

uint64_t BtrfsPropSheet::flags

Definition at line 177 of file propsheet.h.

◆ flags_changed

bool BtrfsPropSheet::flags_changed
private

Definition at line 189 of file propsheet.h.

Referenced by apply_changes(), apply_changes_file(), BtrfsPropSheet(), and change_inode_flag().

◆ flags_set

uint64_t BtrfsPropSheet::flags_set

◆ frag_format

WCHAR BtrfsPropSheet::frag_format[255]

Definition at line 174 of file propsheet.h.

Referenced by BtrfsPropSheet(), init_propsheet(), and set_size_on_disk().

◆ gid

uint32_t BtrfsPropSheet::gid

Definition at line 180 of file propsheet.h.

Referenced by apply_changes_file(), change_gid(), check_file(), init_propsheet(), and set_cmdline().

◆ gid_changed

bool BtrfsPropSheet::gid_changed
private

Definition at line 189 of file propsheet.h.

Referenced by apply_changes(), apply_changes_file(), BtrfsPropSheet(), and change_gid().

◆ has_subvols

bool BtrfsPropSheet::has_subvols

Definition at line 181 of file propsheet.h.

Referenced by BtrfsPropSheet(), check_file(), init_propsheet(), and set_cmdline().

◆ ignore

bool BtrfsPropSheet::ignore
private

Definition at line 186 of file propsheet.h.

Referenced by AddPages(), BtrfsPropSheet(), check_file(), and set_cmdline().

◆ inode

uint64_t BtrfsPropSheet::inode

Definition at line 178 of file propsheet.h.

◆ max_compression_type

uint8_t BtrfsPropSheet::max_compression_type

◆ max_flags

uint64_t BtrfsPropSheet::max_flags

Definition at line 177 of file propsheet.h.

Referenced by check_file(), init_propsheet(), load_file_list(), and set_cmdline().

◆ max_mode

uint32_t BtrfsPropSheet::max_mode

◆ min_compression_type

uint8_t BtrfsPropSheet::min_compression_type

◆ min_flags

uint64_t BtrfsPropSheet::min_flags

Definition at line 177 of file propsheet.h.

Referenced by check_file(), init_propsheet(), load_file_list(), and set_cmdline().

◆ min_mode

uint32_t BtrfsPropSheet::min_mode

◆ mode

uint32_t BtrfsPropSheet::mode

Definition at line 176 of file propsheet.h.

◆ mode_set

uint32_t BtrfsPropSheet::mode_set

◆ num_extents

uint64_t BtrfsPropSheet::num_extents
private

Definition at line 190 of file propsheet.h.

Referenced by BtrfsPropSheet(), check_file(), do_search(), and set_size_on_disk().

◆ perms_changed

bool BtrfsPropSheet::perms_changed
private

Definition at line 189 of file propsheet.h.

Referenced by apply_changes(), apply_changes_file(), BtrfsPropSheet(), and change_perm_flag().

◆ rdev

uint64_t BtrfsPropSheet::rdev

Definition at line 178 of file propsheet.h.

Referenced by check_file(), init_propsheet(), and set_cmdline().

◆ readonly

bool BtrfsPropSheet::readonly

◆ refcount

LONG BtrfsPropSheet::refcount
private

Definition at line 185 of file propsheet.h.

Referenced by AddRef(), BtrfsPropSheet(), and Release().

◆ ro_changed

bool BtrfsPropSheet::ro_changed

Definition at line 182 of file propsheet.h.

Referenced by apply_changes(), apply_changes_file(), BtrfsPropSheet(), and PropSheetDlgProc().

◆ ro_subvol

bool BtrfsPropSheet::ro_subvol

◆ search_list

deque<wstring> BtrfsPropSheet::search_list
private

Definition at line 191 of file propsheet.h.

Referenced by check_file(), do_search(), Initialize(), search_list_thread(), and set_cmdline().

◆ sector_size

uint32_t BtrfsPropSheet::sector_size
private

Definition at line 193 of file propsheet.h.

Referenced by BtrfsPropSheet(), check_file(), and set_size_on_disk().

◆ show_admin_button

bool BtrfsPropSheet::show_admin_button

Definition at line 182 of file propsheet.h.

Referenced by BtrfsPropSheet(), check_file(), and init_propsheet().

◆ size_format

WCHAR BtrfsPropSheet::size_format[255]

Definition at line 174 of file propsheet.h.

Referenced by BtrfsPropSheet(), init_propsheet(), and set_size_on_disk().

◆ sizes

uint64_t BtrfsPropSheet::sizes[5]
private

◆ sparsesize

uint64_t BtrfsPropSheet::sparsesize
private

◆ stgm

STGMEDIUM BtrfsPropSheet::stgm
private

◆ stgm_set

bool BtrfsPropSheet::stgm_set
private

Definition at line 188 of file propsheet.h.

Referenced by BtrfsPropSheet(), Initialize(), and ~BtrfsPropSheet().

◆ subvol

uint64_t BtrfsPropSheet::subvol

Definition at line 178 of file propsheet.h.

Referenced by check_file(), init_propsheet(), and set_cmdline().

◆ thread

◆ totalsize

uint64_t BtrfsPropSheet::totalsize
private

◆ type

uint8_t BtrfsPropSheet::type

Definition at line 179 of file propsheet.h.

◆ uid

uint32_t BtrfsPropSheet::uid

Definition at line 180 of file propsheet.h.

Referenced by apply_changes_file(), change_uid(), check_file(), init_propsheet(), and set_cmdline().

◆ uid_changed

bool BtrfsPropSheet::uid_changed
private

Definition at line 189 of file propsheet.h.

Referenced by apply_changes(), apply_changes_file(), BtrfsPropSheet(), and change_uid().

◆ various_gids

bool BtrfsPropSheet::various_gids

Definition at line 181 of file propsheet.h.

Referenced by apply_changes(), check_file(), init_propsheet(), load_file_list(), and set_cmdline().

◆ various_inodes

bool BtrfsPropSheet::various_inodes

Definition at line 181 of file propsheet.h.

Referenced by check_file(), init_propsheet(), load_file_list(), and set_cmdline().

◆ various_ro

bool BtrfsPropSheet::various_ro

Definition at line 182 of file propsheet.h.

Referenced by check_file(), init_propsheet(), load_file_list(), and set_cmdline().

◆ various_subvols

bool BtrfsPropSheet::various_subvols

Definition at line 181 of file propsheet.h.

Referenced by check_file(), init_propsheet(), load_file_list(), and set_cmdline().

◆ various_types

bool BtrfsPropSheet::various_types

Definition at line 181 of file propsheet.h.

Referenced by check_file(), init_propsheet(), load_file_list(), and set_cmdline().

◆ various_uids

bool BtrfsPropSheet::various_uids

Definition at line 181 of file propsheet.h.

Referenced by apply_changes(), check_file(), init_propsheet(), load_file_list(), and set_cmdline().


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