Windows - статьи



Атрибуты - часть 5


PUCHAR //возвращает указатель на следующий отрезок в списке NtfsDecodeRun( PUCHAR DataRun, //на входе, указатель на отрезок для распаковки LONGLONG *DataRunOffset, //на выходе, распакованное значение кластерного смещения ULONGLONG *DataRunLength //на выходе, распакованное значение числа кластеров ) { UCHAR DataRunOffsetSize; //размер поля смещения UCHAR DataRunLengthSize; //размер поля длины CHAR i;

//из старшего полубайта считаем размер поля смещения DataRunOffsetSize = (*DataRun >> 4) & 0xF; //из младшего размер поля смещения DataRunLengthSize = *DataRun & 0xF;

*DataRunOffset = 0; *DataRunLength = 0;

//указатель на сами данные DataRun++;

//цикл распаковки длины отрезка, с каждой итерацией значение сдвигается на i-байт и //прибавляется с длиной for (i = 0; i < DataRunLengthSize; i++) { *DataRunLength += *DataRun << (i << 3); DataRun++; }

/* NTFS 3+ sparse files, если файл разряжен */ if (DataRunOffsetSize == 0) { *DataRunOffset = -1; } else { //цикл распаковки смещения for (i = 0; i < DataRunOffsetSize - 1; i++) { *DataRunOffset += *DataRun << (i << 3); DataRun++; } //последний байт может быть знаковым, поэтому он обрабатывается отдельно *DataRunOffset = ((CHAR)(*(DataRun++)) << (i << 3)) + *DataRunOffset; }

//возвращаем указатель на следующий отрезок return DataRun; }

Рис. 2. DiskExplorer for NTFS показывает список отрезков для атрибута $BITMAP у файла $MFT. Кроме того, отображает другую полезную информацию об атрибутах, включая длину, резидентен или нет.

Рис. 3. У файла $MFT атрибут дата имеет всего один отрезок, что свидетельствует о том, что он не фрагментирован и его можно индексировать как обычный массив. Данные атрибута начинаются с кластера 0xC0000 и имеют длину 0xE7A8 кластеров.




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