1 /* Copyright (c) Mark Harmstone 2016-17 2 * 3 * This file is part of WinBtrfs. 4 * 5 * WinBtrfs is free software: you can redistribute it and/or modify 6 * it under the terms of the GNU Lesser General Public Licence as published by 7 * the Free Software Foundation, either version 3 of the Licence, or 8 * (at your option) any later version. 9 * 10 * WinBtrfs is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public Licence for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public Licence 16 * along with WinBtrfs. If not, see <http://www.gnu.org/licenses/>. */ 17 18 #pragma once 19 20 #define ISOLATION_AWARE_ENABLED 1 21 #define STRSAFE_NO_DEPRECATE 22 23 #ifndef __REACTOS__ 24 #define WINVER 0x0A00 // Windows 10 25 #define _WIN32_WINNT 0x0A00 26 #endif 27 28 #ifndef __REACTOS__ 29 #include <windows.h> 30 #include <winternl.h> 31 #else 32 #define WIN32_NO_STATUS 33 #include <windef.h> 34 #include <winbase.h> 35 #include <strsafe.h> 36 #include <ndk/iofuncs.h> 37 #endif 38 #include <string> 39 #ifndef __REACTOS__ 40 #include "../btrfs.h" 41 #include "../btrfsioctl.h" 42 #else 43 #include "btrfs.h" 44 #include "btrfsioctl.h" 45 #endif 46 47 #ifndef __REACTOS__ 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 56 #endif 57 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 67 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 75 76 #ifdef _MSC_VER 77 #define funcname __FUNCTION__ 78 #else 79 #define funcname __func__ 80 #endif 81 82 #ifdef __cplusplus 83 extern "C" { 84 #endif 85 #ifndef __REACTOS__ 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); 89 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); 92 #endif 93 94 NTSTATUS WINAPI RtlUTF8ToUnicodeN(PWSTR UnicodeStringDestination, ULONG UnicodeStringMaxWCharCount, 95 PULONG UnicodeStringActualWCharCount, PCCH UTF8StringSource, 96 ULONG UTF8StringByteCount); 97 98 #ifndef __REACTOS__ 99 NTSTATUS WINAPI NtSetEaFile(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length); 100 101 NTSTATUS WINAPI NtSetSecurityObject(HANDLE Handle, SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR SecurityDescriptor); 102 103 NTSTATUS NTAPI NtQueryInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass); 104 #ifdef __cplusplus 105 } 106 #endif 107 #else 108 BOOL 109 WINAPI 110 SetFileInformationByHandle(HANDLE hFile, FILE_INFO_BY_HANDLE_CLASS FileInformationClass, LPVOID lpFileInformation, DWORD dwBufferSize); 111 BOOL 112 WINAPI 113 GetFileInformationByHandleEx(HANDLE hFile, FILE_INFO_BY_HANDLE_CLASS FileInformationClass, LPVOID lpFileInformation, DWORD dwBufferSize); 114 #ifdef __cplusplus 115 } 116 #endif 117 #endif 118 119 #ifndef __REACTOS__ 120 typedef struct _REPARSE_DATA_BUFFER { 121 ULONG ReparseTag; 122 USHORT ReparseDataLength; 123 USHORT Reserved; 124 125 union { 126 struct { 127 USHORT SubstituteNameOffset; 128 USHORT SubstituteNameLength; 129 USHORT PrintNameOffset; 130 USHORT PrintNameLength; 131 ULONG Flags; 132 WCHAR PathBuffer[1]; 133 } SymbolicLinkReparseBuffer; 134 135 struct { 136 USHORT SubstituteNameOffset; 137 USHORT SubstituteNameLength; 138 USHORT PrintNameOffset; 139 USHORT PrintNameLength; 140 WCHAR PathBuffer[1]; 141 } MountPointReparseBuffer; 142 143 struct { 144 UCHAR DataBuffer[1]; 145 } GenericReparseBuffer; 146 }; 147 } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; 148 149 #define SYMLINK_FLAG_RELATIVE 1 150 #endif 151 152 #ifndef FILE_SUPPORTS_BLOCK_REFCOUNTING 153 154 typedef struct _DUPLICATE_EXTENTS_DATA { 155 HANDLE FileHandle; 156 LARGE_INTEGER SourceFileOffset; 157 LARGE_INTEGER TargetFileOffset; 158 LARGE_INTEGER ByteCount; 159 } DUPLICATE_EXTENTS_DATA, *PDUPLICATE_EXTENTS_DATA; 160 161 #define FSCTL_DUPLICATE_EXTENTS_TO_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 209, METHOD_BUFFERED, FILE_WRITE_ACCESS) 162 163 typedef struct _FSCTL_GET_INTEGRITY_INFORMATION_BUFFER { 164 WORD ChecksumAlgorithm; 165 WORD Reserved; 166 DWORD Flags; 167 DWORD ChecksumChunkSizeInBytes; 168 DWORD ClusterSizeInBytes; 169 } FSCTL_GET_INTEGRITY_INFORMATION_BUFFER, *PFSCTL_GET_INTEGRITY_INFORMATION_BUFFER; 170 171 typedef struct _FSCTL_SET_INTEGRITY_INFORMATION_BUFFER { 172 WORD ChecksumAlgorithm; 173 WORD Reserved; 174 DWORD Flags; 175 } FSCTL_SET_INTEGRITY_INFORMATION_BUFFER, *PFSCTL_SET_INTEGRITY_INFORMATION_BUFFER; 176 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) 179 180 #endif 181 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); 190