Windows - статьи



Общие концепции NTFS - часть 2


/p>

Соответствующие структуры имеют вид (определения взяты из исходников Linux-NTFS Project, там же можно найти очень много информации о структурах ntfs). Так же как и FAT, NTFS хранит часть информации в блоке, называемом BIOS Parameter Block, который входит в состав boot sector.

typedef struct _BIOS_PARAMETER_BLOCK { /*0x0b*/USHORT bytes_per_sector; /* Размер сектора, в байтах */ /*0x0d*/UCHAR sectors_per_cluster; /* Секторов в кластере */ /*0x0e*/USHORT reserved_sectors; /* должен быть ноль */ /*0x10*/UCHAR fats; /* должен быть ноль */ /*0x11*/USHORT root_entries; /* должен быть ноль */ /*0x13*/USHORT sectors; /* должен быть ноль */ /*0x15*/UCHAR media_type; /* тип носителя, 0xf8 = hard disk */ /*0x16*/USHORT sectors_per_fat; /* должен быть ноль */ /*0x18*/USHORT sectors_per_track; /* не используется */ /*0x1a*/USHORT heads; /* не используется */ /*0x1c*/ULONG hidden_sectors; /* не используется */ /*0x20*/ULONG large_sectors; /* должен быть ноль */ /* sizeof() = 25 (0x19) bytes */ } BIOS_PARAMETER_BLOCK, *PBIOS_PARAMETER_BLOCK;

typedef struct _NTFS_BOOT_SECTOR { /*0x00*/UCHAR jump[3]; /* переход на загрузочный код */ /*0x03*/ULARGE_INTEGER oem_id; /* сигнатура "NTFS ". */ /*0x0b*/BIOS_PARAMETER_BLOCK bpb; /*0x24*/UCHAR physical_drive; /* не используется */ /*0x25*/UCHAR current_head; /* не используется */ /*0x26*/UCHAR extended_boot_signature; /* не используется */ /*0x27*/UCHAR reserved2; /* не используется */ /*0x28*/ULARGE_INTEGER number_of_sectors; /* Количество секторов на томе. */ /*0x30*/ULARGE_INTEGER mft_lcn; /* Стартовый кластер MFT. */ /*0x38*/ULARGE_INTEGER mftmirr_lcn;/* Стартовый кластер копии MFT */ /*0x40*/CHAR clusters_per_mft_record; /* Размер MFT записи в кластерах. */ /*0x41*/UCHAR reserved0[3]; /* зарезервировано */ /*0x44*/CHAR clusters_per_index_record;/* Размер индексной записи в кластерах. */ /*0x45*/UCHAR reserved1[3]; /* зарезервировано */ /*0x48*/ULARGE_INTEGER volume_serial_number; /* уникальный серийный номер тома */ /*0x50*/ULONG checksum; /* не используется */ /*0x54*/UCHAR bootstrap[426]; /* загрузочный-код */ /*0x1fe*/USHORT end_of_sector_marker; /* конец загрузочного сектора, сигнатура 0xaa55 */ /* sizeof() = 512 (0x200) bytes */ } NTFS_BOOT_SECTOR, *PNTFS_BOOT_SECTOR;

При проверке факта, что том является NTFS, необходимо прежде всего проверить сигнатуру «NTFS ».

if( NtfsBootSector->oem_id.QuadPart != 0x202020205346544E ) return FALSE;

Потом некоторые параметры бут сектора, как например кол-во байт в секторе и количество секторов в кластере на кратность двойки в степени.

if( NtfsBootSector->bpb.bytes_per_sector < 0x100 NtfsBootSector->bpb.bytes_per_sector > 0x1000 ) return FALSE;

//check sectors per cluster switch( NtfsBootSector->bpb.sectors_per_cluster ) { case 1: case 2: case 4: case 8: case 16: case 32: case 64: case 128: break; default: return FALSE; }

Все проверки в функции ntfs_boot_sector_is_ntfs из Linux-NTFS Project.




Содержание  Назад  Вперед