diff --git a/dll/shellext/shellbtrfs/balance.cpp b/dll/shellext/shellbtrfs/balance.cpp index baa2d07ce38..345583eb0e8 100644 --- a/dll/shellext/shellbtrfs/balance.cpp +++ b/dll/shellext/shellbtrfs/balance.cpp @@ -42,7 +42,9 @@ #include #include -static uint64_t convtypes2[] = { BLOCK_FLAG_SINGLE, BLOCK_FLAG_DUPLICATE, BLOCK_FLAG_RAID0, BLOCK_FLAG_RAID1, BLOCK_FLAG_RAID5, BLOCK_FLAG_RAID6, BLOCK_FLAG_RAID10 }; +static uint64_t convtypes2[] = { BLOCK_FLAG_SINGLE, BLOCK_FLAG_DUPLICATE, BLOCK_FLAG_RAID0, BLOCK_FLAG_RAID1, + BLOCK_FLAG_RAID5, BLOCK_FLAG_RAID1C3, BLOCK_FLAG_RAID6, BLOCK_FLAG_RAID10, + BLOCK_FLAG_RAID1C4 }; static WCHAR hex_digit(uint8_t u) { if (u >= 0xa && u <= 0xf) @@ -245,7 +247,7 @@ void BtrfsBalance::RefreshBalanceDlg(HWND hwndDlg, bool first) { CheckDlgButton(hwndDlg, IDC_METADATA, BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SYSTEM, BST_UNCHECKED); - SendMessage(GetDlgItem(hwndDlg, IDC_BALANCE_PROGRESS), PBM_SETPOS, 0, 0); + SendMessageW(GetDlgItem(hwndDlg, IDC_BALANCE_PROGRESS), PBM_SETPOS, 0, 0); } EnableWindow(GetDlgItem(hwndDlg, IDC_DATA_OPTIONS), IsDlgButtonChecked(hwndDlg, IDC_DATA) == BST_CHECKED ? true : false); @@ -566,10 +568,10 @@ INT_PTR CALLBACK BtrfsBalance::BalanceOptsDlgProc(HWND hwndDlg, UINT uMsg, WPARA wstring_sprintf(t, u, bd->dev_id, s.c_str()); - SendMessage(devcb, CB_ADDSTRING, 0, (LPARAM)t.c_str()); + SendMessageW(devcb, CB_ADDSTRING, 0, (LPARAM)t.c_str()); if (opts->devid == bd->dev_id) - SendMessage(devcb, CB_SETCURSEL, num_devices, 0); + SendMessageW(devcb, CB_SETCURSEL, num_devices, 0); num_devices++; @@ -592,10 +594,10 @@ INT_PTR CALLBACK BtrfsBalance::BalanceOptsDlgProc(HWND hwndDlg, UINT uMsg, WPARA if (!load_string(module, convtypes[i], s)) throw last_error(GetLastError()); - SendMessage(convcb, CB_ADDSTRING, 0, (LPARAM)s.c_str()); + SendMessageW(convcb, CB_ADDSTRING, 0, (LPARAM)s.c_str()); if (opts->convert == convtypes2[i]) - SendMessage(convcb, CB_SETCURSEL, i, 0); + SendMessageW(convcb, CB_SETCURSEL, i, 0); i++; @@ -839,10 +841,10 @@ static INT_PTR CALLBACK stub_BalanceOptsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM BtrfsBalance* bb; if (uMsg == WM_INITDIALOG) { - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); bb = (BtrfsBalance*)lParam; } else { - bb = (BtrfsBalance*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + bb = (BtrfsBalance*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); } if (bb) @@ -964,10 +966,10 @@ static INT_PTR CALLBACK stub_BalanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wPar BtrfsBalance* bb; if (uMsg == WM_INITDIALOG) { - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); bb = (BtrfsBalance*)lParam; } else { - bb = (BtrfsBalance*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + bb = (BtrfsBalance*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); } if (bb) diff --git a/dll/shellext/shellbtrfs/devices.cpp b/dll/shellext/shellbtrfs/devices.cpp index e95cace5c52..26613ba1707 100644 --- a/dll/shellext/shellbtrfs/devices.cpp +++ b/dll/shellext/shellbtrfs/devices.cpp @@ -75,7 +75,7 @@ static void find_devices(HWND hwnd, const GUID* guid, const mountmgr& mm, vector static const wstring dosdevices = L"\\DosDevices\\"; - h = SetupDiGetClassDevs(guid, nullptr, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); + h = SetupDiGetClassDevsW(guid, nullptr, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); if (h != INVALID_HANDLE_VALUE) { DWORD index = 0; @@ -629,10 +629,10 @@ static INT_PTR CALLBACK stub_DeviceAddDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wP BtrfsDeviceAdd* bda; if (uMsg == WM_INITDIALOG) { - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); bda = (BtrfsDeviceAdd*)lParam; } else { - bda = (BtrfsDeviceAdd*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + bda = (BtrfsDeviceAdd*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); } if (bda) @@ -824,10 +824,10 @@ static INT_PTR CALLBACK stub_DeviceResizeDlgProc(HWND hwndDlg, UINT uMsg, WPARAM BtrfsDeviceResize* bdr; if (uMsg == WM_INITDIALOG) { - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); bdr = (BtrfsDeviceResize*)lParam; } else - bdr = (BtrfsDeviceResize*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + bdr = (BtrfsDeviceResize*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); if (bdr) return bdr->DeviceResizeDlgProc(hwndDlg, uMsg, wParam, lParam); diff --git a/dll/shellext/shellbtrfs/propsheet.cpp b/dll/shellext/shellbtrfs/propsheet.cpp index 90ee53b27d2..faa7194e664 100644 --- a/dll/shellext/shellbtrfs/propsheet.cpp +++ b/dll/shellext/shellbtrfs/propsheet.cpp @@ -435,11 +435,11 @@ void BtrfsPropSheet::set_cmdline(const wstring& cmdline) { OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr); if (h == INVALID_HANDLE_VALUE) - return; + throw last_error(GetLastError()); Status = NtQueryInformationFile(h, &iosb, &fai, sizeof(FILE_ACCESS_INFORMATION), FileAccessInformation); if (!NT_SUCCESS(Status)) - return; + throw ntstatus_error(Status); if (fai.AccessFlags & FILE_READ_ATTRIBUTES) can_change_perms = fai.AccessFlags & WRITE_DAC; @@ -453,7 +453,10 @@ void BtrfsPropSheet::set_cmdline(const wstring& cmdline) { Status = NtFsControlFile(h, nullptr, nullptr, nullptr, &iosb, FSCTL_BTRFS_GET_INODE_INFO, nullptr, 0, &bii2, sizeof(btrfs_inode_info)); - if (NT_SUCCESS(Status) && !bii2.top) { + if (!NT_SUCCESS(Status)) + throw ntstatus_error(Status); + + if (!bii2.top) { LARGE_INTEGER filesize; subvol = bii2.subvol; @@ -740,7 +743,7 @@ void BtrfsPropSheet::set_size_on_disk(HWND hwndDlg) { if (cr != old_text) SetDlgItemTextW(hwndDlg, IDC_COMPRESSION_RATIO, cr.c_str()); - uint64_t extent_size = (allocsize - sparsesize - sizes[0]) / sector_size; + uint64_t extent_size = (allocsize - sparsesize - sizes[0]) / (sector_size == 0 ? 4096 : sector_size); if (num_extents == 0 || extent_size <= 1) ratio = 0.0f; @@ -751,7 +754,6 @@ void BtrfsPropSheet::set_size_on_disk(HWND hwndDlg) { GetDlgItemTextW(hwndDlg, IDC_FRAGMENTATION, old_text, sizeof(old_text) / sizeof(WCHAR)); - if (frag != old_text) SetDlgItemTextW(hwndDlg, IDC_FRAGMENTATION, frag.c_str()); } @@ -813,7 +815,7 @@ static INT_PTR CALLBACK SizeDetailsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wPara { BtrfsPropSheet* bps = (BtrfsPropSheet*)lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)bps); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)bps); bps->update_size_details_dialog(hwndDlg); @@ -832,7 +834,7 @@ static INT_PTR CALLBACK SizeDetailsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wPara case WM_TIMER: { - BtrfsPropSheet* bps = (BtrfsPropSheet*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + BtrfsPropSheet* bps = (BtrfsPropSheet*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); if (bps) { bps->update_size_details_dialog(hwndDlg); @@ -853,18 +855,18 @@ static INT_PTR CALLBACK SizeDetailsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wPara static void set_check_box(HWND hwndDlg, ULONG id, uint64_t min, uint64_t max) { if (min && max) { - SendDlgItemMessage(hwndDlg, id, BM_SETCHECK, BST_CHECKED, 0); + SendDlgItemMessageW(hwndDlg, id, BM_SETCHECK, BST_CHECKED, 0); } else if (!min && !max) { - SendDlgItemMessage(hwndDlg, id, BM_SETCHECK, BST_UNCHECKED, 0); + SendDlgItemMessageW(hwndDlg, id, BM_SETCHECK, BST_UNCHECKED, 0); } else { LONG_PTR style; - style = GetWindowLongPtr(GetDlgItem(hwndDlg, id), GWL_STYLE); + style = GetWindowLongPtrW(GetDlgItem(hwndDlg, id), GWL_STYLE); style &= ~BS_AUTOCHECKBOX; style |= BS_AUTO3STATE; - SetWindowLongPtr(GetDlgItem(hwndDlg, id), GWL_STYLE, style); + SetWindowLongPtrW(GetDlgItem(hwndDlg, id), GWL_STYLE, style); - SendDlgItemMessage(hwndDlg, id, BM_SETCHECK, BST_INDETERMINATE, 0); + SendDlgItemMessageW(hwndDlg, id, BM_SETCHECK, BST_INDETERMINATE, 0); } } @@ -995,13 +997,13 @@ void BtrfsPropSheet::init_propsheet(HWND hwndDlg) { comptype = GetDlgItem(hwndDlg, IDC_COMPRESS_TYPE); - while (SendMessage(comptype, CB_GETCOUNT, 0, 0) > 0) { - SendMessage(comptype, CB_DELETESTRING, 0, 0); + while (SendMessageW(comptype, CB_GETCOUNT, 0, 0) > 0) { + SendMessageW(comptype, CB_DELETESTRING, 0, 0); } if (min_compression_type != max_compression_type) { - SendMessage(comptype, CB_ADDSTRING, 0, (LPARAM)L""); - SendMessage(comptype, CB_SETCURSEL, 0, 0); + SendMessageW(comptype, CB_ADDSTRING, 0, (LPARAM)L""); + SendMessageW(comptype, CB_SETCURSEL, 0, 0); } i = 0; @@ -1011,13 +1013,13 @@ void BtrfsPropSheet::init_propsheet(HWND hwndDlg) { if (!load_string(module, comp_types[i], t)) throw last_error(GetLastError()); - SendMessage(comptype, CB_ADDSTRING, 0, (LPARAM)t.c_str()); + SendMessageW(comptype, CB_ADDSTRING, 0, (LPARAM)t.c_str()); i++; } if (min_compression_type == max_compression_type) { - SendMessage(comptype, CB_SETCURSEL, min_compression_type, 0); + SendMessageW(comptype, CB_SETCURSEL, min_compression_type, 0); compress_type = min_compression_type; } @@ -1087,12 +1089,12 @@ static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_INITDIALOG: { - PROPSHEETPAGE* psp = (PROPSHEETPAGE*)lParam; + PROPSHEETPAGEW* psp = (PROPSHEETPAGEW*)lParam; BtrfsPropSheet* bps = (BtrfsPropSheet*)psp->lParam; EnableThemeDialogTexture(hwndDlg, ETDT_ENABLETAB); - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)bps); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)bps); bps->init_propsheet(hwndDlg); @@ -1101,7 +1103,7 @@ static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, case WM_COMMAND: { - BtrfsPropSheet* bps = (BtrfsPropSheet*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + BtrfsPropSheet* bps = (BtrfsPropSheet*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); if (bps && !bps->readonly) { switch (HIWORD(wParam)) { @@ -1256,7 +1258,7 @@ static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, break; case PSN_APPLY: { - BtrfsPropSheet* bps = (BtrfsPropSheet*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + BtrfsPropSheet* bps = (BtrfsPropSheet*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); bps->apply_changes(hwndDlg); SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, PSNRET_NOERROR); @@ -1269,7 +1271,7 @@ static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, PNMLINK pNMLink = (PNMLINK)lParam; if (pNMLink->item.iLink == 0) - DialogBoxParamW(module, MAKEINTRESOURCEW(IDD_SIZE_DETAILS), hwndDlg, SizeDetailsDlgProc, GetWindowLongPtr(hwndDlg, GWLP_USERDATA)); + DialogBoxParamW(module, MAKEINTRESOURCEW(IDD_SIZE_DETAILS), hwndDlg, SizeDetailsDlgProc, GetWindowLongPtrW(hwndDlg, GWLP_USERDATA)); } break; } @@ -1278,7 +1280,7 @@ static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, case WM_TIMER: { - BtrfsPropSheet* bps = (BtrfsPropSheet*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + BtrfsPropSheet* bps = (BtrfsPropSheet*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); if (bps) { bps->set_size_on_disk(hwndDlg); @@ -1299,7 +1301,7 @@ static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, HRESULT __stdcall BtrfsPropSheet::AddPages(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam) { try { - PROPSHEETPAGE psp; + PROPSHEETPAGEW psp; HPROPSHEETPAGE hPage; INITCOMMONCONTROLSEX icex; @@ -1315,15 +1317,15 @@ HRESULT __stdcall BtrfsPropSheet::AddPages(LPFNADDPROPSHEETPAGE pfnAddPage, LPAR psp.dwSize = sizeof(psp); psp.dwFlags = PSP_USEREFPARENT | PSP_USETITLE; psp.hInstance = module; - psp.pszTemplate = MAKEINTRESOURCE(IDD_PROP_SHEET); + psp.pszTemplate = MAKEINTRESOURCEW(IDD_PROP_SHEET); psp.hIcon = 0; - psp.pszTitle = MAKEINTRESOURCE(IDS_PROP_SHEET_TITLE); + psp.pszTitle = MAKEINTRESOURCEW(IDS_PROP_SHEET_TITLE); psp.pfnDlgProc = (DLGPROC)PropSheetDlgProc; psp.pcRefParent = (UINT*)&objs_loaded; psp.pfnCallback = nullptr; psp.lParam = (LPARAM)this; - hPage = CreatePropertySheetPage(&psp); + hPage = CreatePropertySheetPageW(&psp); if (hPage) { if (pfnAddPage(hPage, lParam)) { @@ -1353,6 +1355,7 @@ void CALLBACK ShowPropSheetW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int BtrfsPropSheet bps; PROPSHEETPAGEW psp; PROPSHEETHEADERW psh; + INITCOMMONCONTROLSEX icex; wstring title; set_dpi_aware(); @@ -1361,6 +1364,12 @@ void CALLBACK ShowPropSheetW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int bps.set_cmdline(lpszCmdLine); + icex.dwSize = sizeof(icex); + icex.dwICC = ICC_LINK_CLASS; + + if (!InitCommonControlsEx(&icex)) + throw string_error(IDS_INITCOMMONCONTROLSEX_FAILED); + psp.dwSize = sizeof(psp); psp.dwFlags = PSP_USETITLE; psp.hInstance = module; @@ -1381,7 +1390,8 @@ void CALLBACK ShowPropSheetW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int psh.nPages = 1; psh.ppsp = &psp; - PropertySheetW(&psh); + if (PropertySheetW(&psh) < 0) + throw last_error(GetLastError()); } catch (const exception& e) { error_message(hwnd, e.what()); } diff --git a/dll/shellext/shellbtrfs/recv.cpp b/dll/shellext/shellbtrfs/recv.cpp index 0c1ff3ef589..0dc3bf859bb 100644 --- a/dll/shellext/shellbtrfs/recv.cpp +++ b/dll/shellext/shellbtrfs/recv.cpp @@ -1513,10 +1513,10 @@ static INT_PTR CALLBACK stub_RecvProgressDlgProc(HWND hwndDlg, UINT uMsg, WPARAM BtrfsRecv* br; if (uMsg == WM_INITDIALOG) { - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); br = (BtrfsRecv*)lParam; } else { - br = (BtrfsRecv*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + br = (BtrfsRecv*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); } if (br) diff --git a/dll/shellext/shellbtrfs/send.cpp b/dll/shellext/shellbtrfs/send.cpp index 74ba33774e0..b4f242f73c1 100644 --- a/dll/shellext/shellbtrfs/send.cpp +++ b/dll/shellext/shellbtrfs/send.cpp @@ -514,10 +514,10 @@ static INT_PTR CALLBACK stub_SendDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, BtrfsSend* bs; if (uMsg == WM_INITDIALOG) { - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); bs = (BtrfsSend*)lParam; } else - bs = (BtrfsSend*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + bs = (BtrfsSend*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); if (bs) return bs->SendDlgProc(hwndDlg, uMsg, wParam, lParam); diff --git a/dll/shellext/shellbtrfs/shellbtrfs.rc b/dll/shellext/shellbtrfs/shellbtrfs.rc index 4b6bbe2e883..4852681751d 100644 --- a/dll/shellext/shellbtrfs/shellbtrfs.rc +++ b/dll/shellext/shellbtrfs/shellbtrfs.rc @@ -61,8 +61,8 @@ IDI_ICON1 ICON "subvol.ico" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,7,4,0 - PRODUCTVERSION 1,7,4,0 + FILEVERSION 1,7,5,0 + PRODUCTVERSION 1,7,5,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -78,12 +78,12 @@ BEGIN BLOCK "080904b0" BEGIN VALUE "FileDescription", "WinBtrfs shell extension" - VALUE "FileVersion", "1.7.4" + VALUE "FileVersion", "1.7.5" VALUE "InternalName", "btrfs" VALUE "LegalCopyright", "Copyright (c) Mark Harmstone 2016-20" VALUE "OriginalFilename", "shellbtrfs.dll" VALUE "ProductName", "WinBtrfs" - VALUE "ProductVersion", "1.7.4" + VALUE "ProductVersion", "1.7.5" END END BLOCK "VarFileInfo" diff --git a/dll/shellext/shellbtrfs/volpropsheet.cpp b/dll/shellext/shellbtrfs/volpropsheet.cpp index ddc7dc24af0..128ac8e42b5 100644 --- a/dll/shellext/shellbtrfs/volpropsheet.cpp +++ b/dll/shellext/shellbtrfs/volpropsheet.cpp @@ -567,10 +567,10 @@ static INT_PTR CALLBACK stub_UsageDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam BtrfsVolPropSheet* bvps; if (uMsg == WM_INITDIALOG) { - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); bvps = (BtrfsVolPropSheet*)lParam; } else { - bvps = (BtrfsVolPropSheet*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + bvps = (BtrfsVolPropSheet*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); } if (bvps) @@ -943,10 +943,10 @@ static INT_PTR CALLBACK stub_StatsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam BtrfsVolPropSheet* bvps; if (uMsg == WM_INITDIALOG) { - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); bvps = (BtrfsVolPropSheet*)lParam; } else { - bvps = (BtrfsVolPropSheet*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + bvps = (BtrfsVolPropSheet*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); } if (bvps) @@ -1250,10 +1250,10 @@ static INT_PTR CALLBACK stub_DeviceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wPara BtrfsVolPropSheet* bvps; if (uMsg == WM_INITDIALOG) { - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); bvps = (BtrfsVolPropSheet*)lParam; } else { - bvps = (BtrfsVolPropSheet*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + bvps = (BtrfsVolPropSheet*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); } if (bvps) @@ -1331,13 +1331,13 @@ static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_INITDIALOG: { - PROPSHEETPAGE* psp = (PROPSHEETPAGE*)lParam; + PROPSHEETPAGEW* psp = (PROPSHEETPAGEW*)lParam; BtrfsVolPropSheet* bps = (BtrfsVolPropSheet*)psp->lParam; btrfs_device* bd; EnableThemeDialogTexture(hwndDlg, ETDT_ENABLETAB); - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)bps); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)bps); bps->readonly = true; bd = bps->devices; @@ -1386,7 +1386,7 @@ static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, case WM_COMMAND: { - BtrfsVolPropSheet* bps = (BtrfsVolPropSheet*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + BtrfsVolPropSheet* bps = (BtrfsVolPropSheet*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); if (bps) { switch (HIWORD(wParam)) { @@ -1428,7 +1428,7 @@ static INT_PTR CALLBACK PropSheetDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, HRESULT __stdcall BtrfsVolPropSheet::AddPages(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam) { try { - PROPSHEETPAGE psp; + PROPSHEETPAGEW psp; HPROPSHEETPAGE hPage; INITCOMMONCONTROLSEX icex; @@ -1444,15 +1444,15 @@ HRESULT __stdcall BtrfsVolPropSheet::AddPages(LPFNADDPROPSHEETPAGE pfnAddPage, L psp.dwSize = sizeof(psp); psp.dwFlags = PSP_USEREFPARENT | PSP_USETITLE; psp.hInstance = module; - psp.pszTemplate = MAKEINTRESOURCE(IDD_VOL_PROP_SHEET); + psp.pszTemplate = MAKEINTRESOURCEW(IDD_VOL_PROP_SHEET); psp.hIcon = 0; - psp.pszTitle = MAKEINTRESOURCE(IDS_VOL_PROP_SHEET_TITLE); + psp.pszTitle = MAKEINTRESOURCEW(IDS_VOL_PROP_SHEET_TITLE); psp.pfnDlgProc = (DLGPROC)PropSheetDlgProc; psp.pcRefParent = (UINT*)&objs_loaded; psp.pfnCallback = nullptr; psp.lParam = (LPARAM)this; - hPage = CreatePropertySheetPage(&psp); + hPage = CreatePropertySheetPageW(&psp); if (hPage) { if (pfnAddPage(hPage, lParam)) { @@ -1594,10 +1594,10 @@ static INT_PTR __stdcall dlg_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM BtrfsChangeDriveLetter* bcdl; if (uMsg == WM_INITDIALOG) { - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); bcdl = (BtrfsChangeDriveLetter*)lParam; } else - bcdl = (BtrfsChangeDriveLetter*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + bcdl = (BtrfsChangeDriveLetter*)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA); return bcdl->DlgProc(hwndDlg, uMsg, wParam, lParam); } diff --git a/dll/win32/ubtrfs/ubtrfs.rc b/dll/win32/ubtrfs/ubtrfs.rc index 903edb0c9a5..686e30e7b3c 100644 --- a/dll/win32/ubtrfs/ubtrfs.rc +++ b/dll/win32/ubtrfs/ubtrfs.rc @@ -51,8 +51,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,7,4,0 - PRODUCTVERSION 1,7,4,0 + FILEVERSION 1,7,5,0 + PRODUCTVERSION 1,7,5,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -68,12 +68,12 @@ BEGIN BLOCK "080904b0" BEGIN VALUE "FileDescription", "Btrfs utility DLL" - VALUE "FileVersion", "1.7.4" + VALUE "FileVersion", "1.7.5" VALUE "InternalName", "ubtrfs" VALUE "LegalCopyright", "Copyright (c) Mark Harmstone 2016-20" VALUE "OriginalFilename", "ubtrfs.dll" VALUE "ProductName", "WinBtrfs" - VALUE "ProductVersion", "1.7.4" + VALUE "ProductVersion", "1.7.5" END END BLOCK "VarFileInfo" diff --git a/drivers/filesystems/btrfs/btrfs.c b/drivers/filesystems/btrfs/btrfs.c index 4824af9c87b..2f2932f1205 100644 --- a/drivers/filesystems/btrfs/btrfs.c +++ b/drivers/filesystems/btrfs/btrfs.c @@ -5923,7 +5923,7 @@ static void check_cpu() { #ifndef _MSC_VER { - uint32_t eax, ebx, ecx, edx, xcr0; + uint32_t eax, ebx, ecx, edx; __cpuid(1, eax, ebx, ecx, edx); @@ -5935,10 +5935,17 @@ static void check_cpu() { if (__get_cpuid_count(7, 0, &eax, &ebx, &ecx, &edx)) have_avx2 = ebx & bit_AVX2; - if (have_avx2) { // check if supported by OS - __asm__("xgetbv" : "=a" (xcr0) : "c" (0) : "edx" ); + if (have_avx2) { + // check Windows has enabled AVX2 - Windows 10 doesn't immediately - if ((xcr0 & 6) != 6) + if (__readcr4() & (1 << 18)) { + uint32_t xcr0; + + __asm__("xgetbv" : "=a" (xcr0) : "c" (0) : "edx" ); + + if ((xcr0 & 6) != 6) + have_avx2 = false; + } else have_avx2 = false; } } @@ -5954,9 +5961,14 @@ static void check_cpu() { have_avx2 = cpu_info[1] & (1 << 5); if (have_avx2) { - uint32_t xcr0 = (uint32_t)_xgetbv(0); + // check Windows has enabled AVX2 - Windows 10 doesn't immediately - if ((xcr0 & 6) != 6) + if (__readcr4() & (1 << 18)) { + uint32_t xcr0 = (uint32_t)_xgetbv(0); + + if ((xcr0 & 6) != 6) + have_avx2 = false; + } else have_avx2 = false; } } diff --git a/drivers/filesystems/btrfs/btrfs.inf b/drivers/filesystems/btrfs/btrfs.inf index 695bc76f0ed..ac8ff69dc4d 100644 --- a/drivers/filesystems/btrfs/btrfs.inf +++ b/drivers/filesystems/btrfs/btrfs.inf @@ -10,7 +10,7 @@ Signature = "$Windows NT$" Class = Volume ClassGuid = {71a27cdd-812a-11d0-bec7-08002be2092f} Provider = %Me% -DriverVer = 05/24/2020,1.7.3.0 +DriverVer = 10/31/2020,1.7.5.0 CatalogFile = btrfs.cat [DestinationDirs] diff --git a/drivers/filesystems/btrfs/btrfs.rc b/drivers/filesystems/btrfs/btrfs.rc index 8a0116a2646..e7a7ad6c280 100644 --- a/drivers/filesystems/btrfs/btrfs.rc +++ b/drivers/filesystems/btrfs/btrfs.rc @@ -51,8 +51,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,7,4,0 - PRODUCTVERSION 1,7,4,0 + FILEVERSION 1,7,5,0 + PRODUCTVERSION 1,7,5,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -68,12 +68,12 @@ BEGIN BLOCK "080904b0" BEGIN VALUE "FileDescription", "WinBtrfs" - VALUE "FileVersion", "1.7.4" + VALUE "FileVersion", "1.7.5" VALUE "InternalName", "btrfs" VALUE "LegalCopyright", "Copyright (c) Mark Harmstone 2016-20" VALUE "OriginalFilename", "btrfs.sys" VALUE "ProductName", "WinBtrfs" - VALUE "ProductVersion", "1.7.4" + VALUE "ProductVersion", "1.7.5" END END BLOCK "VarFileInfo" diff --git a/drivers/filesystems/btrfs/btrfs_drv.h b/drivers/filesystems/btrfs/btrfs_drv.h index 17c58e4e5d5..0e2554adbc3 100644 --- a/drivers/filesystems/btrfs/btrfs_drv.h +++ b/drivers/filesystems/btrfs/btrfs_drv.h @@ -201,17 +201,8 @@ typedef struct _FSCTL_SET_INTEGRITY_INFORMATION_BUFFER { #ifndef __REACTOS__ #ifndef _MSC_VER #define __drv_aliasesMem -#define _Requires_lock_held_(a) -#define _Requires_exclusive_lock_held_(a) -#define _Releases_lock_(a) -#define _Releases_exclusive_lock_(a) #define _Dispatch_type_(a) -#define _Create_lock_level_(a) #define _Lock_level_order_(a,b) -#define _Has_lock_level_(a) -#define _Requires_lock_not_held_(a) -#define _Acquires_exclusive_lock_(a) -#define _Acquires_shared_lock_(a) #endif #endif // __REACTOS__ diff --git a/drivers/filesystems/btrfs/create.c b/drivers/filesystems/btrfs/create.c index 699228e95a1..25b0b975e53 100644 --- a/drivers/filesystems/btrfs/create.c +++ b/drivers/filesystems/btrfs/create.c @@ -3593,22 +3593,19 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO LARGE_INTEGER zero; if (fileref->fcb->type == BTRFS_TYPE_DIRECTORY || is_subvol_readonly(fileref->fcb->subvol, Irp)) { - free_fileref(fileref); - - return STATUS_ACCESS_DENIED; + Status = STATUS_ACCESS_DENIED; + goto end; } if (Vcb->readonly) { - free_fileref(fileref); - - return STATUS_MEDIA_WRITE_PROTECTED; + Status = STATUS_MEDIA_WRITE_PROTECTED; + goto end; } zero.QuadPart = 0; if (!MmCanFileBeTruncated(&fileref->fcb->nonpaged->segment_object, &zero)) { - free_fileref(fileref); - - return STATUS_USER_MAPPED_FILE; + Status = STATUS_USER_MAPPED_FILE; + goto end; } } @@ -3622,10 +3619,7 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO granted_access, &Status)) { SeUnlockSubjectContext(&IrpSp->Parameters.Create.SecurityContext->AccessState->SubjectSecurityContext); TRACE("SeAccessCheck failed, returning %08lx\n", Status); - - free_fileref(fileref); - - return Status; + goto end; } SeUnlockSubjectContext(&IrpSp->Parameters.Create.SecurityContext->AccessState->SubjectSecurityContext); @@ -3638,10 +3632,8 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO while (sf) { if (sf->delete_on_close) { TRACE("could not open as deletion pending\n"); - - free_fileref(fileref); - - return STATUS_DELETE_PENDING; + Status = STATUS_DELETE_PENDING; + goto end; } sf = sf->parent; } @@ -3651,9 +3643,8 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO is_subvol_readonly(fileref->fcb->subvol, Irp) || fileref->fcb == Vcb->dummy_fcb || Vcb->readonly; if (options & FILE_DELETE_ON_CLOSE && (fileref == Vcb->root_fileref || readonly)) { - free_fileref(fileref); - - return STATUS_CANNOT_DELETE; + Status = STATUS_CANNOT_DELETE; + goto end; } if (readonly) { @@ -3681,9 +3672,8 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO *granted_access &= allowed; IrpSp->Parameters.Create.SecurityContext->AccessState->PreviouslyGrantedAccess &= allowed; } else if (*granted_access & ~allowed) { - free_fileref(fileref); - - return Vcb->readonly ? STATUS_MEDIA_WRITE_PROTECTED : STATUS_ACCESS_DENIED; + Status = Vcb->readonly ? STATUS_MEDIA_WRITE_PROTECTED : STATUS_ACCESS_DENIED; + goto end; } } @@ -3709,24 +3699,20 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO Irp->Tail.Overlay.AuxiliaryBuffer = (void*)data; - free_fileref(fileref); - - return STATUS_REPARSE; + Status = STATUS_REPARSE; + goto end; } } if (fileref->fcb->type == BTRFS_TYPE_DIRECTORY && !fileref->fcb->ads) { if (options & FILE_NON_DIRECTORY_FILE && !(fileref->fcb->atts & FILE_ATTRIBUTE_REPARSE_POINT)) { - free_fileref(fileref); - - return STATUS_FILE_IS_A_DIRECTORY; + Status = STATUS_FILE_IS_A_DIRECTORY; + goto end; } } else if (options & FILE_DIRECTORY_FILE) { TRACE("returning STATUS_NOT_A_DIRECTORY (type = %u)\n", fileref->fcb->type); - - free_fileref(fileref); - - return STATUS_NOT_A_DIRECTORY; + Status = STATUS_NOT_A_DIRECTORY; + goto end; } if (fileref->open_count > 0) { @@ -3738,9 +3724,7 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO else WARN("IoCheckShareAccess failed, returning %08lx\n", Status); - free_fileref(fileref); - - return Status; + goto end; } IoUpdateShareAccess(FileObject, &fileref->fcb->share_access); @@ -3749,12 +3733,8 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO if (*granted_access & FILE_WRITE_DATA || options & FILE_DELETE_ON_CLOSE) { if (!MmFlushImageSection(&fileref->fcb->nonpaged->segment_object, MmFlushForWrite)) { - - IoRemoveShareAccess(FileObject, &fileref->fcb->share_access); - - free_fileref(fileref); - - return (options & FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE : STATUS_SHARING_VIOLATION; + Status = (options & FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE : STATUS_SHARING_VIOLATION; + goto end2; } } @@ -3762,9 +3742,7 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO Status = FsRtlCheckOplock(fcb_oplock(fileref->fcb), Irp, NULL, NULL, NULL); if (!NT_SUCCESS(Status)) { WARN("FsRtlCheckOplock returned %08lx\n", Status); - free_fileref(fileref); - - return Status; + goto end2; } if (RequestedDisposition == FILE_OVERWRITE || RequestedDisposition == FILE_OVERWRITE_IF || RequestedDisposition == FILE_SUPERSEDE) { @@ -3774,43 +3752,26 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO if ((RequestedDisposition == FILE_OVERWRITE || RequestedDisposition == FILE_OVERWRITE_IF) && readonly) { WARN("cannot overwrite readonly file\n"); - - IoRemoveShareAccess(FileObject, &fileref->fcb->share_access); - - free_fileref(fileref); - - return STATUS_ACCESS_DENIED; + Status = STATUS_ACCESS_DENIED; + goto end2; } if (!fileref->fcb->ads && (IrpSp->Parameters.Create.FileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) != ((fileref->fcb->atts & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN)))) { - IoRemoveShareAccess(FileObject, &fileref->fcb->share_access); - - free_fileref(fileref); - - return STATUS_ACCESS_DENIED; + Status = STATUS_ACCESS_DENIED; + goto end2; } if (fileref->fcb->ads) { Status = stream_set_end_of_file_information(Vcb, 0, fileref->fcb, fileref, false); if (!NT_SUCCESS(Status)) { ERR("stream_set_end_of_file_information returned %08lx\n", Status); - - IoRemoveShareAccess(FileObject, &fileref->fcb->share_access); - - free_fileref(fileref); - - return Status; + goto end2; } } else { Status = truncate_file(fileref->fcb, 0, Irp, rollback); if (!NT_SUCCESS(Status)) { ERR("truncate_file returned %08lx\n", Status); - - IoRemoveShareAccess(FileObject, &fileref->fcb->share_access); - - free_fileref(fileref); - - return Status; + goto end2; } } @@ -3819,12 +3780,7 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO if (!NT_SUCCESS(Status)) { ERR("extend_file returned %08lx\n", Status); - - IoRemoveShareAccess(FileObject, &fileref->fcb->share_access); - - free_fileref(fileref); - - return Status; + goto end2; } } @@ -3838,12 +3794,7 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO Status = IoCheckEaBufferValidity(Irp->AssociatedIrp.SystemBuffer, IrpSp->Parameters.Create.EaLength, &offset); if (!NT_SUCCESS(Status)) { ERR("IoCheckEaBufferValidity returned %08lx (error at offset %lu)\n", Status, offset); - - IoRemoveShareAccess(FileObject, &fileref->fcb->share_access); - - free_fileref(fileref); - - return Status; + goto end2; } fileref->fcb->ealen = 4; @@ -3872,12 +3823,8 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO fileref->fcb->ea_xattr.Buffer = ExAllocatePoolWithTag(pool_type, IrpSp->Parameters.Create.EaLength, ALLOC_TAG); if (!fileref->fcb->ea_xattr.Buffer) { ERR("out of memory\n"); - - IoRemoveShareAccess(FileObject, &fileref->fcb->share_access); - - free_fileref(fileref); - - return STATUS_INSUFFICIENT_RESOURCES; + Status = STATUS_INSUFFICIENT_RESOURCES; + goto end2; } fileref->fcb->ea_xattr.Length = fileref->fcb->ea_xattr.MaximumLength = (USHORT)IrpSp->Parameters.Create.EaLength; @@ -3914,10 +3861,7 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO Status = delete_fileref(dc->fileref, NULL, false, NULL, rollback); if (!NT_SUCCESS(Status)) { ERR("delete_fileref returned %08lx\n", Status); - - free_fileref(fileref); - - return Status; + goto end2; } } } else @@ -3973,11 +3917,8 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO if (ffei->Flags & FILE_NEED_EA) { WARN("returning STATUS_ACCESS_DENIED as no EA knowledge\n"); - IoRemoveShareAccess(FileObject, &fileref->fcb->share_access); - - free_fileref(fileref); - - return STATUS_ACCESS_DENIED; + Status = STATUS_ACCESS_DENIED; + goto end2; } if (ffei->NextEntryOffset == 0) @@ -3994,11 +3935,8 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO if (!ccb) { ERR("out of memory\n"); - IoRemoveShareAccess(FileObject, &fileref->fcb->share_access); - - free_fileref(fileref); - - return STATUS_INSUFFICIENT_RESOURCES; + Status = STATUS_INSUFFICIENT_RESOURCES; + goto end2; } RtlZeroMemory(ccb, sizeof(*ccb)); @@ -4076,7 +4014,17 @@ static NTSTATUS open_file2(device_extension* Vcb, ULONG RequestedDisposition, PO #endif InterlockedIncrement(&Vcb->open_files); - return STATUS_SUCCESS; + Status = STATUS_SUCCESS; + +end2: + if (!NT_SUCCESS(Status)) + IoRemoveShareAccess(FileObject, &fileref->fcb->share_access); + +end: + if (!NT_SUCCESS(Status)) + free_fileref(fileref); + + return Status; } NTSTATUS open_fileref_by_inode(_Requires_exclusive_lock_held_(_Curr_->fcb_lock) device_extension* Vcb, diff --git a/drivers/filesystems/btrfs/fileinfo.c b/drivers/filesystems/btrfs/fileinfo.c index 85006b55fc5..4bebfda1904 100644 --- a/drivers/filesystems/btrfs/fileinfo.c +++ b/drivers/filesystems/btrfs/fileinfo.c @@ -5807,7 +5807,7 @@ NTSTATUS __stdcall drv_set_ea(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { goto end2; } - if (Irp->RequestorMode == KernelMode) { + if (Irp->RequestorMode == KernelMode || ccb->access & FILE_WRITE_ATTRIBUTES) { RtlCopyMemory(&fcb->inode_item.st_uid, item->value.Buffer, sizeof(uint32_t)); fcb->sd_dirty = true; fcb->sd_deleted = false; @@ -5822,7 +5822,7 @@ NTSTATUS __stdcall drv_set_ea(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { goto end2; } - if (Irp->RequestorMode == KernelMode) + if (Irp->RequestorMode == KernelMode || ccb->access & FILE_WRITE_ATTRIBUTES) RtlCopyMemory(&fcb->inode_item.st_gid, item->value.Buffer, sizeof(uint32_t)); RemoveEntryList(&item->list_entry); @@ -5834,7 +5834,7 @@ NTSTATUS __stdcall drv_set_ea(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { goto end2; } - if (Irp->RequestorMode == KernelMode) { + if (Irp->RequestorMode == KernelMode || ccb->access & FILE_WRITE_ATTRIBUTES) { uint32_t allowed = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH | S_ISGID | S_ISVTX | S_ISUID; uint32_t val; diff --git a/drivers/filesystems/btrfs/write.c b/drivers/filesystems/btrfs/write.c index e8e354280c3..0d63ac01cec 100644 --- a/drivers/filesystems/btrfs/write.c +++ b/drivers/filesystems/btrfs/write.c @@ -3298,6 +3298,14 @@ NTSTATUS truncate_file(fcb* fcb, uint64_t end, PIRP Irp, LIST_ENTRY* rollback) { } fcb->inode_item.st_blocks += end; + + fcb->inode_item.st_size = end; + fcb->inode_item_changed = true; + TRACE("setting st_size to %I64x\n", end); + + fcb->Header.AllocationSize.QuadPart = sector_align(fcb->inode_item.st_size, fcb->Vcb->superblock.sector_size); + fcb->Header.FileSize.QuadPart = fcb->inode_item.st_size; + fcb->Header.ValidDataLength.QuadPart = fcb->inode_item.st_size; } ExFreePool(buf);