21#if (NTDDI_VERSION >= NTDDI_WIN10)
24#define FileIdInformation (enum _FILE_INFORMATION_CLASS)59
25#define FileHardLinkFullIdInformation (enum _FILE_INFORMATION_CLASS)62
26#define FileDispositionInformationEx (enum _FILE_INFORMATION_CLASS)64
27#define FileRenameInformationEx (enum _FILE_INFORMATION_CLASS)65
28#define FileStatInformation (enum _FILE_INFORMATION_CLASS)68
29#define FileStatLxInformation (enum _FILE_INFORMATION_CLASS)70
30#define FileCaseSensitiveInformation (enum _FILE_INFORMATION_CLASS)71
31#define FileLinkInformationEx (enum _FILE_INFORMATION_CLASS)72
32#define FileStorageReserveIdInformation (enum _FILE_INFORMATION_CLASS)74
73#define LX_FILE_METADATA_HAS_UID 0x01
74#define LX_FILE_METADATA_HAS_GID 0x02
75#define LX_FILE_METADATA_HAS_MODE 0x04
76#define LX_FILE_METADATA_HAS_DEVICE_ID 0x08
77#define LX_FILE_CASE_SENSITIVE_DIR 0x10
120#define FILE_RENAME_REPLACE_IF_EXISTS 0x001
121#define FILE_RENAME_POSIX_SEMANTICS 0x002
122#define FILE_RENAME_SUPPRESS_PIN_STATE_INHERITANCE 0x004
123#define FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE 0x008
124#define FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE 0x010
125#define FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE 0x020
126#define FILE_RENAME_IGNORE_READONLY_ATTRIBUTE 0x040
127#define FILE_RENAME_FORCE_RESIZE_TARGET_SR 0x080
128#define FILE_RENAME_FORCE_RESIZE_SOURCE_SR 0x100
130#define FILE_DISPOSITION_DELETE 0x1
131#define FILE_DISPOSITION_POSIX_SEMANTICS 0x2
132#define FILE_DISPOSITION_FORCE_IMAGE_SECTION_CHECK 0x4
133#define FILE_DISPOSITION_ON_CLOSE 0x8
135#define FILE_LINK_REPLACE_IF_EXISTS 0x001
136#define FILE_LINK_POSIX_SEMANTICS 0x002
137#define FILE_LINK_SUPPRESS_STORAGE_RESERVE_INHERITANCE 0x008
138#define FILE_LINK_NO_INCREASE_AVAILABLE_SPACE 0x010
139#define FILE_LINK_NO_DECREASE_AVAILABLE_SPACE 0x020
140#define FILE_LINK_IGNORE_READONLY_ATTRIBUTE 0x040
141#define FILE_LINK_FORCE_RESIZE_TARGET_SR 0x080
142#define FILE_LINK_FORCE_RESIZE_SOURCE_SR 0x100
146#define FILE_RENAME_INFORMATION_EX FILE_RENAME_INFORMATION
147#define FILE_LINK_INFORMATION_EX FILE_LINK_INFORMATION
177#define FILE_RENAME_REPLACE_IF_EXISTS 0x001
178#define FILE_RENAME_POSIX_SEMANTICS 0x002
179#define FILE_RENAME_IGNORE_READONLY_ATTRIBUTE 0x040
181#define FILE_DISPOSITION_DELETE 0x1
182#define FILE_DISPOSITION_POSIX_SEMANTICS 0x2
183#define FILE_DISPOSITION_FORCE_IMAGE_SECTION_CHECK 0x4
185#define FILE_LINK_REPLACE_IF_EXISTS 0x001
186#define FILE_LINK_POSIX_SEMANTICS 0x002
187#define FILE_LINK_IGNORE_READONLY_ATTRIBUTE 0x040
196 bool inode_item_changed =
false;
200 if (fileref && fileref->
parent)
203 ERR(
"stream did not have fileref\n");
209 ERR(
"ccb was NULL\n");
218 WARN(
"attempted to set FILE_ATTRIBUTE_DIRECTORY on non-directory\n");
254 inode_item_changed =
true;
264 inode_item_changed =
true;
274 inode_item_changed =
true;
284 inode_item_changed =
true;
323 fcb->
subvol->root_item.ctransid =
Vcb->superblock.generation;
330 fcb->
subvol->root_item.flags &= ~BTRFS_SUBVOL_READONLY;
333 inode_item_changed =
true;
338 if (inode_item_changed) {
385 ERR(
"no fileref for stream\n");
395 TRACE(
"not allowing readonly file to be deleted\n");
401 WARN(
"not allowing \\$Root to be deleted\n");
408 TRACE(
"directory not empty\n");
415 TRACE(
"trying to delete file which is being mapped as an image\n");
451 if (
c->open_count > 0)
472 ERR(
"out of memory\n");
496 ERR(
"out of memory\n");
510 ERR(
"out of memory\n");
527 ERR(
"out of memory\n");
538 while (le != &oldfcb->
extents) {
545 ERR(
"out of memory\n");
553 if (
ext2->datalen > 0)
556 ext2->unique =
false;
557 ext2->ignore =
false;
558 ext2->inserted =
true;
573 ERR(
"out of memory\n");
595 ERR(
"out of memory\n");
601 hl2->index = hl->
index;
603 hl2->name.Length = hl2->name.MaximumLength = hl->
name.
Length;
606 if (!hl2->name.Buffer) {
607 ERR(
"out of memory\n");
615 hl2->utf8.Length = hl2->utf8.MaximumLength = hl->
utf8.
Length;
618 if (!hl2->utf8.Buffer) {
619 ERR(
"out of memory\n");
638 ERR(
"out of memory\n");
651 ERR(
"out of memory\n");
662 while (le != &oldfcb->
xattrs) {
671 ERR(
"out of memory\n");
717 ERR(
"open_fileref_child returned %08lx\n",
Status);
724 ERR(
"out of memory\n");
755 if (dc2->
hash >> 24 ==
c)
764 c =
dc->hash_uc >> 24;
793 ERR(
"out of memory\n");
822 ERR(
"SeAssignSecurity returned %08lx\n",
Status);
828 ERR(
"SeAssignSecurity returned NULL security descriptor\n");
834 ERR(
"RtlGetOwnerSecurityDescriptor returned %08lx\n",
Status);
849 fcb->
Header.ValidDataLength.QuadPart = 0;
861 ERR(
"out of memory\n");
869 ERR(
"out of memory\n");
875 acquire_fcb_lock_exclusive(
Vcb);
879 release_fcb_lock(
Vcb);
965 acquire_fcb_lock_exclusive(
fileref->fcb->Vcb);
970 ERR(
"out of memory\n");
995 ERR(
"add_children_to_move_list returned %08lx\n",
Status);
1022 ERR(
"duplicate_fcb returned %08lx\n",
Status);
1092 ERR(
"get_chunk_from_address(%I64x) failed\n", ed2->
address);
1098 ERR(
"update_changed_extent_ref returned %08lx\n",
Status);
1168 fileref->fcb->subvol->root_item.ctransid =
fileref->fcb->Vcb->superblock.generation;
1176 bool name_changed =
false;
1182 ERR(
"out of memory\n");
1192 ERR(
"create_directory_fcb returned %08lx\n",
Status);
1213 name_changed =
true;
1218 ERR(
"out of memory\n");
1271 ERR(
"out of memory\n");
1281 ERR(
"out of memory\n");
1291 ERR(
"RtlUpcaseUnicodeString returned %08lx\n",
Status);
1326 TRACE(
"me->fileref->parent->fcb->inode_item.st_size (inode %I64x) was %I64x\n", me->
fileref->
parent->fcb->inode, me->
fileref->
parent->fcb->inode_item.st_size);
1328 TRACE(
"me->fileref->parent->fcb->inode_item.st_size (inode %I64x) now %I64x\n", me->
fileref->
parent->fcb->inode, me->
fileref->
parent->fcb->inode_item.st_size);
1372 ERR(
"delete_fileref returned %08lx\n",
Status);
1380 ERR(
"out of memory\n");
1391 ERR(
"out of memory\n");
1402 ERR(
"out of memory\n");
1428 ERR(
"delete_fileref returned %08lx\n",
Status);
1436 destdir->
fcb->
subvol->root_item.ctransid = destdir->
fcb->
Vcb->superblock.generation;
1463 fileref->fcb->subvol->fcbs_version++;
1465 release_fcb_lock(
fileref->fcb->Vcb);
1495 if (dc2->
hash >
dc->hash) {
1512 if (dc2->
hash >
dc->hash)
1516 c =
dc->hash_uc >> 24;
1570 WARN(
"trying to rename stream on readonly file\n");
1575 WARN(
"insufficient permissions\n");
1587 WARN(
"trying to overwrite open file\n");
1592 WARN(
"can only overwrite existing stream if it is zero-length\n");
1598 ERR(
"out of memory\n");
1630 fileref->fcb->inode_item_changed =
true;
1663 fileref->fcb->extents_changed =
true;
1671 if (
fileref->fcb->adsxattr.Buffer) {
1673 fileref->fcb->adsxattr.Length =
fileref->fcb->adsxattr.MaximumLength = 0;
1680 fileref->fcb->adsdata.Length =
fileref->fcb->adsdata.MaximumLength = 0;
1682 acquire_fcb_lock_exclusive(
Vcb);
1692 release_fcb_lock(
Vcb);
1755 ERR(
"out of memory\n");
1774 ERR(
"add_extent_to_fcb returned %08lx\n",
Status);
1784 ERR(
"out of memory\n");
1802 ERR(
"do_write_file returned %08lx\n",
Status);
1812 fileref->fcb->inode_item_changed =
true;
1817 if (
dc->utf8.Buffer)
1820 if (
dc->name.Buffer)
1823 if (
dc->name_uc.Buffer)
1838 dummyfcb->
ads =
true;
1841 acquire_fcb_lock_exclusive(
Vcb);
1844 dummyfcb->
subvol->fcbs_version++;
1845 release_fcb_lock(
Vcb);
1869 static const WCHAR datasuf[] =
L":$DATA";
1870 static const char xapref[] =
"user.";
1873 ERR(
"fileref not set\n");
1878 ERR(
"fileref->parent not set\n");
1883 WARN(
"filename too short\n");
1888 WARN(
"destination filename must begin with a colon\n");
1893 WARN(
"insufficient permissions\n");
1901 if (
fn.Length >=
sizeof(datasuf) -
sizeof(
WCHAR) &&
1903 fn.Length -=
sizeof(datasuf) -
sizeof(
WCHAR);
1910 WARN(
"invalid stream name %.*S\n", (
int)(
fn.Length /
sizeof(
WCHAR)),
fn.Buffer);
1915 WARN(
"trying to rename stream on readonly file\n");
1934 WARN(
"trying to overwrite open file\n");
1940 WARN(
"can only overwrite existing stream if it is zero-length\n");
1947 ERR(
"delete_fileref returned %08lx\n",
Status);
1952 ERR(
"open_fileref_child returned %08lx\n",
Status);
1964 ERR(
"out of memory\n");
1978 ERR(
"out of memory\n");
2002 ERR(
"out of memory\n");
2015 WARN(
"cannot rename as data too long\n");
2026 WARN(
"cannot rename as data too long\n");
2036 ERR(
"RtlUpcaseUnicodeString returned %08lx\n",
Status);
2047 ERR(
"out of memory\n");
2062 dummyfcb->
ads =
true;
2065 acquire_fcb_lock_exclusive(
Vcb);
2068 dummyfcb->
subvol->fcbs_version++;
2069 release_fcb_lock(
Vcb);
2079 fileref->dc->name_uc = utf16uc;
2085 fileref->fcb->adsmaxlen = newmaxlen;
2116 static const WCHAR datasuf[] =
L":$DATA";
2117 static const char xapref[] =
"user.";
2120 ERR(
"fileref not set\n");
2125 WARN(
"filename too short\n");
2130 WARN(
"destination filename must begin with a colon\n");
2135 WARN(
"insufficient permissions\n");
2146 if (
fn.Length >=
sizeof(datasuf) -
sizeof(
WCHAR) &&
2148 fn.Length -=
sizeof(datasuf) -
sizeof(
WCHAR);
2150 if (
fn.Length == 0) {
2151 WARN(
"not allowing overwriting file with itself\n");
2157 WARN(
"invalid stream name %.*S\n", (
int)(
fn.Length /
sizeof(
WCHAR)),
fn.Buffer);
2162 WARN(
"trying to rename stream on readonly file\n");
2181 WARN(
"trying to overwrite open file\n");
2187 WARN(
"can only overwrite existing stream if it is zero-length\n");
2194 ERR(
"delete_fileref returned %08lx\n",
Status);
2199 ERR(
"open_fileref_child returned %08lx\n",
Status);
2211 ERR(
"out of memory\n");
2225 ERR(
"out of memory\n");
2249 ERR(
"out of memory\n");
2262 WARN(
"cannot rename as data too long\n");
2273 WARN(
"cannot rename as data too long\n");
2283 ERR(
"RtlUpcaseUnicodeString returned %08lx\n",
Status);
2292 if (
fileref->fcb->inode_item.st_size > 0) {
2299 ERR(
"out of memory\n");
2310 ERR(
"out of memory\n");
2321 ERR(
"short read\n");
2335 ERR(
"out of memory\n");
2352 ERR(
"duplicate_fcb returned %08lx\n",
Status);
2367 if (!dummyfileref) {
2368 ERR(
"out of memory\n");
2385 dummyfileref->
fcb = dummyfcb;
2392 if (
fileref->fcb->inode_item.st_size > 0) {
2396 ERR(
"excise_extents returned %08lx\n",
Status);
2411 dummyfcb->
Header.AllocationSize.QuadPart = 0;
2412 dummyfcb->
Header.FileSize.QuadPart = 0;
2413 dummyfcb->
Header.ValidDataLength.QuadPart = 0;
2420 le =
fileref->fcb->extents.Flink;
2421 while (le != &
fileref->fcb->extents) {
2445 if (
fileref->fcb->subvol->fcbs_ptrs[dummyfcb->
hash >> 24] == &
fileref->fcb->list_entry)
2468 fr->
parent = dummyfileref;
2480 dummyfileref->
dc->
fileref = dummyfileref;
2499 dc->name_uc = utf16uc;
2505 fileref->parent = dummyfileref;
2511 fileref->fcb->adsmaxlen = newmaxlen;
2533 ULONG fnlen, utf8len, origutf8len;
2552 TRACE(
"tfo = %p\n", tfo);
2562 ERR(
"no fileref set and no directory given\n");
2568 while (fnlen > 0 && (fri->
FileName[fnlen - 1] ==
'/' || fri->
FileName[fnlen - 1] ==
'\\')) {
2575 for (
i = fnlen - 1;
i >= 0;
i--) {
2589 WARN(
"not allowing \\$Root to be renamed\n");
2608 }
else if (fnlen >= 1 &&
fn[0] ==
':') {
2633 origutf8len =
fileref->dc->utf8.Length;
2642 ERR(
"out of memory\n");
2651 if (tfo && tfo->FsContext2) {
2652 struct _ccb* relatedccb = tfo->FsContext2;
2654 related = relatedccb->
fileref;
2664 TRACE(
"destination file already exists\n");
2670 }
else if (
fileref == oldfileref) {
2674 WARN(
"trying to overwrite open file\n");
2678 WARN(
"trying to overwrite readonly file\n");
2682 WARN(
"trying to overwrite directory\n");
2698 ERR(
"open_fileref returned %08lx\n",
Status);
2703 if (related->fcb ==
Vcb->dummy_fcb) {
2713 TRACE(
"SeAccessCheck failed, returning %08lx\n",
Status);
2720 WARN(
"trying to rename file with open children\n");
2731 TRACE(
"SeAccessCheck failed, returning %08lx\n",
Status);
2738 oldfileref->delete_on_close =
true;
2739 oldfileref->posix_delete =
true;
2744 ERR(
"delete_fileref returned %08lx\n",
Status);
2752 ERR(
"move_across_subvols returned %08lx\n",
Status);
2760 ULONG reqlen, oldutf8len;
2766 ERR(
"fileref_get_filename returned %08lx\n",
Status);
2772 ERR(
"out of memory\n");
2781 ERR(
"fileref_get_filename returned %08lx\n",
Status);
2791 ERR(
"out of memory\n");
2813 ERR(
"out of memory\n");
2825 ERR(
"out of memory\n");
2837 ERR(
"RtlUpcaseUnicodeString returned %08lx\n",
Status);
2857 ERR(
"fileref_get_filename returned %08lx\n",
Status);
2864 ERR(
"out of memory\n");
2874 ERR(
"fileref_get_filename returned %08lx\n",
Status);
2896 related->fcb->inode_item.transid =
Vcb->superblock.generation;
2897 TRACE(
"related->fcb->inode_item.st_size (inode %I64x) was %I64x\n", related->fcb->inode, related->fcb->inode_item.st_size);
2898 related->fcb->inode_item.st_size = related->fcb->inode_item.st_size + (2 *
utf8.Length) - (2* oldutf8len);
2899 TRACE(
"related->fcb->inode_item.st_size (inode %I64x) now %I64x\n", related->fcb->inode, related->fcb->inode_item.st_size);
2900 related->fcb->inode_item.sequence++;
2901 related->fcb->inode_item.st_ctime =
now;
2902 related->fcb->inode_item.st_mtime =
now;
2904 related->fcb->inode_item_changed =
true;
2933 fr2->deleted =
true;
2938 if (!fr2->oldutf8.Buffer) {
2940 if (!fr2->oldutf8.Buffer) {
2941 ERR(
"out of memory\n");
2952 fr2->fcb->fileref = fr2;
2987 ERR(
"out of memory\n");
2997 ERR(
"out of memory\n");
3007 ERR(
"RtlUpcaseUnicodeString returned %08lx\n",
Status);
3018 if (
IsListEmpty(&related->fcb->dir_children_index))
3040 ERR(
"out of memory\n");
3045 hl->
parent = related->fcb->inode;
3052 ERR(
"out of memory\n");
3064 ERR(
"out of memory\n");
3082 if (hl->
parent == fr2->parent->fcb->inode && hl->
index == fr2->oldindex) {
3116 related->fcb->inode_item.transid =
Vcb->superblock.generation;
3117 TRACE(
"related->fcb->inode_item.st_size (inode %I64x) was %I64x\n", related->fcb->inode, related->fcb->inode_item.st_size);
3118 related->fcb->inode_item.st_size += 2 * utf8len;
3119 TRACE(
"related->fcb->inode_item.st_size (inode %I64x) now %I64x\n", related->fcb->inode, related->fcb->inode_item.st_size);
3120 related->fcb->inode_item.sequence++;
3121 related->fcb->inode_item.st_ctime =
now;
3122 related->fcb->inode_item.st_mtime =
now;
3124 related->fcb->inode_item_changed =
true;
3129 fr2->parent->fcb->inode_item.transid =
Vcb->superblock.generation;
3130 TRACE(
"fr2->parent->fcb->inode_item.st_size (inode %I64x) was %I64x\n", fr2->parent->fcb->inode, fr2->parent->fcb->inode_item.st_size);
3131 fr2->parent->fcb->inode_item.st_size -= 2 * origutf8len;
3132 TRACE(
"fr2->parent->fcb->inode_item.st_size (inode %I64x) now %I64x\n", fr2->parent->fcb->inode, fr2->parent->fcb->inode_item.st_size);
3133 fr2->parent->fcb->inode_item.sequence++;
3134 fr2->parent->fcb->inode_item.st_ctime =
now;
3135 fr2->parent->fcb->inode_item.st_mtime =
now;
3139 fr2->parent->fcb->inode_item_changed =
true;
3177 ERR(
"no fileref for stream\n");
3181 if (end < fcb->adsdata.Length) {
3185 TRACE(
"truncating stream to %x bytes\n",
end);
3189 TRACE(
"extending stream to %x bytes\n",
end);
3199 ERR(
"out of memory\n");
3234 fileref->
parent->fcb->subvol->root_item.ctransid =
Vcb->superblock.generation;
3254 ERR(
"fileref is NULL\n");
3307 TRACE(
"FileObject: AllocationSize = %I64x, FileSize = %I64x, ValidDataLength = %I64x\n",
3316 new_end_of_file =
fcb->
Header.FileSize.QuadPart;
3320 if (new_end_of_file < fcb->inode_item.st_size) {
3326 TRACE(
"truncating file to %I64x bytes\n", new_end_of_file);
3335 ERR(
"error - truncate_file failed\n");
3339 TRACE(
"extending file to %I64x bytes\n", new_end_of_file);
3343 ERR(
"error - extend_file failed\n");
3386 ERR(
"CcSetFileSizes threw exception %08lx\n",
Status);
3412 ULONG fnlen, utf8len;
3445 ERR(
"no fileref set and no directory given\n");
3454 tfofcb = tfo->FsContext;
3457 while (fnlen > 0 && (fli->
FileName[fnlen - 1] ==
'/' || fli->
FileName[fnlen - 1] ==
'\\')) {
3464 for (
i = fnlen - 1;
i >= 0;
i--) {
3478 WARN(
"tried to create hard link on directory\n");
3484 WARN(
"tried to create hard link on stream\n");
3510 ERR(
"out of memory\n");
3519 if (tfo && tfo->FsContext2) {
3520 struct _ccb* relatedccb = tfo->FsContext2;
3522 related = relatedccb->
fileref;
3529 if (!oldfileref->deleted) {
3530 WARN(
"destination file already exists\n");
3535 }
else if (
fileref == oldfileref) {
3539 WARN(
"trying to overwrite open file\n");
3543 WARN(
"trying to overwrite readonly file\n");
3547 WARN(
"trying to overwrite directory\n");
3561 ERR(
"open_fileref returned %08lx\n",
Status);
3571 TRACE(
"SeAccessCheck failed, returning %08lx\n",
Status);
3578 WARN(
"can't create hard link over subvolume boundary\n");
3589 TRACE(
"SeAccessCheck failed, returning %08lx\n",
Status);
3596 oldfileref->delete_on_close =
true;
3597 oldfileref->posix_delete =
true;
3602 ERR(
"delete_fileref returned %08lx\n",
Status);
3612 fr2->created =
true;
3613 fr2->parent = related;
3617 WARN(
"add_dir_child returned %08lx\n",
Status);
3630 ERR(
"out of memory\n");
3642 ERR(
"out of memory\n");
3654 ERR(
"out of memory\n");
3668 ERR(
"out of memory\n");
3673 hl->
parent = related->fcb->inode;
3680 ERR(
"out of memory\n");
3692 ERR(
"out of memory\n");
3724 parfcb->inode_item.transid =
Vcb->superblock.generation;
3725 TRACE(
"parfcb->inode_item.st_size (inode %I64x) was %I64x\n", parfcb->inode, parfcb->inode_item.st_size);
3726 parfcb->inode_item.st_size += 2 * utf8len;
3727 TRACE(
"parfcb->inode_item.st_size (inode %I64x) now %I64x\n", parfcb->inode, parfcb->inode_item.st_size);
3728 parfcb->inode_item.sequence++;
3729 parfcb->inode_item.st_ctime =
now;
3731 parfcb->inode_item_changed =
true;
3779 ERR(
"fileref is NULL\n");
3845 ERR(
"CcSetFileSizes threw exception %08lx\n",
Status);
3874 WARN(
"cannot set case-sensitive flag on anything other than directory\n");
3903 Irp->IoStatus.Information = 0;
3947 TRACE(
"set information\n");
3954 TRACE(
"FileAllocationInformation\n");
3957 WARN(
"insufficient privileges\n");
3968 TRACE(
"FileBasicInformation\n");
3971 WARN(
"insufficient privileges\n");
3983 TRACE(
"FileDispositionInformation\n");
3986 WARN(
"insufficient privileges\n");
3998 TRACE(
"FileEndOfFileInformation\n");
4001 WARN(
"insufficient privileges\n");
4012 TRACE(
"FileLinkInformation\n");
4017 TRACE(
"FilePositionInformation\n");
4022 TRACE(
"FileRenameInformation\n");
4028 TRACE(
"FileValidDataLengthInformation\n");
4031 WARN(
"insufficient privileges\n");
4043#pragma GCC diagnostic push
4044#pragma GCC diagnostic ignored "-Wswitch"
4048 TRACE(
"FileDispositionInformationEx\n");
4051 WARN(
"insufficient privileges\n");
4062 TRACE(
"FileRenameInformationEx\n");
4067 TRACE(
"FileLinkInformationEx\n");
4072 TRACE(
"FileCaseSensitiveInformation\n");
4075 WARN(
"insufficient privileges\n");
4084 WARN(
"unimplemented FileInformationClass FileStorageReserveIdInformation\n");
4088#pragma GCC diagnostic pop
4130 ERR(
"no fileref for stream\n");
4154 ERR(
"no fileref for stream\n");
4193 ERR(
"no fileref for stream\n");
4250 bool overflow =
false;
4255 if (
fn->MaximumLength >=
sizeof(
WCHAR)) {
4256 fn->Buffer[0] =
'\\';
4265 *preqlen =
sizeof(
WCHAR);
4289 movelen =
fn->Length;
4291 if ((!overflow ||
fn->MaximumLength > fr->
dc->
name.
Length +
sizeof(
WCHAR)) && movelen > 0) {
4296 if (
fn->MaximumLength >=
sizeof(
WCHAR)) {
4297 fn->Buffer[0] = fr->
fcb->
ads ?
':' :
'\\';
4300 if (
fn->MaximumLength >
sizeof(
WCHAR)) {
4305 if (
fn->Length >
fn->MaximumLength) {
4306 fn->Length =
fn->MaximumLength;
4336 static const WCHAR datasuf[] = {
':',
'$',
'D',
'A',
'T',
'A',0};
4340 ERR(
"called without fileref\n");
4357 ERR(
"fileref_get_filename returned %08lx\n",
Status);
4363 reqlen += datasuflen;
4365 if (
fn.Length + datasuflen >
fn.MaximumLength) {
4367 reqlen += datasuflen;
4371 fn.Length += datasuflen;
4379 TRACE(
"%.*S (truncated)\n", (
int)(
fn.Length /
sizeof(
WCHAR)),
fn.Buffer);
4394 ERR(
"no fileref for stream\n");
4416 static const WCHAR datasuf[] =
L":$DATA";
4420 ERR(
"fileref was NULL\n");
4438 if (
dc->index == 0) {
4447 TRACE(
"length = %li, reqsize = %lu\n", *
length, reqsize);
4460 entry->NextEntryOffset = 0;
4465 entry->StreamName[0] =
':';
4478 if (
dc->index == 0) {
4481 entry->NextEntryOffset = 0;
4485 entry->StreamSize.QuadPart =
dc->fileref->fcb->adsdata.Length;
4487 entry->StreamSize.QuadPart =
dc->size;
4489 entry->StreamAllocationSize.QuadPart =
entry->StreamSize.QuadPart;
4491 entry->StreamName[0] =
':';
4521 TRACE(
"FileStandardLinkInformation\n");
4540 bool overflow =
false;
4568 if (bytes_needed > *
length)
4577 if (
fcb ==
fcb->
Vcb->root_fileref->fcb) {
4601 if (bytes_needed > *
length)
4627 ERR(
"open_fileref_by_inode returned %08lx\n",
Status);
4630 bool found =
false, deleted =
false;
4654 TRACE(
"fn = %.*S (found = %u)\n", (
int)(
fn->Length /
sizeof(
WCHAR)),
fn->Buffer, found);
4661 if (bytes_needed > *
length)
4709 bool overflow =
false;
4737 if (bytes_needed > *
length)
4741 flefii = &flfii->
Entry;
4745 if (
fcb ==
fcb->
Vcb->root_fileref->fcb) {
4767 if (bytes_needed > *
length)
4771 flefii = &flfii->
Entry;
4796 ERR(
"open_fileref_by_inode returned %08lx\n",
Status);
4799 bool found =
false, deleted =
false;
4823 TRACE(
"fn = %.*S (found = %u)\n", (
int)(
fn->Length /
sizeof(
WCHAR)),
fn->Buffer, found);
4830 if (bytes_needed > *
length)
4838 flefii = &flfii->
Entry;
5053 if (
fcb ==
Vcb->volume_fcb)
5057 ERR(
"ccb is NULL\n");
5067 TRACE(
"FileAllInformation\n");
5070 WARN(
"insufficient privileges\n");
5077 ERR(
"no fileref for stream\n");
5121 TRACE(
"FileAttributeTagInformation\n");
5124 WARN(
"insufficient privileges\n");
5141 TRACE(
"FileBasicInformation\n");
5144 WARN(
"insufficient privileges\n");
5157 ERR(
"no fileref for stream\n");
5174 TRACE(
"FileCompressionInformation\n");
5184 TRACE(
"FileEaInformation\n");
5195 TRACE(
"FileInternalInformation\n");
5206 TRACE(
"FileNameInformation\n");
5217 TRACE(
"FileNetworkOpenInformation\n");
5220 WARN(
"insufficient privileges\n");
5234 TRACE(
"FilePositionInformation\n");
5245 TRACE(
"FileStandardInformation\n");
5262 TRACE(
"FileStreamInformation\n");
5269#if (NTDDI_VERSION >= NTDDI_VISTA)
5274 TRACE(
"FileHardLinkInformation\n");
5287 TRACE(
"FileNormalizedNameInformation\n");
5298 TRACE(
"FileStandardLinkInformation\n");
5306 TRACE(
"FileRemoteProtocolInformation\n");
5311#pragma GCC diagnostic push
5312#pragma GCC diagnostic ignored "-Wswitch"
5324 TRACE(
"FileIdInformation\n");
5341 TRACE(
"FileStatInformation\n");
5358 TRACE(
"FileStatLxInformation\n");
5375 TRACE(
"FileCaseSensitiveInformation\n");
5386 TRACE(
"FileHardLinkFullIdInformation\n");
5395#pragma GCC diagnostic pop
5439 Irp->IoStatus.Information = 0;
5441 TRACE(
"query information\n");
5495 ERR(
"could not get output buffer\n");
5501 ERR(
"no file object\n");
5528 WARN(
"insufficient privileges\n");
5553 s.Length =
s.MaximumLength =
in->EaNameLength;
5554 s.Buffer =
in->EaName;
5558 if (
in->NextEntryOffset == 0)
5578 if (
in->NextEntryOffset == 0)
5601 out->NextEntryOffset = 0;
5602 out->Flags = ea->Flags;
5603 out->EaNameLength = ea->EaNameLength;
5604 out->EaValueLength = ea->EaValueLength;
5605 RtlCopyMemory(
out->EaName, ea->EaName, ea->EaNameLength + ea->EaValueLength + 1);
5613 if (ea->NextEntryOffset == 0)
5667 out->NextEntryOffset = 0;
5738 if (
Vcb->readonly) {
5745 ERR(
"could not get output buffer\n");
5752 ERR(
"IoCheckEaBufferValidity returned %08lx (error at offset %lu)\n",
Status,
offset);
5757 ERR(
"no file object\n");
5784 WARN(
"insufficient privileges\n");
5805 ERR(
"out of memory\n");
5839 while (le != &ealist) {
5842 if (
item->name.Length ==
s.Length &&
5857 ERR(
"out of memory\n");
5881 while (le != &ealist) {
5886 if (
item->value.Length == 0) {
5896 while (le != &ealist) {
5903 ERR(
"uid value was shorter than expected\n");
5918 ERR(
"gid value was shorter than expected\n");
5930 ERR(
"mode value was shorter than expected\n");
5965 while (le != &ealist) {
5978 ERR(
"out of memory\n");
5992 while (le != &ealist) {
6056 Irp->IoStatus.Information = 0;
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
BOOLEAN NTAPI SeAccessCheck(_In_ PSECURITY_DESCRIPTOR SecurityDescriptor, _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, _In_ BOOLEAN SubjectContextLocked, _In_ ACCESS_MASK DesiredAccess, _In_ ACCESS_MASK PreviouslyGrantedAccess, _Out_ PPRIVILEGE_SET *Privileges, _In_ PGENERIC_MAPPING GenericMapping, _In_ KPROCESSOR_MODE AccessMode, _Out_ PACCESS_MASK GrantedAccess, _Out_ PNTSTATUS AccessStatus)
Determines whether security access rights can be given to an object depending on the security descrip...
unsigned short int uint16_t
static struct @1597 move_list[MOVE_LIST_SIZE]
#define InterlockedIncrement
static void set_size(float size)
#define FILE_CS_FLAG_CASE_SENSITIVE_DIR
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 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
#define _Dispatch_type_(a)
static const char lxgid[]
#define IO_REPARSE_TAG_AF_UNIX
uint32_t sid_to_uid(PSID sid)
static __inline void win_time_to_unix(LARGE_INTEGER t, BTRFS_TIME *out)
uint32_t inherit_mode(fcb *parfcb, bool is_dir)
_In_ fcb _In_ chunk _In_ uint64_t _In_ uint64_t _In_ bool prealloc
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
ULONG get_reparse_tag_fcb(fcb *fcb)
NTSTATUS open_fileref_child(_Requires_lock_held_(_Curr_->tree_lock) _Requires_exclusive_lock_held_(_Curr_->fcb_lock) _In_ device_extension *Vcb, _In_ file_ref *sf, _In_ PUNICODE_STRING name, _In_ bool case_sensitive, _In_ bool lastpart, _In_ bool streampart, _In_ POOL_TYPE pooltype, _Out_ file_ref **psf2, _In_opt_ PIRP Irp)
static __inline uint64_t make_file_id(root *r, uint64_t inode)
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)
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)))
NTSTATUS NTSTATUS NTSTATUS NTSTATUS extend_file(fcb *fcb, file_ref *fileref, uint64_t end, bool prealloc, PIRP Irp, LIST_ENTRY *rollback) __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 NTSTATUS NTSTATUS truncate_file(fcb *fcb, uint64_t end, PIRP Irp, LIST_ENTRY *rollback) __attribute__((nonnull(1
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)
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
static const char lxmod[]
static const char lxuid[]
#define IO_REPARSE_TAG_LX_CHR
#define IO_REPARSE_TAG_LX_BLK
NTSTATUS NTSTATUS void clear_rollback(LIST_ENTRY *rollback) __attribute__((nonnull(1)))
#define IO_REPARSE_TAG_LX_FIFO
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)
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)
static __inline void * map_user_buffer(PIRP Irp, ULONG priority)
static __inline uint64_t fcb_alloc_size(fcb *fcb)
static __inline bool is_subvol_readonly(root *r, PIRP Irp)
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, OUT OPTIONAL PIO_STATUS_BLOCK IoStatus)
#define _Requires_exclusive_lock_held_(lock)
#define STATUS_NOT_IMPLEMENTED
#define NT_SUCCESS(StatCode)
static string utf16_to_utf8(const wstring_view &utf16)
#define FILE_ATTRIBUTE_NORMAL
#define crc32(crc, buf, len)
static const WCHAR *const ext[]
void mark_fcb_dirty(_In_ fcb *fcb)
NTSTATUS delete_fileref(_In_ file_ref *fileref, _In_opt_ PFILE_OBJECT FileObject, _In_ bool make_orphan, _In_opt_ PIRP Irp, _In_ LIST_ENTRY *rollback)
void free_fileref(_Inout_ file_ref *fr)
void reap_fileref(device_extension *Vcb, file_ref *fr)
void free_fcb(_Inout_ fcb *fcb)
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 is_top_level(_In_ PIRP Irp)
void queue_notification_fcb(_In_ file_ref *fileref, _In_ ULONG filter_match, _In_ ULONG action, _In_opt_ PUNICODE_STRING stream)
NTSTATUS check_file_name_valid(_In_ PUNICODE_STRING us, _In_ bool posix, _In_ bool stream)
void send_notification_fileref(_In_ file_ref *fileref, _In_ ULONG filter_match, _In_ ULONG action, _In_opt_ PUNICODE_STRING stream)
#define EXTENT_TYPE_PREALLOC
#define BTRFS_SUBVOL_READONLY
#define BTRFS_ENCODING_NONE
#define EXTENT_TYPE_INLINE
#define EXTENT_TYPE_REGULAR
#define BTRFS_COMPRESSION_NONE
#define BTRFS_ROOT_FSTREE
#define BTRFS_ENCRYPTION_NONE
struct _FILE_STAT_INFORMATION FILE_STAT_INFORMATION
struct _FILE_STAT_INFORMATION * PFILE_STAT_INFORMATION
#define FileStatInformation
static NTSTATUS duplicate_fcb(fcb *oldfcb, fcb **pfcb)
static NTSTATUS fill_in_hard_link_information(FILE_LINKS_INFORMATION *fli, file_ref *fileref, PIRP Irp, LONG *length)
struct _FILE_ID_INFORMATION FILE_ID_INFORMATION
struct _move_entry move_entry
static NTSTATUS set_link_information(device_extension *Vcb, PIRP Irp, PFILE_OBJECT FileObject, PFILE_OBJECT tfo, bool ex)
#define FILE_RENAME_IGNORE_READONLY_ATTRIBUTE
static NTSTATUS fill_in_file_standard_link_information(FILE_STANDARD_LINK_INFORMATION *fsli, fcb *fcb, file_ref *fileref, LONG *length)
static NTSTATUS fill_in_file_internal_information(FILE_INTERNAL_INFORMATION *fii, fcb *fcb, LONG *length)
#define FILE_DISPOSITION_FORCE_IMAGE_SECTION_CHECK
static NTSTATUS fill_in_file_name_information(FILE_NAME_INFORMATION *fni, fcb *fcb, file_ref *fileref, LONG *length)
#define FILE_LINK_IGNORE_READONLY_ATTRIBUTE
static NTSTATUS fill_in_file_stream_information(FILE_STREAM_INFORMATION *fsi, file_ref *fileref, LONG *length)
static NTSTATUS fill_in_file_basic_information(FILE_BASIC_INFORMATION *fbi, INODE_ITEM *ii, LONG *length, fcb *fcb, file_ref *fileref)
struct _FILE_CASE_SENSITIVE_INFORMATION FILE_CASE_SENSITIVE_INFORMATION
struct _FILE_CASE_SENSITIVE_INFORMATION * PFILE_CASE_SENSITIVE_INFORMATION
static NTSTATUS fill_in_file_id_information(FILE_ID_INFORMATION *fii, fcb *fcb, LONG *length)
struct _FILE_DISPOSITION_INFORMATION_EX * PFILE_DISPOSITION_INFORMATION_EX
static NTSTATUS fill_in_file_compression_information(FILE_COMPRESSION_INFORMATION *fci, LONG *length, fcb *fcb)
#define FileStorageReserveIdInformation
#define FileHardLinkFullIdInformation
#define FileCaseSensitiveInformation
struct _FILE_RENAME_INFORMATION_EX FILE_RENAME_INFORMATION_EX
#define FILE_DISPOSITION_POSIX_SEMANTICS
#define FileIdInformation
static NTSTATUS fill_in_file_attribute_information(FILE_ATTRIBUTE_TAG_INFORMATION *ati, fcb *fcb, ccb *ccb, LONG *length)
static NTSTATUS set_end_of_file_information(device_extension *Vcb, PIRP Irp, PFILE_OBJECT FileObject, bool advance_only, bool prealloc)
static NTSTATUS rename_stream(device_extension *Vcb, file_ref *fileref, ccb *ccb, FILE_RENAME_INFORMATION_EX *fri, ULONG flags, PIRP Irp, LIST_ENTRY *rollback)
static NTSTATUS rename_file_to_stream(device_extension *Vcb, file_ref *fileref, ccb *ccb, FILE_RENAME_INFORMATION_EX *fri, ULONG flags, PIRP Irp, LIST_ENTRY *rollback)
#define LX_FILE_METADATA_HAS_DEVICE_ID
NTSTATUS stream_set_end_of_file_information(device_extension *Vcb, uint16_t end, fcb *fcb, file_ref *fileref, bool advance_only)
#define LX_FILE_METADATA_HAS_UID
struct _FILE_ID_INFORMATION * PFILE_ID_INFORMATION
static NTSTATUS move_across_subvols(file_ref *fileref, ccb *ccb, file_ref *destdir, PANSI_STRING utf8, PUNICODE_STRING fnus, PIRP Irp, LIST_ENTRY *rollback)
#define FileRenameInformationEx
#define FileDispositionInformationEx
#define FILE_DISPOSITION_DELETE
static NTSTATUS set_case_sensitive_information(PIRP Irp)
static NTSTATUS rename_stream_to_file(device_extension *Vcb, file_ref *fileref, ccb *ccb, ULONG flags, PIRP Irp, LIST_ENTRY *rollback)
bool has_open_children(file_ref *fileref)
#define FILE_LINK_POSIX_SEMANTICS
static NTSTATUS fill_in_file_stat_information(FILE_STAT_INFORMATION *fsi, fcb *fcb, ccb *ccb, LONG *length)
static NTSTATUS fill_in_file_ea_information(FILE_EA_INFORMATION *eai, fcb *fcb, LONG *length)
void remove_fcb_from_subvol(_In_ _Requires_exclusive_lock_held_(_Curr_->Vcb->fcb_lock) fcb *fcb)
static NTSTATUS set_rename_information(device_extension *Vcb, PIRP Irp, PFILE_OBJECT FileObject, PFILE_OBJECT tfo, bool ex)
#define FILE_RENAME_POSIX_SEMANTICS
struct _FILE_LINKS_FULL_ID_INFORMATION * PFILE_LINKS_FULL_ID_INFORMATION
static NTSTATUS set_valid_data_length_information(device_extension *Vcb, PIRP Irp, PFILE_OBJECT FileObject)
#define LX_FILE_CASE_SENSITIVE_DIR
#define FILE_RENAME_REPLACE_IF_EXISTS
struct _FILE_LINKS_FULL_ID_INFORMATION FILE_LINKS_FULL_ID_INFORMATION
struct _FILE_LINK_ENTRY_FULL_ID_INFORMATION * PFILE_LINK_ENTRY_FULL_ID_INFORMATION
static NTSTATUS set_disposition_information(device_extension *Vcb, PIRP Irp, PFILE_OBJECT FileObject, bool ex)
static NTSTATUS fill_in_file_network_open_information(FILE_NETWORK_OPEN_INFORMATION *fnoi, fcb *fcb, file_ref *fileref, LONG *length)
struct _FILE_STAT_LX_INFORMATION * PFILE_STAT_LX_INFORMATION
struct _FILE_DISPOSITION_INFORMATION_EX FILE_DISPOSITION_INFORMATION_EX
static NTSTATUS fill_in_file_stat_lx_information(FILE_STAT_LX_INFORMATION *fsli, fcb *fcb, ccb *ccb, LONG *length)
struct _FILE_STAT_LX_INFORMATION FILE_STAT_LX_INFORMATION
#define FileLinkInformationEx
void add_fcb_to_subvol(_In_ _Requires_exclusive_lock_held_(_Curr_->Vcb->fcb_lock) fcb *fcb)
static NTSTATUS fill_in_file_standard_information(FILE_STANDARD_INFORMATION *fsi, fcb *fcb, file_ref *fileref, LONG *length)
static NTSTATUS set_basic_information(device_extension *Vcb, PIRP Irp, PFILE_OBJECT FileObject)
static NTSTATUS create_directory_fcb(device_extension *Vcb, root *r, fcb *parfcb, fcb **pfcb)
NTSTATUS fileref_get_filename(file_ref *fileref, PUNICODE_STRING fn, USHORT *name_offset, ULONG *preqlen)
#define FileStatLxInformation
struct _FILE_RENAME_INFORMATION_EX * PFILE_RENAME_INFORMATION_EX
static NTSTATUS add_children_to_move_list(device_extension *Vcb, move_entry *me, PIRP Irp)
void insert_dir_child_into_hash_lists(fcb *fcb, dir_child *dc)
struct _FILE_LINK_INFORMATION_EX * PFILE_LINK_INFORMATION_EX
struct _FILE_LINK_ENTRY_FULL_ID_INFORMATION FILE_LINK_ENTRY_FULL_ID_INFORMATION
static NTSTATUS fill_in_hard_link_full_id_information(FILE_LINKS_FULL_ID_INFORMATION *flfii, file_ref *fileref, PIRP Irp, LONG *length)
static NTSTATUS fill_in_file_position_information(FILE_POSITION_INFORMATION *fpi, PFILE_OBJECT FileObject, LONG *length)
#define FILE_LINK_REPLACE_IF_EXISTS
static NTSTATUS query_info(device_extension *Vcb, PFILE_OBJECT FileObject, PIRP Irp)
struct _FILE_LINK_INFORMATION_EX FILE_LINK_INFORMATION_EX
void remove_dir_child_from_hash_lists(fcb *fcb, dir_child *dc)
static NTSTATUS fill_in_file_case_sensitive_information(FILE_CASE_SENSITIVE_INFORMATION *fcsi, fcb *fcb, LONG *length)
static NTSTATUS set_position_information(PFILE_OBJECT FileObject, PIRP Irp)
#define LX_FILE_METADATA_HAS_GID
#define LX_FILE_METADATA_HAS_MODE
_In_ PIO_STACK_LOCATION IrpSp
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IsListEmpty(ListHead)
#define RtlCompareMemory(s1, s2, l)
NTSTATUS RtlUpcaseUnicodeString(PUNICODE_STRING dst, PUNICODE_STRING src, BOOLEAN Alloc)
#define KeQuerySystemTime(t)
#define ExAcquireResourceExclusiveLite(res, wait)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
#define ExAcquireResourceSharedLite(res, wait)
@ FilePositionInformation
@ FileEndOfFileInformation
@ FileCompressionInformation
@ FileInternalInformation
@ FileAttributeTagInformation
@ FileNormalizedNameInformation
@ FileValidDataLengthInformation
@ FileAllocationInformation
@ FileNetworkOpenInformation
@ FileDispositionInformation
@ FileHardLinkInformation
struct _FILE_NETWORK_OPEN_INFORMATION FILE_NETWORK_OPEN_INFORMATION
struct _FILE_INTERNAL_INFORMATION FILE_INTERNAL_INFORMATION
#define FsRtlEnterFileSystem
#define FsRtlExitFileSystem
VOID NTAPI CcSetFileSizes(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLenum GLuint GLenum GLsizei const GLchar * buf
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLuint GLsizei GLsizei * length
GLuint GLint GLboolean GLint GLenum access
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
@ FileRemoteProtocolInformation
@ FileStandardLinkInformation
struct _FILE_ATTRIBUTE_TAG_INFORMATION FILE_ATTRIBUTE_TAG_INFORMATION
NTSYSAPI ULONG WINAPI RtlLengthSecurityDescriptor(PSECURITY_DESCRIPTOR)
struct _FILE_MODE_INFORMATION FILE_MODE_INFORMATION
struct _FILE_EA_INFORMATION FILE_EA_INFORMATION
struct _FILE_STREAM_INFORMATION FILE_STREAM_INFORMATION
#define EXCEPTION_EXECUTE_HANDLER
#define memcpy(s1, s2, n)
#define FILE_STANDARD_INFORMATION
#define FILE_BASIC_INFORMATION
static const DWORD padding[]
static PIO_STATUS_BLOCK iosb
DRIVER_DISPATCH(nfs41_FsdDispatch)
#define _Function_class_(n)
#define FILE_ATTRIBUTE_READONLY
#define FILE_READ_ATTRIBUTES
struct _FILE_POSITION_INFORMATION FILE_POSITION_INFORMATION
struct _FILE_ALIGNMENT_INFORMATION FILE_ALIGNMENT_INFORMATION
#define FILE_WRITE_ATTRIBUTES
#define FILE_ATTRIBUTE_DIRECTORY
#define FILE_ADD_SUBDIRECTORY
NTSYSAPI VOID NTAPI RtlUpperString(PSTRING DestinationString, PSTRING SourceString)
#define FILE_ATTRIBUTE_SPARSE_FILE
#define FILE_ATTRIBUTE_REPARSE_POINT
NTSYSAPI NTSTATUS NTAPI RtlGetOwnerSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor, OUT PSID *Owner, OUT PBOOLEAN OwnerDefaulted)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
VOID NTAPI FsRtlNotifyFilterReportChange(IN PNOTIFY_SYNC NotifySync, IN PLIST_ENTRY NotifyList, IN PSTRING FullTargetName, IN USHORT TargetNameOffset, IN PSTRING StreamName OPTIONAL, IN PSTRING NormalizedParentName OPTIONAL, IN ULONG FilterMatch, IN ULONG Action, IN PVOID TargetContext, IN PVOID FilterContext)
VOID NTAPI FsRtlNotifyFullChangeDirectory(IN PNOTIFY_SYNC NotifySync, IN PLIST_ENTRY NotifyList, IN PVOID FsContext, IN PSTRING FullDirectoryName, IN BOOLEAN WatchTree, IN BOOLEAN IgnoreBuffer, IN ULONG CompletionFilter, IN PIRP NotifyIrp, IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL)
PGENERIC_MAPPING NTAPI IoGetFileObjectGenericMapping(VOID)
#define IoCompleteRequest
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
NTSTATUS NTAPI IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define STATUS_INTERNAL_ERROR
#define STATUS_NONEXISTENT_EA_ENTRY
#define STATUS_FILE_CLOSED
#define STATUS_NO_EAS_ON_FILE
#define STATUS_USER_MAPPED_FILE
#define STATUS_NO_MORE_EAS
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)
#define BTRFS_INODE_COMPRESS
#define BTRFS_INODE_NODATASUM
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define IRP_MJ_SET_INFORMATION
#define IRP_MJ_QUERY_INFORMATION
static __inline uint64_t unix_time_to_win(BTRFS_TIME *t)
#define offsetof(TYPE, MEMBER)
BOOLEAN NTAPI MmCanFileBeTruncated(_In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, _In_opt_ PLARGE_INTEGER NewFileSize)
BOOLEAN NTAPI MmFlushImageSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN MMFLUSH_TYPE FlushType)
#define SUBVOL_ROOT_INODE
struct _FILE_ACCESS_INFORMATION FILE_ACCESS_INFORMATION
#define FileStandardInformation
#define STATUS_CANNOT_DELETE
#define STATUS_DEVICE_NOT_READY
#define BTRFS_TYPE_DIRECTORY
#define BTRFS_TYPE_SOCKET
#define BTRFS_TYPE_SYMLINK
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_BUFFER_OVERFLOW
#define BTRFS_TYPE_CHARDEV
#define BTRFS_TYPE_BLOCKDEV
base of all file and directory entries
LARGE_INTEGER ValidDataLength
LARGE_INTEGER AllocationSize
struct _IO_STACK_LOCATION::@4104::@4119 FileSystemControl
struct _IO_STACK_LOCATION::@4104::@4115 QueryEa
struct _IO_STACK_LOCATION::@4104::@4116 SetEa
union _IO_STACK_LOCATION::@1611 Parameters
struct _IO_STACK_LOCATION::@4104::@4113 QueryFile
struct _IO_STACK_LOCATION::@4104::@4114 SetFile
struct _LIST_ENTRY * Blink
struct _LIST_ENTRY * Flink
bool user_set_change_time
bool user_set_access_time
bool user_set_creation_time
LIST_ENTRY list_entry_all
LIST_ENTRY dir_children_index
struct _file_ref * fileref
LIST_ENTRY dir_children_hash
LIST_ENTRY ** hash_ptrs_uc
struct _device_extension * Vcb
LIST_ENTRY dir_children_hash_uc
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 _move_entry * parent
LIST_ENTRY list_entry_hash_uc
LIST_ENTRY list_entry_hash
struct _file_ref * fileref
LIST_ENTRY list_entry_index
VOID NTAPI SeReleaseSubjectContext(_In_ PSECURITY_SUBJECT_CONTEXT SubjectContext)
Releases both the primary and client tokens of a security subject context.
VOID NTAPI SeCaptureSubjectContext(_Out_ PSECURITY_SUBJECT_CONTEXT SubjectContext)
Captures the security subject context of the calling thread and calling process.
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define RtlMoveMemory(Destination, Source, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_DIRECTORY_NOT_EMPTY
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_FILE_IS_A_DIRECTORY
#define STATUS_MEDIA_WRITE_PROTECTED
#define STATUS_ACCESS_DENIED
#define STATUS_INVALID_PARAMETER
#define STATUS_TOO_MANY_LINKS
#define STATUS_OBJECT_NAME_COLLISION
#define STATUS_INFO_LENGTH_MISMATCH
#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
static GLenum _GLUfuncptr fn
struct _FILE_COMPRESSION_INFORMATION FILE_COMPRESSION_INFORMATION
#define FILE_ACTION_MODIFIED_STREAM
#define FILE_NOTIFY_CHANGE_SIZE
struct _FILE_LINK_ENTRY_INFORMATION FILE_LINK_ENTRY_INFORMATION
#define SL_INDEX_SPECIFIED
#define FILE_ACTION_MODIFIED
#define FILE_ACTION_RENAMED_OLD_NAME
#define FILE_NOTIFY_CHANGE_LAST_ACCESS
#define FILE_NOTIFY_CHANGE_ATTRIBUTES
#define FILE_ACTION_REMOVED
#define SL_RETURN_SINGLE_ENTRY
struct _FILE_STANDARD_LINK_INFORMATION FILE_STANDARD_LINK_INFORMATION
#define FILE_NOTIFY_CHANGE_FILE_NAME
#define FILE_NOTIFY_CHANGE_STREAM_SIZE
#define FILE_ACTION_RENAMED_NEW_NAME
#define FILE_NOTIFY_CHANGE_CREATION
#define FILE_NOTIFY_CHANGE_LAST_WRITE
#define FILE_NOTIFY_CHANGE_EA
#define FILE_ACTION_ADDED
#define FILE_NOTIFY_CHANGE_DIR_NAME