1 /* Copyright (c) Mark Harmstone 2016-17
3 * This file is part of WinBtrfs.
5 * WinBtrfs is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public Licence as published by
7 * the Free Software Foundation, either version 3 of the Licence, or
8 * (at your option) any later version.
10 * WinBtrfs is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public Licence for more details.
15 * You should have received a copy of the GNU Lesser General Public Licence
16 * along with WinBtrfs. If not, see <http://www.gnu.org/licenses/>. */
20 #define ISOLATION_AWARE_ENABLED 1
21 #define STRSAFE_NO_DEPRECATE
24 #define WINVER 0x0A00 // Windows 10
25 #define _WIN32_WINNT 0x0A00
32 #define WIN32_NO_STATUS
36 #include <ndk/iofuncs.h>
41 #include "../btrfsioctl.h"
44 #include "btrfsioctl.h"
48 #define STATUS_SUCCESS (NTSTATUS)0x00000000
49 #define STATUS_BUFFER_OVERFLOW (NTSTATUS)0x80000005
50 #define STATUS_END_OF_FILE (NTSTATUS)0xc0000011
51 #define STATUS_MORE_PROCESSING_REQUIRED (NTSTATUS)0xc0000016
52 #define STATUS_BUFFER_TOO_SMALL (NTSTATUS)0xc0000023
53 #define STATUS_DEVICE_NOT_READY (NTSTATUS)0xc00000a3
54 #define STATUS_CANNOT_DELETE (NTSTATUS)0xc0000121
55 #define STATUS_NOT_FOUND (NTSTATUS)0xc0000225
58 #define BLOCK_FLAG_DATA 0x001
59 #define BLOCK_FLAG_SYSTEM 0x002
60 #define BLOCK_FLAG_METADATA 0x004
61 #define BLOCK_FLAG_RAID0 0x008
62 #define BLOCK_FLAG_RAID1 0x010
63 #define BLOCK_FLAG_DUPLICATE 0x020
64 #define BLOCK_FLAG_RAID10 0x040
65 #define BLOCK_FLAG_RAID5 0x080
66 #define BLOCK_FLAG_RAID6 0x100
68 #define BTRFS_TYPE_FILE 1
69 #define BTRFS_TYPE_DIRECTORY 2
70 #define BTRFS_TYPE_CHARDEV 3
71 #define BTRFS_TYPE_BLOCKDEV 4
72 #define BTRFS_TYPE_FIFO 5
73 #define BTRFS_TYPE_SOCKET 6
74 #define BTRFS_TYPE_SYMLINK 7
77 #define funcname __FUNCTION__
79 #define funcname __func__
86 NTSYSCALLAPI NTSTATUS NTAPI
NtFsControlFile(HANDLE FileHandle
, HANDLE Event
, PIO_APC_ROUTINE ApcRoutine
, PVOID ApcContext
,
87 PIO_STATUS_BLOCK IoStatusBlock
, ULONG FsControlCode
, PVOID InputBuffer
, ULONG InputBufferLength
,
88 PVOID OutputBuffer
, ULONG OutputBufferLength
);
90 NTSTATUS NTAPI
NtReadFile(HANDLE FileHandle
, HANDLE Event
, PIO_APC_ROUTINE ApcRoutine
, PVOID ApcContext
, PIO_STATUS_BLOCK IoStatusBlock
, PVOID Buffer
,
91 ULONG Length
, PLARGE_INTEGER ByteOffset
, PULONG Key
);
94 NTSTATUS WINAPI
RtlUTF8ToUnicodeN(PWSTR UnicodeStringDestination
, ULONG UnicodeStringMaxWCharCount
,
95 PULONG UnicodeStringActualWCharCount
, PCCH UTF8StringSource
,
96 ULONG UTF8StringByteCount
);
99 NTSTATUS WINAPI
NtSetEaFile(HANDLE FileHandle
, PIO_STATUS_BLOCK IoStatusBlock
, PVOID Buffer
, ULONG Length
);
101 NTSTATUS WINAPI
NtSetSecurityObject(HANDLE Handle
, SECURITY_INFORMATION SecurityInformation
, PSECURITY_DESCRIPTOR SecurityDescriptor
);
103 NTSTATUS NTAPI
NtQueryInformationFile(HANDLE hFile
, PIO_STATUS_BLOCK io
, PVOID ptr
, ULONG len
, FILE_INFORMATION_CLASS FileInformationClass
);
110 SetFileInformationByHandle(HANDLE hFile
, FILE_INFO_BY_HANDLE_CLASS FileInformationClass
, LPVOID lpFileInformation
, DWORD dwBufferSize
);
113 GetFileInformationByHandleEx(HANDLE hFile
, FILE_INFO_BY_HANDLE_CLASS FileInformationClass
, LPVOID lpFileInformation
, DWORD dwBufferSize
);
120 typedef struct _REPARSE_DATA_BUFFER
{
122 USHORT ReparseDataLength
;
127 USHORT SubstituteNameOffset
;
128 USHORT SubstituteNameLength
;
129 USHORT PrintNameOffset
;
130 USHORT PrintNameLength
;
133 } SymbolicLinkReparseBuffer
;
136 USHORT SubstituteNameOffset
;
137 USHORT SubstituteNameLength
;
138 USHORT PrintNameOffset
;
139 USHORT PrintNameLength
;
141 } MountPointReparseBuffer
;
145 } GenericReparseBuffer
;
147 } REPARSE_DATA_BUFFER
, *PREPARSE_DATA_BUFFER
;
149 #define SYMLINK_FLAG_RELATIVE 1
152 #ifndef FILE_SUPPORTS_BLOCK_REFCOUNTING
154 typedef struct _DUPLICATE_EXTENTS_DATA
{
156 LARGE_INTEGER SourceFileOffset
;
157 LARGE_INTEGER TargetFileOffset
;
158 LARGE_INTEGER ByteCount
;
159 } DUPLICATE_EXTENTS_DATA
, *PDUPLICATE_EXTENTS_DATA
;
161 #define FSCTL_DUPLICATE_EXTENTS_TO_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 209, METHOD_BUFFERED, FILE_WRITE_ACCESS)
163 typedef struct _FSCTL_GET_INTEGRITY_INFORMATION_BUFFER
{
164 WORD ChecksumAlgorithm
;
167 DWORD ChecksumChunkSizeInBytes
;
168 DWORD ClusterSizeInBytes
;
169 } FSCTL_GET_INTEGRITY_INFORMATION_BUFFER
, *PFSCTL_GET_INTEGRITY_INFORMATION_BUFFER
;
171 typedef struct _FSCTL_SET_INTEGRITY_INFORMATION_BUFFER
{
172 WORD ChecksumAlgorithm
;
175 } FSCTL_SET_INTEGRITY_INFORMATION_BUFFER
, *PFSCTL_SET_INTEGRITY_INFORMATION_BUFFER
;
177 #define FSCTL_GET_INTEGRITY_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 159, METHOD_BUFFERED, FILE_ANY_ACCESS)
178 #define FSCTL_SET_INTEGRITY_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 160, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
182 extern HMODULE module
;
183 void ShowError(HWND hwnd
, ULONG err
);
184 void ShowNtStatusError(HWND hwnd
, NTSTATUS Status
);
185 void ShowStringError(HWND hwndDlg
, int num
, ...);
186 void format_size(UINT64 size
, WCHAR
* s
, ULONG len
, BOOL show_bytes
);
187 void set_dpi_aware();
188 std::wstring
format_message(ULONG last_error
);
189 std::wstring
format_ntstatus(NTSTATUS Status
);