27#ifndef FSCTL_CSV_CONTROL
28#define FSCTL_CSV_CONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 181, METHOD_BUFFERED, FILE_ANY_ACCESS)
31#ifndef FSCTL_QUERY_VOLUME_CONTAINER_STATE
32#define FSCTL_QUERY_VOLUME_CONTAINER_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 228, METHOD_BUFFERED, FILE_ANY_ACCESS)
37#define SEF_AVOID_PRIVILEGE_CHECK 0x08
39#define SEF_SACL_AUTO_INHERIT 0x02
79 for (
i = 0;
i < 16;
i+=2) {
98 ERR(
"out of memory\n");
105 Status =
read_data(
Vcb,
addr,
Vcb->superblock.node_size,
NULL,
true,
buf,
NULL,
NULL,
Irp, 0,
false,
NormalPagePriority);
107 ERR(
"read_data returned %08lx\n",
Status);
115 t.header.level = th->
level;
116 t.header.tree_id =
t.root->id;
120 ERR(
"get_tree_new_address returned %08lx\n",
Status);
124 if (!
t.has_new_address) {
125 ERR(
"tree new address not set\n");
133 c->used +=
Vcb->superblock.node_size;
135 ERR(
"could not find chunk for address %I64x\n",
t.new_address);
145 if (th->
level == 0) {
160 ERR(
"increase_extent_refcount_data returned %08lx\n",
Status);
178 ERR(
"increase_extent_refcount returned %08lx\n",
Status);
192 ERR(
"write_data returned %08lx\n",
Status);
197 bool need_wait =
false;
233 *newaddr =
t.new_address;
249 while (le != &subvol->
fcbs) {
277 ERR(
"error - ccb was NULL\n");
282 WARN(
"insufficient privileges\n");
305 ERR(
"do_write returned %08lx\n",
Status);
317 ERR(
"create_root returned %08lx\n",
Status);
321 r->lastinode =
subvol->lastinode;
323 if (!
Vcb->uuid_root) {
326 TRACE(
"uuid root doesn't exist, creating it\n");
331 ERR(
"create_root returned %08lx\n",
Status);
335 Vcb->uuid_root = uuid_root;
340 ERR(
"out of memory\n");
361 ERR(
"insert_tree_item returned %08lx\n",
Status);
368 searchkey.
offset = 0xffffffffffffffff;
372 ERR(
"error - find_item returned %08lx\n",
Status);
378 ERR(
"snapshot_tree_copy returned %08lx\n",
Status);
385 r->root_item.inode.generation = 1;
386 r->root_item.inode.st_size = 3;
387 r->root_item.inode.st_blocks =
subvol->root_item.inode.st_blocks;
388 r->root_item.inode.st_nlink = 1;
390 r->root_item.inode.flags = 0x80000000;
391 r->root_item.inode.flags_ro = 0xffffffff;
392 r->root_item.generation =
Vcb->superblock.generation;
393 r->root_item.objid =
subvol->root_item.objid;
394 r->root_item.block_number =
address;
395 r->root_item.bytes_used =
subvol->root_item.bytes_used;
396 r->root_item.last_snapshot_generation =
Vcb->superblock.generation;
397 r->root_item.root_level =
subvol->root_item.root_level;
398 r->root_item.generation2 =
Vcb->superblock.generation;
399 r->root_item.parent_uuid =
subvol->root_item.uuid;
400 r->root_item.ctransid =
subvol->root_item.ctransid;
401 r->root_item.otransid =
Vcb->superblock.generation;
402 r->root_item.ctime =
subvol->root_item.ctime;
403 r->root_item.otime =
now;
413 ERR(
"error - could not find ROOT_ITEM for subvol %I64x\n",
r->id);
422 subvol->root_item.last_snapshot_generation =
Vcb->superblock.generation;
430 ERR(
"out of memory\n");
437 ERR(
"open_fcb returned %08lx\n",
Status);
446 WARN(
"add_dir_child returned %08lx\n",
Status);
483 fcb->
subvol->root_item.ctransid =
Vcb->superblock.generation;
489 while (le != &
subvol->fcbs) {
493 while (le2 != &fcb2->
extents) {
510 ERR(
"do_write returned %08lx\n",
Status);
527 bool readonly, posix;
536 if (IoIs32bitProcess(
Irp)) {
545 subvolh = Handle32ToHandle(bcs32->
subvol);
551 posix = bcs32->
posix;
586 ERR(
"fileref was NULL\n");
591 WARN(
"insufficient privileges\n");
609 ERR(
"utf16_to_utf8 failed with error %08lx\n",
Status);
614 ERR(
"utf16_to_utf8 returned a length of 0\n");
619 ERR(
"len was too long\n");
627 ERR(
"out of memory\n");
633 ERR(
"utf16_to_utf8 failed with error %08lx\n",
Status);
644 WARN(
"file already exists\n");
651 ERR(
"open_fileref returned %08lx\n",
Status);
657 ERR(
"ObReferenceObjectByHandle returned %08lx\n",
Status);
661 if (subvol_obj->DeviceObject !=
FileObject->DeviceObject) {
666 subvol_fcb = subvol_obj->FsContext;
672 if (subvol_fcb->
inode != subvol_fcb->
subvol->root_item.objid) {
673 WARN(
"handle inode was %I64x, expected %I64x\n", subvol_fcb->
inode, subvol_fcb->
subvol->root_item.objid);
678 ccb = subvol_obj->FsContext2;
686 WARN(
"insufficient privileges\n");
691 if (
fcb ==
Vcb->dummy_fcb) {
700 while (le != &subvol_fcb->
subvol->fcbs) {
706 while (le2 != &openfcb->
extents) {
726 ERR(
"open_fileref returned %08lx\n",
Status);
772 ERR(
"error - fcb was NULL\n");
778 ERR(
"error - ccb was NULL\n");
785 ERR(
"parent FCB was not a directory\n");
790 ERR(
"fileref was NULL\n");
795 ERR(
"parent has been deleted\n");
800 WARN(
"insufficient privileges\n");
810 if (
fcb ==
Vcb->dummy_fcb)
832 ERR(
"utf16_to_utf8 failed with error %08lx\n",
Status);
837 ERR(
"utf16_to_utf8 returned a length of 0\n");
842 ERR(
"len was too long\n");
850 ERR(
"out of memory\n");
856 ERR(
"utf16_to_utf8 failed with error %08lx\n",
Status);
870 WARN(
"file already exists\n");
877 ERR(
"open_fileref returned %08lx\n",
Status);
885 ERR(
"create_root returned %08lx\n",
Status);
889 TRACE(
"created root %I64x\n",
id);
891 if (!
Vcb->uuid_root) {
894 TRACE(
"uuid root doesn't exist, creating it\n");
899 ERR(
"create_root returned %08lx\n",
Status);
903 Vcb->uuid_root = uuid_root;
908 ERR(
"out of memory\n");
929 ERR(
"insert_tree_item returned %08lx\n",
Status);
934 r->root_item.inode.generation = 1;
935 r->root_item.inode.st_size = 3;
936 r->root_item.inode.st_blocks =
Vcb->superblock.node_size;
937 r->root_item.inode.st_nlink = 1;
939 r->root_item.inode.flags = 0x80000000;
940 r->root_item.inode.flags_ro = 0xffffffff;
946 r->root_item.bytes_used =
Vcb->superblock.node_size;
947 r->root_item.ctransid =
Vcb->superblock.generation;
948 r->root_item.otransid =
Vcb->superblock.generation;
949 r->root_item.ctime =
now;
950 r->root_item.otime =
now;
956 ERR(
"out of memory\n");
985 ERR(
"SeAssignSecurity returned %08lx\n",
Status);
990 ERR(
"SeAssignSecurity returned NULL security descriptor\n");
997 ERR(
"RtlGetOwnerSecurityDescriptor returned %08lx\n",
Status);
1009 acquire_fcb_lock_exclusive(
Vcb);
1013 release_fcb_lock(
Vcb);
1016 rootfcb->
Header.AllocationSize.QuadPart = 0;
1017 rootfcb->
Header.FileSize.QuadPart = 0;
1018 rootfcb->
Header.ValidDataLength.QuadPart = 0;
1028 r->lastinode = rootfcb->
inode;
1035 ERR(
"out of memory\n");
1046 ERR(
"insert_tree_item returned %08lx\n",
Status);
1055 ERR(
"out of memory\n");
1071 WARN(
"add_dir_child returned %08lx\n",
Status);
1078 ERR(
"out of memory\n");
1088 ERR(
"out of memory\n");
1110 fcb->
subvol->root_item.ctransid =
Vcb->superblock.generation;
1137 }
else if (rootfcb) {
1185 WARN(
"insufficient privileges\n");
1224 bool extents_inline =
false;
1231 if (!old_style &&
ext->offset > last_end)
1236 last_end =
ext->offset +
ext->extent_data.decoded_size;
1237 extents_inline =
true;
1243 switch (
ext->extent_data.compression) {
1346 WARN(
"insufficient privileges\n");
1351 WARN(
"insufficient privileges\n");
1362 WARN(
"trying to change inode on readonly subvolume\n");
1375 WARN(
"trying to change nocow flag on non-empty file\n");
1451 le =
Vcb->devices.Flink;
1452 while (le != &
Vcb->devices) {
1475 dev->missing =
false;
1478 dev->missing =
true;
1481 dev->next_entry = 0;
1483 dev->readonly = (
Vcb->readonly || dev2->
readonly) ?
true :
false;
1521 if (!
Vcb->chunk_usage_found) {
1524 if (!
Vcb->chunk_usage_found)
1532 ERR(
"find_chunk_usage returned %08lx\n",
Status);
1541 le =
Vcb->chunks.Flink;
1542 while (le != &
Vcb->chunks) {
1543 bool addnew =
false;
1555 if (bue->
type ==
c->chunk_item->type) {
1588 bue->
type =
c->chunk_item->type;
1594 factor =
c->chunk_item->num_stripes;
1596 factor =
c->chunk_item->num_stripes /
c->chunk_item->sub_stripes;
1598 factor =
c->chunk_item->num_stripes - 1;
1600 factor =
c->chunk_item->num_stripes - 2;
1605 while (le2 != &
Vcb->chunks) {
1666 bool verify =
false;
1671 le =
Vcb->devices.Flink;
1672 while (le != &
Vcb->devices) {
1675 if (
dev->devobj &&
dev->removable) {
1687 dev->change_count =
cc;
1708 WARN(
"STUB: FSCTL_FILESYSTEM_GET_STATISTICS\n");
1728 FILE_SET_SPARSE_BUFFER* fssb =
data;
1735 if (
data &&
length <
sizeof(FILE_SET_SPARSE_BUFFER))
1739 ERR(
"FileObject was NULL\n");
1746 ERR(
"FCB was NULL\n");
1751 ERR(
"CCB was NULL\n");
1756 WARN(
"insufficient privileges\n");
1761 ERR(
"no fileref\n");
1774 WARN(
"FileObject did not point to a file\n");
1780 set = fssb->SetSparse;
1790 fcb->
atts &= ~FILE_ATTRIBUTE_SPARSE_FILE;
1840 ERR(
"out of memory\n");
1850 ERR(
"read_file returned %08lx\n",
Status);
1864 ERR(
"excise_extents returned %08lx\n",
Status);
1880 ERR(
"add_extent_to_fcb returned %08lx\n",
Status);
1894 ERR(
"write_compressed returned %08lx\n",
Status);
1903 ERR(
"do_write_file returned %08lx\n",
Status);
1912 FILE_ZERO_DATA_INFORMATION* fzdi =
data;
1924 if (!
data ||
length <
sizeof(FILE_ZERO_DATA_INFORMATION))
1928 ERR(
"FileObject was NULL\n");
1932 if (fzdi->BeyondFinalZero.QuadPart <= fzdi->FileOffset.QuadPart) {
1933 WARN(
"BeyondFinalZero was less than or equal to FileOffset (%I64x <= %I64x)\n", fzdi->BeyondFinalZero.QuadPart, fzdi->FileOffset.QuadPart);
1940 ERR(
"FCB was NULL\n");
1947 ERR(
"ccb was NULL\n");
1952 WARN(
"insufficient privileges\n");
1959 ERR(
"fileref was NULL\n");
1971 WARN(
"FileObject did not point to a file\n");
1977 ERR(
"FileObject is stream\n");
1992 if (!
ext2->ignore) {
2008 ERR(
"zero_data returned %08lx\n",
Status);
2017 end = (fzdi->BeyondFinalZero.QuadPart >>
Vcb->sector_shift) <<
Vcb->sector_shift;
2022 ERR(
"zero_data returned %08lx\n",
Status);
2029 ERR(
"zero_data returned %08lx\n",
Status);
2034 if (
end < (
uint64_t)fzdi->BeyondFinalZero.QuadPart) {
2037 ERR(
"zero_data returned %08lx\n",
Status);
2045 ERR(
"excise_extents returned %08lx\n",
Status);
2072 fcb->
subvol->root_item.ctransid =
Vcb->superblock.generation;
2093 FILE_ALLOCATED_RANGE_BUFFER* ranges = outbuf;
2097 TRACE(
"FSCTL_QUERY_ALLOCATED_RANGES\n");
2100 ERR(
"FileObject was NULL\n");
2104 if (!
inbuf || inbuflen <
sizeof(FILE_ALLOCATED_RANGE_BUFFER) || !outbuf)
2110 ERR(
"FCB was NULL\n");
2121 else if (outbuflen <
sizeof(FILE_ALLOCATED_RANGE_BUFFER))
2124 ranges[
i].FileOffset.QuadPart = 0;
2146 if (
ext->offset > last_end) {
2147 if (last_end > last_start) {
2148 if ((
i + 1) *
sizeof(FILE_ALLOCATED_RANGE_BUFFER) <= outbuflen) {
2149 ranges[
i].FileOffset.QuadPart = last_start;
2158 last_start =
ext->offset;
2161 last_end =
ext->offset +
len;
2167 if (last_end > last_start) {
2168 if ((
i + 1) *
sizeof(FILE_ALLOCATED_RANGE_BUFFER) <= outbuflen) {
2169 ranges[
i].FileOffset.QuadPart = last_start;
2181 *retlen =
i *
sizeof(FILE_ALLOCATED_RANGE_BUFFER);
2194 ERR(
"FileObject was NULL\n");
2198 if (!
buf || buflen <
sizeof(FILE_OBJECTID_BUFFER))
2204 ERR(
"FCB was NULL\n");
2217 *retlen =
sizeof(FILE_OBJECTID_BUFFER);
2225 le =
Vcb->all_fcbs.Flink;
2226 while (le != &
Vcb->all_fcbs) {
2241 bool lock_paused_balance =
false;
2243 TRACE(
"FSCTL_LOCK_VOLUME\n");
2245 if (
Vcb->scrub.thread) {
2246 WARN(
"cannot lock while scrub running\n");
2250 if (
Vcb->balance.thread) {
2251 WARN(
"cannot lock while balance running\n");
2255 TRACE(
"locking volume\n");
2277 lock_paused_balance =
true;
2284 if (
Vcb->need_write && !
Vcb->readonly)
2294 ERR(
"do_write returned %08lx\n",
Status);
2304 Vcb->lock_paused_balance = lock_paused_balance;
2309 if (lock_paused_balance)
2331 Vcb->locked =
false;
2332 Vcb->Vpb->Flags &= ~VPB_LOCKED;
2337 if (
Vcb->lock_paused_balance)
2344 TRACE(
"FSCTL_UNLOCK_VOLUME\n");
2349 TRACE(
"unlocking volume\n");
2367 TRACE(
"FSCTL_INVALIDATE_VOLUMES\n");
2373 if (IoIs32bitProcess(
Irp)) {
2391 ERR(
"ObReferenceObjectByHandle returned %08lx\n",
Status);
2395 devobj = fileobj->DeviceObject;
2404 if (
Vcb->Vpb &&
Vcb->Vpb->RealDevice == devobj) {
2405 if (
Vcb->Vpb == devobj->Vpb) {
2408 bool free_newvpb =
false;
2412 ERR(
"out of memory\n");
2423 Vcb->removing =
true;
2433 if (
Vcb->need_write && !
Vcb->readonly)
2441 ERR(
"do_write returned %08lx\n",
Status);
2460 devobj->Vpb = newvpb;
2469 if (
Vcb->open_files == 0)
2495 if (
Irp->AssociatedIrp.SystemBuffer) {
2496 volstate =
Irp->AssociatedIrp.SystemBuffer;
2497 }
else if (
Irp->MdlAddress !=
NULL) {
2513 Irp->IoStatus.Information =
sizeof(
ULONG);
2522 TRACE(
"FSCTL_GET_COMPRESSION\n");
2524 if (
Irp->AssociatedIrp.SystemBuffer) {
2526 }
else if (
Irp->MdlAddress !=
NULL) {
2539 Irp->IoStatus.Information =
sizeof(
USHORT);
2548 TRACE(
"FSCTL_SET_COMPRESSION\n");
2588 TRACE(
"FSCTL_DISMOUNT_VOLUME\n");
2594 if (
Vcb->disallow_dismount ||
Vcb->page_file_count != 0) {
2595 WARN(
"attempting to dismount boot volume or one containing a pagefile\n");
2601 WARN(
"FsRtlNotifyVolumeEvent returned %08lx\n",
Status);
2610 if (
Vcb->need_write && !
Vcb->readonly) {
2614 ERR(
"do_write returned %08lx\n",
Status);
2620 Vcb->removing =
true;
2622 open_files =
Vcb->open_files > 0;
2626 Vcb->vde->mounted_device =
NULL;
2648 ERR(
"out of memory\n");
2654 ERR(
"sync_read_phys returned %08lx\n",
Status);
2660 TRACE(
"device is not Btrfs\n");
2666 TRACE(
"device has Btrfs magic, but invalid superblock checksum\n");
2688 if (
Vcb->superblock.num_devices > 1) {
2689 le2 =
Vcb->devices.Flink;
2690 while (le2 != &
Vcb->devices) {
2732 WARN(
"IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES returned %08lx\n",
Status);
2755 const GUID* pnp_guid;
2764 WARN(
"not allowing second device to be added to non-PNP device\n");
2772 if (IoIs32bitProcess(
Irp)) {
2790 ERR(
"ObReferenceObjectByHandle returned %08lx\n",
Status);
2798 ERR(
"get_device_pnp_name returned %08lx\n",
Status);
2809 ERR(
"IOCTL_DISK_IS_WRITABLE returned %08lx\n",
Status);
2816 ERR(
"is_device_part_of_mounted_btrfs_raid returned %08lx\n",
Status);
2824 DRIVE_LAYOUT_INFORMATION_EX* dli =
NULL;
2836 ERR(
"out of memory\n");
2846 ERR(
"not adding disk which has partitions\n");
2858 WARN(
"device was not disk\n");
2868 &gli,
sizeof(gli),
true,
NULL);
2870 ERR(
"error reading length information: %08lx\n",
Status);
2877 if (
size < 0x100000) {
2878 ERR(
"device was not large enough to hold FS (%I64x bytes, need at least 1 MB)\n",
size);
2887 if (
Vcb->need_write)
2895 ERR(
"do_write returned %08lx\n",
Status);
2901 ERR(
"out of memory\n");
2909 dev->fileobj = fileobj;
2910 dev->seeding =
false;
2915 if (
size > 0x100000) {
2918 ERR(
"add_space_entry returned %08lx\n",
Status);
2925 le =
Vcb->devices.Flink;
2926 while (le != &
Vcb->devices) {
2938 dev->devitem.num_bytes =
size;
2939 dev->devitem.bytes_used = 0;
2940 dev->devitem.optimal_io_align =
Vcb->superblock.sector_size;
2941 dev->devitem.optimal_io_width =
Vcb->superblock.sector_size;
2942 dev->devitem.minimal_io_size =
Vcb->superblock.sector_size;
2943 dev->devitem.type = 0;
2944 dev->devitem.generation = 0;
2945 dev->devitem.start_offset = 0;
2946 dev->devitem.dev_group = 0;
2947 dev->devitem.seek_speed = 0;
2948 dev->devitem.bandwidth = 0;
2950 dev->devitem.fs_uuid =
Vcb->superblock.uuid;
2954 ERR(
"out of memory\n");
2962 ERR(
"insert_tree_item returned %08lx\n",
Status);
2970 ERR(
"out of memory\n");
2983 ERR(
"error - find_item returned %08lx\n",
Status);
2991 ERR(
"delete_tree_item returned %08lx\n",
Status);
2999 ERR(
"insert_tree_item returned %08lx\n",
Status);
3004 if (
dev->trim && !
dev->readonly && !
Vcb->options.no_trim)
3010 ERR(
"out of memory\n");
3019 ERR(
"write_data_phys returned %08lx\n",
Status);
3031 ERR(
"out of memory\n");
3036 vc->
uuid =
dev->devitem.device_uuid;
3047 WARN(
"IoRegisterPlugPlayNotification returned %08lx\n",
Status);
3049 pnp_name2 = pnp_name;
3052 pnp_name.
Buffer[2] ==
'?' && pnp_name.
Buffer[3] ==
'\\') {
3060 if (pnp_name2.
Length == 0)
3065 ERR(
"out of memory\n");
3088 ERR(
"IoGetDeviceObjectPointer returned %08lx\n",
Status);
3092 WARN(
"remove_drive_letter returned %08lx\n",
Status);
3099 Vcb->superblock.num_devices++;
3100 Vcb->superblock.total_bytes +=
size;
3101 Vcb->devices_loaded++;
3110 ERR(
"do_write returned %08lx\n",
Status);
3135 TRACE(
"FSCTL_ALLOW_EXTENDED_DASD_IO\n");
3146 if (
fcb !=
Vcb->volume_fcb)
3184 le =
Vcb->devices.Flink;
3186 while (le != &
Vcb->devices) {
3191 dev->stats_changed =
true;
3192 Vcb->stats_changed =
true;
3193 Vcb->need_write =
true;
3201 WARN(
"device %I64x not found\n", devid);
3213 TRACE(
"FSCTL_GET_INTEGRITY_INFORMATION\n");
3233 TRACE(
"FSCTL_SET_INTEGRITY_INFORMATION\n");
3290 WARN(
"insufficient privileges\n");
3299 ERR(
"ObReferenceObjectByHandle returned %08lx\n",
Status);
3303 if (sourcefo->DeviceObject !=
FileObject->DeviceObject) {
3304 WARN(
"source and destination are on different volumes\n");
3309 sourcefcb = sourcefo->FsContext;
3310 sourceccb = sourcefo->FsContext2;
3312 if (!sourcefcb || !sourceccb || sourcefcb ==
Vcb->volume_fcb) {
3317 if (!sourcefcb->ads && !
fcb->
ads) {
3330 WARN(
"insufficient privileges\n");
3340 sourcelen = sourcefcb->ads ? sourcefcb->adsdata.Length : sourcefcb->inode_item.st_size;
3347 if (
fcb == sourcefcb &&
3350 WARN(
"source and destination are the same, and the ranges overlap\n");
3368 if (
fcb != sourcefcb)
3385 ULONG bytes_read, dataoff, datalen2;
3400 ERR(
"out of memory\n");
3412 ERR(
"read_file returned %08lx\n",
Status);
3418 if (sourcefcb->ads) {
3421 ERR(
"read_stream returned %08lx\n",
Status);
3428 ERR(
"read_file returned %08lx\n",
Status);
3434 if (dataoff + bytes_read < datalen2)
3439 else if (make_inline) {
3445 ERR(
"excise_extents returned %08lx\n",
Status);
3454 ERR(
"out of memory\n");
3471 ERR(
"add_extent_to_fcb returned %08lx\n",
Status);
3482 ERR(
"do_write_file returned %08lx\n",
Status);
3492 le = sourcefcb->extents.
Flink;
3493 while (le != &sourcefcb->extents) {
3515 ERR(
"out of memory\n");
3526 ext2->unique =
false;
3527 ext2->ignore =
false;
3528 ext2->inserted =
true;
3530 ext2->extent_data.generation =
Vcb->superblock.generation;
3531 ext2->extent_data.decoded_size =
ext->extent_data.decoded_size;
3532 ext2->extent_data.compression =
ext->extent_data.compression;
3533 ext2->extent_data.encryption =
ext->extent_data.encryption;
3534 ext2->extent_data.encoding =
ext->extent_data.encoding;
3535 ext2->extent_data.type =
ext->extent_data.type;
3554 ERR(
"out of memory\n");
3565 ERR(
"out of memory\n");
3580 ERR(
"get_chunk_from_address(%I64x) failed\n", ed2s->
address);
3588 ERR(
"update_changed_extent_ref returned %08lx\n",
Status);
3601 ERR(
"excise_extents returned %08lx\n",
Status);
3612 le = sourcefcb->extents.
Flink;
3613 while (le != &sourcefcb->extents) {
3620 le2 = newexts.
Flink;
3621 while (le2 != &newexts) {
3628 ext->unique =
false;
3645 lastextle = &
ext->list_entry;
3678 if (
FileObject->SectionObjectPointer->DataSectionObject)
3691 if (
fcb != sourcefcb)
3711 while (le != &
subvol->fcbs) {
3725 searchkey.
offset = 0xffffffffffffffff;
3729 ERR(
"find_item returned %08lx\n",
Status);
3768 WARN(
"trying to create file in something other than a directory\n");
3794 WARN(
"insufficient privileges\n");
3798 if (bmn->
inode != 0) {
3804 if (bmn->
name[
i] == 0 || bmn->
name[
i] ==
'/')
3814 ERR(
"utf16_to_utf8 returned %08lx\n",
Status);
3819 ERR(
"utf16_to_utf8 returned a length of 0\n");
3824 ERR(
"len was too long (%lx)\n",
len);
3832 ERR(
"out of memory\n");
3838 ERR(
"utf16_to_utf8 failed with error %08lx\n",
Status);
3848 ERR(
"find_file_in_dir returned %08lx\n",
Status);
3853 WARN(
"filename already exists\n");
3863 ERR(
"out of memory\n");
3927 fcb->
Header.AllocationSize.QuadPart = 0;
3929 fcb->
Header.ValidDataLength.QuadPart = 0;
3933 if (bmn->
name[0] ==
'.')
3950 ERR(
"SeAssignSecurityEx returned %08lx\n",
Status);
3957 WARN(
"RtlGetOwnerSecurityDescriptor returned %08lx\n",
Status);
3967 acquire_fcb_lock_exclusive(
Vcb);
3969 if (bmn->
inode == 0) {
3981 release_fcb_lock(
Vcb);
3984 WARN(
"inode collision\n");
3988 ERR(
"check_inode_used returned %08lx\n",
Status);
3990 release_fcb_lock(
Vcb);
4005 release_fcb_lock(
Vcb);
4008 ERR(
"out of memory\n");
4019 fcb->
subvol->root_item.ctransid =
Vcb->superblock.generation;
4029 WARN(
"add_dir_child returned %08lx\n",
Status);
4043 release_fcb_lock(
Vcb);
4046 ERR(
"out of memory\n");
4056 release_fcb_lock(
Vcb);
4059 ERR(
"out of memory\n");
4085 parfcb->
subvol->fcbs_version++;
4088 release_fcb_lock(
Vcb);
4117 Vcb->need_write =
true;
4145 if (
fcb->
subvol->root_item.rtransid != 0) {
4146 WARN(
"subvol already has received information set\n");
4156 fcb->
subvol->root_item.rtransid =
Vcb->superblock.generation;
4187 WARN(
"insufficient privileges\n");
4243 static const char stream_pref[] =
"user.";
4271 WARN(
"insufficient privileges\n");
4281 WARN(
"insufficient privileges\n");
4297 ERR(
"out of memory\n");
4332 fcb->
atts &= ~FILE_ATTRIBUTE_READONLY;
4358 ERR(
"out of memory\n");
4374 WARN(
"insufficient privileges\n");
4393 WARN(
"IoCheckEaBufferValidity returned %08lx (error at offset %lu)\n",
Status,
offset);
4399 ERR(
"out of memory\n");
4437 static const char lzo[] =
"lzo";
4438 static const char zlib[] =
"zlib";
4439 static const char zstd[] =
"zstd";
4460 }
else if (bsxa->
namelen >= (
sizeof(stream_pref) - 1) &&
RtlCompareMemory(bsxa->
data, stream_pref,
sizeof(stream_pref) - 1) ==
sizeof(stream_pref) - 1) {
4468 ERR(
"out of memory\n");
4542 le =
Vcb->roots.Flink;
4543 while (le != &
Vcb->roots) {
4555 ERR(
"couldn't find subvol %I64x\n",
id);
4564 ERR(
"open_fileref_by_inode returned %08lx\n",
Status);
4577 ERR(
"fileref_get_filename returned %08lx\n",
Status);
4595 if (!
out || outlen <
sizeof(
WCHAR))
4605 if (!
Vcb->uuid_root) {
4606 ERR(
"couldn't find uuid root\n");
4618 ERR(
"find_item returned %08lx\n",
Status);
4631 searchkey2.
offset = 0xffffffffffffffff;
4635 ERR(
"find_item returned %08lx\n",
Status);
4644 TRACE(
"found subvol %I64x\n", *
id);
4650 TRACE(
"found subvol %I64x\n", *
id);
4661 ERR(
"find_item returned %08lx\n",
Status);
4676 searchkey2.
offset = 0xffffffffffffffff;
4680 ERR(
"find_item returned %08lx\n",
Status);
4729 le =
Vcb->devices.Flink;
4730 while (le != &
Vcb->devices) {
4742 ERR(
"could not find device %I64x\n", br->
device);
4748 ERR(
"trying to resize missing device\n");
4753 if (
dev->readonly) {
4754 ERR(
"trying to resize readonly device\n");
4759 if (br->
size > 0 &&
dev->devitem.num_bytes == br->
size) {
4760 TRACE(
"size unchanged, returning STATUS_SUCCESS\n");
4765 if (br->
size > 0 &&
dev->devitem.num_bytes > br->
size) {
4766 bool need_balance =
true;
4769 le =
dev->space.Flink;
4770 while (le != &
dev->space) {
4773 if (
s->address <= br->
size &&
s->address +
s->size >=
dev->devitem.num_bytes) {
4774 need_balance =
false;
4781 delta =
dev->devitem.num_bytes - br->
size;
4787 if (
Vcb->balance.thread) {
4788 WARN(
"balance already running\n");
4795 for (
i = 0;
i < 3;
i++) {
4798 Vcb->balance.opts[
i].drange_start = br->
size;
4799 Vcb->balance.opts[
i].drange_end =
dev->devitem.num_bytes;
4802 Vcb->balance.paused =
false;
4803 Vcb->balance.shrinking =
true;
4813 ERR(
"PsCreateSystemThread returned %08lx\n",
Status);
4823 dev->devitem.num_bytes = br->
size;
4827 ERR(
"update_dev_item returned %08lx\n",
Status);
4834 Vcb->superblock.total_bytes -= delta;
4840 &gli,
sizeof(gli),
true,
NULL);
4842 ERR(
"IOCTL_DISK_GET_LENGTH_INFO returned %08lx\n",
Status);
4846 if (br->
size == 0) {
4849 if (
dev->devitem.num_bytes == br->
size) {
4850 TRACE(
"size unchanged, returning STATUS_SUCCESS\n");
4855 if (br->
size == 0) {
4856 ERR(
"IOCTL_DISK_GET_LENGTH_INFO returned 0 length\n");
4866 delta = br->
size -
dev->devitem.num_bytes;
4869 dev->devitem.num_bytes = br->
size;
4873 ERR(
"update_dev_item returned %08lx\n",
Status);
4880 Vcb->superblock.total_bytes += delta;
4884 Vcb->need_write =
true;
4904#if (NTDDI_VERSION >= NTDDI_WIN7)
4905 PREQUEST_OPLOCK_INPUT_BUFFER
buf =
NULL;
4906 bool oplock_request =
false, oplock_ack =
false;
4908 bool oplock_request =
false;
4910 ULONG oplock_count = 0;
4912 bool shared_request;
4916 ERR(
"fcb was NULL\n");
4921 ERR(
"fileref was NULL\n");
4928#if (NTDDI_VERSION >= NTDDI_WIN7)
4929 if (fsctl == FSCTL_REQUEST_OPLOCK) {
4936 buf =
Irp->AssociatedIrp.SystemBuffer;
4939 if (
buf->Flags & REQUEST_OPLOCK_INPUT_FLAG_REQUEST &&
buf->Flags & REQUEST_OPLOCK_INPUT_FLAG_ACK)
4942 oplock_request =
buf->Flags & REQUEST_OPLOCK_INPUT_FLAG_REQUEST;
4943 oplock_ack =
buf->Flags & REQUEST_OPLOCK_INPUT_FLAG_ACK;
4945 if (!oplock_request && !oplock_ack)
4950#if (NTDDI_VERSION >= NTDDI_WIN7)
4951 bool shared_request = (fsctl ==
FSCTL_REQUEST_OPLOCK_LEVEL_2) || (fsctl == FSCTL_REQUEST_OPLOCK && !(
buf->RequestedOplockLevel & OPLOCK_LEVEL_CACHE_WRITE));
4956#if (NTDDI_VERSION >= NTDDI_WIN7)
4961 WARN(
"oplock requests on directories can only be for read or read-handle oplocks\n");
4971 if (shared_request) {
4981 oplock_count =
fileref->open_count;
4984#if (NTDDI_VERSION >= NTDDI_WIN7)
4986 (fsctl == FSCTL_REQUEST_OPLOCK &&
buf->RequestedOplockLevel & OPLOCK_LEVEL_CACHE_HANDLE)) &&
4991 ExReleaseResourceLite(fcb->Header.Resource);
4992 ExReleaseResourceLite(&Vcb->tree_lock);
4993 return STATUS_DELETE_PENDING;
5013 TRACE(
"get_retrieval_pointers(%p, %p, %p, %lx, %p, %lx, %p)\n",
Vcb,
FileObject,
in, inlen,
5014 out, outlen, retlen);
5038 unsigned int num_extents = 0, first_extent_num = 0,
i;
5039 uint64_t num_sectors, last_off = 0;
5051 if (
ext->offset > last_off)
5054 if ((
ext->offset >>
Vcb->sector_shift) <= (
uint64_t)
in->StartingVcn.QuadPart &&
5055 (
ext->offset +
ext->extent_data.decoded_size) >>
Vcb->sector_shift > (
uint64_t)
in->StartingVcn.QuadPart) {
5057 first_extent_num = num_extents;
5062 last_off =
ext->offset +
ext->extent_data.decoded_size;
5067 if (num_sectors > last_off >>
Vcb->sector_shift)
5075 out->ExtentCount = num_extents - first_extent_num;
5076 out->StartingVcn.QuadPart = first_ext->
offset >>
Vcb->sector_shift;
5092 if (
ext->offset > last_off) {
5098 out->Extents[
i].NextVcn.QuadPart =
ext->offset >>
Vcb->sector_shift;
5099 out->Extents[
i].Lcn.QuadPart = -1;
5111 out->Extents[
i].NextVcn.QuadPart = (
ext->offset +
ext->extent_data.decoded_size) >>
Vcb->sector_shift;
5118 out->Extents[
i].Lcn.QuadPart = -1;
5127 if (num_sectors <<
Vcb->sector_shift > last_off) {
5133 out->Extents[
i].NextVcn.QuadPart = num_sectors;
5134 out->Extents[
i].Lcn.QuadPart = -1;
5153 ERR(
"out of memory\n");
5164 switch (
Vcb->superblock.csum_type) {
5170 csum[
i] = sparse_hash;
5181 csum[
i] = sparse_hash;
5200 ERR(
"unrecognized hash type %x\n",
Vcb->superblock.csum_type);
5204 *
ptr += sparse_extents *
Vcb->csum_size;
5215 TRACE(
"get_csum_info(%p, %p, %p, %lx, %p, %x)\n",
Vcb,
FileObject,
buf, buflen, retlen, processor_mode);
5234 WARN(
"insufficient privileges\n");
5245 bool sparse_hash_found =
false;
5262 buf->csum_type =
Vcb->superblock.csum_type;
5263 buf->csum_length =
Vcb->csum_size;
5275 buf->num_sectors = 0;
5305 if (
ext->offset > last_off) {
5306 uint64_t sparse_extents = (
ext->offset - last_off) >>
Vcb->sector_shift;
5309 sparse_hash_found =
true;
5330 if (
buf->num_sectors > last_off >>
Vcb->sector_shift) {
5331 uint64_t sparse_extents =
buf->num_sectors - (last_off >>
Vcb->sector_shift);
5366#if (NTDDI_VERSION >= NTDDI_WIN7)
5367 case FSCTL_REQUEST_OPLOCK:
5389 WARN(
"STUB: FSCTL_IS_PATHNAME_VALID\n");
5394 WARN(
"STUB: FSCTL_MARK_VOLUME_DIRTY\n");
5399 WARN(
"STUB: FSCTL_QUERY_RETRIEVAL_POINTERS\n");
5412 WARN(
"STUB: FSCTL_SET_BOOTLOADER_ACCESSED\n");
5421 WARN(
"STUB: FSCTL_QUERY_FAT_BPB\n");
5430 WARN(
"STUB: FSCTL_GET_NTFS_VOLUME_DATA\n");
5435 WARN(
"STUB: FSCTL_GET_NTFS_FILE_RECORD\n");
5440 WARN(
"STUB: FSCTL_GET_VOLUME_BITMAP\n");
5449 &
Irp->IoStatus.Information);
5453 WARN(
"STUB: FSCTL_MOVE_FILE\n");
5466 WARN(
"STUB: FSCTL_FIND_FILES_BY_SID\n");
5471 WARN(
"STUB: FSCTL_SET_OBJECT_ID\n");
5477 &
Irp->IoStatus.Information);
5481 WARN(
"STUB: FSCTL_DELETE_OBJECT_ID\n");
5499 WARN(
"STUB: FSCTL_ENUM_USN_DATA\n");
5504 WARN(
"STUB: FSCTL_SECURITY_ID_CHECK\n");
5509 WARN(
"STUB: FSCTL_READ_USN_JOURNAL\n");
5514 WARN(
"STUB: FSCTL_SET_OBJECT_ID_EXTENDED\n");
5520 &
Irp->IoStatus.Information);
5540 WARN(
"STUB: FSCTL_ENABLE_UPGRADE\n");
5545 WARN(
"STUB: FSCTL_SET_ENCRYPTION\n");
5550 WARN(
"STUB: FSCTL_ENCRYPTION_FSCTL_IO\n");
5555 WARN(
"STUB: FSCTL_WRITE_RAW_ENCRYPTED\n");
5560 WARN(
"STUB: FSCTL_READ_RAW_ENCRYPTED\n");
5565 WARN(
"STUB: FSCTL_CREATE_USN_JOURNAL\n");
5570 WARN(
"STUB: FSCTL_READ_FILE_USN_DATA\n");
5575 WARN(
"STUB: FSCTL_WRITE_USN_CLOSE_RECORD\n");
5580 WARN(
"STUB: FSCTL_EXTEND_VOLUME\n");
5585 WARN(
"STUB: FSCTL_QUERY_USN_JOURNAL\n");
5590 WARN(
"STUB: FSCTL_DELETE_USN_JOURNAL\n");
5595 WARN(
"STUB: FSCTL_MARK_HANDLE\n");
5600 WARN(
"STUB: FSCTL_SIS_COPYFILE\n");
5605 WARN(
"STUB: FSCTL_SIS_LINK_FILES\n");
5610 WARN(
"STUB: FSCTL_RECALL_FILE\n");
5615 WARN(
"STUB: FSCTL_READ_FROM_PLEX\n");
5620 WARN(
"STUB: FSCTL_FILE_PREFETCH\n");
5624#if _WIN32_WINNT >= 0x0600
5626 WARN(
"STUB: FSCTL_MAKE_MEDIA_COMPATIBLE\n");
5631 WARN(
"STUB: FSCTL_SET_DEFECT_MANAGEMENT\n");
5636 WARN(
"STUB: FSCTL_QUERY_SPARING_INFO\n");
5641 WARN(
"STUB: FSCTL_QUERY_ON_DISK_VOLUME_INFO\n");
5646 WARN(
"STUB: FSCTL_SET_VOLUME_COMPRESSION_STATE\n");
5651 WARN(
"STUB: FSCTL_TXFS_MODIFY_RM\n");
5656 WARN(
"STUB: FSCTL_TXFS_QUERY_RM_INFORMATION\n");
5661 WARN(
"STUB: FSCTL_TXFS_ROLLFORWARD_REDO\n");
5666 WARN(
"STUB: FSCTL_TXFS_ROLLFORWARD_UNDO\n");
5671 WARN(
"STUB: FSCTL_TXFS_START_RM\n");
5676 WARN(
"STUB: FSCTL_TXFS_SHUTDOWN_RM\n");
5681 WARN(
"STUB: FSCTL_TXFS_READ_BACKUP_INFORMATION\n");
5686 WARN(
"STUB: FSCTL_TXFS_WRITE_BACKUP_INFORMATION\n");
5691 WARN(
"STUB: FSCTL_TXFS_CREATE_SECONDARY_RM\n");
5696 WARN(
"STUB: FSCTL_TXFS_GET_METADATA_INFO\n");
5701 WARN(
"STUB: FSCTL_TXFS_GET_TRANSACTED_VERSION\n");
5705 case FSCTL_TXFS_SAVEPOINT_INFORMATION:
5706 WARN(
"STUB: FSCTL_TXFS_SAVEPOINT_INFORMATION\n");
5711 WARN(
"STUB: FSCTL_TXFS_CREATE_MINIVERSION\n");
5716 WARN(
"STUB: FSCTL_TXFS_TRANSACTION_ACTIVE\n");
5721 WARN(
"STUB: FSCTL_SET_ZERO_ON_DEALLOCATION\n");
5726 WARN(
"STUB: FSCTL_SET_REPAIR\n");
5731 WARN(
"STUB: FSCTL_GET_REPAIR\n");
5736 WARN(
"STUB: FSCTL_WAIT_FOR_REPAIR\n");
5741 WARN(
"STUB: FSCTL_INITIATE_REPAIR\n");
5746 WARN(
"STUB: FSCTL_CSC_INTERNAL\n");
5751 WARN(
"STUB: FSCTL_SHRINK_VOLUME\n");
5756 WARN(
"STUB: FSCTL_SET_SHORT_NAME_BEHAVIOR\n");
5761 WARN(
"STUB: FSCTL_DFSR_SET_GHOST_HANDLE_STATE\n");
5766 WARN(
"STUB: FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES\n");
5771 WARN(
"STUB: FSCTL_TXFS_LIST_TRANSACTIONS\n");
5776 WARN(
"STUB: FSCTL_QUERY_PAGEFILE_ENCRYPTION\n");
5780 case FSCTL_RESET_VOLUME_ALLOCATION_HINTS:
5781 WARN(
"STUB: FSCTL_RESET_VOLUME_ALLOCATION_HINTS\n");
5785 case FSCTL_TXFS_READ_BACKUP_INFORMATION2:
5786 WARN(
"STUB: FSCTL_TXFS_READ_BACKUP_INFORMATION2\n");
5791 WARN(
"STUB: FSCTL_CSV_CONTROL\n");
5797 TRACE(
"STUB: FSCTL_QUERY_VOLUME_CONTAINER_STATE\n");
5933 &
Irp->IoStatus.Information,
Irp->RequestorMode);
5944 Irp->RequestorMode);
5948 WARN(
"unknown control code %lx (DeviceType = %lx, Access = %lx, Function = %lx, Method = %lx)\n",
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define STATUS_PRIVILEGE_NOT_HELD
unsigned short int uint16_t
#define InterlockedIncrement
NTSYSAPI ULONG NTAPI RtlRandomEx(PULONG Seed)
HRESULT read_stream(BSCallback *, IStream *, void *, DWORD, DWORD *) DECLSPEC_HIDDEN
static NTSTATUS lock_volume(device_extension *Vcb, PIRP Irp)
static NTSTATUS get_compression(PIRP Irp)
static NTSTATUS get_csum_info(device_extension *Vcb, PFILE_OBJECT FileObject, btrfs_csum_info *buf, ULONG buflen, ULONG_PTR *retlen, KPROCESSOR_MODE processor_mode)
static NTSTATUS mknod(device_extension *Vcb, PFILE_OBJECT FileObject, void *data, ULONG datalen, PIRP Irp)
static NTSTATUS set_sparse(device_extension *Vcb, PFILE_OBJECT FileObject, void *data, ULONG length, PIRP Irp)
static void flush_fcb_caches(device_extension *Vcb)
static NTSTATUS unlock_volume(device_extension *Vcb, PIRP Irp)
static NTSTATUS fs_get_statistics(void *buffer, DWORD buflen, ULONG_PTR *retlen)
static NTSTATUS set_zero_data(device_extension *Vcb, PFILE_OBJECT FileObject, void *data, ULONG length, PIRP Irp)
void flush_subvol_fcbs(root *subvol)
static NTSTATUS get_file_ids(PFILE_OBJECT FileObject, void *data, ULONG length)
static NTSTATUS create_subvol(device_extension *Vcb, PFILE_OBJECT FileObject, void *data, ULONG datalen, PIRP Irp)
static NTSTATUS find_subvol(device_extension *Vcb, void *in, ULONG inlen, void *out, ULONG outlen, PIRP Irp)
tFsRtlAreThereCurrentOrInProgressFileLocks fFsRtlAreThereCurrentOrInProgressFileLocks
static NTSTATUS add_csum_sparse_extents(device_extension *Vcb, uint64_t sparse_extents, uint8_t **ptr, bool found, void *hash_ptr)
static NTSTATUS recvd_subvol(device_extension *Vcb, PFILE_OBJECT FileObject, void *data, ULONG datalen, KPROCESSOR_MODE processor_mode)
static void get_uuid(BTRFS_UUID *uuid)
static void mark_subvol_dirty(device_extension *Vcb, root *r)
static NTSTATUS get_retrieval_pointers(device_extension *Vcb, PFILE_OBJECT FileObject, STARTING_VCN_INPUT_BUFFER *in, ULONG inlen, RETRIEVAL_POINTERS_BUFFER *out, ULONG outlen, ULONG_PTR *retlen)
static NTSTATUS is_device_part_of_mounted_btrfs_raid(PDEVICE_OBJECT devobj, PFILE_OBJECT fileobj)
static NTSTATUS reserve_subvol(device_extension *Vcb, PFILE_OBJECT FileObject, PIRP Irp)
static NTSTATUS get_subvol_path(device_extension *Vcb, uint64_t id, WCHAR *out, ULONG outlen, PIRP Irp)
static NTSTATUS get_integrity_information(device_extension *Vcb, PFILE_OBJECT FileObject, void *data, ULONG datalen)
static NTSTATUS query_uuid(device_extension *Vcb, void *data, ULONG length)
static NTSTATUS get_inode_info(PFILE_OBJECT FileObject, void *data, ULONG length)
static NTSTATUS invalidate_volumes(PIRP Irp)
static NTSTATUS get_object_id(PFILE_OBJECT FileObject, FILE_OBJECTID_BUFFER *buf, ULONG buflen, ULONG_PTR *retlen)
NTSTATUS dismount_volume(device_extension *Vcb, bool shutdown, PIRP Irp)
static NTSTATUS fsctl_get_xattrs(device_extension *Vcb, PFILE_OBJECT FileObject, void *data, ULONG datalen, KPROCESSOR_MODE processor_mode)
static void update_volumes(device_extension *Vcb)
tFsRtlCheckLockForOplockRequest fFsRtlCheckLockForOplockRequest
static NTSTATUS get_usage(device_extension *Vcb, void *data, ULONG length, PIRP Irp)
static NTSTATUS duplicate_extents(device_extension *Vcb, PFILE_OBJECT FileObject, void *data, ULONG datalen, PIRP Irp)
static NTSTATUS snapshot_tree_copy(device_extension *Vcb, uint64_t addr, root *subvol, uint64_t *newaddr, PIRP Irp, LIST_ENTRY *rollback)
static NTSTATUS resize_device(device_extension *Vcb, void *data, ULONG len, PIRP Irp)
ERESOURCE global_loading_lock
#define SEF_SACL_AUTO_INHERIT
static NTSTATUS add_device(device_extension *Vcb, PIRP Irp, KPROCESSOR_MODE processor_mode)
void trim_whole_device(device *dev)
#define FSCTL_QUERY_VOLUME_CONTAINER_STATE
static NTSTATUS is_volume_dirty(device_extension *Vcb, PIRP Irp)
static NTSTATUS do_create_snapshot(device_extension *Vcb, PFILE_OBJECT parent, fcb *subvol_fcb, PANSI_STRING utf8, PUNICODE_STRING name, bool readonly, PIRP Irp)
static NTSTATUS allow_extended_dasd_io(device_extension *Vcb, PFILE_OBJECT FileObject)
bool fcb_is_inline(fcb *fcb)
static NTSTATUS fsctl_oplock(device_extension *Vcb, PIRP *Pirp)
static NTSTATUS check_inode_used(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock) device_extension *Vcb, _In_ root *subvol, _In_ uint64_t inode, _In_ uint32_t hash, _In_opt_ PIRP Irp)
void do_unlock_volume(device_extension *Vcb)
static NTSTATUS create_snapshot(device_extension *Vcb, PFILE_OBJECT FileObject, void *data, ULONG length, PIRP Irp)
NTSTATUS fsctl_request(PDEVICE_OBJECT DeviceObject, PIRP *Pirp, uint32_t type)
static NTSTATUS get_devices(device_extension *Vcb, void *data, ULONG length)
static NTSTATUS set_inode_info(PFILE_OBJECT FileObject, void *data, ULONG length, PIRP Irp)
static NTSTATUS set_integrity_information(PFILE_OBJECT FileObject, void *data, ULONG datalen)
static NTSTATUS is_volume_mounted(device_extension *Vcb, PIRP Irp)
static NTSTATUS zero_data(device_extension *Vcb, fcb *fcb, uint64_t start, uint64_t length, PIRP Irp, LIST_ENTRY *rollback)
static NTSTATUS query_ranges(PFILE_OBJECT FileObject, FILE_ALLOCATED_RANGE_BUFFER *inbuf, ULONG inbuflen, void *outbuf, ULONG outbuflen, ULONG_PTR *retlen)
static NTSTATUS set_compression(PIRP Irp)
#define FSCTL_CSV_CONTROL
static NTSTATUS reset_stats(device_extension *Vcb, void *data, ULONG length, KPROCESSOR_MODE processor_mode)
static NTSTATUS fsctl_set_xattr(device_extension *Vcb, PFILE_OBJECT FileObject, void *data, ULONG datalen, PIRP Irp)
NTSTATUS read_file(fcb *fcb, uint8_t *data, uint64_t start, uint64_t length, ULONG *pbr, PIRP Irp) __attribute__((nonnull(1
#define increase_fileref_refcount(fileref)
#define InterlockedIncrement64(a)
_In_ fcb _In_ chunk _In_ uint64_t _In_ uint64_t _In_ bool _In_opt_ void _In_opt_ PIRP _In_ LIST_ENTRY * rollback
#define EA_CASE_SENSITIVE
static __inline FAST_IO_POSSIBLE fast_io_possible(fcb *fcb)
NTSTATUS stop_scrub(device_extension *Vcb, KPROCESSOR_MODE processor_mode)
#define keycmp(key1, key2)
NTSTATUS pause_scrub(device_extension *Vcb, KPROCESSOR_MODE processor_mode)
NTSTATUS NTSTATUS NTSTATUS NTSTATUS NTSTATUS excise_extents(device_extension *Vcb, fcb *fcb, uint64_t start_data, uint64_t end_data, PIRP Irp, LIST_ENTRY *rollback) __attribute__((nonnull(1
void space_list_add2(LIST_ENTRY *list, LIST_ENTRY *list_size, uint64_t address, uint64_t length, chunk *c, LIST_ENTRY *rollback)
NTSTATUS add_space_entry(LIST_ENTRY *list, LIST_ENTRY *list_size, uint64_t offset, uint64_t size)
void void void NTSTATUS void NTSTATUS NTSTATUS remove_drive_letter(PDEVICE_OBJECT mountmgr, PUNICODE_STRING devpath)
uint32_t sid_to_uid(PSID sid)
NTSTATUS get_reparse_point(PFILE_OBJECT FileObject, void *buffer, DWORD buflen, ULONG_PTR *retlen)
static __inline void win_time_to_unix(LARGE_INTEGER t, BTRFS_TIME *out)
uint32_t inherit_mode(fcb *parfcb, bool is_dir)
NTSTATUS update_dev_item(device_extension *Vcb, device *device, PIRP Irp)
void fcb_get_sd(fcb *fcb, struct _fcb *parent, bool look_for_xattr, PIRP Irp)
NTSTATUS do_write_file(fcb *fcb, uint64_t start_data, uint64_t end_data, void *data, PIRP Irp, bool file_write, uint32_t irp_offset, LIST_ENTRY *rollback) __attribute__((nonnull(1
NTSTATUS increase_extent_refcount_data(device_extension *Vcb, uint64_t address, uint64_t size, uint64_t root, uint64_t inode, uint64_t offset, uint32_t refcount, PIRP Irp)
NTSTATUS NTSTATUS NTSTATUS void free_write_data_stripes(write_data_context *wtc) __attribute__((nonnull(1)))
void space_list_subtract2(LIST_ENTRY *list, LIST_ENTRY *list_size, uint64_t address, uint64_t length, chunk *c, LIST_ENTRY *rollback)
BOOLEAN(__stdcall * tFsRtlCheckLockForOplockRequest)(PFILE_LOCK FileLock, PLARGE_INTEGER AllocationSize)
NTSTATUS query_scrub(device_extension *Vcb, KPROCESSOR_MODE processor_mode, void *data, ULONG length)
NTSTATUS open_fileref(_Requires_lock_held_(_Curr_->tree_lock) _Requires_exclusive_lock_held_(_Curr_->fcb_lock) _In_ device_extension *Vcb, _Out_ file_ref **pfr, _In_ PUNICODE_STRING fnus, _In_opt_ file_ref *related, _In_ bool parent, _Out_opt_ USHORT *parsed, _Out_opt_ ULONG *fn_offset, _In_ POOL_TYPE pooltype, _In_ bool case_sensitive, _In_opt_ PIRP Irp)
_In_ fcb _In_ chunk _In_ uint64_t _In_ uint64_t _In_ bool _In_opt_ void _In_opt_ PIRP _In_ LIST_ENTRY _In_ uint8_t compression
_In_ fcb _In_ chunk _In_ uint64_t start_data
NTSTATUS set_reparse_point(PIRP Irp)
#define COMPRESSED_EXTENT_SIZE
bool has_open_children(file_ref *fileref)
NTSTATUS do_write(device_extension *Vcb, PIRP Irp)
static __inline POPLOCK fcb_oplock(fcb *fcb)
NTSTATUS NTSTATUS NTSTATUS NTSTATUS NTSTATUS chunk * get_chunk_from_address(device_extension *Vcb, uint64_t address) __attribute__((nonnull(1)))
void do_rollback(device_extension *Vcb, LIST_ENTRY *rollback) __attribute__((nonnull(1
void find_gid(struct _fcb *fcb, struct _fcb *parfcb, PSECURITY_SUBJECT_CONTEXT subjcont)
_In_ uint16_t _Out_ ULONG * atts
NTSTATUS increase_extent_refcount(device_extension *Vcb, uint64_t address, uint64_t size, uint8_t type, void *data, KEY *firstitem, uint8_t level, PIRP Irp)
#define EA_PROP_COMPRESSION
NTSTATUS write_compressed(fcb *fcb, uint64_t start_data, uint64_t end_data, void *data, PIRP Irp, LIST_ENTRY *rollback)
#define makedev(major, minor)
NTSTATUS write_data_phys(_In_ PDEVICE_OBJECT device, _In_ PFILE_OBJECT fileobj, _In_ uint64_t address, _In_reads_bytes_(length) void *data, _In_ uint32_t length)
NTSTATUS open_fileref_by_inode(_Requires_exclusive_lock_held_(_Curr_->fcb_lock) device_extension *Vcb, root *subvol, uint64_t inode, file_ref **pfr, PIRP Irp)
BOOLEAN(__stdcall * tFsRtlAreThereCurrentOrInProgressFileLocks)(PFILE_LOCK FileLock)
NTSTATUS bool void NTSTATUS add_extent_to_fcb(_In_ fcb *fcb, _In_ uint64_t offset, _In_reads_bytes_(edsize) EXTENT_DATA *ed, _In_ uint16_t edsize, _In_ bool unique, _In_opt_ _When_(return >=0, __drv_aliasesMem) void *csum, _In_ LIST_ENTRY *rollback) __attribute__((nonnull(1
NTSTATUS open_fcb(_Requires_lock_held_(_Curr_->tree_lock) _Requires_exclusive_lock_held_(_Curr_->fcb_lock) device_extension *Vcb, root *subvol, uint64_t inode, uint8_t type, PANSI_STRING utf8, bool always_add_hl, fcb *parent, fcb **pfcb, POOL_TYPE pooltype, PIRP Irp)
NTSTATUS read_send_buffer(device_extension *Vcb, PFILE_OBJECT FileObject, void *data, ULONG datalen, ULONG_PTR *retlen, KPROCESSOR_MODE processor_mode)
void volume_removal(PUNICODE_STRING devpath)
NTSTATUS NTSTATUS bool bool void free_trees(device_extension *Vcb) __attribute__((nonnull(1)))
void add_fcb_to_subvol(_In_ _Requires_exclusive_lock_held_(_Curr_->Vcb->fcb_lock) fcb *fcb)
NTSTATUS delete_reparse_point(PIRP Irp)
NTSTATUS insert_tree_item(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock) device_extension *Vcb, _In_ root *r, _In_ uint64_t obj_id, _In_ uint8_t obj_type, _In_ uint64_t offset, _In_reads_bytes_opt_(size) _When_(return >=0, __drv_aliasesMem) void *data, _In_ uint16_t size, _Out_opt_ traverse_ptr *ptp, _In_opt_ PIRP Irp) __attribute__((nonnull(1
NTSTATUS bool void NTSTATUS void add_extent(_In_ fcb *fcb, _In_ LIST_ENTRY *prevextle, _In_ __drv_aliasesMem extent *newext) __attribute__((nonnull(1
void get_sector_csum(device_extension *Vcb, void *buf, void *csum)
void calc_tree_checksum(device_extension *Vcb, tree_header *th)
NTSTATUS NTSTATUS void clear_rollback(LIST_ENTRY *rollback) __attribute__((nonnull(1)))
NTSTATUS fileref_get_filename(file_ref *fileref, PUNICODE_STRING fn, USHORT *name_offset, ULONG *preqlen)
NTSTATUS start_scrub(device_extension *Vcb, KPROCESSOR_MODE processor_mode)
NTSTATUS update_changed_extent_ref(device_extension *Vcb, chunk *c, uint64_t address, uint64_t size, uint64_t root, uint64_t objid, uint64_t offset, int32_t count, bool no_csum, bool superseded, PIRP Irp)
NTSTATUS get_tree_new_address(device_extension *Vcb, tree *t, PIRP Irp, LIST_ENTRY *rollback)
fcb * create_fcb(device_extension *Vcb, POOL_TYPE pool_type)
NTSTATUS add_dir_child(fcb *fcb, uint64_t inode, bool subvol, PANSI_STRING utf8, PUNICODE_STRING name, uint8_t type, dir_child **pdc)
file_ref * create_fileref(device_extension *Vcb)
NTSTATUS NTSTATUS delete_tree_item(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock) device_extension *Vcb, _Inout_ traverse_ptr *tp) __attribute__((nonnull(1
static __inline void * map_user_buffer(PIRP Irp, ULONG priority)
NTSTATUS find_file_in_dir(PUNICODE_STRING filename, fcb *fcb, root **subvol, uint64_t *inode, dir_child **pdc, bool case_sensitive)
static __inline bool is_subvol_readonly(root *r, PIRP Irp)
NTSTATUS resume_scrub(device_extension *Vcb, KPROCESSOR_MODE processor_mode)
static __inline bool write_fcb_compressed(fcb *fcb)
#define FSCTL_BTRFS_QUERY_SCRUB
#define BTRFS_BALANCE_OPTS_DRANGE
#define FSCTL_BTRFS_CREATE_SNAPSHOT
#define FSCTL_BTRFS_SET_INODE_INFO
#define FSCTL_BTRFS_STOP_SCRUB
#define FSCTL_BTRFS_ADD_DEVICE
#define BTRFS_COMPRESSION_ANY
#define FSCTL_BTRFS_PAUSE_SCRUB
#define FSCTL_BTRFS_PAUSE_BALANCE
#define FSCTL_BTRFS_SEND_SUBVOL
#define BTRFS_BALANCE_OPTS_ENABLED
#define FSCTL_BTRFS_SET_XATTR
#define FSCTL_BTRFS_RESERVE_SUBVOL
#define FSCTL_BTRFS_QUERY_BALANCE
#define FSCTL_BTRFS_GET_UUID
#define FSCTL_BTRFS_GET_XATTRS
#define FSCTL_BTRFS_RESUME_SCRUB
#define FSCTL_BTRFS_START_SCRUB
#define FSCTL_BTRFS_START_BALANCE
#define FSCTL_BTRFS_MKNOD
#define FSCTL_BTRFS_FIND_SUBVOL
#define FSCTL_BTRFS_RESIZE
#define FSCTL_BTRFS_RECEIVED_SUBVOL
#define FSCTL_BTRFS_RESUME_BALANCE
#define FSCTL_BTRFS_GET_INODE_INFO
#define BTRFS_BALANCE_OPTS_DEVID
#define FSCTL_BTRFS_REMOVE_DEVICE
#define FSCTL_BTRFS_GET_CSUM_INFO
#define FSCTL_BTRFS_GET_USAGE
#define FSCTL_BTRFS_STOP_BALANCE
#define FSCTL_BTRFS_GET_DEVICES
#define FSCTL_BTRFS_CREATE_SUBVOL
#define FSCTL_BTRFS_GET_FILE_IDS
#define FSCTL_BTRFS_RESET_STATS
#define FSCTL_BTRFS_READ_SEND_BUFFER
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, OUT OPTIONAL PIO_STATUS_BLOCK IoStatus)
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
#define IOCTL_DISK_IS_WRITABLE
#define _Requires_exclusive_lock_held_(lock)
#define STATUS_NOT_SUPPORTED
#define NT_SUCCESS(StatCode)
static string utf16_to_utf8(const wstring_view &utf16)
static const WCHAR *const ext[]
static LONG find_item(PropertyBag *This, LPCOLESTR name)
NTSTATUS query_balance(device_extension *Vcb, void *data, ULONG length)
NTSTATUS resume_balance(device_extension *Vcb, KPROCESSOR_MODE processor_mode)
NTSTATUS pause_balance(device_extension *Vcb, KPROCESSOR_MODE processor_mode)
NTSTATUS remove_device(device_extension *Vcb, void *data, ULONG length, KPROCESSOR_MODE processor_mode)
NTSTATUS stop_balance(device_extension *Vcb, KPROCESSOR_MODE processor_mode)
NTSTATUS start_balance(device_extension *Vcb, void *data, ULONG length, KPROCESSOR_MODE processor_mode)
void mark_fcb_dirty(_In_ fcb *fcb)
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
void log_device_error(_In_ device_extension *Vcb, _Inout_ device *dev, _In_ int error)
NTSTATUS get_device_pnp_name(_In_ PDEVICE_OBJECT DeviceObject, _Out_ PUNICODE_STRING pnp_name, _Out_ const GUID **guid)
void free_fileref(_Inout_ file_ref *fr)
NTSTATUS create_root(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock) device_extension *Vcb, _In_ uint64_t id, _Out_ root **rootptr, _In_ bool no_tree, _In_ uint64_t offset, _In_opt_ PIRP Irp)
NTSTATUS find_chunk_usage(_In_ _Requires_lock_held_(_Curr_->tree_lock) device_extension *Vcb, _In_opt_ PIRP Irp)
void mark_fileref_dirty(_In_ file_ref *fileref)
ULONG get_file_attributes(_In_ _Requires_lock_held_(_Curr_->tree_lock) device_extension *Vcb, _In_ root *r, _In_ uint64_t inode, _In_ uint8_t type, _In_ bool dotfile, _In_ bool ignore_xa, _In_opt_ PIRP Irp)
bool check_superblock_checksum(superblock *sb)
void queue_notification_fcb(_In_ file_ref *fileref, _In_ ULONG filter_match, _In_ ULONG action, _In_opt_ PUNICODE_STRING stream)
void init_device(_In_ device_extension *Vcb, _Inout_ device *dev, _In_ bool get_nums)
NTSTATUS sync_read_phys(_In_ PDEVICE_OBJECT DeviceObject, _In_ PFILE_OBJECT FileObject, _In_ uint64_t StartingOffset, _In_ ULONG Length, _Out_writes_bytes_(Length) PUCHAR Buffer, _In_ bool override)
NTSTATUS check_file_name_valid(_In_ PUNICODE_STRING us, _In_ bool posix, _In_ bool stream)
void uninit(_In_ device_extension *Vcb)
void send_notification_fileref(_In_ file_ref *fileref, _In_ ULONG filter_match, _In_ ULONG action, _In_opt_ PUNICODE_STRING stream)
NTSTATUS dev_ioctl(_In_ PDEVICE_OBJECT DeviceObject, _In_ ULONG ControlCode, _In_reads_bytes_opt_(InputBufferSize) PVOID InputBuffer, _In_ ULONG InputBufferSize, _Out_writes_bytes_opt_(OutputBufferSize) PVOID OutputBuffer, _In_ ULONG OutputBufferSize, _In_ bool Override, _Out_opt_ IO_STATUS_BLOCK *iosb)
#define BTRFS_COMPRESSION_LZO
#define BTRFS_COMPRESSION_ZLIB
#define BTRFS_COMPRESSION_ZSTD
#define EXTENT_TYPE_PREALLOC
static const uint64_t superblock_addrs[]
#define BTRFS_SUBVOL_READONLY
#define BTRFS_ENCODING_NONE
#define TYPE_SUBVOL_REC_UUID
#define EXTENT_TYPE_INLINE
#define BTRFS_TYPE_UNKNOWN
#define BTRFS_DEV_STAT_WRITE_ERRORS
#define TYPE_TREE_BLOCK_REF
#define EXTENT_TYPE_REGULAR
#define BTRFS_COMPRESSION_NONE
#define BTRFS_ENCRYPTION_NONE
_In_ PIO_STACK_LOCATION IrpSp
static struct all_devices * devices
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IsListEmpty(ListHead)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define RtlCompareMemory(s1, s2, l)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define KeQuerySystemTime(t)
#define ExAcquireResourceExclusiveLite(res, wait)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
#define ExAcquireResourceSharedLite(res, wait)
VOID NTAPI KeClearEvent(IN PKEVENT Event)
LONG NTAPI KeReadStateEvent(IN PKEVENT Event)
BOOLEAN NTAPI FsRtlFastCheckLockForWrite(IN PFILE_LOCK FileLock, IN PLARGE_INTEGER FileOffset, IN PLARGE_INTEGER Length, IN ULONG Key, IN PFILE_OBJECT FileObject, IN PVOID Process)
BOOLEAN NTAPI FsRtlFastCheckLockForRead(IN PFILE_LOCK FileLock, IN PLARGE_INTEGER FileOffset, IN PLARGE_INTEGER Length, IN ULONG Key, IN PFILE_OBJECT FileObject, IN PVOID Process)
#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX
#define FsRtlAreThereCurrentFileLocks(FL)
#define FSRTL_VOLUME_CHANGE_SIZE
BOOLEAN NTAPI CcPurgeCacheSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN UninitializeCacheMaps)
GLuint GLuint GLsizei GLenum type
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLenum GLuint GLenum GLsizei const GLchar * buf
GLuint GLsizei GLsizei * length
GLenum const GLvoid * addr
GLsizeiptr const GLvoid GLenum usage
GLfloat GLfloat GLfloat GLfloat h
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 factor
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
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
LARGE_INTEGER NTAPI KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq)
_Check_return_ int __cdecl rand(void)
#define OBJ_KERNEL_HANDLE
NTSYSAPI BOOLEAN WINAPI RtlValidRelativeSecurityDescriptor(PSECURITY_DESCRIPTOR, ULONG, SECURITY_INFORMATION)
POBJECT_TYPE IoFileObjectType
int const JOCTET unsigned int datalen
NTSTATUS NTAPI CcWaitForCurrentLazyWriterActivity(VOID)
#define memcpy(s1, s2, n)
#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
#define IOCTL_DISK_GET_LENGTH_INFO
#define MOUNTMGR_DEVICE_NAME
#define SE_MANAGE_VOLUME_PRIVILEGE
static PIO_STATUS_BLOCK iosb
#define InitializeObjectAttributes(p, n, a, r, s)
#define FSCTL_QUERY_RETRIEVAL_POINTERS
#define FSCTL_OPLOCK_BREAK_NOTIFY
#define FILE_ATTRIBUTE_READONLY
#define FSCTL_LOCK_VOLUME
#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE
#define FSCTL_REQUEST_OPLOCK_LEVEL_1
#define FILE_READ_ATTRIBUTES
#define FILE_ATTRIBUTE_HIDDEN
#define FSCTL_REQUEST_FILTER_OPLOCK
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define FSCTL_MARK_VOLUME_DIRTY
#define FSCTL_INVALIDATE_VOLUMES
#define FSCTL_IS_PATHNAME_VALID
#define FILE_WRITE_ATTRIBUTES
#define FSCTL_UNLOCK_VOLUME
#define FSCTL_REQUEST_BATCH_OPLOCK
#define FILE_ATTRIBUTE_DIRECTORY
#define FSCTL_QUERY_FAT_BPB
#define FSCTL_FILESYSTEM_GET_STATISTICS
#define FSCTL_OPBATCH_ACK_CLOSE_PENDING
#define FSCTL_OPLOCK_BREAK_ACK_NO_2
#define FSCTL_IS_VOLUME_MOUNTED
#define FILE_ADD_SUBDIRECTORY
#define FSCTL_GET_COMPRESSION
#define FSCTL_REQUEST_OPLOCK_LEVEL_2
#define FSCTL_DISMOUNT_VOLUME
#define FSCTL_SET_COMPRESSION
struct _DEVICE_MANAGE_DATA_SET_ATTRIBUTES DEVICE_MANAGE_DATA_SET_ATTRIBUTES
#define DEVICE_DSM_FLAG_ENTIRE_DATA_SET_RANGE
#define IOCTL_STORAGE_GET_DEVICE_NUMBER
#define IOCTL_STORAGE_CHECK_VERIFY
#define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED
#define IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES
#define DeviceDsmAction_Trim
#define COMPRESSION_FORMAT_NONE
#define FSRTL_VOLUME_UNLOCK
#define FILE_ATTRIBUTE_SPARSE_FILE
#define FSRTL_VOLUME_LOCK
#define FILE_ATTRIBUTE_REPARSE_POINT
#define FSRTL_VOLUME_DISMOUNT
#define FSCTL_GET_NTFS_VOLUME_DATA
#define VPB_REMOVE_PENDING
NTSYSAPI NTSTATUS NTAPI RtlGetOwnerSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor, OUT PSID *Owner, OUT PBOOLEAN OwnerDefaulted)
#define FSRTL_VOLUME_LOCK_FAILED
#define FSCTL_GET_NTFS_FILE_RECORD
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
NTSTATUS NTAPI FsRtlNotifyVolumeEvent(IN PFILE_OBJECT FileObject, IN ULONG EventCode)
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
PGENERIC_MAPPING NTAPI IoGetFileObjectGenericMapping(VOID)
VOID NTAPI IoSetHardErrorOrVerifyDevice(IN PIRP Irp, IN PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
VOID NTAPI IoReleaseVpbSpinLock(IN KIRQL Irql)
VOID NTAPI IoAcquireVpbSpinLock(OUT PKIRQL Irql)
NTSTATUS NTAPI PsCreateSystemThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle, IN PCLIENT_ID ClientId, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext)
BOOLEAN NTAPI SeSinglePrivilegeCheck(_In_ LUID PrivilegeValue, _In_ KPROCESSOR_MODE PreviousMode)
Checks if a single privilege is present in the context of the calling thread.
#define STATUS_INTERNAL_ERROR
#define STATUS_FILE_LOCK_CONFLICT
#define STATUS_NOT_LOCKED
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
NTSTATUS NTAPI FsRtlOplockFsctrl(IN POPLOCK Oplock, IN PIRP Irp, IN ULONG OpenCount)
NTSTATUS NTAPI FsRtlCheckOplock(IN POPLOCK Oplock, IN PIRP Irp, IN PVOID Context, IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL)
NTSTATUS NTAPI IoRegisterPlugPlayNotification(_In_ IO_NOTIFICATION_EVENT_CATEGORY EventCategory, _In_ ULONG EventCategoryFlags, _In_opt_ PVOID EventCategoryData, _In_ PDRIVER_OBJECT DriverObject, _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine, _Inout_opt_ PVOID Context, _Out_ PVOID *NotificationEntry)
#define BTRFS_INODE_COMPRESS
#define BTRFS_INODE_NODATASUM
#define BTRFS_INODE_NODATACOW
#define FSCTL_GET_REPARSE_POINT
#define FSCTL_SET_REPARSE_POINT
#define FSCTL_IS_VOLUME_DIRTY
#define FILESYSTEM_STATISTICS_TYPE_NTFS
#define FSCTL_GET_RETRIEVAL_POINTERS
struct _FILESYSTEM_STATISTICS FILESYSTEM_STATISTICS
#define FSCTL_DELETE_REPARSE_POINT
#define FSCTL_GET_VOLUME_BITMAP
#define FSCTL_CSC_INTERNAL
#define FSCTL_READ_RAW_ENCRYPTED
#define FSCTL_TXFS_SHUTDOWN_RM
#define FSCTL_SET_VOLUME_COMPRESSION_STATE
#define FSCTL_QUERY_ALLOCATED_RANGES
#define FSCTL_SET_OBJECT_ID
#define FSCTL_SET_DEFECT_MANAGEMENT
#define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES
#define FSCTL_TXFS_ROLLFORWARD_REDO
#define FSCTL_WRITE_USN_CLOSE_RECORD
#define FSCTL_QUERY_SPARING_INFO
#define FSCTL_SHRINK_VOLUME
#define FSCTL_READ_USN_JOURNAL
#define FSCTL_TXFS_WRITE_BACKUP_INFORMATION
#define FSCTL_WRITE_RAW_ENCRYPTED
#define FSCTL_FIND_FILES_BY_SID
#define FSCTL_DELETE_USN_JOURNAL
#define FSCTL_SET_ZERO_DATA
#define FSCTL_ENCRYPTION_FSCTL_IO
#define FSCTL_TXFS_QUERY_RM_INFORMATION
#define FSCTL_TXFS_READ_BACKUP_INFORMATION
#define FSCTL_QUERY_ON_DISK_VOLUME_INFO
#define FSCTL_SIS_LINK_FILES
#define FSCTL_RECALL_FILE
#define FSCTL_SIS_COPYFILE
#define FSCTL_TXFS_MODIFY_RM
#define FSCTL_SET_ENCRYPTION
#define FSCTL_MARK_HANDLE
#define FSCTL_QUERY_USN_JOURNAL
#define FSCTL_FILE_PREFETCH
#define FSCTL_CREATE_OR_GET_OBJECT_ID
#define FSCTL_CREATE_USN_JOURNAL
#define FSCTL_SET_OBJECT_ID_EXTENDED
#define FSCTL_SET_ZERO_ON_DEALLOCATION
#define FSCTL_ALLOW_EXTENDED_DASD_IO
#define FSCTL_ENUM_USN_DATA
#define FSCTL_MAKE_MEDIA_COMPATIBLE
#define FSCTL_INITIATE_REPAIR
#define FSCTL_TXFS_START_RM
#define FSCTL_TXFS_ROLLFORWARD_UNDO
#define FSCTL_TXFS_LIST_TRANSACTIONS
#define FSCTL_TXFS_GET_METADATA_INFO
#define FSCTL_GET_OBJECT_ID
#define FSCTL_SECURITY_ID_CHECK
#define FSCTL_TXFS_CREATE_SECONDARY_RM
#define FSCTL_WAIT_FOR_REPAIR
#define FSCTL_TXFS_CREATE_MINIVERSION
#define FSCTL_EXTEND_VOLUME
#define FSCTL_QUERY_PAGEFILE_ENCRYPTION
#define FSCTL_TXFS_GET_TRANSACTED_VERSION
#define FSCTL_ENABLE_UPGRADE
#define FSCTL_READ_FILE_USN_DATA
#define FSCTL_SET_SHORT_NAME_BEHAVIOR
#define FSCTL_DELETE_OBJECT_ID
#define FSCTL_DFSR_SET_GHOST_HANDLE_STATE
#define FSCTL_TXFS_TRANSACTION_ACTIVE
#define FSCTL_READ_FROM_PLEX
#define offsetof(TYPE, MEMBER)
int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
static void send_subvol(const wstring &subvol, const wstring &file, const wstring &parent, const vector< wstring > &clones)
#define SUBVOL_ROOT_INODE
#define STATUS_DEVICE_NOT_READY
#define FSCTL_SET_INTEGRITY_INFORMATION
#define STATUS_MORE_PROCESSING_REQUIRED
#define FSCTL_GET_INTEGRITY_INFORMATION
#define STATUS_END_OF_FILE
#define FSCTL_DUPLICATE_EXTENTS_TO_FILE
#define BTRFS_TYPE_DIRECTORY
#define BTRFS_TYPE_SOCKET
#define BTRFS_TYPE_SYMLINK
#define BLOCK_FLAG_RAID10
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_BUFFER_OVERFLOW
#define BTRFS_TYPE_CHARDEV
#define BTRFS_TYPE_BLOCKDEV
INT WSAAPI shutdown(IN SOCKET s, IN INT how)
DEVICE_DATA_MANAGEMENT_SET_ACTION Action
ULONG ParameterBlockLength
ULONG ParameterBlockOffset
ULONG DataSetRangesOffset
ULONG DataSetRangesLength
LARGE_INTEGER SourceFileOffset
LARGE_INTEGER TargetFileOffset
ULONG SizeOfCompleteStructure
struct _IO_STACK_LOCATION::@4104::@4119 FileSystemControl
union _IO_STACK_LOCATION::@1611 Parameters
struct _LIST_ENTRY * Flink
struct _DEVICE_OBJECT * RealDevice
bool user_set_change_time
bool allow_extended_dasd_io
LIST_ENTRY list_entry_all
struct _file_ref * fileref
LIST_ENTRY ** hash_ptrs_uc
struct _device_extension * Vcb
ANSI_STRING reparse_xattr
bool reparse_xattr_changed
enum prop_compression_type prop_compression
struct _fcb_nonpaged * nonpaged
bool prop_compression_changed
FSRTL_ADVANCED_FCB_HEADER Header
struct _file_ref * parent
struct pdo_device_extension * pdode
uint64_t disk_size_uncompressed
BOOL compression_type_changed
btrfs_usage_device devices[1]
void * notification_entry
VOID NTAPI SeCaptureSubjectContext(_Out_ PSECURITY_SUBJECT_CONTEXT SubjectContext)
Captures the security subject context of the calling thread and calling process.
union _LARGE_INTEGER LARGE_INTEGER
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_FILE_IS_A_DIRECTORY
#define STATUS_NOT_A_DIRECTORY
#define STATUS_MEDIA_WRITE_PROTECTED
#define STATUS_ACCESS_DENIED
#define STATUS_INVALID_PARAMETER
#define STATUS_OBJECT_NAME_COLLISION
#define STATUS_FILE_DELETED
#define STATUS_INVALID_USER_BUFFER
#define STATUS_VERIFY_REQUIRED
#define STATUS_OBJECT_NAME_INVALID
#define STATUS_INSUFFICIENT_RESOURCES
#define STATUS_OBJECT_NAME_NOT_FOUND
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
#define FILE_ACTION_MODIFIED
#define FILE_NOTIFY_CHANGE_ATTRIBUTES
#define FILE_NOTIFY_CHANGE_FILE_NAME
@ EventCategoryTargetDeviceChange
#define FSCTL_SET_BOOTLOADER_ACCESSED
#define FILE_NOTIFY_CHANGE_LAST_WRITE
#define FILE_ACTION_ADDED
#define FILE_NOTIFY_CHANGE_DIR_NAME
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
#define ObDereferenceObject
#define ObReferenceObject
#define PsGetCurrentProcess
NTKERNELAPI NTSTATUS NTAPI SeAssignSecurityEx(_In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor, _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor, _Out_ PSECURITY_DESCRIPTOR *NewDescriptor, _In_opt_ GUID *ObjectType, _In_ BOOLEAN IsDirectoryObject, _In_ ULONG AutoInheritFlags, _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext, _In_ PGENERIC_MAPPING GenericMapping, _In_ POOL_TYPE PoolType)