22 #define WIN32_NO_STATUS 46 #include <stringapiset.h> 49 #include "../btrfsioctl.h" 50 #include "../crc32c.h" 51 #include "../xxhash.h" 53 #if defined(_X86_) || defined(_AMD64_) 63 #define malloc(size) RtlAllocateHeap(RtlGetProcessHeap(), 0, (size)) 64 #define free(ptr) RtlFreeHeap(RtlGetProcessHeap(), 0, (ptr)) 67 #define SHA256_HASH_SIZE 32 70 #define BLAKE2_HASH_SIZE 32 71 void blake2b(
void *
out,
size_t outlen,
const void*
in,
size_t inlen);
74 #define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) 75 #define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) 76 #define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) 78 #ifndef _MSC_VER // not in mingw yet 79 #define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED 0x80000000 108 #define FORMAT_FLAG_QUICK_FORMAT 0x00000001 109 #define FORMAT_FLAG_UNKNOWN1 0x00000002 110 #define FORMAT_FLAG_DISMOUNT_FIRST 0x00000004 111 #define FORMAT_FLAG_UNKNOWN2 0x00000040 112 #define FORMAT_FLAG_LARGE_RECORDS 0x00000100 113 #define FORMAT_FLAG_INTEGRITY_DISABLE 0x00000100 130 Blink = ListHead->
Blink;
131 Entry->Flink = ListHead;
132 Entry->Blink = Blink;
170 #define keycmp(key1, key2)\ 171 ((key1.obj_id < key2.obj_id) ? -1 :\ 172 ((key1.obj_id > key2.obj_id) ? 1 :\ 173 ((key1.obj_type < key2.obj_type) ? -1 :\ 174 ((key1.obj_type > key2.obj_type) ? 1 :\ 175 ((key1.offset < key2.offset) ? -1 :\ 176 ((key1.offset > key2.offset) ? 1 :\ 245 #endif // __REACTOS__ 273 TextOut.Output =
"stub, not implemented";
303 while (le != roots) {
307 le3 =
r->items.Flink;
308 while (le3 != &
r->items) {
330 while (le != chunks) {
347 item->key.obj_id = obj_id;
348 item->key.obj_type = obj_type;
360 while (le != &
r->items) {
378 off =
dev->last_alloc;
381 dev->dev_item.bytes_used +=
size;
403 while (le != chunks) {
406 if (
c->offset +
c->chunk_item->size > off)
407 off =
c->offset +
c->chunk_item->size;
413 if (
dev->dev_item.num_bytes > 0xC80000000)
425 if (
dev->dev_item.num_bytes -
dev->dev_item.bytes_used < stripes *
size)
435 c->chunk_item->size =
size;
438 c->chunk_item->type =
flags;
442 c->chunk_item->num_stripes = stripes;
443 c->chunk_item->sub_stripes = 0;
447 for (
i = 0;
i < stripes;
i++) {
465 for (
i = 0;
i <
c->chunk_item->num_stripes;
i++) {
487 addr =
addr - ((
addr -
c->offset) %
c->chunk_item->stripe_length) +
c->chunk_item->stripe_length;
489 if (
addr >=
c->offset +
c->chunk_item->size)
514 while (le != roots) {
520 c->lastoff =
r->header.address + node_size;
521 c->used += node_size;
537 if (
r->items.Flink == &
r->items) {
591 for (
i = 0;
i <
c->chunk_item->num_stripes;
i++) {
630 while (le != roots) {
637 r->header.num_items = 0;
638 r->header.fs_uuid = *fsuuid;
640 r->header.chunk_tree_uuid = *chunkuuid;
641 r->header.generation = 1;
642 r->header.tree_id =
r->id;
646 dp =
tree + node_size;
649 while (le2 != &
r->items) {
655 if (
item->size > 0) {
665 r->header.num_items++;
695 for (
i = 0;
i < 16;
i+=2) {
702 uuid->uuid[
i] = (
r & 0xff00) >> 8;
703 uuid->uuid[
i+1] =
r & 0xff;
713 dev->dev_item.num_bytes =
size;
714 dev->dev_item.bytes_used = 0;
718 dev->dev_item.type = 0;
719 dev->dev_item.generation = 0;
720 dev->dev_item.start_offset = 0;
721 dev->dev_item.dev_group = 0;
722 dev->dev_item.seek_speed = 0;
723 dev->dev_item.bandwidth = 0;
729 dev->dev_item.fs_uuid = *fsuuid;
731 dev->last_alloc = 0x100000;
772 while (le != &extent_root->
items) {
776 bytes_used +=
item->key.offset;
778 bytes_used += node_size;
806 if (
label->Length > 0) {
815 for (
unsigned int i = 0;
i <
label->Length /
sizeof(
WCHAR);
i++) {
817 if (
label->Buffer[
i] ==
'/' ||
label->Buffer[
i] ==
'\\') {
882 out->seconds =
l / 10000000;
883 out->nanoseconds = (
l % 10000000) * 100;
900 lpFileTime->dwLowDateTime = SystemTime.
LowPart;
901 lpFileTime->dwHighDateTime = SystemTime.
HighPart;
946 while (le != chunks) {
952 bgi.
flags =
c->chunk_item->type;
1036 static const char default_subvol[] =
"default";
1037 static const uint32_t default_hash = 0x8dbfc2d2;
1118 if (!metadata_chunk)
1140 Status =
write_superblocks(
h, &
dev, chunk_root, root_root, extent_root,
sys_chunk, node_size, &fsuuid,
sector_size,
label, incompat_flags);
1216 static WCHAR btrfs[] =
L"\\Btrfs";
1218 sblen =
sizeof(*sb);
1282 if (bfs2->num_devices == 1)
1290 if (bfs2->next_entry == 0)
1324 return ((
i != 0) && !(
i & (
i - 1)));
1327 #if !defined(__REACTOS__) && (defined(_X86_) || defined(_AMD64_)) 1328 static void check_cpu() {
1329 unsigned int cpuInfo[4];
1333 __get_cpuid(1, &cpuInfo[0], &cpuInfo[1], &cpuInfo[2], &cpuInfo[3]);
1364 static WCHAR btrfs[] =
L"\\Btrfs";
1375 tp.PrivilegeCount = 1;
1376 tp.Privileges[0].Luid = luid;
1386 #if defined(_X86_) || defined(_AMD64_) 1463 Label = &empty_label;
1529 if (BackwardCompatible)
1565 #endif // __REACTOS__
uint8_t sys_chunk_array[SYS_CHUNK_ARRAY_SIZE]
#define FILE_GENERIC_READ
NTSYSAPI ULONG NTAPI RtlRandom(_Inout_ PULONG Seed)
static PIO_STATUS_BLOCK iosb
void __stdcall SetCsumType(uint16_t csum_type)
_In_opt_ HANDLE _In_opt_ PIO_APC_ROUTINE _In_opt_ PVOID ApcContext
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
BOOLEAN NTAPI BtrfsFormat(IN PUNICODE_STRING DriveRoot, IN PFMIFSCALLBACK Callback, IN BOOLEAN QuickFormat, IN BOOLEAN BackwardCompatible, IN MEDIA_TYPE MediaType, IN PUNICODE_STRING Label, IN ULONG ClusterSize)
#define STATUS_PRIVILEGE_NOT_HELD
ULONG DataSetRangesOffset
struct TEXTOUTPUT * PTEXTOUTPUT
static NTSTATUS write_superblocks(HANDLE h, btrfs_dev *dev, btrfs_root *chunk_root, btrfs_root *root_root, btrfs_root *extent_root, btrfs_chunk *sys_chunk, uint32_t node_size, BTRFS_UUID *fsuuid, uint32_t sector_size, PUNICODE_STRING label, uint64_t incompat_flags)
VOID(* PIO_APC_ROUTINE)(IN PVOID ApcContext, IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved)
BOOL WINAPI LookupPrivilegeValueW(LPCWSTR lpSystemName, LPCWSTR lpPrivilegeName, PLUID lpLuid)
_In_ ULONG _In_ ULONG _In_ ULONG Length
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
static NTSTATUS write_roots(HANDLE h, LIST_ENTRY *roots, uint32_t node_size, BTRFS_UUID *fsuuid, BTRFS_UUID *chunkuuid)
#define WideCharToMultiByte
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)
#define OBJ_CASE_INSENSITIVE
static uint64_t find_chunk_offset(uint64_t size, uint64_t offset, btrfs_dev *dev, btrfs_root *dev_root, BTRFS_UUID *chunkuuid)
static bool look_for_device(btrfs_filesystem *bfs, BTRFS_UUID *devuuid)
static void set_default_subvol(btrfs_root *root_root, uint32_t node_size)
ACPI_SIZE strlen(const char *String)
static bool is_power_of_two(ULONG i)
char label[MAX_LABEL_SIZE]
static bool is_mounted_multi_device(HANDLE h, uint32_t sector_size)
#define STATUS_INVALID_PARAMETER
BOOL __stdcall FormatEx(DSTRING *root, STREAM_MESSAGE *message, options *opts, uint32_t unk1)
GLdouble GLdouble GLdouble r
struct _LIST_ENTRY * Blink
#define IOCTL_BTRFS_QUERY_FILESYSTEMS
#define SUBVOL_ROOT_INODE
#define BTRFS_INCOMPAT_FLAGS_EXTENDED_IREF
static NTSTATUS write_btrfs(HANDLE h, uint64_t size, PUNICODE_STRING label, uint32_t sector_size, uint32_t node_size, uint64_t incompat_flags)
static void add_inode_ref(btrfs_root *r, uint64_t inode, uint64_t parent, uint64_t index, const char *name)
#define FORMAT_FLAG_QUICK_FORMAT
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)
#define TYPE_TREE_BLOCK_REF
void __cdecl srand(_In_ unsigned int _Seed)
ULONG_PTR DataBufferOffset
struct _DEVICE_MANAGE_DATA_SET_ATTRIBUTES DEVICE_MANAGE_DATA_SET_ATTRIBUTES
#define ATA_FLAGS_DATA_IN
void __stdcall SetIncompatFlags(uint64_t incompat_flags)
#define IDE_COMMAND_IDENTIFY
enum _MEDIA_TYPE MEDIA_TYPE
#define BTRFS_INCOMPAT_FLAGS_SKINNY_METADATA
#define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED
#define DLL_PROCESS_ATTACH
NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(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)
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
#define STATUS_INVALID_VOLUME_LABEL
ULONG ParameterBlockOffset
unsigned short int uint16_t
#define TYPE_METADATA_ITEM
#define HEADER_FLAG_MIXED_BACKREF
static void add_block_group_items(LIST_ENTRY *chunks, btrfs_root *extent_root)
#define BTRFS_ROOT_DATA_RELOC
static btrfs_root * add_root(LIST_ENTRY *roots, uint64_t id)
GLfloat GLfloat GLfloat GLfloat h
DEVICE_DATA_MANAGEMENT_SET_ACTION Action
_In_ WDFREQUEST _In_ size_t OutputBufferLength
#define STATUS_INTERNAL_ERROR
static bool check_superblock_checksum(superblock *sb)
#define FSCTL_UNLOCK_VOLUME
#define SE_PRIVILEGE_ENABLED
#define FILE_SYNCHRONOUS_IO_ALERT
static NTSTATUS NTAPI FormatEx2(PUNICODE_STRING DriveRoot, FMIFS_MEDIA_FLAG MediaFlag, PUNICODE_STRING Label, BOOLEAN QuickFormat, ULONG ClusterSize, PFMIFSCALLBACK Callback)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
USHORT NominalMediaRotationRate
_Check_return_ int __cdecl rand(void)
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 token
FORCEINLINE VOID InsertTailList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry)
#define BTRFS_INCOMPAT_FLAGS_MIXED_GROUPS
void blake2b(void *out, size_t outlen, const void *in, size_t inlen)
#define DeviceDsmAction_Trim
#define BLOCK_FLAG_SYSTEM
#define BTRFS_TYPE_DIRECTORY
#define offsetof(TYPE, MEMBER)
struct btrfs_disk_key key
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
ULONG DataSetRangesLength
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
#define IOCTL_DISK_GET_LENGTH_INFO
static uint64_t get_next_address(btrfs_chunk *c)
#define keycmp(key1, key2)
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
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 GLint GLint j
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
ULONG ParameterBlockLength
void calc_sha256(uint8_t *hash, const void *input, size_t len)
#define BTRFS_INCOMPAT_FLAGS_MIXED_BACKREF
BOOLEAN NTAPI BtrfsChkdsk(IN PUNICODE_STRING DriveRoot, IN PFMIFSCALLBACK Callback, IN BOOLEAN FixErrors, IN BOOLEAN Verbose, IN BOOLEAN CheckOnlyIfDirty, IN BOOLEAN ScanDrive, IN PVOID pUnknown1, IN PVOID pUnknown2, IN PVOID pUnknown3, IN PVOID pUnknown4, IN PULONG ExitStatus)
struct _LIST_ENTRY * Flink
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
static void init_device(btrfs_dev *dev, uint64_t id, uint64_t size, BTRFS_UUID *fsuuid, uint32_t sector_size)
static void calc_superblock_checksum(superblock *sb)
#define BTRFS_ROOT_TREEDIR
FORCEINLINE VOID InitializeListHead(PLIST_ENTRY ListHead)
#define NT_SUCCESS(StatCode)
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void *lpReserved)
#define IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES
uint64_t root_dir_objectid
static void do_full_trim(HANDLE h)
static bool is_ssd(HANDLE h)
#define success(from, fromstr, to, tostr)
#define STATUS_ACCESS_DENIED
NTSTATUS WINAPI ChkdskEx(PUNICODE_STRING DriveRoot, BOOLEAN FixErrors, BOOLEAN Verbose, BOOLEAN CheckOnlyIfDirty, BOOLEAN ScanDrive, PFMIFSCALLBACK Callback)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
_In_opt_ HANDLE _In_opt_ PIO_APC_ROUTINE ApcRoutine
#define FILE_READ_ATTRIBUTES
#define IOCTL_BTRFS_PROBE_VOLUME
GLenum const GLvoid * addr
#define BTRFS_INCOMPAT_FLAGS_BIG_METADATA
#define BLOCK_FLAG_METADATA
#define BTRFS_ROOT_FSTREE
#define TYPE_BLOCK_GROUP_ITEM
#define memcpy(s1, s2, n)
static bool superblock_collision(btrfs_chunk *c, uint64_t address)
#define GetCurrentProcess()
uint64_t cache_generation
static void add_item(btrfs_root *r, uint64_t obj_id, uint8_t obj_type, uint64_t offset, void *data, uint16_t size)
static void init_fs_tree(btrfs_root *r, uint32_t node_size)
static __inline void win_time_to_unix(LARGE_INTEGER t, BTRFS_TIME *out)
XXH_PUBLIC_API unsigned long long XXH64(const void *input, size_t len, unsigned long long seed)
BOOL WINAPI AdjustTokenPrivileges(HANDLE TokenHandle, BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength)
static void calc_tree_checksum(tree_header *th, uint32_t node_size)
static void add_dir_item(btrfs_root *root, uint64_t inode, uint32_t hash, uint64_t key_objid, uint8_t key_type, uint64_t key_offset, uint64_t transid, uint8_t type, const char *name)
struct _ATA_PASS_THROUGH_EX ATA_PASS_THROUGH_EX
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
#define FILE_GENERIC_WRITE
static void free_roots(LIST_ENTRY *roots)
#define FSCTL_DISMOUNT_VOLUME
PPC_QUAL void __cpuid(int CPUInfo[], const int InfoType)
GLenum GLenum GLenum input
#define BTRFS_ROOT_CHECKSUM
#define STATUS_BUFFER_OVERFLOW
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
#define EXTENT_ITEM_TREE_BLOCK
BOOLEAN(NTAPI * PFMIFSCALLBACK)(CALLBACKCOMMAND Command, ULONG SubAction, PVOID ActionInfo)
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)
static OUT PIO_STATUS_BLOCK IoStatusBlock
static btrfs_chunk * add_chunk(LIST_ENTRY *chunks, uint64_t flags, btrfs_root *chunk_root, btrfs_dev *dev, btrfs_root *dev_root, BTRFS_UUID *chunkuuid, uint32_t sector_size)
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
#define IOCTL_ATA_PASS_THROUGH
#define DEVICE_DSM_FLAG_ENTIRE_DATA_SET_RANGE
static NTSTATUS write_data(HANDLE h, uint64_t address, btrfs_chunk *c, void *data, ULONG size)
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG FsControlCode
#define crc32(crc, buf, len)
uint64_t def_incompat_flags
#define BTRFS_ROOT_DEVTREE
static const uint64_t superblock_addrs[]
BOOL __stdcall GetFilesystemInformation(uint32_t unk1, uint32_t unk2, void *unk3)
#define FSCTL_LOCK_VOLUME
static NTSTATUS clear_first_megabyte(HANDLE h)
static void free_chunks(LIST_ENTRY *chunks)
#define RtlZeroMemory(Destination, Length)
#define InitializeObjectAttributes(p, n, a, r, s)
#define HEADER_FLAG_WRITTEN
#define BLOCK_FLAG_DUPLICATE
GLuint GLuint GLsizei GLenum type
#define BTRFS_ROOT_EXTENT
BTRFS_UUID chunktree_uuid
uint64_t chunk_root_generation
static void get_uuid(BTRFS_UUID *uuid)
#define TOKEN_ADJUST_PRIVILEGES
static void assign_addresses(LIST_ENTRY *roots, btrfs_chunk *sys_chunk, btrfs_chunk *metadata_chunk, uint32_t node_size, btrfs_root *root_root, btrfs_root *extent_root, bool skinny)
void __stdcall SetSizes(ULONG sector, ULONG node)
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
base of all file and directory entries
btrfs_filesystem_device device
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
#define RtlCompareMemory(s1, s2, l)
_In_ uint16_t _Out_ ULONG * atts
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset