24 #define FileIdExtdDirectoryInformation (enum _FILE_INFORMATION_CLASS)60 25 #define FileIdExtdBothDirectoryInformation (enum _FILE_INFORMATION_CLASS)63 65 #define FileIdExtdDirectoryInformation (enum _FILE_INFORMATION_CLASS)60 66 #define FileIdExtdBothDirectoryInformation (enum _FILE_INFORMATION_CLASS)63 99 ERR(
"read_file returned %08lx\n",
Status);
133 ERR(
"open_fcb returned %08lx\n",
Status);
159 WARN(
"IoCheckEaBufferValidity returned %08lx (error at offset %lu)\n",
Status,
offset);
201 le =
fcb->
Vcb->roots.Flink;
202 while (le != &
fcb->
Vcb->roots) {
228 ii =
fcb->
Vcb->dummy_fcb->inode_item;
230 ealen =
fcb->
Vcb->dummy_fcb->ealen;
251 searchkey.
offset = 0xffffffffffffffff;
255 ERR(
"error - find_item returned %08lx\n",
Status);
260 ERR(
"could not find inode item for inode %I64x in root %I64x\n",
inode,
r->id);
305 if (fileref && fileref->
parent) {
306 ii = fileref->
parent->fcb->inode_item;
307 r = fileref->
parent->fcb->subvol;
310 ealen = fileref->
parent->fcb->ealen;
327 TRACE(
"FileBothDirectoryInformation\n");
332 TRACE(
"buffer overflow - %li > %lu\n", needed, *
len);
367 TRACE(
"FileDirectoryInformation\n");
372 TRACE(
"buffer overflow - %li > %lu\n", needed, *
len);
405 TRACE(
"FileFullDirectoryInformation\n");
410 TRACE(
"buffer overflow - %li > %lu\n", needed, *
len);
444 TRACE(
"FileIdBothDirectoryInformation\n");
449 TRACE(
"buffer overflow - %li > %lu\n", needed, *
len);
485 TRACE(
"FileIdFullDirectoryInformation\n");
490 TRACE(
"buffer overflow - %li > %lu\n", needed, *
len);
522 #pragma GCC diagnostic push 523 #pragma GCC diagnostic ignored "-Wswitch" 525 #if (NTDDI_VERSION >= NTDDI_VISTA) 530 TRACE(
"FileIdExtdDirectoryInformation\n");
535 TRACE(
"buffer overflow - %li > %lu\n", needed, *
len);
573 TRACE(
"FileIdExtdBothDirectoryInformation\n");
578 TRACE(
"buffer overflow - %li > %lu\n", needed, *
len);
616 #pragma GCC diagnostic pop 623 TRACE(
"FileNamesInformation\n");
628 TRACE(
"buffer overflow - %li > %lu\n", needed, *
len);
644 FIXME(
"STUB: FileObjectIdInformation\n");
648 FIXME(
"STUB: FileQuotaInformation\n");
652 FIXME(
"STUB: FileReparsePointInformation\n");
656 WARN(
"Unknown FileInformationClass %u\n",
IrpSp->
Parameters.QueryDirectory.FileInformationClass);
692 }
else if (*
offset == 1) {
753 bool has_wildcard =
false, specific_file =
false, initial;
758 TRACE(
"query directory\n");
769 ERR(
"ccb was NULL\n");
774 ERR(
"fcb was NULL\n");
779 WARN(
"insufficient privileges\n");
786 ERR(
"Vcb was NULL\n");
790 if (fileref->
fcb ==
Vcb->dummy_fcb)
794 TRACE(
"QD flags: (none)\n");
798 TRACE(
"QD flags:\n");
801 TRACE(
" SL_INDEX_SPECIFIED\n");
806 TRACE(
" SL_RESTART_SCAN\n");
811 TRACE(
" SL_RETURN_SINGLE_ENTRY\n");
837 specific_file =
true;
841 specific_file =
false;
853 ERR(
"out of memory\n");
897 if (
Irp->MdlAddress && !
buf) {
898 ERR(
"MmGetSystemAddressForMdlSafe returned NULL\n");
917 ERR(
"RtlUpcaseUnicodeString returned %08lx\n",
Status);
984 }
else if (has_wildcard) {
1012 #pragma GCC diagnostic push 1013 #pragma GCC diagnostic ignored "-Wswitch" 1025 #pragma GCC diagnostic pop 1033 WARN(
"unhandled file information class %u\n",
IrpSp->
Parameters.QueryDirectory.FileInformationClass);
1053 *lastoffset = (
ULONG)(curitem - lastitem);
1092 TRACE(
"IRP_MN_NOTIFY_CHANGE_DIRECTORY\n");
1095 ERR(
"ccb was NULL\n");
1100 ERR(
"no fileref\n");
1105 WARN(
"insufficient privileges\n");
1130 ERR(
"out of memory\n");
1139 ERR(
"fileref_get_filename returned %08lx\n",
Status);
1143 ERR(
"fileref_get_filename returned %08lx\n",
Status);
1172 TRACE(
"directory control\n");
1186 Irp->IoStatus.Information = 0;
#define KeQuerySystemTime(t)
struct _file_ref * parent
#define IRP_MN_NOTIFY_CHANGE_DIRECTORY
struct _file_ref * fileref
#define STATUS_INSUFFICIENT_RESOURCES
NTSTATUS RtlUpcaseUnicodeString(PUNICODE_STRING dst, PUNICODE_STRING src, BOOLEAN Alloc)
#define FsRtlEnterFileSystem
#define FILE_ATTRIBUTE_SPARSE_FILE
#define BTRFS_TYPE_SOCKET
#define SL_INDEX_SPECIFIED
void free_fcb(_Inout_ fcb *fcb)
struct _FILE_ID_EXTD_DIR_INFORMATION FILE_ID_EXTD_DIR_INFORMATION
#define FsRtlExitFileSystem
NTSTATUS fileref_get_filename(file_ref *fileref, PUNICODE_STRING fn, USHORT *name_offset, ULONG *preqlen)
#define IO_REPARSE_TAG_LX_FIFO
#define STATUS_INVALID_PARAMETER
#define BTRFS_TYPE_BLOCKDEV
GLdouble GLdouble GLdouble r
#define SUBVOL_ROOT_INODE
GLuint GLuint GLsizei count
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)
struct _FILE_ID_EXTD_BOTH_DIR_INFORMATION * PFILE_ID_EXTD_BOTH_DIR_INFORMATION
static NTSTATUS query_dir_item(fcb *fcb, ccb *ccb, void *buf, LONG *len, PIRP Irp, dir_entry *de, root *r)
ANSI_STRING reparse_xattr
#define IRP_MN_QUERY_DIRECTORY
enum DirEntryType dir_entry_type
static NTSTATUS query_directory(PIRP Irp)
unsigned short int uint16_t
NTSTATUS read_file(fcb *fcb, uint8_t *data, uint64_t start, uint64_t length, ULONG *pbr, PIRP Irp)
#define BTRFS_TYPE_CHARDEV
#define FileIdExtdDirectoryInformation
bool is_top_level(_In_ PIRP Irp)
BOOLEAN NTAPI FsRtlDoesNameContainWildCards(IN PUNICODE_STRING Name)
BOOLEAN NTAPI FsRtlIsNameInExpression(IN PUNICODE_STRING Expression, IN PUNICODE_STRING Name, IN BOOLEAN IgnoreCase, IN PWCHAR UpcaseTable OPTIONAL)
UNICODE_STRING query_string
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
struct _FILE_FULL_DIRECTORY_INFORMATION FILE_FULL_DIR_INFORMATION
#define STATUS_INTERNAL_ERROR
GLenum GLuint GLenum GLsizei const GLchar * buf
static __inline uint64_t make_file_id(root *r, uint64_t inode)
_In_ PDEVICE_OBJECT DeviceObject
return STATUS_NOT_IMPLEMENTED
#define IO_DISK_INCREMENT
GLenum GLuint GLenum GLsizei length
#define BTRFS_TYPE_DIRECTORY
ULONG get_reparse_tag_fcb(fcb *fcb)
LIST_ENTRY ** hash_ptrs_uc
#define offsetof(TYPE, MEMBER)
NTSTATUS NTAPI IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define IoCompleteRequest
#define FileIdExtdBothDirectoryInformation
_Dispatch_type_(IRP_MJ_DIRECTORY_CONTROL)
struct _FILE_BOTH_DIR_INFORMATION FILE_BOTH_DIR_INFORMATION
#define IRP_MJ_DIRECTORY_CONTROL
#define FILE_ATTRIBUTE_REPARSE_POINT
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)
static __inline uint64_t unix_time_to_win(BTRFS_TIME *t)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
FSRTL_ADVANCED_FCB_HEADER Header
static LONG find_item(PropertyBag *This, LPCOLESTR name)
struct _LIST_ENTRY * Flink
LIST_ENTRY dir_children_hash_uc
#define FILE_LIST_DIRECTORY
LIST_ENTRY dir_children_index
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)
#define NT_SUCCESS(StatCode)
#define STATUS_NO_MORE_FILES
static __inline void * map_user_buffer(PIRP Irp, ULONG priority)
#define IO_REPARSE_TAG_LX_BLK
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
LIST_ENTRY list_entry_index
#define STATUS_ACCESS_DENIED
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
static NTSTATUS next_dir_entry(file_ref *fileref, uint64_t *offset, dir_entry *de, dir_child **pdc)
#define ExAllocatePoolWithTag(hernya, size, tag)
struct _FILE_DIRECTORY_INFORMATION FILE_DIRECTORY_INFORMATION
ULONG get_reparse_tag(device_extension *Vcb, root *subvol, uint64_t inode, uint8_t type, ULONG atts, bool lxss, PIRP Irp)
struct _FILE_NAMES_INFORMATION FILE_NAMES_INFORMATION
#define FILE_ATTRIBUTE_NORMAL
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
static ULONG get_ea_len(device_extension *Vcb, root *subvol, uint64_t inode, PIRP Irp)
#define _Function_class_(n)
DRIVER_DISPATCH(nfs41_FsdDispatch)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
#define SL_RETURN_SINGLE_ENTRY
static unsigned __int64 next
#define STATUS_BUFFER_OVERFLOW
struct _fcb_nonpaged * nonpaged
#define IO_REPARSE_TAG_AF_UNIX
_In_ PIO_STACK_LOCATION IrpSp
#define STATUS_NO_SUCH_FILE
#define IO_REPARSE_TAG_LX_CHR
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
struct _FILE_ID_BOTH_DIR_INFORMATION FILE_ID_BOTH_DIR_INFORMATION
struct _FILE_ID_EXTD_DIR_INFORMATION * PFILE_ID_EXTD_DIR_INFORMATION
static __inline void win_time_to_unix(LARGE_INTEGER t, BTRFS_TIME *out)
struct _FILE_ID_FULL_DIR_INFORMATION FILE_ID_FULL_DIR_INFORMATION
static NTSTATUS notify_change_directory(device_extension *Vcb, PIRP Irp)
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
LIST_ENTRY dir_children_hash
GLuint GLuint GLsizei GLenum type
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
uint64_t query_dir_offset
#define IO_REPARSE_TAG_SYMLINK
struct _device_extension * Vcb
#define RtlCompareMemory(s1, s2, l)
NTSTATUS vol_directory_control(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
_In_ uint16_t _Out_ ULONG * atts
#define BTRFS_TYPE_SYMLINK
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
struct _FILE_ID_EXTD_BOTH_DIR_INFORMATION FILE_ID_EXTD_BOTH_DIR_INFORMATION
VOID NTAPI FsRtlNotifyFilterChangeDirectory(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, IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL)