3286 WARN(
"insufficient privileges\n");
3295 ERR(
"ObReferenceObjectByHandle returned %08lx\n",
Status);
3299 if (sourcefo->DeviceObject !=
FileObject->DeviceObject) {
3300 WARN(
"source and destination are on different volumes\n");
3305 sourcefcb = sourcefo->FsContext;
3306 sourceccb = sourcefo->FsContext2;
3308 if (!sourcefcb || !sourceccb || sourcefcb ==
Vcb->volume_fcb) {
3313 if (!sourcefcb->ads && !
fcb->
ads) {
3326 WARN(
"insufficient privileges\n");
3336 sourcelen = sourcefcb->ads ? sourcefcb->adsdata.Length : sourcefcb->inode_item.st_size;
3343 if (
fcb == sourcefcb &&
3346 WARN(
"source and destination are the same, and the ranges overlap\n");
3364 if (
fcb != sourcefcb)
3381 ULONG bytes_read, dataoff, datalen2;
3396 ERR(
"out of memory\n");
3408 ERR(
"read_file returned %08lx\n",
Status);
3414 if (sourcefcb->ads) {
3417 ERR(
"read_stream returned %08lx\n",
Status);
3424 ERR(
"read_file returned %08lx\n",
Status);
3430 if (dataoff + bytes_read < datalen2)
3435 else if (make_inline) {
3441 ERR(
"excise_extents returned %08lx\n",
Status);
3450 ERR(
"out of memory\n");
3467 ERR(
"add_extent_to_fcb returned %08lx\n",
Status);
3478 ERR(
"do_write_file returned %08lx\n",
Status);
3488 le = sourcefcb->extents.
Flink;
3489 while (le != &sourcefcb->extents) {
3511 ERR(
"out of memory\n");
3522 ext2->unique =
false;
3523 ext2->ignore =
false;
3524 ext2->inserted =
true;
3526 ext2->extent_data.generation =
Vcb->superblock.generation;
3527 ext2->extent_data.decoded_size =
ext->extent_data.decoded_size;
3528 ext2->extent_data.compression =
ext->extent_data.compression;
3529 ext2->extent_data.encryption =
ext->extent_data.encryption;
3530 ext2->extent_data.encoding =
ext->extent_data.encoding;
3531 ext2->extent_data.type =
ext->extent_data.type;
3550 ERR(
"out of memory\n");
3561 ERR(
"out of memory\n");
3576 ERR(
"get_chunk_from_address(%I64x) failed\n", ed2s->
address);
3584 ERR(
"update_changed_extent_ref returned %08lx\n",
Status);
3597 ERR(
"excise_extents returned %08lx\n",
Status);
3608 le = sourcefcb->extents.
Flink;
3609 while (le != &sourcefcb->extents) {
3616 le2 = newexts.
Flink;
3617 while (le2 != &newexts) {
3624 ext->unique =
false;
3641 lastextle = &
ext->list_entry;
3674 if (
FileObject->SectionObjectPointer->DataSectionObject)
3687 if (
fcb != sourcefcb)
#define KeQuerySystemTime(t)
struct _file_ref * parent
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
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
BOOLEAN NTAPI CcPurgeCacheSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN UninitializeCacheMaps)
return STATUS_NOT_SUPPORTED
#define STATUS_INSUFFICIENT_RESOURCES
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)
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)
#define BTRFS_COMPRESSION_NONE
#define STATUS_INVALID_PARAMETER
NTSTATUS read_file(fcb *fcb, uint8_t *data, uint64_t start, uint64_t length, ULONG *pbr, PIRP Irp) __attribute__((nonnull(1
#define FILE_NOTIFY_CHANGE_LAST_WRITE
unsigned short int uint16_t
#define InsertTailList(ListHead, Entry)
int const JOCTET unsigned int datalen
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
#define STATUS_BUFFER_TOO_SMALL
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
#define STATUS_INTERNAL_ERROR
#define EXTENT_TYPE_INLINE
void queue_notification_fcb(_In_ file_ref *fileref, _In_ ULONG filter_match, _In_ ULONG action, _In_opt_ PUNICODE_STRING stream)
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)
static __inline bool is_subvol_readonly(root *r, PIRP Irp)
#define FILE_ACTION_MODIFIED
#define PsGetCurrentProcess
#define BTRFS_ENCODING_NONE
#define offsetof(TYPE, MEMBER)
void mark_fcb_dirty(_In_ fcb *fcb)
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
#define STATUS_MEDIA_WRITE_PROTECTED
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
FSRTL_ADVANCED_FCB_HEADER Header
struct _LIST_ENTRY * Flink
LARGE_INTEGER SourceFileOffset
#define BTRFS_ENCRYPTION_NONE
#define NT_SUCCESS(StatCode)
#define BTRFS_INODE_NODATASUM
bool user_set_change_time
#define ObDereferenceObject
NTSTATUS NTSTATUS void clear_rollback(LIST_ENTRY *rollback) __attribute__((nonnull(1)))
#define STATUS_ACCESS_DENIED
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define FILE_READ_ATTRIBUTES
#define ExAllocatePoolWithTag(hernya, size, tag)
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
void do_rollback(device_extension *Vcb, LIST_ENTRY *rollback) __attribute__((nonnull(1
#define EXTENT_TYPE_PREALLOC
POBJECT_TYPE IoFileObjectType
#define EXTENT_TYPE_REGULAR
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
static const WCHAR data2[]
#define InitializeListHead(ListHead)
_In_ fcb _In_ chunk _In_ uint64_t _In_ uint64_t _In_ bool _In_opt_ void _In_opt_ PIRP _In_ LIST_ENTRY * rollback
bool fcb_is_inline(fcb *fcb)
LARGE_INTEGER TargetFileOffset
HRESULT read_stream(BSCallback *, IStream *, void *, DWORD, DWORD *) DECLSPEC_HIDDEN
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
#define STATUS_FILE_LOCK_CONFLICT
NTSTATUS bool void NTSTATUS void add_extent(_In_ fcb *fcb, _In_ LIST_ENTRY *prevextle, _In_ __drv_aliasesMem extent *newext) __attribute__((nonnull(1
static __inline void win_time_to_unix(LARGE_INTEGER t, BTRFS_TIME *out)
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
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)
NTSTATUS NTSTATUS NTSTATUS NTSTATUS NTSTATUS chunk * get_chunk_from_address(device_extension *Vcb, uint64_t address) __attribute__((nonnull(1)))
#define BTRFS_TYPE_SYMLINK