ReactOS 0.4.16-dev-1946-g52006dd
ntfs.h File Reference
#include <pshpack1.h>
#include <poppack.h>
Include dependency graph for ntfs.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  NTFS_BOOTSECTOR
 
struct  NTFS_RECORD
 
struct  NTFS_MFT_RECORD
 
struct  NTFS_ATTR_RECORD
 
struct  NTFS_INDEX_HEADER
 
struct  NTFS_INDEX_ROOT
 
struct  NTFS_FILE_NAME_ATTR
 
struct  NTFS_ATTR_LIST_ATTR
 
struct  NTFS_INDEX_ENTRY
 
struct  NTFS_ATTR_CONTEXT
 
struct  _NTFS_FILE_HANDLE
 

Macros

#define NTFS_FILE_MFT   0
 
#define NTFS_FILE_MFTMIRR   1
 
#define NTFS_FILE_LOGFILE   2
 
#define NTFS_FILE_VOLUME   3
 
#define NTFS_FILE_ATTRDEF   4
 
#define NTFS_FILE_ROOT   5
 
#define NTFS_FILE_BITMAP   6
 
#define NTFS_FILE_BOOT   7
 
#define NTFS_FILE_BADCLUS   8
 
#define NTFS_FILE_QUOTA   9
 
#define NTFS_FILE_UPCASE   10
 
#define NTFS_FILE_EXTEND   11
 
#define NTFS_ATTR_TYPE_STANDARD_INFORMATION   0x10
 
#define NTFS_ATTR_TYPE_ATTRIBUTE_LIST   0x20
 
#define NTFS_ATTR_TYPE_FILENAME   0x30
 
#define NTFS_ATTR_TYPE_OBJECT_ID   0x40
 
#define NTFS_ATTR_TYPE_SECURITY_DESCRIPTOR   0x50
 
#define NTFS_ATTR_TYPE_VOLUME_NAME   0x60
 
#define NTFS_ATTR_TYPE_VOLUME_INFORMATION   0x70
 
#define NTFS_ATTR_TYPE_DATA   0x80
 
#define NTFS_ATTR_TYPE_INDEX_ROOT   0x90
 
#define NTFS_ATTR_TYPE_INDEX_ALLOCATION   0xa0
 
#define NTFS_ATTR_TYPE_BITMAP   0xb0
 
#define NTFS_ATTR_TYPE_REPARSE_POINT   0xc0
 
#define NTFS_ATTR_TYPE_EA_INFORMATION   0xd0
 
#define NTFS_ATTR_TYPE_EA   0xe0
 
#define NTFS_ATTR_TYPE_END   0xffffffff
 
#define NTFS_ATTR_NORMAL   0
 
#define NTFS_ATTR_COMPRESSED   1
 
#define NTFS_ATTR_RESIDENT   2
 
#define NTFS_ATTR_ENCRYPTED   0x4000
 
#define NTFS_SMALL_INDEX   0
 
#define NTFS_LARGE_INDEX   1
 
#define NTFS_INDEX_ENTRY_NODE   1
 
#define NTFS_INDEX_ENTRY_END   2
 
#define NTFS_FILE_NAME_POSIX   0
 
#define NTFS_FILE_NAME_WIN32   1
 
#define NTFS_FILE_NAME_DOS   2
 
#define NTFS_FILE_NAME_WIN32_AND_DOS   3
 
#define NTFS_FILE_ATTR_NORMAL   0x00
 
#define NTFS_FILE_ATTR_READONLY   0x01
 
#define NTFS_FILE_ATTR_HIDDEN   0x02
 
#define NTFS_FILE_ATTR_SYSTEM   0x04
 
#define NTFS_FILE_ATTR_ARCHIVE   0x20
 
#define NTFS_FILE_ATTR_DIRECTORY   0x10000000
 
#define NTFS_MFT_MASK   0x0000FFFFFFFFFFFFULL
 

Typedefs

typedef struct NTFS_BOOTSECTORPNTFS_BOOTSECTOR
 
typedef struct NTFS_RECORDPNTFS_RECORD
 
typedef struct NTFS_MFT_RECORDPNTFS_MFT_RECORD
 
typedef struct NTFS_ATTR_RECORDPNTFS_ATTR_RECORD
 
typedef struct NTFS_INDEX_HEADERPNTFS_INDEX_HEADER
 
typedef struct NTFS_INDEX_ROOTPNTFS_INDEX_ROOT
 
typedef struct NTFS_FILE_NAME_ATTRPNTFS_FILE_NAME_ATTR
 
typedef struct NTFS_ATTR_LIST_ATTRPNTFS_ATTR_LIST_ATTR
 
typedef struct NTFS_INDEX_ENTRYPNTFS_INDEX_ENTRY
 
typedef struct NTFS_ATTR_CONTEXTPNTFS_ATTR_CONTEXT
 
typedef struct _NTFS_VOLUME_INFOPNTFS_VOLUME_INFO
 
typedef struct _NTFS_FILE_HANDLE NTFS_FILE_HANDLE
 
typedef struct _NTFS_FILE_HANDLEPNTFS_FILE_HANDLE
 

Functions

ULONGLONG NtfsGetVolumeSize (_In_ ULONG DeviceId)
 Returns the size of the NTFS volume laid on the storage media device opened via DeviceId.
 
const DEVVTBLNtfsMount (ULONG DeviceId)
 

Macro Definition Documentation

◆ NTFS_ATTR_COMPRESSED

#define NTFS_ATTR_COMPRESSED   1

Definition at line 53 of file ntfs.h.

◆ NTFS_ATTR_ENCRYPTED

#define NTFS_ATTR_ENCRYPTED   0x4000

Definition at line 55 of file ntfs.h.

◆ NTFS_ATTR_NORMAL

#define NTFS_ATTR_NORMAL   0

Definition at line 52 of file ntfs.h.

◆ NTFS_ATTR_RESIDENT

#define NTFS_ATTR_RESIDENT   2

Definition at line 54 of file ntfs.h.

◆ NTFS_ATTR_TYPE_ATTRIBUTE_LIST

#define NTFS_ATTR_TYPE_ATTRIBUTE_LIST   0x20

Definition at line 37 of file ntfs.h.

◆ NTFS_ATTR_TYPE_BITMAP

#define NTFS_ATTR_TYPE_BITMAP   0xb0

Definition at line 46 of file ntfs.h.

◆ NTFS_ATTR_TYPE_DATA

#define NTFS_ATTR_TYPE_DATA   0x80

Definition at line 43 of file ntfs.h.

◆ NTFS_ATTR_TYPE_EA

#define NTFS_ATTR_TYPE_EA   0xe0

Definition at line 49 of file ntfs.h.

◆ NTFS_ATTR_TYPE_EA_INFORMATION

#define NTFS_ATTR_TYPE_EA_INFORMATION   0xd0

Definition at line 48 of file ntfs.h.

◆ NTFS_ATTR_TYPE_END

#define NTFS_ATTR_TYPE_END   0xffffffff

Definition at line 50 of file ntfs.h.

◆ NTFS_ATTR_TYPE_FILENAME

#define NTFS_ATTR_TYPE_FILENAME   0x30

Definition at line 38 of file ntfs.h.

◆ NTFS_ATTR_TYPE_INDEX_ALLOCATION

#define NTFS_ATTR_TYPE_INDEX_ALLOCATION   0xa0

Definition at line 45 of file ntfs.h.

◆ NTFS_ATTR_TYPE_INDEX_ROOT

#define NTFS_ATTR_TYPE_INDEX_ROOT   0x90

Definition at line 44 of file ntfs.h.

◆ NTFS_ATTR_TYPE_OBJECT_ID

#define NTFS_ATTR_TYPE_OBJECT_ID   0x40

Definition at line 39 of file ntfs.h.

◆ NTFS_ATTR_TYPE_REPARSE_POINT

#define NTFS_ATTR_TYPE_REPARSE_POINT   0xc0

Definition at line 47 of file ntfs.h.

◆ NTFS_ATTR_TYPE_SECURITY_DESCRIPTOR

#define NTFS_ATTR_TYPE_SECURITY_DESCRIPTOR   0x50

Definition at line 40 of file ntfs.h.

◆ NTFS_ATTR_TYPE_STANDARD_INFORMATION

#define NTFS_ATTR_TYPE_STANDARD_INFORMATION   0x10

Definition at line 36 of file ntfs.h.

◆ NTFS_ATTR_TYPE_VOLUME_INFORMATION

#define NTFS_ATTR_TYPE_VOLUME_INFORMATION   0x70

Definition at line 42 of file ntfs.h.

◆ NTFS_ATTR_TYPE_VOLUME_NAME

#define NTFS_ATTR_TYPE_VOLUME_NAME   0x60

Definition at line 41 of file ntfs.h.

◆ NTFS_FILE_ATTR_ARCHIVE

#define NTFS_FILE_ATTR_ARCHIVE   0x20

Definition at line 73 of file ntfs.h.

◆ NTFS_FILE_ATTR_DIRECTORY

#define NTFS_FILE_ATTR_DIRECTORY   0x10000000

Definition at line 74 of file ntfs.h.

◆ NTFS_FILE_ATTR_HIDDEN

#define NTFS_FILE_ATTR_HIDDEN   0x02

Definition at line 70 of file ntfs.h.

◆ NTFS_FILE_ATTR_NORMAL

#define NTFS_FILE_ATTR_NORMAL   0x00

Definition at line 68 of file ntfs.h.

◆ NTFS_FILE_ATTR_READONLY

#define NTFS_FILE_ATTR_READONLY   0x01

Definition at line 69 of file ntfs.h.

◆ NTFS_FILE_ATTR_SYSTEM

#define NTFS_FILE_ATTR_SYSTEM   0x04

Definition at line 71 of file ntfs.h.

◆ NTFS_FILE_ATTRDEF

#define NTFS_FILE_ATTRDEF   4

Definition at line 27 of file ntfs.h.

◆ NTFS_FILE_BADCLUS

#define NTFS_FILE_BADCLUS   8

Definition at line 31 of file ntfs.h.

◆ NTFS_FILE_BITMAP

#define NTFS_FILE_BITMAP   6

Definition at line 29 of file ntfs.h.

◆ NTFS_FILE_BOOT

#define NTFS_FILE_BOOT   7

Definition at line 30 of file ntfs.h.

◆ NTFS_FILE_EXTEND

#define NTFS_FILE_EXTEND   11

Definition at line 34 of file ntfs.h.

◆ NTFS_FILE_LOGFILE

#define NTFS_FILE_LOGFILE   2

Definition at line 25 of file ntfs.h.

◆ NTFS_FILE_MFT

#define NTFS_FILE_MFT   0

Definition at line 23 of file ntfs.h.

◆ NTFS_FILE_MFTMIRR

#define NTFS_FILE_MFTMIRR   1

Definition at line 24 of file ntfs.h.

◆ NTFS_FILE_NAME_DOS

#define NTFS_FILE_NAME_DOS   2

Definition at line 65 of file ntfs.h.

◆ NTFS_FILE_NAME_POSIX

#define NTFS_FILE_NAME_POSIX   0

Definition at line 63 of file ntfs.h.

◆ NTFS_FILE_NAME_WIN32

#define NTFS_FILE_NAME_WIN32   1

Definition at line 64 of file ntfs.h.

◆ NTFS_FILE_NAME_WIN32_AND_DOS

#define NTFS_FILE_NAME_WIN32_AND_DOS   3

Definition at line 66 of file ntfs.h.

◆ NTFS_FILE_QUOTA

#define NTFS_FILE_QUOTA   9

Definition at line 32 of file ntfs.h.

◆ NTFS_FILE_ROOT

#define NTFS_FILE_ROOT   5

Definition at line 28 of file ntfs.h.

◆ NTFS_FILE_UPCASE

#define NTFS_FILE_UPCASE   10

Definition at line 33 of file ntfs.h.

◆ NTFS_FILE_VOLUME

#define NTFS_FILE_VOLUME   3

Definition at line 26 of file ntfs.h.

◆ NTFS_INDEX_ENTRY_END

#define NTFS_INDEX_ENTRY_END   2

Definition at line 61 of file ntfs.h.

◆ NTFS_INDEX_ENTRY_NODE

#define NTFS_INDEX_ENTRY_NODE   1

Definition at line 60 of file ntfs.h.

◆ NTFS_LARGE_INDEX

#define NTFS_LARGE_INDEX   1

Definition at line 58 of file ntfs.h.

◆ NTFS_MFT_MASK

#define NTFS_MFT_MASK   0x0000FFFFFFFFFFFFULL

Definition at line 76 of file ntfs.h.

◆ NTFS_SMALL_INDEX

#define NTFS_SMALL_INDEX   0

Definition at line 57 of file ntfs.h.

Typedef Documentation

◆ NTFS_FILE_HANDLE

◆ PNTFS_ATTR_CONTEXT

◆ PNTFS_ATTR_LIST_ATTR

◆ PNTFS_ATTR_RECORD

◆ PNTFS_BOOTSECTOR

◆ PNTFS_FILE_HANDLE

◆ PNTFS_FILE_NAME_ATTR

◆ PNTFS_INDEX_ENTRY

◆ PNTFS_INDEX_HEADER

◆ PNTFS_INDEX_ROOT

◆ PNTFS_MFT_RECORD

◆ PNTFS_RECORD

◆ PNTFS_VOLUME_INFO

Definition at line 249 of file ntfs.h.

Function Documentation

◆ NtfsGetVolumeSize()

ULONGLONG NtfsGetVolumeSize ( _In_ ULONG  DeviceId)

Returns the size of the NTFS volume laid on the storage media device opened via DeviceId.

Definition at line 919 of file ntfs.c.

921{
923 ASSERT(Volume);
924 return Volume->BootSector.VolumeSectorCount * Volume->BootSector.BytesPerSector;
925}
PNTFS_VOLUME_INFO NtfsVolumes[MAX_FDS]
Definition: ntfs.c:55
UNICODE_STRING Volume
Definition: fltkernel.h:1172
#define ASSERT(a)
Definition: mode.c:44

Referenced by FsGetVolumeSize().

◆ NtfsMount()

const DEVVTBL * NtfsMount ( ULONG  DeviceId)

Definition at line 938 of file ntfs.c.

939{
942 ULONG Count;
944
945 TRACE("Enter NtfsMount(%lu)\n", DeviceId);
946
947 //
948 // Allocate data for volume information
949 //
951 if (!Volume)
952 return NULL;
954
955 //
956 // Read the BootSector
957 //
958 Position.QuadPart = 0;
959 Status = ArcSeek(DeviceId, &Position, SeekAbsolute);
960 if (Status != ESUCCESS)
961 {
963 return NULL;
964 }
965 Status = ArcRead(DeviceId, &Volume->BootSector, sizeof(Volume->BootSector), &Count);
966 if (Status != ESUCCESS || Count != sizeof(Volume->BootSector))
967 {
969 return NULL;
970 }
971
972 //
973 // Check if BootSector is valid. If no, return early
974 //
975 if (!RtlEqualMemory(Volume->BootSector.SystemId, "NTFS", 4))
976 {
978 return NULL;
979 }
980
981 //
982 // Calculate cluster size and MFT record size
983 //
984 Volume->ClusterSize = Volume->BootSector.SectorsPerCluster * Volume->BootSector.BytesPerSector;
985 if (Volume->BootSector.ClustersPerMftRecord > 0)
986 Volume->MftRecordSize = Volume->BootSector.ClustersPerMftRecord * Volume->ClusterSize;
987 else
988 Volume->MftRecordSize = 1 << (-Volume->BootSector.ClustersPerMftRecord);
989 if (Volume->BootSector.ClustersPerIndexRecord > 0)
990 Volume->IndexRecordSize = Volume->BootSector.ClustersPerIndexRecord * Volume->ClusterSize;
991 else
992 Volume->IndexRecordSize = 1 << (-Volume->BootSector.ClustersPerIndexRecord);
993
994 TRACE("ClusterSize: 0x%x\n", Volume->ClusterSize);
995 TRACE("ClustersPerMftRecord: %d\n", Volume->BootSector.ClustersPerMftRecord);
996 TRACE("ClustersPerIndexRecord: %d\n", Volume->BootSector.ClustersPerIndexRecord);
997 TRACE("MftRecordSize: 0x%x\n", Volume->MftRecordSize);
998 TRACE("IndexRecordSize: 0x%x\n", Volume->IndexRecordSize);
999
1000 //
1001 // Read MFT index
1002 //
1003 TRACE("Reading MFT index...\n");
1004 Volume->MasterFileTable = FrLdrTempAlloc(Volume->MftRecordSize, TAG_NTFS_MFT);
1005 if (!Volume->MasterFileTable)
1006 {
1008 return NULL;
1009 }
1010 Position.QuadPart = Volume->BootSector.MftLocation * Volume->ClusterSize;
1011 Status = ArcSeek(DeviceId, &Position, SeekAbsolute);
1012 if (Status != ESUCCESS)
1013 {
1014 FileSystemError("Failed to seek to Master File Table record.");
1015 FrLdrTempFree(Volume->MasterFileTable, TAG_NTFS_MFT);
1017 return NULL;
1018 }
1019 Status = ArcRead(DeviceId, Volume->MasterFileTable, Volume->MftRecordSize, &Count);
1020 if (Status != ESUCCESS || Count != Volume->MftRecordSize)
1021 {
1022 FileSystemError("Failed to read the Master File Table record.");
1023 FrLdrTempFree(Volume->MasterFileTable, TAG_NTFS_MFT);
1025 return NULL;
1026 }
1027
1028 //
1029 // Keep room to read partial sectors
1030 //
1031 Volume->TemporarySector = FrLdrTempAlloc(Volume->BootSector.BytesPerSector, TAG_NTFS_DATA);
1032 if (!Volume->TemporarySector)
1033 {
1034 FileSystemError("Failed to allocate memory.");
1035 FrLdrTempFree(Volume->MasterFileTable, TAG_NTFS_MFT);
1037 return NULL;
1038 }
1039
1040 //
1041 // Keep device id
1042 //
1043 Volume->DeviceId = DeviceId;
1044
1045 //
1046 // Search DATA attribute
1047 //
1048 TRACE("Searching for DATA attribute...\n");
1049 Volume->MFTContext = NtfsFindAttribute(Volume, Volume->MasterFileTable, NTFS_ATTR_TYPE_DATA, L"");
1050 if (!Volume->MFTContext)
1051 {
1052 FileSystemError("Can't find data attribute for Master File Table.");
1053 FrLdrTempFree(Volume->MasterFileTable, TAG_NTFS_MFT);
1055 return NULL;
1056 }
1057
1058 //
1059 // Remember NTFS volume information
1060 //
1061 NtfsVolumes[DeviceId] = Volume;
1062
1063 //
1064 // Return success
1065 //
1066 TRACE("NtfsMount(%lu) success\n", DeviceId);
1067 return &NtfsFuncTable;
1068}
#define NTFS_ATTR_TYPE_DATA
Definition: ntfs.h:43
ARC_STATUS ArcSeek(ULONG FileId, LARGE_INTEGER *Position, SEEKMODE SeekMode)
Definition: fs.c:455
VOID FileSystemError(PCSTR ErrorString)
Definition: fs.c:471
ARC_STATUS ArcRead(ULONG FileId, VOID *Buffer, ULONG N, ULONG *Count)
Definition: fs.c:448
VOID FrLdrTempFree(PVOID Allocation, ULONG Tag)
Definition: heap.c:553
PVOID FrLdrTempAlloc(_In_ SIZE_T Size, _In_ ULONG Tag)
Definition: heap.c:545
#define TAG_NTFS_MFT
Definition: ntfs.c:35
const DEVVTBL NtfsFuncTable
Definition: ntfs.c:928
#define TAG_NTFS_DATA
Definition: ntfs.c:40
static PNTFS_ATTR_CONTEXT NtfsFindAttribute(PNTFS_VOLUME_INFO Volume, PNTFS_MFT_RECORD MftRecord, ULONG Type, const WCHAR *Name)
Definition: ntfs.c:443
#define TAG_NTFS_VOLUME
Definition: ntfs.c:39
#define NULL
Definition: types.h:112
#define L(x)
Definition: resources.c:13
Status
Definition: gdiplustypes.h:25
#define RtlEqualMemory(dst, src, len)
Definition: kdvm.h:18
int Count
Definition: noreturn.cpp:7
@ ESUCCESS
Definition: arc.h:32
ULONG ARC_STATUS
Definition: arc.h:4
@ SeekAbsolute
Definition: arc.h:59
#define TRACE(s)
Definition: solgame.cpp:4
static COORD Position
Definition: mouse.c:34
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG
Definition: typedefs.h:59