39 UNICODE_STRING path, ignoreus, compressus, compressforceus, compresstypeus, readonlyus, zliblevelus, flushintervalus,
40 maxinlineus, subvolidus, skipbalanceus, nobarrierus, notrimus, clearcacheus, allowdegradedus, zstdlevelus,
67 ERR(
"out of memory\n");
74 path.Buffer[
i] =
'\\';
77 for (
j = 0;
j < 16;
j++) {
83 if (
j == 3 ||
j == 5 ||
j == 7 ||
j == 9) {
92 ERR(
"out of memory\n");
104 ERR(
"ZwOpenKey returned %08lx\n",
Status);
204 ERR(
"ZwEnumerateValueKey returned %08lx\n",
Status);
218 if (
options->flush_interval == 0)
247 ERR(
"out of memory\n");
254 path.Buffer[
i] =
'\\';
257 for (
j = 0;
j < 16;
j++) {
263 if (
j == 3 ||
j == 5 ||
j == 7 ||
j == 9) {
264 path.Buffer[
i] =
'-';
273 ERR(
"ZwCreateKey returned %08lx\n",
Status);
284 ERR(
"ZwSetValueKey returned %08lx\n",
Status);
305 bool has_options =
false;
313 ERR(
"out of memory\n");
321 ERR(
"ZwOpenKey returned %08lx\n",
Status);
346 ERR(
"ZwEnumerateValueKey returned %08lx\n",
Status);
356 ERR(
"ZwSetValueKey returned %08lx\n",
Status);
362 ERR(
"ZwDeleteKey returned %08lx\n",
Status);
387 ERR(
"out of memory\n");
394 path.Buffer[
i] =
'\\';
397 for (
j = 0;
j < 16;
j++) {
403 if (
j == 3 ||
j == 5 ||
j == 7 ||
j == 9) {
404 path.Buffer[
i] =
'-';
411 ERR(
"registry_mark_volume_unmounted_path returned %08lx\n",
Status);
423 #define is_hex(c) ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) 431 for (
i = 0;
i < 36;
i++) {
432 if (
i == 8 ||
i == 13 ||
i == 18 ||
i == 23) {
457 ERR(
"out of memory\n");
474 ERR(
"out of memory\n");
482 ERR(
"out of memory\n");
492 ERR(
"ZwEnumerateKey returned %08lx\n",
Status);
504 ERR(
"out of memory\n");
514 WARN(
"registry_mark_volume_unmounted_path returned %08lx\n",
Status);
545 static const WCHAR mappings[] =
L"\\Mappings";
556 ERR(
"out of memory\n");
564 us.Length =
us.MaximumLength = regpath->
Length +
sizeof(mappings) -
sizeof(
WCHAR);
571 ERR(
"ZwCreateKey returned %08lx\n",
Status);
584 ERR(
"out of memory\n");
623 static const WCHAR mappings[] =
L"\\GroupMappings";
634 ERR(
"out of memory\n");
642 us.Length =
us.MaximumLength = regpath->
Length +
sizeof(mappings) -
sizeof(
WCHAR);
649 ERR(
"ZwCreateKey returned %08lx\n",
Status);
664 ERR(
"out of memory\n");
688 static const WCHAR builtin_users[] =
L"S-1-5-32-545";
705 ERR(
"ZwSetValueKey returned %08lx\n",
Status);
735 ERR(
"out of memory\n");
748 ERR(
"ZwDeleteValueKey returned %08lx\n",
Status);
753 ERR(
"ZwSetValueKey returned %08lx\n",
Status);
763 ERR(
"ZwSetValueKey returned %08lx\n",
Status);
766 ERR(
"ZwQueryValueKey returned %08lx\n",
Status);
780 static const WCHAR def_log_file[] =
L"\\??\\C:\\btrfs.log";
795 ERR(
"ZwCreateKey returned %08lx\n",
Status);
841 ERR(
"out of memory\n");
854 ERR(
"out of memory\n");
869 ERR(
"ZwDeleteValueKey returned %08lx\n",
Status);
876 ERR(
"ZwQueryValueKey returned %08lx\n",
Status);
903 if (old_log_device.
Buffer)
918 ERR(
"out of memory\n");
931 ERR(
"out of memory\n");
946 ERR(
"ZwDeleteValueKey returned %08lx\n",
Status);
951 ERR(
"ZwQueryValueKey returned %08lx\n",
Status);
957 Status = ZwSetValueKey(
h, &
us, 0,
REG_SZ, (
void*)def_log_file,
sizeof(def_log_file));
960 ERR(
"ZwSetValueKey returned %08lx\n",
Status);
964 ERR(
"ZwQueryValueKey returned %08lx\n",
Status);
973 ERR(
"out of memory\n");
1019 TRACE(
"registry changed\n");
1025 ERR(
"ZwNotifyChangeKey returned %08lx\n",
Status);
1036 ERR(
"ZwNotifyChangeKey returned %08lx\n",
Status);
static void read_group_mappings(PUNICODE_STRING regpath)
static PIO_STATUS_BLOCK iosb
static void read_mappings(PUNICODE_STRING regpath)
struct _KEY_VALUE_BASIC_INFORMATION KEY_VALUE_BASIC_INFORMATION
#define STATUS_INSUFFICIENT_RESOURCES
#define STATUS_NO_MORE_ENTRIES
#define OBJ_CASE_INSENSITIVE
struct _KEY_VALUE_FULL_INFORMATION KEY_VALUE_FULL_INFORMATION
void add_user_mapping(WCHAR *sidstring, ULONG sidstringlength, uint32_t uid)
GLsizei const GLchar ** path
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
struct _KEY_BASIC_INFORMATION KEY_BASIC_INFORMATION
void watch_registry(HANDLE regh)
NTSYSAPI NTSTATUS NTAPI ZwDeleteValueKey(__in IN HANDLE Key, __in IN PUNICODE_STRING ValueName)
uint32_t mount_max_inline
uint32_t mount_clear_cache
uint32_t mount_no_barrier
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
#define BTRFS_COMPRESSION_ZSTD
#define REG_OPENED_EXISTING_KEY
#define InsertTailList(ListHead, Entry)
NTSTATUS registry_mark_volume_mounted(BTRFS_UUID *uuid)
#define OBJ_KERNEL_HANDLE
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
#define STATUS_BUFFER_TOO_SMALL
GLfloat GLfloat GLfloat GLfloat h
static void reset_subkeys(HANDLE h, PUNICODE_STRING reg_path)
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
void read_registry(PUNICODE_STRING regpath, bool refresh)
#define FILE_SYNCHRONOUS_IO_ALERT
static NTSTATUS registry_mark_volume_unmounted_path(PUNICODE_STRING path)
NTSTATUS registry_mark_volume_unmounted(BTRFS_UUID *uuid)
#define FILE_WRITE_THROUGH
#define REG_NOTIFY_CHANGE_LAST_SET
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
#define REG_CREATED_NEW_KEY
uint32_t mount_zlib_level
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)
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
#define REG_OPTION_NON_VOLATILE
struct _LIST_ENTRY * Flink
BOOLEAN NTAPI FsRtlAreNamesEqual(IN PCUNICODE_STRING Name1, IN PCUNICODE_STRING Name2, IN BOOLEAN IgnoreCase, IN PCWCH UpcaseTable OPTIONAL)
#define ExInitializeWorkItem(Item, Routine, Context)
#define NT_SUCCESS(StatCode)
#define ObDereferenceObject
ZSTDLIB_API int ZSTD_maxCLevel(void)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define ExAllocatePoolWithTag(hernya, size, tag)
void add_group_mapping(WCHAR *sidstring, ULONG sidstringlength, uint32_t gid)
static bool is_uuid(ULONG namelen, WCHAR *name)
NTSTATUS registry_load_volume_options(device_extension *Vcb)
#define FILE_ATTRIBUTE_NORMAL
UNICODE_STRING log_device
#define FILE_NON_DIRECTORY_FILE
uint32_t mount_zstd_level
UNICODE_STRING registry_path
uint32_t mount_compress_type
#define STATUS_OBJECT_NAME_NOT_FOUND
#define STATUS_BUFFER_OVERFLOW
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
uint32_t mount_no_root_dir
#define InitializeListHead(ListHead)
_Function_class_(WORKER_THREAD_ROUTINE)
uint32_t mount_skip_balance
static void get_registry_value(HANDLE h, WCHAR *string, ULONG type, void *val, ULONG size)
uint32_t mount_flush_interval
uint32_t mount_allow_degraded
static ACCESS_MASK const OBJECT_ATTRIBUTES ULONG const UNICODE_STRING ULONG PULONG dispos
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define InitializeObjectAttributes(p, n, a, r, s)
#define RtlCopyMemory(Destination, Source, Length)
ROSDATA VSC_LPWSTR key_names[]
static const WCHAR option_mounted[]
GLuint GLuint GLsizei GLenum type
uint32_t mount_compress_force
#define RtlCompareMemory(s1, s2, l)
#define KEY_ENUMERATE_SUB_KEYS