44 SIZE_T PathSize, PathSizeWithNull;
50 if (PathSizeWithNull < PathSize)
83 PWCHAR Separator, FileCopy;
100 wcsncpy(FileCopy, Separator + 1, PathSize /
sizeof(
WCHAR));
122 if ((FileEntry->
DeviceId == DeviceId) &&
128 if ((!(
Flags & 4) || (FileEntry->
Flags & 0x10000)) && ((
Flags & 4) || !(FileEntry->
Flags & 0x10000)))
155 if ((FileEntry->
DeviceId == DeviceId) &&
161 if ((!(
Flags & 4) || (FileEntry->
Flags & 0x10000)) && ((
Flags & 4) || !(FileEntry->
Flags & 0x10000)))
180 DeviceId = FileEntry->DeviceId;
190 Status = FileEntry->Callbacks.Close(FileEntry);
198 #define BL_FILE_PURGE_LIMIT 512 209 (FileEntry->
Flags & 0x10000)) &&
271 ULONG FileId, CheckFlags;
276 DirectoryEntry =
NULL;
371 NextEntry = ListHead->
Flink;
372 while (NextEntry != ListHead)
384 NextEntry = NextEntry->
Flink;
420 FileEntry->Callbacks.Close(FileEntry);
427 FileEntry->FileId = FileId;
431 if (++FileEntry->ReferenceCount == 1)
434 FileEntry->TotalBytesRead = 0;
435 FileEntry->Unknown2 = 0;
450 *NewFileEntry = FileEntry;
525 *FileId = FileEntry->
FileId;
629 if (
Size >= *InputSize)
673 ChangedUnknown =
FALSE;
731 ChangedUnknown =
TRUE;
779 DeviceInfo.BlockDeviceInfo.Unknown = OldUnknown;
929 NetRegisterFunctionTable.Destroy,
930 NetRegisterFunctionTable.Mount,
931 NetRegisterFunctionTable.Purge,
937 NtfsRegisterFunctionTable.Destroy,
938 NtfsRegisterFunctionTable.Mount,
939 NtfsRegisterFunctionTable.Purge,
959 FppRegisterFunctionTable.Destroy,
960 FppRegisterFunctionTable.Mount,
961 FppRegisterFunctionTable.Purge,
969 WimRegisterFunctionTable.Destroy,
970 WimRegisterFunctionTable.Mount,
971 WimRegisterFunctionTable.Purge,
979 UdfsRegisterFunctionTable.Destroy,
980 UdfsRegisterFunctionTable.Mount,
981 UdfsRegisterFunctionTable.Purge,
PBL_FS_MOUNT_CALLBACK MountCallback
NTSTATUS BlFileGetInformation(_In_ ULONG FileId, _In_ PBL_FILE_INFORMATION FileInfo)
NTSTATUS(* PBL_FS_PURGE_CALLBACK)(VOID)
_IRQL_requires_same_ _In_opt_ PVOID Argument1
BOOLEAN(* PBL_TBL_LOOKUP_ROUTINE)(_In_ PVOID Entry, _In_ PVOID Argument1, _In_ PVOID Argument2, _In_ PVOID Argument3, _In_ PVOID Argument4)
NTSTATUS FileTablePurgeEntry(_In_ PVOID Entry)
#define STATUS_INVALID_PARAMETER
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
NTSTATUS BlFileSetInformation(_In_ ULONG FileId, _Out_ PBL_FILE_INFORMATION FileInfo)
NTSTATUS BlFileReadEx(_In_ ULONG FileId, _Out_ PVOID Buffer, _In_ ULONG Size, _Out_ PULONG BytesReturned, _In_ ULONG Flags)
PBL_FILE_GET_INFO GetInfo
static OUT PIO_STATUS_BLOCK OUT PVOID FileInformation
#define BL_DEVICE_ENTRY_WRITE_ACCESS
IN PVOID IN PVOID IN USHORT IN USHORT Size
#define BL_UNKNOWN_ACCESS
PWCHAR FileIoCopyFileName(_In_ PWCHAR FilePath)
#define InsertTailList(ListHead, Entry)
NTSTATUS BlDeviceGetInformation(_In_ ULONG DeviceId, _Out_ PBL_DEVICE_INFORMATION DeviceInformation)
static BOOL Write(PBYTE Address, PBYTE Data, SIZE_T Size)
NTSTATUS BlMmFreeHeap(_In_ PVOID Buffer)
NTSTATUS FatInitialize(VOID)
PBL_FS_PURGE_CALLBACK Purge
PBL_FS_INIT_CALLBACK Init
#define BL_FILE_ENTRY_READ_ACCESS
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_ ULONG _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesReturned
NTSTATUS FatMount(_In_ ULONG DeviceId, _In_ ULONG Unknown, _Out_ PBL_FILE_ENTRY *FileEntry)
PBL_FS_MOUNT_CALLBACK Mount
NTSTATUS(* PBL_FS_DESTROY_CALLBACK)(VOID)
#define BL_FILE_PURGE_LIMIT
BL_FILE_CALLBACKS Callbacks
NTSTATUS EtfsMount(_In_ ULONG DeviceId, _In_ ULONG Unknown, _Out_ PBL_FILE_ENTRY *FileEntry)
NTSTATUS(* PBL_FS_INIT_CALLBACK)(VOID)
#define OBJ_NAME_PATH_SEPARATOR
_In_ PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine
#define BL_FS_REGISTER_AT_HEAD_FLAG
PVOID BlMmAllocateHeap(_In_ SIZE_T Size)
#define BL_DIRECTORY_ACCESS
#define BL_FILE_ENTRY_UNKNOWN_ACCESS
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)
struct _LIST_ENTRY * Flink
#define BL_FILE_WRITE_ACCESS
_Must_inspect_result_ _In_ ULONG Flags
InternalIoctlParams Argument4
PBL_FS_DESTROY_CALLBACK Destroy
#define NT_SUCCESS(StatCode)
_In_ WDFCOLLECTION _In_ ULONG Index
BL_FILE_SYSTEM_REGISTRATION_TABLE FatRegisterFunctionTable
struct _DeviceInfo DeviceInfo
PVOID BlTblFindEntry(_In_ PVOID *Table, _In_ ULONG Count, _Out_ PULONG EntryIndex, _In_ PBL_TBL_LOOKUP_ROUTINE Callback, _In_ PVOID Argument1, _In_ PVOID Argument2, _In_ PVOID Argument3, _In_ PVOID Argument4)
#define STATUS_ACCESS_DENIED
#define STATUS_UNSUCCESSFUL
NTSTATUS BlFileReadAtOffsetEx(_In_ ULONG FileId, _In_ ULONG Size, _In_ ULONGLONG ByteOffset, _In_ PVOID Buffer, _Out_ PULONG BytesReturned, _In_ ULONG Flags)
PBL_FS_INIT_CALLBACK InitCallback
#define BL_FILE_ENTRY_WRITE_ACCESS
PBL_FS_PURGE_CALLBACK PurgeCallback
PBL_FS_DESTROY_CALLBACK DestroyCallback
#define BL_DEVICE_ENTRY_OPENED
static const WCHAR Backslash[]
PBL_FILE_SET_INFO SetInfo
NTSTATUS EtfsInitialize(VOID)
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
#define BL_FILE_READ_ACCESS
NTSTATUS BlFileClose(_In_ ULONG FileId)
LIST_ENTRY RegisteredFileSystems
_In_ PFCB _In_ LONGLONG FileOffset
#define InitializeListHead(ListHead)
#define BL_FILE_ENTRY_OPENED
BOOLEAN FileTableCompareWithSameAttributes(_In_ PVOID Entry, _In_ PVOID Argument1, _In_ PVOID Argument2, _In_ PVOID Argument3, _In_ PVOID Argument4)
NTSTATUS(* PBL_FS_MOUNT_CALLBACK)(_In_ ULONG DeviceId, _In_ ULONG Unknown, _Out_ struct _BL_FILE_ENTRY **FileEntry)
VOID EfiPrintf(_In_ PWCHAR Format,...)
NTSTATUS BlFileOpen(_In_ ULONG DeviceId, _In_ PWCHAR FileName, _In_ ULONG Flags, _Out_ PULONG FileId)
BOOLEAN FileTableCompareWithSubsetAttributes(_In_ PVOID Entry, _In_ PVOID Argument1, _In_ PVOID Argument2, _In_ PVOID Argument3, _In_ PVOID Argument4)
NTSTATUS FileIoOpen(_In_ ULONG DeviceId, _In_ PWCHAR FileName, _In_ ULONG Flags, _In_ ULONG Unknown, _In_ PBL_TBL_LOOKUP_ROUTINE CompareRoutine, _Out_opt_ PBL_FILE_ENTRY *NewFileEntry)
NTSTATUS BlTblSetEntry(_Inout_ PVOID **Table, _Inout_ PULONG Count, _In_ PVOID Entry, _Out_ PULONG EntryIndex, _In_ PBL_TBL_SET_ROUTINE Callback)
NTSTATUS FileTableDestroyEntry(_In_ PBL_FILE_ENTRY FileEntry, _In_ ULONG Index)
NTSTATUS FileInformationCheck(_In_ PBL_FILE_INFORMATION FileInformation, _In_ BOOLEAN Write, _In_opt_ PULONG InputSize, _In_opt_ PULONG BytesReturned, _Out_opt_ PULONG RequiredSize)
NTSTATUS BlpFileRegisterFileSystem(_In_ PBL_FS_INIT_CALLBACK InitCallback, _In_ PBL_FS_DESTROY_CALLBACK DestroyCallback, _In_ PBL_FS_MOUNT_CALLBACK MountCallback, _In_ PBL_FS_PURGE_CALLBACK PurgeCallback, _In_ ULONG Flags)
struct _BL_FILE_ENTRY * PBL_FILE_ENTRY
#define RtlZeroMemory(Destination, Length)
NTSTATUS BlDeviceSetInformation(_In_ ULONG DeviceId, _In_ PBL_DEVICE_INFORMATION DeviceInformation)
BL_FILE_SYSTEM_REGISTRATION_TABLE EtfsRegisterFunctionTable
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ ULONG _Out_ PVOID _Out_ PULONG RequiredSize
PWCHAR FileIoCopyParentDirectoryPath(_In_ PWCHAR FilePath)
NTSTATUS BlpFileInitialize(VOID)
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define BL_DEVICE_ENTRY_READ_ACCESS
base of all file and directory entries
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset