Modules/NTFS - Implimentation in progress
[tpg/acess2.git] / KernelLand / Modules / Filesystems / NTFS / common.h
index d6b11e8..ac93b52 100644 (file)
  *
  * common.h - Common Types and Definitions
  */
-#ifndef _COMMON_H_
-#define _COMMON_H_
+#ifndef _NTFS__COMMON_H_
+#define _NTFS__COMMON_H_
 
 #include <acess.h>
 #include <vfs.h>
+#include "ntfs.h"
 
-typedef Uint16 WCHAR;
+typedef struct sNTFS_File      tNTFS_File;
+typedef struct sNTFS_Directory tNTFS_Directory;
+typedef struct sNTFS_Disk      tNTFS_Disk;
+typedef struct sNTFS_Attrib    tNTFS_Attrib;
+typedef struct sNTFS_AttribDataRun     tNTFS_AttribDataRun;
 
 // === STRUCTURES ===
+
+struct sNTFS_File
+{
+       tVFS_Node       Node;
+       tNTFS_Attrib    *Data;
+};
+
+struct sNTFS_Directory
+{
+       tVFS_Node       Node;
+       tNTFS_Attrib    *I30Root;
+       tNTFS_Attrib    *I30Allocation;
+};
+
 /**
  * In-memory representation of an NTFS Disk
  */
-typedef struct sNTFS_Disk
+struct sNTFS_Disk
 {
         int    FD;
         int    CacheHandle;
         
         int    ClusterSize;
+       
        Uint64  MFTBase;
        Uint32  MFTRecSize;
        
-       tVFS_Node       RootNode;
-}      tNTFS_Disk;
-
-typedef struct sNTFS_BootSector
-{
-       // 0
-       Uint8   Jump[3];
-       Uint8   SystemID[8];    // = "NTFS    "
-       Uint16  BytesPerSector;
-       Uint8   SectorsPerCluster;
-       
-       // 0xE
-       Uint8   Unused[7];
-       Uint8   MediaDescriptor;
-       Uint16  Unused2;
-       Uint16  SectorsPerTrack;
-       Uint16  Heads;
-       
-       // 0x1C
-       Uint64  Unused3;
-       Uint32  Unkown; // Usually 0x00800080 (according to Linux docs)
-       
-       // 0x28
-       Uint64  TotalSectorCount;       // Size of volume in sectors
-       Uint64  MFTStart;       // Logical Cluster Number of Cluster 0 of MFT
-       Uint64  MFTMirrorStart; // Logical Cluster Number of Cluster 0 of MFT Backup
-       
-       // 0x40
-       // If either of these are -ve, the size can be obtained via
-       // SizeInBytes = 2^(-1 * Value)
-       Sint8   ClustersPerMFTRecord;
-       Uint8   Unused4[3];
-       Sint8   ClustersPerIndexRecord;
-       Uint8   Unused5[3];
+       tNTFS_Attrib    *MFTDataAttr;
+       tNTFS_Attrib    *MFTBitmapAttr;
        
-       Uint64  SerialNumber;
-       
-       Uint8   Padding[512-0x50];
-       
-} PACKED       tNTFS_BootSector;
+       tNTFS_Directory RootDir;
+};
 
-/**
- * FILE header, an entry in the MFT
- */
-typedef struct sNTFS_FILE_Header
+struct sNTFS_AttribDataRun
 {
-       Uint32  Magic;  // 'FILE'
-       Uint16  UpdateSequenceOfs;
-       Uint16  UpdateSequenceSize;     // Size in words of the UpdateSequenceArray
-       
-       Uint64  LSN;    // $LogFile Sequence Number
-       
-       Uint16  SequenceNumber;
-       Uint16  HardLinkCount;  
-       Uint16  FirstAttribOfs; // Size of header?
-       Uint16  Flags;  // 0: In Use, 1: Directory
-       
-       Uint32  RecordSize;             // Real Size of FILE Record
-       Uint32  RecordSpace;    // Allocated Size for FILE Record
-       
-       /**
-        * Base address of the MFT containing this record
-        */
-       Uint64  Reference;      // "File reference to the base FILE record" ???
-       
-       Uint16  NextAttribID;
-       union
-       {
-               // Only in XP
-               struct {
-                       Uint16  AlignTo4Byte;
-                       Uint16  RecordNumber;   // Number of this MFT Record
-                       Uint16  UpdateSequenceNumber;
-                       Uint16  UpdateSequenceArray[];
-               }       XP;
-               struct {
-                       Uint16  UpdateSequenceNumber;
-                       Uint16  UpdateSequenceArray[];
-               }       All;
-       } OSDep;        
-       
-} PACKED       tNTFS_FILE_Header;
+       Uint64  Count;
+       Uint64  LCN;
+};
 
-/**
- * File Attribute, follows the FILE header
- */
-typedef struct sNTFS_FILE_Attrib
+struct sNTFS_Attrib
 {
-       Uint32  Type;   // See eNTFS_FILE_Attribs
-       Uint32  Size;   // Includes header
-       
-       Uint8   ResidentFlag;   // (What does this mean?)
-       Uint8   NameLength;
-       Uint16  NameOffset;
-       Uint16  Flags;  // 0: Compressed, 14: Encrypted, 15: Sparse
-       Uint16  AttributeID;
-       
-       union
-       {
-               struct {
-                       Uint32  AttribLen;      // In words
-                       Uint16  AttribOfs;
-                       Uint8   IndexedFlag;
-                       Uint8   Padding;
-                       
-                       Uint16  Name[]; // UTF-16
-                       // Attribute Data
-               }       Resident;
+       tNTFS_Disk      *Disk;
+       Uint32  Type;
+
+       char    *Name;
+
+       Uint64  DataSize;       
+
+        int    IsResident;
+       union {
+               void    *ResidentData;
                struct {
-                       Uint64  StartingVCN;
-                       Uint64  LastVCN;
-                       Uint16  DataRunOfs;
-                       Uint16  CompressionUnitSize;
-                       Uint32  Padding;
-                       Uint64  AllocatedSize;
-                       Uint64  RealSize;
-                       Uint64  InitiatedSize;  // One assumes, ammount of actual data stored
-                       Uint16  Name[]; // UTF-16
-                       // Data Runs
-               }       NonResident;
+                        int    nRuns;
+                        int    CompressionUnitL2Size;  // 0 = uncompressed
+                       Uint64  FirstPopulatedCluster;
+                       tNTFS_AttribDataRun     *Runs;
+               } NonResident;
        };
-} PACKED       tNTFS_FILE_Attrib;
+};
 
+// -- MFT Access / Manipulation
+extern tNTFS_Attrib    *NTFS_GetAttrib(tNTFS_Disk *Disk, Uint32 MFTEntry, int Type, const char *Name, int DesIdx);
+extern size_t  NTFS_ReadAttribData(tNTFS_Attrib *Attrib, Uint64 Offset, size_t Length, void *Buffer);
 // -- dir.c
 extern int     NTFS_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX]);
 extern tVFS_Node       *NTFS_FindDir(tVFS_Node *Node, const char *Name, Uint Flags);

UCC git Repository :: git.ucc.asn.au