NT4/private/ntos/fsrec/ntfs_rec.h
2020-09-30 17:12:29 +02:00

151 lines
5.4 KiB
C

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
ntfs_rec.h
Abstract:
This module contains the mini-file system recognizer for NTFS.
Author:
Darryl E. Havens (darrylh) 8-dec-1992
Environment:
Kernel mode, local to I/O system
Revision History:
--*/
//
// The fundamental unit of allocation on an Ntfs volume is the
// cluster. Format guarantees that the cluster size is an integral
// power of two times the physical sector size of the device. Ntfs
// reserves 64-bits to describe a cluster, in order to support
// large disks. The LCN represents a physical cluster number on
// the disk, and the VCN represents a virtual cluster number within
// an attribute.
//
typedef LARGE_INTEGER LCN;
typedef LCN *PLCN;
typedef LARGE_INTEGER VCN;
typedef VCN *PVCN;
typedef LARGE_INTEGER LBO;
typedef LBO *PLBO;
typedef LARGE_INTEGER VBO;
typedef VBO *PVBO;
//
// The boot sector is duplicated on the partition. The first copy
// is on the first physical sector (LBN == 0) of the partition, and
// the second copy is at <number sectors on partition> / 2. If the
// first copy can not be read when trying to mount the disk, the
// second copy may be read and has the identical contents. Format
// must figure out which cluster the second boot record belongs in,
// and it must zero all of the other sectors that happen to be in
// the same cluster. The boot file minimally contains with two
// clusters, which are the two clusters which contain the copies of
// the boot record. If format knows that some system likes to put
// code somewhere, then it should also align this requirement to
// even clusters, and add that to the boot file as well.
//
// Part of the sector contains a BIOS Parameter Block. The BIOS in
// the sector is packed (i.e., unaligned) so we'll supply an
// unpacking macro to translate a packed BIOS into its unpacked
// equivalent. The unpacked BIOS structure is already defined in
// ntioapi.h so we only need to define the packed BIOS.
//
//
// Define the Packed and Unpacked BIOS Parameter Block
//
typedef struct _PACKED_BIOS_PARAMETER_BLOCK {
UCHAR BytesPerSector[2]; // offset = 0x000
UCHAR SectorsPerCluster[1]; // offset = 0x002
UCHAR ReservedSectors[2]; // offset = 0x003 (zero)
UCHAR Fats[1]; // offset = 0x005 (zero)
UCHAR RootEntries[2]; // offset = 0x006 (zero)
UCHAR Sectors[2]; // offset = 0x008 (zero)
UCHAR Media[1]; // offset = 0x00A
UCHAR SectorsPerFat[2]; // offset = 0x00B (zero)
UCHAR SectorsPerTrack[2]; // offset = 0x00D
UCHAR Heads[2]; // offset = 0x00F
UCHAR HiddenSectors[4]; // offset = 0x011 (zero)
UCHAR LargeSectors[4]; // offset = 0x015 (zero)
} PACKED_BIOS_PARAMETER_BLOCK; // sizeof = 0x019
typedef PACKED_BIOS_PARAMETER_BLOCK *PPACKED_BIOS_PARAMETER_BLOCK;
//
// Define the boot sector. Note that MFT2 is exactly three file
// record segments long, and it mirrors the first three file record
// segments from the MFT, which are MFT, MFT2 and the Log File.
//
// The Oem field contains the ASCII characters "NTFS ".
//
// The Checksum field is a simple additive checksum of all of the
// ULONGs which precede the Checksum ULONG. The rest of the sector
// is not included in this Checksum.
//
typedef struct _PACKED_BOOT_SECTOR {
UCHAR Jump[3]; // offset = 0x000
UCHAR Oem[8]; // offset = 0x003
PACKED_BIOS_PARAMETER_BLOCK PackedBpb; // offset = 0x00B
UCHAR Unused[4]; // offset = 0x024
LARGE_INTEGER NumberSectors; // offset = 0x028
LCN MftStartLcn; // offset = 0x030
LCN Mft2StartLcn; // offset = 0x038
CHAR ClustersPerFileRecordSegment; // offset = 0x040
UCHAR Reserved0[3];
CHAR DefaultClustersPerIndexAllocationBuffer; // offset = 0x044
UCHAR Reserved1[3];
LARGE_INTEGER SerialNumber; // offset = 0x048
ULONG Checksum; // offset = 0x050
UCHAR BootStrap[0x200-0x044]; // offset = 0x054
} PACKED_BOOT_SECTOR; // sizeof = 0x200
typedef PACKED_BOOT_SECTOR *PPACKED_BOOT_SECTOR;
//
// Define the functions provided by this driver.
//
BOOLEAN
IsNtfsVolume(
IN PPACKED_BOOT_SECTOR BootSector,
IN ULONG BytesPerSector,
IN PLARGE_INTEGER NumberOfSectors
);
BOOLEAN
GetDeviceValues(
IN PDEVICE_OBJECT DeviceObject,
OUT PULONG BytesPerSector,
OUT PLARGE_INTEGER NumberOfSectors
);
BOOLEAN
NtfsReadBlock(
IN PDEVICE_OBJECT DeviceObject,
IN PLARGE_INTEGER ByteOffset,
IN ULONG MinimumBytes,
IN ULONG BytesPerSector,
OUT PVOID *Buffer
);