[BTRFS][UBTRFS][SHELLBTRFS] Upgrade to 1.7.8 (#4417)

v1.7.8.1 (2021-06-13):

- Fixed bug preventing new directories from appearing in listings
- Fixed Release version of driver still not working on XP

v1.7.8 (2021-06-09):

- ~~Upgraded zstd to version 1.5.0~~ Not in ReactOS as it introduces deprecated code
- Fixed regression stopping driver from working under XP
- Fixed compilation on clang
- Fixed corruption issue when Linux mount option inode_cache had been used
- Fixed recursion issue involving virtual directory \$Root
This commit is contained in:
Vincent Franchomme 2022-04-28 21:35:40 +02:00 committed by Hermès BÉLUSCA - MAÏTO
parent 98654b54b4
commit 3cfd8ab775
19 changed files with 79 additions and 67 deletions

View file

@ -43,7 +43,7 @@ HRESULT __stdcall BtrfsIconOverlay::QueryInterface(REFIID riid, void **ppObj) {
return E_NOINTERFACE;
}
HRESULT __stdcall BtrfsIconOverlay::GetOverlayInfo(PWSTR pwszIconFile, int cchMax, int* pIndex, DWORD* pdwFlags) {
HRESULT __stdcall BtrfsIconOverlay::GetOverlayInfo(PWSTR pwszIconFile, int cchMax, int* pIndex, DWORD* pdwFlags) noexcept {
if (GetModuleFileNameW(module, pwszIconFile, cchMax) == 0)
return E_FAIL;
@ -62,7 +62,7 @@ HRESULT __stdcall BtrfsIconOverlay::GetOverlayInfo(PWSTR pwszIconFile, int cchMa
return S_OK;
}
HRESULT __stdcall BtrfsIconOverlay::GetPriority(int *pPriority) {
HRESULT __stdcall BtrfsIconOverlay::GetPriority(int *pPriority) noexcept {
if (!pPriority)
return E_INVALIDARG;
@ -71,7 +71,7 @@ HRESULT __stdcall BtrfsIconOverlay::GetPriority(int *pPriority) {
return S_OK;
}
HRESULT __stdcall BtrfsIconOverlay::IsMemberOf(PCWSTR pwszPath, DWORD dwAttrib) {
HRESULT __stdcall BtrfsIconOverlay::IsMemberOf(PCWSTR pwszPath, DWORD dwAttrib) noexcept {
win_handle h;
NTSTATUS Status;
IO_STATUS_BLOCK iosb;

View file

@ -51,9 +51,9 @@ public:
// IShellIconOverlayIdentifier
virtual HRESULT __stdcall GetOverlayInfo(PWSTR pwszIconFile, int cchMax, int* pIndex, DWORD* pdwFlags);
virtual HRESULT __stdcall GetPriority(int *pPriority);
virtual HRESULT __stdcall IsMemberOf(PCWSTR pwszPath, DWORD dwAttrib);
virtual HRESULT __stdcall GetOverlayInfo(PWSTR pwszIconFile, int cchMax, int* pIndex, DWORD* pdwFlags) noexcept;
virtual HRESULT __stdcall GetPriority(int *pPriority) noexcept;
virtual HRESULT __stdcall IsMemberOf(PCWSTR pwszPath, DWORD dwAttrib) noexcept;
private:
LONG refcount;

View file

@ -243,11 +243,11 @@ void wstring_sprintf(wstring& s, wstring fmt, ...) {
#pragma warning(pop)
#endif
extern "C" STDAPI DllCanUnloadNow(void) {
STDAPI DllCanUnloadNow(void) {
return objs_loaded == 0 ? S_OK : S_FALSE;
}
extern "C" STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) {
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) {
if (rclsid == CLSID_ShellBtrfsIconHandler) {
Factory* fact = new Factory;
if (!fact)
@ -497,7 +497,7 @@ static void unreg_prop_sheet_handler(const wstring& filetype, const wstring& nam
#endif
}
extern "C" STDAPI DllRegisterServer(void) {
STDAPI DllRegisterServer(void) {
try {
register_clsid(CLSID_ShellBtrfsIconHandler, COM_DESCRIPTION_ICON_HANDLER);
register_clsid(CLSID_ShellBtrfsContextMenu, COM_DESCRIPTION_CONTEXT_MENU);
@ -520,7 +520,7 @@ extern "C" STDAPI DllRegisterServer(void) {
return S_OK;
}
extern "C" STDAPI DllUnregisterServer(void) {
STDAPI DllUnregisterServer(void) {
try {
unreg_prop_sheet_handler(L"Folder", ICON_OVERLAY_NAME);
unreg_prop_sheet_handler(L"*", ICON_OVERLAY_NAME);
@ -541,7 +541,7 @@ extern "C" STDAPI DllUnregisterServer(void) {
return S_OK;
}
extern "C" STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine) {
STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine) {
if (bInstall)
return DllRegisterServer();
else

View file

@ -336,7 +336,7 @@ HRESULT BtrfsPropSheet::load_file_list() {
totalsize = allocsize = sparsesize = 0;
for (i = 0; i < num_files; i++) {
if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / sizeof(MAX_PATH))) {
if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / sizeof(WCHAR))) {
HRESULT hr;
hr = check_file(fn, i, num_files, &sv);
@ -704,7 +704,7 @@ void BtrfsPropSheet::apply_changes(HWND hDlg) {
num_files = DragQueryFileW((HDROP)stgm.hGlobal, 0xFFFFFFFF, nullptr, 0);
for (i = 0; i < num_files; i++) {
if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / sizeof(MAX_PATH))) {
if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / sizeof(WCHAR))) {
apply_changes_file(hDlg, fn);
}
}
@ -882,7 +882,7 @@ void BtrfsPropSheet::open_as_admin(HWND hwndDlg) {
GetModuleFileNameW(module, modfn, sizeof(modfn) / sizeof(WCHAR));
for (i = 0; i < num_files; i++) {
if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / sizeof(MAX_PATH))) {
if (DragQueryFileW((HDROP)stgm.hGlobal, i, fn, sizeof(fn) / sizeof(WCHAR))) {
wstring t;
SHELLEXECUTEINFOW sei;

View file

@ -1563,6 +1563,11 @@ extern "C" void CALLBACK RecvSubvolGUIW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszC
tp->PrivilegeCount = 3;
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warray-bounds"
#endif // __clang__
if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", &luid)) {
free(tp);
throw last_error(GetLastError());
@ -1592,6 +1597,10 @@ extern "C" void CALLBACK RecvSubvolGUIW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszC
throw last_error(GetLastError());
}
#ifdef __clang__
#pragma clang diagnostic pop
#endif // __clang__
file[0] = 0;
memset(&ofn, 0, sizeof(OPENFILENAMEW));
@ -1636,6 +1645,11 @@ extern "C" void CALLBACK RecvSubvolW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdL
tp->PrivilegeCount = 3;
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warray-bounds"
#endif // __clang__
if (!LookupPrivilegeValueW(nullptr, L"SeManageVolumePrivilege", &luid)) {
free(tp);
return;
@ -1660,6 +1674,10 @@ extern "C" void CALLBACK RecvSubvolW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdL
tp->Privileges[2].Luid = luid;
tp->Privileges[2].Attributes = SE_PRIVILEGE_ENABLED;
#ifdef __clang__
#pragma clang diagnostic pop
#endif // __clang__
if (!AdjustTokenPrivileges(token, false, tp, tplen, nullptr, nullptr)) {
free(tp);
return;

View file

@ -61,8 +61,8 @@ IDI_ICON1 ICON "subvol.ico"
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,7,7,0
PRODUCTVERSION 1,7,7,0
FILEVERSION 1,7,8,0
PRODUCTVERSION 1,7,8,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -78,12 +78,12 @@ BEGIN
BLOCK "080904b0"
BEGIN
VALUE "FileDescription", "WinBtrfs shell extension"
VALUE "FileVersion", "1.7.7"
VALUE "FileVersion", "1.7.8"
VALUE "InternalName", "btrfs"
VALUE "LegalCopyright", "Copyright (c) Mark Harmstone 2016-21"
VALUE "OriginalFilename", "shellbtrfs.dll"
VALUE "ProductName", "WinBtrfs"
VALUE "ProductVersion", "1.7.7"
VALUE "ProductVersion", "1.7.8"
END
END
BLOCK "VarFileInfo"

View file

@ -104,10 +104,6 @@ using namespace std;
extern "C" {
#endif
#ifndef __REACTOS__
NTSYSCALLAPI NTSTATUS NTAPI NtFsControlFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
PIO_STATUS_BLOCK IoStatusBlock, ULONG FsControlCode, PVOID InputBuffer, ULONG InputBufferLength,
PVOID OutputBuffer, ULONG OutputBufferLength);
NTSTATUS NTAPI NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer,
ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);
@ -115,11 +111,15 @@ NTSTATUS WINAPI NtSetEaFile(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, P
NTSTATUS WINAPI NtSetSecurityObject(HANDLE Handle, SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR SecurityDescriptor);
#ifdef _MSC_VER
NTSYSCALLAPI NTSTATUS NTAPI NtFsControlFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
PIO_STATUS_BLOCK IoStatusBlock, ULONG FsControlCode, PVOID InputBuffer, ULONG InputBufferLength,
PVOID OutputBuffer, ULONG OutputBufferLength);
NTSTATUS NTAPI NtQueryInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass);
NTSTATUS NTAPI NtSetInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass);
#ifdef _MSC_VER
#define FileBasicInformation (FILE_INFORMATION_CLASS)4
#define FileStandardInformation (FILE_INFORMATION_CLASS)5
#define FileDispositionInformation (FILE_INFORMATION_CLASS)13

View file

@ -97,7 +97,7 @@ HRESULT __stdcall BtrfsVolPropSheet::Initialize(PCIDLIST_ABSOLUTE pidlFolder, ID
return E_FAIL;
}
if (DragQueryFileW((HDROP)stgm.hGlobal, 0, fnbuf, sizeof(fnbuf) / sizeof(MAX_PATH))) {
if (DragQueryFileW((HDROP)stgm.hGlobal, 0, fnbuf, sizeof(fnbuf) / sizeof(WCHAR))) {
fn = fnbuf;
win_handle h = CreateFileW(fn.c_str(), FILE_TRAVERSE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr,

View file

@ -51,8 +51,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,7,7,0
PRODUCTVERSION 1,7,7,0
FILEVERSION 1,7,8,0
PRODUCTVERSION 1,7,8,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -68,12 +68,12 @@ BEGIN
BLOCK "080904b0"
BEGIN
VALUE "FileDescription", "Btrfs utility DLL"
VALUE "FileVersion", "1.7.7"
VALUE "FileVersion", "1.7.8"
VALUE "InternalName", "ubtrfs"
VALUE "LegalCopyright", "Copyright (c) Mark Harmstone 2016-21"
VALUE "OriginalFilename", "ubtrfs.dll"
VALUE "ProductName", "WinBtrfs"
VALUE "ProductVersion", "1.7.7"
VALUE "ProductVersion", "1.7.8"
END
END
BLOCK "VarFileInfo"

View file

@ -68,10 +68,6 @@ typedef struct {
LIST_ENTRY list_entry;
} data_reloc_ref;
#ifndef _MSC_VER // not in mingw yet
#define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED 0x80000000
#endif
#define BALANCE_UNIT 0x100000 // only read 1 MB at a time
static NTSTATUS add_metadata_reloc(_Requires_exclusive_lock_held_(_Curr_->tree_lock) device_extension* Vcb, LIST_ENTRY* items, traverse_ptr* tp,

View file

@ -397,7 +397,7 @@ static bool get_last_inode(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock
return false;
}
if (tp.item->key.obj_type == TYPE_INODE_ITEM || (tp.item->key.obj_type == TYPE_ROOT_ITEM && !(tp.item->key.obj_id & 0x8000000000000000))) {
if ((tp.item->key.obj_type == TYPE_INODE_ITEM || tp.item->key.obj_type == TYPE_ROOT_ITEM) && tp.item->key.obj_id <= BTRFS_LAST_FREE_OBJECTID) {
r->lastinode = tp.item->key.obj_id;
TRACE("last inode for tree %I64x is %I64x\n", r->id, r->lastinode);
return true;
@ -408,7 +408,7 @@ static bool get_last_inode(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock
TRACE("moving on to %I64x,%x,%I64x\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset);
if (tp.item->key.obj_type == TYPE_INODE_ITEM || (tp.item->key.obj_type == TYPE_ROOT_ITEM && !(tp.item->key.obj_id & 0x8000000000000000))) {
if ((tp.item->key.obj_type == TYPE_INODE_ITEM || tp.item->key.obj_type == TYPE_ROOT_ITEM) && tp.item->key.obj_id <= BTRFS_LAST_FREE_OBJECTID) {
r->lastinode = tp.item->key.obj_id;
TRACE("last inode for tree %I64x is %I64x\n", r->id, r->lastinode);
return true;

View file

@ -15,6 +15,7 @@ static const uint64_t superblock_addrs[] = { 0x10000, 0x4000000, 0x4000000000, 0
#define BTRFS_MAGIC 0x4d5f53665248425f
#define MAX_LABEL_SIZE 0x100
#define SUBVOL_ROOT_INODE 0x100
#define BTRFS_LAST_FREE_OBJECTID 0xffffffffffffff00
#define TYPE_INODE_ITEM 0x01
#define TYPE_INODE_REF 0x0C

View file

@ -10,7 +10,7 @@ Signature = "$Windows NT$"
Class = Volume
ClassGuid = {71a27cdd-812a-11d0-bec7-08002be2092f}
Provider = %Me%
DriverVer = 04/12/2021,1.7.7.0
DriverVer = 06/07/2021,1.7.8.0
CatalogFile = btrfs.cat
[DestinationDirs]

View file

@ -51,8 +51,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,7,7,0
PRODUCTVERSION 1,7,7,0
FILEVERSION 1,7,8,0
PRODUCTVERSION 1,7,8,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -68,12 +68,12 @@ BEGIN
BLOCK "080904b0"
BEGIN
VALUE "FileDescription", "WinBtrfs"
VALUE "FileVersion", "1.7.7"
VALUE "FileVersion", "1.7.8"
VALUE "InternalName", "btrfs"
VALUE "LegalCopyright", "Copyright (c) Mark Harmstone 2016-21"
VALUE "OriginalFilename", "btrfs.sys"
VALUE "ProductName", "WinBtrfs"
VALUE "ProductVersion", "1.7.7"
VALUE "ProductVersion", "1.7.8"
END
END
BLOCK "VarFileInfo"

View file

@ -126,7 +126,7 @@ C_ASSERT(sizeof(bool) == 1);
#define BTRFS_VOLUME_PREFIX L"\\Device\\Btrfs{"
#ifdef _MSC_VER
#if defined(_MSC_VER) || defined(__clang__)
#define try __try
#define except __except
#define finally __finally
@ -1633,7 +1633,7 @@ extern BTRFS_UUID boot_uuid;
// not in mingw yet
#ifndef _MSC_VER
typedef struct {
FSRTL_COMMON_FCB_HEADER DUMMYSTRUCTNAME;
FSRTL_COMMON_FCB_HEADER Header;
PFAST_MUTEX FastMutex;
LIST_ENTRY FilterContexts;
EX_PUSH_LOCK PushLock;
@ -1652,7 +1652,7 @@ typedef struct {
#endif
#else
typedef struct {
FSRTL_COMMON_FCB_HEADER DUMMYSTRUCTNAME;
FSRTL_COMMON_FCB_HEADER Header;
PFAST_MUTEX FastMutex;
LIST_ENTRY FilterContexts;
EX_PUSH_LOCK PushLock;

View file

@ -727,6 +727,13 @@ next:
if (!dc)
return STATUS_NO_MORE_FILES;
if (dc->root_dir && fileref->parent) { // hide $Root dir unless in apparent root, to avoid recursion
if (dc->list_entry_index.Flink == &fileref->fcb->dir_children_index)
return STATUS_NO_MORE_FILES;
dc = CONTAINING_RECORD(dc->list_entry_index.Flink, dir_child, list_entry_index);
}
de->key = dc->key;
de->name = dc->name;
de->type = dc->type;

View file

@ -46,10 +46,6 @@ typedef struct {
static NTSTATUS create_chunk(device_extension* Vcb, chunk* c, PIRP Irp);
static NTSTATUS update_tree_extents(device_extension* Vcb, tree* t, PIRP Irp, LIST_ENTRY* rollback);
#ifndef _MSC_VER // not in mingw yet
#define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED 0x80000000
#endif
_Function_class_(IO_COMPLETION_ROUTINE)
static NTSTATUS __stdcall write_completion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID conptr) {
write_context* context = conptr;

View file

@ -36,10 +36,6 @@
#define SEF_AVOID_PRIVILEGE_CHECK 0x08 // on MSDN but not in any header files(?)
#ifndef _MSC_VER // not in mingw yet
#define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED 0x80000000
#endif
#define SEF_SACL_AUTO_INHERIT 0x02
extern LIST_ENTRY VcbList;
@ -5030,7 +5026,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
ExAcquireResourceSharedLite(fcb->Header.Resource, true);
try {
_SEH2_TRY {
LIST_ENTRY* le = fcb->extents.Flink;
extent* first_ext = NULL;
unsigned int num_extents = 0, first_extent_num = 0, i;
@ -5067,7 +5063,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
if (!first_ext) {
Status = STATUS_END_OF_FILE;
leave;
_SEH2_LEAVE;
}
out->ExtentCount = num_extents - first_extent_num;
@ -5090,7 +5086,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
if (ext->offset > last_off) {
if (outlen < sizeof(LARGE_INTEGER) + sizeof(LARGE_INTEGER)) {
Status = STATUS_BUFFER_OVERFLOW;
leave;
_SEH2_LEAVE;
}
out->Extents[i].NextVcn.QuadPart = ext->offset >> Vcb->sector_shift;
@ -5103,7 +5099,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
if (outlen < sizeof(LARGE_INTEGER) + sizeof(LARGE_INTEGER)) {
Status = STATUS_BUFFER_OVERFLOW;
leave;
_SEH2_LEAVE;
}
out->Extents[i].NextVcn.QuadPart = (ext->offset + ext->extent_data.decoded_size) >> Vcb->sector_shift;
@ -5125,7 +5121,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
if (num_sectors << Vcb->sector_shift > last_off) {
if (outlen < sizeof(LARGE_INTEGER) + sizeof(LARGE_INTEGER)) {
Status = STATUS_BUFFER_OVERFLOW;
leave;
_SEH2_LEAVE;
}
out->Extents[i].NextVcn.QuadPart = num_sectors;
@ -5136,9 +5132,9 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
}
Status = STATUS_SUCCESS;
} finally {
} _SEH2_FINALLY {
ExReleaseResourceLite(fcb->Header.Resource);
}
} _SEH2_END;
return Status;
}
@ -5235,7 +5231,7 @@ static NTSTATUS get_csum_info(device_extension* Vcb, PFILE_OBJECT FileObject, bt
ExAcquireResourceSharedLite(fcb->Header.Resource, true);
try {
_SEH2_TRY {
LIST_ENTRY* le;
uint8_t* ptr;
uint64_t last_off;
@ -5244,17 +5240,17 @@ static NTSTATUS get_csum_info(device_extension* Vcb, PFILE_OBJECT FileObject, bt
if (fcb->ads) {
Status = STATUS_INVALID_DEVICE_REQUEST;
leave;
_SEH2_LEAVE;
}
if (fcb->type == BTRFS_TYPE_DIRECTORY) {
Status = STATUS_FILE_IS_A_DIRECTORY;
leave;
_SEH2_LEAVE;
}
if (fcb->inode_item.flags & BTRFS_INODE_NODATASUM) {
Status = STATUS_INVALID_DEVICE_REQUEST;
leave;
_SEH2_LEAVE;
}
buf->csum_type = Vcb->superblock.csum_type;
@ -5273,7 +5269,7 @@ static NTSTATUS get_csum_info(device_extension* Vcb, PFILE_OBJECT FileObject, bt
buf->num_sectors = 0;
*retlen = offsetof(btrfs_csum_info, data[0]);
Status = STATUS_SUCCESS;
leave;
_SEH2_LEAVE;
}
le = le->Flink;
@ -5284,7 +5280,7 @@ static NTSTATUS get_csum_info(device_extension* Vcb, PFILE_OBJECT FileObject, bt
if (buflen < offsetof(btrfs_csum_info, data[0]) + (buf->csum_length * buf->num_sectors)) {
Status = STATUS_BUFFER_OVERFLOW;
*retlen = offsetof(btrfs_csum_info, data[0]);
leave;
_SEH2_LEAVE;
}
ptr = buf->data;
@ -5333,9 +5329,9 @@ static NTSTATUS get_csum_info(device_extension* Vcb, PFILE_OBJECT FileObject, bt
*retlen = offsetof(btrfs_csum_info, data[0]) + (buf->csum_length * buf->num_sectors);
Status = STATUS_SUCCESS;
} finally {
} _SEH2_FINALLY {
ExReleaseResourceLite(fcb->Header.Resource);
}
} _SEH2_END;
return Status;
}

View file

@ -82,8 +82,6 @@ void blake2b(void *out, size_t outlen, const void* in, size_t inlen);
#ifdef __cplusplus
extern "C" {
#endif
NTSYSCALLAPI NTSTATUS NTAPI NtFsControlFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG FsControlCode, PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength);
NTSTATUS NTAPI NtWriteFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer,
ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);