replace nob with ms' build, move disk creation to build.bat, major comment cleanup, remove old and stupid tests, overhaul interrupt management with per-CPU vector allocation, affinity migration and safe teardown, add proper IOAPIC routing and PCI MSI/MSI-X/INTx support, migrate drivers to the new interrupt API, integrate ACPICA with a proper OS services layer, move ACPI firmware events, power button handling and S5 shutdown into acpi.sys, add parallel driver startup and atomic publication, replace PnP arrays with dynamic lists, redesign service startup again to be asynchronous, add delayed startup mode for services, allow omitting keys in services.ini, fix acpi ec deferred work handling, fix kernel threads having garbage exit code.

This commit is contained in:
maksw committed 2026-10-28 15:18:43 +01:00
1 parent d36f19509c
commit 36eef8f58d
696 files changed
+147281 -7530

No files matched your search

+1
View File
@@ -0,0 +1 @@
DIRS=ext4 fat ntfs
+3 -5
View File
@@ -1130,7 +1130,8 @@ static void Ext4UnmountPartition(const IO_PARTITION_INFO* partition, IO_PARTITIO
uint32_t count = gExt4MountedCount;
KeReleaseMutex(&gExt4MountMutex);
(void)IoRemoveVolume(ioVolume, IoVolumeBackingRemoved);
(void)IoRemoveVolume(ioVolume, change == IoPartitionSurpriseRemoved
? IoVolumeBackingRemoved : IoVolumeUnmounted);
IoReleaseVolume(ioVolume);
DbgPrint("EXT4: disk=%u lba=%llu %s; unmounted volume=%u; total=%u\n",
partition->DiskIndex, (unsigned long long)partition->StartLba,
@@ -1157,7 +1158,6 @@ static void Ext4PartitionChange(const IO_PARTITION_INFO* partition,
static KSTATUS DriverInitialize(NTL_MODULE* module) {
(void)module;
DbgPrint("EXT4: Init\n");
Ext4ListInit(&gExt4Mounts);
gExt4MountedCount = 0;
@@ -1170,9 +1170,7 @@ static KSTATUS DriverInitialize(NTL_MODULE* module) {
return status;
}
if (!gExt4MountedCount)
DbgPrint("EXT4: no mountable ext partitions found; driver resident for partition changes.\n");
DbgPrint("EXT4: Init complete; mounted %u volume(s).\n", gExt4MountedCount);
DbgPrint("fs: ext4 volumes=%u\n", gExt4MountedCount);
return NTLSTATUS_SUCCESS;
}
+1
View File
@@ -0,0 +1 @@
!include $(BASEDIR)\makefile.def
+11
View File
@@ -0,0 +1,11 @@
TARGETNAME=ext4
TARGETPATH=obj
TARGETTYPE=DRIVER
FLAVOR=EXT4
TARGETLIBS="$(BASEDIR)\bin\kernel.lib" "$(BASEDIR)\bin\libc.lib"
EXTRA_LFLAGS=/NOENTRY
INCLUDES=$(BASEDIR)\code\drivers\fs\ext4\include;$(BASEDIR)\code\drivers\fs\ext4\third_party\lwext4\include
SOURCES=@/code/drivers/fs/ext4/ext4_port.c @/code/drivers/fs/ext4/ext4_driver.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_balloc.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_bcache.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_bitmap.c \
@/code/drivers/fs/ext4/third_party/lwext4/src/ext4_block_group.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_blockdev.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_crc32.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_debug.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_dir.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_dir_idx.c \
@/code/drivers/fs/ext4/third_party/lwext4/src/ext4_extent.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_fs.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_hash.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_ialloc.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_inode.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_journal.c \
@/code/drivers/fs/ext4/third_party/lwext4/src/ext4_super.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_trans.c @/code/drivers/fs/ext4/third_party/lwext4/src/ext4_xattr.c
-10
View File
@@ -98,7 +98,6 @@ static KSTATUS FatCacheRead(FAT_VOL* v, uint64_t lba, uint8_t** out) {
return NTLSTATUS_SUCCESS;
}
// Implements the fat Cache Mark Dirty operation.
static void FatCacheMarkDirty(FAT_VOL* v, uint64_t lba) {
uint32_t slot = (uint32_t)(lba % FAT_CACHE_SLOTS);
if (gFatCache[slot].valid && gFatCache[slot].vol == v && gFatCache[slot].lba == lba)
@@ -231,7 +230,6 @@ bool FatDirectoryNextSegment(FAT_VOL* v, uint32_t dirCluster,
return true;
}
// Implements the cluster To Lba operation.
uint64_t FatClusterToLba(FAT_VOL* v, uint32_t cluster) {
return v->DataStart + (uint64_t)(cluster - 2) * v->SectorsPerCluster;
}
@@ -390,12 +388,10 @@ void FatFreeClusterChain(FAT_VOL* v, uint32_t start) {
// FAT timestamp and DIRENT metadata helpers.
// Implements the fat Is Leap Year operation.
static bool FatIsLeapYear(uint32_t year) {
return ((year % 4u) == 0u && (year % 100u) != 0u) || ((year % 400u) == 0u);
}
// Implements the fat Days In Month operation.
static uint32_t FatDaysInMonth(uint32_t year, uint32_t month) {
static const uint8_t days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
if (month < 1u || month > 12u) return 31u;
@@ -414,13 +410,11 @@ static uint64_t FatCalendarToEpochSeconds(uint32_t year, uint32_t month, uint32_
return (((days * 24u) + hour) * 60u + minute) * 60u + second;
}
// Implements the fat Day Of Week operation.
static uint8_t FatDayOfWeek(uint32_t year, uint32_t month, uint32_t day) {
uint64_t epoch = FatCalendarToEpochSeconds(year, month, day, 0, 0, 0);
return (uint8_t)(((epoch / 86400u) + 4u) % 7u);
}
// Implements the fat Encode Date operation.
static uint16_t FatEncodeDate(const SYS_SYSTEM_TIME* t) {
uint32_t year = t && t->Year ? t->Year : 1980u;
uint32_t month = t && t->Month ? t->Month : 1u;
@@ -435,7 +429,6 @@ static uint16_t FatEncodeDate(const SYS_SYSTEM_TIME* t) {
return (uint16_t)(((year - 1980u) << 9) | (month << 5) | day);
}
// Implements the fat Encode Time operation.
static uint16_t FatEncodeTime(const SYS_SYSTEM_TIME* t) {
uint32_t hour = t ? t->Hour : 0u;
uint32_t minute = t ? t->Minute : 0u;
@@ -446,7 +439,6 @@ static uint16_t FatEncodeTime(const SYS_SYSTEM_TIME* t) {
return (uint16_t)((hour << 11) | (minute << 5) | (second / 2u));
}
// Implements the fat Encode Create Time Tenth operation.
static uint8_t FatEncodeCreateTimeTenth(const SYS_SYSTEM_TIME* t) {
uint32_t second = t ? t->Second : 0u;
uint32_t ms = t ? t->Millisecond : 0u;
@@ -457,7 +449,6 @@ static uint8_t FatEncodeCreateTimeTenth(const SYS_SYSTEM_TIME* t) {
return (uint8_t)v;
}
// Implements the fat Query Encoded Time operation.
void FatQueryEncodedTime(FAT_ENCODED_TIME* out) {
SYS_SYSTEM_TIME now;
memset(&now, 0, sizeof(now));
@@ -502,7 +493,6 @@ void FatDecodeDateTime(uint16_t date, uint16_t time, uint8_t createTenth,
out->EpochSeconds = FatCalendarToEpochSeconds(year, month, day, hour, minute, second);
}
// Implements the fat Decode Access Date operation.
void FatDecodeAccessDate(uint16_t date, SYS_SYSTEM_TIME* out) {
FatDecodeDateTime(date, 0, 0, out);
}
-8
View File
@@ -46,7 +46,6 @@ static volatile int gFatAsyncInitState;
static void FatAsyncReadSubmitNext(FAT_ASYNC_RW* ctx);
static void FatAsyncWriteSubmitNext(FAT_ASYNC_RW* ctx);
// Implements the async Worker operation.
static void FatAsyncWorker(void* arg) {
(void)arg;
@@ -70,7 +69,6 @@ static void FatAsyncWorker(void* arg) {
}
}
// Implements the ensure Async Worker Started operation.
static KSTATUS FatEnsureAsyncWorkerStarted(void) {
uintptr_t flags = KeAcquireSpinlock(&gFatAsyncLock);
if (gFatAsyncInitState == 2) {
@@ -104,7 +102,6 @@ static KSTATUS FatEnsureAsyncWorkerStarted(void) {
return s;
}
// Implements the async Queue Continuation operation.
static void FatAsyncQueueContinuation(FAT_ASYNC_RW* ctx) {
if (!ctx) return;
@@ -114,7 +111,6 @@ static void FatAsyncQueueContinuation(FAT_ASYNC_RW* ctx) {
KeSignalSemaphore(gFatAsyncSemaphore);
}
// Implements the async Finish operation.
static void FatAsyncFinish(FAT_ASYNC_RW* ctx, KSTATUS status, size_t information) {
if (!ctx) return;
if (ctx->CurrentDevice) {
@@ -128,7 +124,6 @@ static void FatAsyncFinish(FAT_ASYNC_RW* ctx, KSTATUS status, size_t information
if (complete) complete(completeContext, status, information);
}
// Implements the async Read Irp Complete operation.
static void FatAsyncReadIrpComplete(IRP* irp, void* completeCtx) {
FAT_ASYNC_RW* ctx = (FAT_ASYNC_RW*)completeCtx;
if (!ctx) return;
@@ -158,7 +153,6 @@ static void FatAsyncReadIrpComplete(IRP* irp, void* completeCtx) {
FatAsyncQueueContinuation(ctx);
}
// Implements the async Read Submit Next operation.
static void FatAsyncReadSubmitNext(FAT_ASYNC_RW* ctx) {
if (ctx->Remaining == 0) {
FatAsyncFinish(ctx, NTLSTATUS_SUCCESS, ctx->Done);
@@ -271,7 +265,6 @@ KSTATUS FatReadAsync(IO_VOLUME_PROVIDER* fs, void* fileCtx,
return NTLSTATUS_PENDING;
}
// Implements the async Write Irp Complete operation.
static void FatAsyncWriteIrpComplete(IRP* irp, void* completeCtx) {
FAT_ASYNC_RW* ctx = (FAT_ASYNC_RW*)completeCtx;
if (!ctx) return;
@@ -294,7 +287,6 @@ static void FatAsyncWriteIrpComplete(IRP* irp, void* completeCtx) {
FatAsyncQueueContinuation(ctx);
}
// Implements the async Write Submit Next operation.
static void FatAsyncWriteSubmitNext(FAT_ASYNC_RW* ctx) {
if (ctx->Remaining == 0) {
uint64_t newEnd = ctx->Offset + ctx->Done;
-13
View File
@@ -15,7 +15,6 @@ static char FatUpperChar(char c);
static bool FatIsLowerChar(char c);
static bool FatIsValidShortChar(char c);
// Implements the make83 Name V operation.
static void Make83NameV(SYS_STRING_VIEW src, char name8[8], char ext3[3]) {
memset(name8, ' ', 8);
memset(ext3, ' ', 3);
@@ -48,17 +47,14 @@ static void Make83NameV(SYS_STRING_VIEW src, char name8[8], char ext3[3]) {
// LFN assembly / matching.
// Implements the fat Upper Char operation.
static char FatUpperChar(char c) {
return (c >= 'a' && c <= 'z') ? (char)(c - 32) : c;
}
// Implements the fat Is Lower Char operation.
static bool FatIsLowerChar(char c) {
return c >= 'a' && c <= 'z';
}
// Implements the fat Is Valid Short Char operation.
static bool FatIsValidShortChar(char c) {
c = FatUpperChar(c);
if (c >= 'A' && c <= 'Z') return true;
@@ -96,14 +92,12 @@ static bool FatNameIsStructurallyShort83V(SYS_STRING_VIEW name) {
return baseLen >= 1 && baseLen <= 8 && extLen <= 3;
}
// Implements the fat Component Has Lower V operation.
static bool FatComponentHasLowerV(SYS_STRING_VIEW name, size_t start, size_t end) {
for (size_t i = start; i < end; i++)
if (FatIsLowerChar(name.Data[i])) return true;
return false;
}
// Implements the fat Component Has Upper V operation.
static bool FatComponentHasUpperV(SYS_STRING_VIEW name, size_t start, size_t end) {
for (size_t i = start; i < end; i++)
if (name.Data[i] >= 'A' && name.Data[i] <= 'Z') return true;
@@ -144,7 +138,6 @@ static bool FatNameNeedsLfnForCreateV(SYS_STRING_VIEW name) {
return false;
}
// Implements the fat Short Name Case Flags V operation.
static uint8_t FatShortNameCaseFlagsV(SYS_STRING_VIEW name) {
if (!FatNameIsStructurallyShort83V(name)) return 0;
size_t baseEnd, extStart, extEnd;
@@ -160,7 +153,6 @@ static uint8_t FatShortNameCaseFlagsV(SYS_STRING_VIEW name) {
return flags;
}
// Implements the lfn Checksum operation.
static uint8_t LfnChecksum(const char name8[8], const char ext3[3]) {
uint8_t sum = 0;
for (int i = 0; i < 11; i++) {
@@ -170,7 +162,6 @@ static uint8_t LfnChecksum(const char name8[8], const char ext3[3]) {
return sum;
}
// Implements the lfn Set Char operation.
static void LfnSetChar(LFN_ENTRY* e, int idx, uint16_t value) {
if (idx < 5) e->Name1[idx] = value;
else if (idx < 11) e->Name2[idx - 5] = value;
@@ -242,7 +233,6 @@ static bool ShortNameExistsRaw(FAT_VOL* v, uint32_t dirCluster,
return false;
}
// Implements the fat Alias Append Char operation.
static void FatAliasAppendChar(char* dst, int* len, int maxLen, char c) {
c = FatUpperChar(c);
if (!FatIsValidShortChar(c)) return;
@@ -384,7 +374,6 @@ static KSTATUS DeleteLegacyBrokenDotAliasV(FAT_VOL* v, uint32_t dirCluster,
return NTLSTATUS_SUCCESS;
}
// Implements the lfn Append operation.
void FatLfnAppend(char* lfn, const LFN_ENTRY* e) {
int seq = (e->Order & 0x3F) - 1;
if (seq < 0 || seq >= (FAT_MAX_LFN / 13)) return;
@@ -413,7 +402,6 @@ static bool FatStringViewDataIsPlausible(SYS_STRING_VIEW view) {
return data >= 0x10000u;
}
// Implements the name View Is Valid operation.
static bool FatNameViewIsValid(SYS_STRING_VIEW name) {
if (!FatStringViewDataIsPlausible(name)) return false;
if (name.Length == 0 || name.Length >= FAT_MAX_LFN) return false;
@@ -424,7 +412,6 @@ static bool FatNameViewIsValid(SYS_STRING_VIEW name) {
return true;
}
// Implements the lfn Match V operation.
static bool LfnMatchV(const char* lfn, SYS_STRING_VIEW want) {
if (!lfn || !SysSvIsValid(want)) return false;
size_t i = 0;
+3 -5
View File
@@ -249,7 +249,8 @@ static void FatUnmountPartition(const IO_PARTITION_INFO* partition, IO_PARTITION
uint32_t mountedCount = gMountedCount;
KeReleaseMutex(&gFatMountMutex);
(void)IoRemoveVolume(volume, IoVolumeBackingRemoved);
(void)IoRemoveVolume(volume, change == IoPartitionSurpriseRemoved
? IoVolumeBackingRemoved : IoVolumeUnmounted);
IoReleaseVolume(volume); // Drop the active mount-list reference.
DbgPrint("FAT: disk=%u lba=%llu %s; unmounted volume=%u; total=%u\n",
partition->DiskIndex, (unsigned long long)partition->StartLba,
@@ -278,7 +279,6 @@ static void FatPartitionChange(const IO_PARTITION_INFO* partition,
// Initializes FAT and subscribes to the authoritative kernel partition stream.
static KSTATUS DriverInitialize(NTL_MODULE* module) {
(void)module;
DbgPrint("FAT: Init\n");
FatCacheInvalidate();
@@ -292,9 +292,7 @@ static KSTATUS DriverInitialize(NTL_MODULE* module) {
return status;
}
if (!gMountedCount)
DbgPrint("FAT: no mountable FAT partitions found; driver resident for partition changes.\n");
DbgPrint("FAT: Init complete; mounted %u volume(s).\n", gMountedCount);
DbgPrint("fs: fat volumes=%u\n", gMountedCount);
return NTLSTATUS_SUCCESS;
}
+1
View File
@@ -0,0 +1 @@
!include $(BASEDIR)\makefile.def
+7
View File
@@ -0,0 +1,7 @@
TARGETNAME=fat
TARGETPATH=obj
TARGETTYPE=DRIVER
FLAVOR=DRIVER
TARGETLIBS="$(BASEDIR)\bin\kernel.lib" "$(BASEDIR)\bin\libc.lib"
EXTRA_LFLAGS=/NOENTRY
SOURCES=@/code/drivers/fs/fat/fat.c @/code/drivers/fs/fat/fat_directory.c @/code/drivers/fs/fat/fat_file.c @/code/drivers/fs/fat/fat_async.c @/code/drivers/fs/fat/fat_driver.c @/code/drivers/fs/fat/fat_mount.c
+1
View File
@@ -0,0 +1 @@
DIRS=ntfs3g
+3 -5
View File
@@ -1571,7 +1571,8 @@ static void NtfsUnmountPartition(const IO_PARTITION_INFO* partition, IO_PARTITIO
uint32_t mountedCount = gMountedCount;
KeReleaseMutex(&gNtfsMountMutex);
(void)IoRemoveVolume(volume, IoVolumeBackingRemoved);
(void)IoRemoveVolume(volume, change == IoPartitionSurpriseRemoved
? IoVolumeBackingRemoved : IoVolumeUnmounted);
IoReleaseVolume(volume); // Drop the active mount-list reference.
DbgPrint("NTFS: disk=%u lba=%llu %s; unmounted volume=%u; total=%u\n",
partition->DiskIndex, (unsigned long long)partition->StartLba,
@@ -1600,7 +1601,6 @@ static void NtfsPartitionChange(const IO_PARTITION_INFO* partition,
// Initializes NTFS and subscribes to the authoritative kernel partition stream.
static KSTATUS DriverInitialize(NTL_MODULE* module) {
(void)module;
DbgPrint("NTFS: Init\n");
LIST_INIT(&gNtfsMounts);
@@ -1613,9 +1613,7 @@ static KSTATUS DriverInitialize(NTL_MODULE* module) {
return status;
}
if (!gMountedCount)
DbgPrint("NTFS: no mountable NTFS partitions found; driver resident for partition changes.\n");
DbgPrint("NTFS: Init complete; mounted %u volume(s).\n", gMountedCount);
DbgPrint("fs: ntfs volumes=%u\n", gMountedCount);
return NTLSTATUS_SUCCESS;
}
+1
View File
@@ -0,0 +1 @@
!include $(BASEDIR)\makefile.def
+3 -3
View File
@@ -1114,7 +1114,8 @@ static void Ntfs3gUnmountPartition(const IO_PARTITION_INFO* partition, IO_PARTIT
uint32_t count = gNtfs3gMountedCount;
KeReleaseMutex(&gNtfs3gMountMutex);
(void)IoRemoveVolume(ioVolume, IoVolumeBackingRemoved);
(void)IoRemoveVolume(ioVolume, change == IoPartitionSurpriseRemoved
? IoVolumeBackingRemoved : IoVolumeUnmounted);
IoReleaseVolume(ioVolume);
DbgPrint("NTFS3G: disk=%u lba=%llu %s; unmounted volume=%u; total=%u\n",
partition->DiskIndex, (unsigned long long)partition->StartLba,
@@ -1140,14 +1141,13 @@ static void Ntfs3gPartitionChange(const IO_PARTITION_INFO* partition,
static KSTATUS DriverInitialize(NTL_MODULE* module) {
(void)module;
DbgPrint("NTFS3G: Init (libntfs-3g replacement driver)\n");
Ntfs3gListInit(&gNtfs3gMounts);
gNtfs3gMountedCount = 0;
Ntfs3gEnsureMutexes();
KSTATUS status = IoRegisterPartitionChangeCallback(Ntfs3gPartitionChange, (void*)0);
if (!KSUCCESS(status))
return status;
DbgPrint("NTFS3G: Init complete; mounted %u volume(s).\n", gNtfs3gMountedCount);
DbgPrint("fs: ntfs3g volumes=%u\n", gNtfs3gMountedCount);
return NTLSTATUS_SUCCESS;
}
+13
View File
@@ -0,0 +1,13 @@
TARGETNAME=ntfs
TARGETPATH=obj
TARGETTYPE=DRIVER
FLAVOR=NTFS
TARGETLIBS="$(BASEDIR)\bin\kernel.lib" "$(BASEDIR)\bin\libc.lib" "$(BASEDIR)\bin\printf.lib"
EXTRA_LFLAGS=/NOENTRY
INCLUDES=$(BASEDIR)\code\drivers\fs\ntfs\ntfs3g\include;$(BASEDIR)\code\drivers\fs\ntfs\ntfs3g\third_party\ntfs-3g\include;$(BASEDIR)\code\drivers\fs\ntfs\ntfs3g\third_party\ntfs-3g\include\ntfs-3g
SOURCES=@/code/drivers/fs/ntfs/ntfs3g/ntfs3g_port.c @/code/drivers/fs/ntfs/ntfs3g/ntfs3g_device.c @/code/drivers/fs/ntfs/ntfs3g/ntfs3g_driver.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/acls.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/attrib.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/attrlist.c \
@/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/bitmap.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/bootsect.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/cache.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/collate.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/compat.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/compress.c \
@/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/debug.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/device.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/dir.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/ea.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/efs.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/index.c \
@/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/inode.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/ioctl.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/lcnalloc.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/logfile.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/logging.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/mft.c \
@/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/misc.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/mst.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/object_id.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/realpath.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/reparse.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/runlist.c \
@/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/security.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/unistr.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/volume.c @/code/drivers/fs/ntfs/ntfs3g/third_party/ntfs-3g/libntfs-3g/xattrs.c