#define NTFS_H
#include <ntifs.h>
+#include <pseh/pseh2.h>
#define CACHEPAGESIZE(pDeviceExt) \
((pDeviceExt)->NtfsInfo.UCHARsPerCluster > PAGE_SIZE ? \
#define TAG_NTFS 'SFTN'
#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
+#define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
#define DEVICE_NAME L"\\Ntfs"
ULONG SectorsPerCluster;
ULONG BytesPerCluster;
ULONGLONG SectorCount;
+ ULONGLONG ClusterCount;
ULARGE_INTEGER MftStart;
ULARGE_INTEGER MftMirrStart;
ULONG BytesPerFileRecord;
UCHAR MinorVersion;
USHORT Flags;
+ ULONG MftZoneReservation;
} NTFS_INFO, *PNTFS_INFO;
#define NTFS_TYPE_CCB '20SF'
PDEVICE_OBJECT DeviceObject;
CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
ULONG Flags;
+ FAST_IO_DISPATCH FastIoDispatch;
} NTFS_GLOBAL_DATA, *PNTFS_GLOBAL_DATA;
#define NTFS_FILE_UPCASE 10
#define NTFS_FILE_EXTEND 11
+#define NTFS_MFT_MASK 0x0000FFFFFFFFFFFFULL
+
#define COLLATION_BINARY 0x00
#define COLLATION_FILE_NAME 0x01
#define COLLATION_UNICODE_STRING 0x02
#define NTFS_FILE_TYPE_HIDDEN 0x2
#define NTFS_FILE_TYPE_SYSTEM 0x4
#define NTFS_FILE_TYPE_ARCHIVE 0x20
+#define NTFS_FILE_TYPE_REPARSE 0x400
#define NTFS_FILE_TYPE_COMPRESSED 0x800
#define NTFS_FILE_TYPE_DIRECTORY 0x10000000
/* NTFS_RECORD_HEADER.Type */
#define NRH_FILE_TYPE 0x454C4946 /* 'FILE' */
+#define NRH_INDX_TYPE 0x58444E49 /* 'INDX' */
typedef struct _FILE_RECORD_HEADER
ULONGLONG AllocatedSize;
ULONGLONG DataSize;
ULONG FileAttributes;
- ULONG AlignmentOrReserved;
+ union
+ {
+ struct
+ {
+ USHORT PackedEaSize;
+ USHORT AlignmentOrReserved;
+ } EaInfo;
+ ULONG ReparseTag;
+ } Extended;
UCHAR NameLength;
UCHAR NameType;
WCHAR Name[1];
INDEX_HEADER_ATTRIBUTE Header;
} INDEX_ROOT_ATTRIBUTE, *PINDEX_ROOT_ATTRIBUTE;
+typedef struct
+{
+ NTFS_RECORD_HEADER Ntfs;
+ ULONGLONG VCN;
+ INDEX_HEADER_ATTRIBUTE Header;
+} INDEX_BUFFER, *PINDEX_BUFFER;
+
typedef struct
{
union
ULONG Unknown2;
} VOLINFO_ATTRIBUTE, *PVOLINFO_ATTRIBUTE;
+typedef struct {
+ ULONG ReparseTag;
+ USHORT DataLength;
+ USHORT Reserved;
+ UCHAR Data[1];
+} REPARSE_POINT_ATTRIBUTE, *PREPARSE_POINT_ATTRIBUTE;
+
typedef struct
{
NTFSIDENTIFIER Identifier;
ULONG Flags;
ULONGLONG MFTIndex;
+ USHORT LinkCount;
FILENAME_ATTRIBUTE Entry;
VOID
NtfsDumpFileAttributes(PFILE_RECORD_HEADER FileRecord);
+PSTANDARD_INFORMATION
+GetStandardInformationFromRecord(PFILE_RECORD_HEADER FileRecord);
+
PFILENAME_ATTRIBUTE
-GetFileNameFromRecord(PFILE_RECORD_HEADER FileRecord);
+GetFileNameFromRecord(PFILE_RECORD_HEADER FileRecord, UCHAR NameType);
+
+PFILENAME_ATTRIBUTE
+GetBestFileNameFromRecord(PFILE_RECORD_HEADER FileRecord);
/* blockdev.c */
NtfsReadDisk(IN PDEVICE_OBJECT DeviceObject,
IN LONGLONG StartingOffset,
IN ULONG Length,
+ IN ULONG SectorSize,
IN OUT PUCHAR Buffer,
IN BOOLEAN Override);
PIRP Irp);
+/* devctl.c */
+
+DRIVER_DISPATCH NtfsFsdDeviceControl;
+NTSTATUS NTAPI
+NtfsFsdDeviceControl(PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
+
/* dirctl.c */
DRIVER_DISPATCH NtfsFsdDirectoryControl;
VOID NTAPI
NtfsRelReadAhead(PVOID Context);
+FAST_IO_CHECK_IF_POSSIBLE NtfsFastIoCheckIfPossible;
+FAST_IO_READ NtfsFastIoRead;
+FAST_IO_WRITE NtfsFastIoWrite;
+
/* fcb.c */
BOOLEAN
NtfsFCBIsDirectory(PNTFS_FCB Fcb);
+BOOLEAN
+NtfsFCBIsReparsePoint(PNTFS_FCB Fcb);
+
BOOLEAN
NtfsFCBIsRoot(PNTFS_FCB Fcb);
PNTFS_FCB *pFCB,
const PWSTR pFileName);
+NTSTATUS
+NtfsReadFCBAttribute(PNTFS_VCB Vcb,
+ PNTFS_FCB pFCB,
+ ULONG Type,
+ PCWSTR Name,
+ ULONG NameLength,
+ PVOID * Data);
+
/* finfo.c */
/* mft.c */
+VOID
+ReleaseAttributeContext(PNTFS_ATTR_CONTEXT Context);
+
ULONG
ReadAttribute(PDEVICE_EXTENSION Vcb,
PNTFS_ATTR_CONTEXT Context,
FindAttribute(PDEVICE_EXTENSION Vcb,
PFILE_RECORD_HEADER MftRecord,
ULONG Type,
- PUNICODE_STRING Name,
+ PCWSTR Name,
+ ULONG NameLength,
PNTFS_ATTR_CONTEXT * AttrCtx);
VOID
NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
PIRP Irp);
+PVOID
+NtfsGetUserBuffer(PIRP Irp);
+
#if 0
BOOLEAN
wstrcmpjoki(PWSTR s1, PWSTR s2);
ULONG Count);
#endif
-VOID
-NtfsDateTimeToFileTime(ULONGLONG NtfsTime,
- PLARGE_INTEGER SystemTime);
-
VOID
NtfsFileFlagsToAttributes(ULONG NtfsAttributes,
PULONG FileAttributes);
/* volinfo.c */
+ULONGLONG
+NtfsGetFreeClusters(PDEVICE_EXTENSION DeviceExt);
+
NTSTATUS
NtfsQueryVolumeInformation(PNTFS_IRP_CONTEXT IrpContext);