estrutura ATTRIBUTE_RECORD_HEADER
[Essa estrutura é válida apenas para a versão 3 dos volumes NTFS; ela pode ser alterada em versões futuras.]
Representa um registro de atributo.
Sintaxe
typedef struct _ATTRIBUTE_RECORD_HEADER {
ATTRIBUTE_TYPE_CODE TypeCode;
ULONG RecordLength;
UCHAR FormCode;
UCHAR NameLength;
USHORT NameOffset;
USHORT Flags;
USHORT Instance;
union {
struct {
ULONG ValueLength;
USHORT ValueOffset;
UCHAR Reserved[2];
} Resident;
struct {
VCN LowestVcn;
VCN HighestVcn;
USHORT MappingPairsOffset;
UCHAR Reserved[6];
LONGLONG AllocatedLength;
LONGLONG FileSize;
LONGLONG ValidDataLength;
LONGLONG TotalAllocated;
} Nonresident;
} Form;
} ATTRIBUTE_RECORD_HEADER, *PATTRIBUTE_RECORD_HEADER;
Membros
-
TypeCode
-
O código de tipo de atributo.
Valor Significado - $STANDARD_INFORMATION
- 0x10
Atributos de arquivo (como somente leitura e arquivo), carimbos de data/hora (como criação de arquivo e última modificação) e a contagem de link rígido. - $ATTRIBUTE_LIST
- 0x20
Uma lista de atributos que compõem o arquivo e a referência de arquivo do registro de arquivo MFT no qual cada atributo está localizado. - $FILE_NAME
- 0x30
O nome do arquivo, em caracteres Unicode. - $OBJECT_ID
- 0x40
Um identificador de objeto de 64 bytes atribuído pelo serviço de acompanhamento de link. - $VOLUME_NAME
- 0x60
Rótulo do volume. Presente no arquivo $Volume. - $VOLUME_INFORMATION
- 0x70
As informações de volume. Presente no arquivo $Volume. - $DATA
- 0x80
O conteúdo do arquivo. - $INDEX_ROOT
- 0x90
Usado para implementar a alocação de nome de arquivo para diretórios grandes. - $INDEX_ALLOCATION
- 0xA0
Usado para implementar a alocação de nome de arquivo para diretórios grandes. - $BITMAP
- 0xB0
Um índice de bitmap para um diretório grande. - $REPARSE_POINT
- 0xC0
Os dados do ponto de nova análise. -
Recordlength
-
O tamanho do registro de atributo, em bytes. Esse valor reflete o tamanho necessário para a variante do registro e é sempre arredondado para o limite de quadword mais próximo.
-
FormCode
-
O código do formulário de atributo.
Valor Significado - RESIDENT_FORM
- 0x00
O valor está contido no registro de arquivo e segue imediatamente o cabeçalho do registro de atributo. - NONRESIDENT_FORM
- 0x01
O valor está contido em outros setores no disco. -
NameLength
-
O tamanho do nome do atributo opcional, em caracteres ou 0 se não houver nenhum nome de atributo. O comprimento máximo do nome do atributo é de 255 caracteres.
-
NameOffset
-
O deslocamento do nome do atributo desde o início do registro de atributo, em bytes. Se o membro NameLength for 0, esse membro será indefinido.
-
Sinalizadores
-
Os sinalizadores de atributo.
-
ATTRIBUTE_FLAG_COMPRESSION_MASK (0x00FF)
-
ATTRIBUTE_FLAG_SPARSE (0x8000)
-
ATTRIBUTE_FLAG_ENCRYPTED (0x4000)
-
-
Instância
-
A instância exclusiva desse atributo no registro de arquivo.
-
Formulário
-
Se o membro FormCode for RESIDENT_FORM, a união será uma estrutura Residente . Se FormCode for NONRESIDENT_FORM, a união será uma estrutura nãosidente .
-
Residente
-
-
ValueLength
-
O tamanho do valor do atributo, em bytes.
-
ValueOffset
-
O deslocamento para o valor do início do registro de atributo, em bytes.
-
Reserved
-
Reservado.
-
-
Nãosidente
-
-
LowerVcn
-
O VCN (número de cluster virtual) mais baixo coberto por esse registro de atributo.
-
HighestVcn
-
O VCN mais alto coberto por esse registro de atributo.
-
MappingPairsOffset
-
O deslocamento para a matriz de pares de mapeamento desde o início do registro de atributo, em bytes. Para obter mais informações, consulte Comentários.
-
Reserved
-
Reservado.
-
AllocatedLength
-
O tamanho alocado do arquivo, em bytes. Esse valor é um múltiplo par do tamanho do cluster. Esse membro não será válido se o membro LowerVcn for diferente de zero.
-
FileSize
-
O tamanho do arquivo (byte mais alto que pode ser lido mais 1), em bytes. Esse membro não será válido se LowerVcn for diferente de zero.
-
ValidDataLength
-
O comprimento de dados válido (byte inicializado mais 1) válido, em bytes. Esse valor é arredondado para o limite de cluster mais próximo. Esse membro não será válido se LowerVcn for diferente de zero.
-
TotalAllocated
-
O total alocado para o arquivo (a soma dos clusters alocados).
-
-
Comentários
Observe que não há nenhum arquivo de cabeçalho associado para essa estrutura.
Essa definição de estrutura é válida apenas para a versão principal 3 e a versão secundária 0 ou 1, conforme relatado por FSCTL_GET_NTFS_VOLUME_DATA.
Os registros de atributo são sempre alinhados em um limite de quadword.
Se o atributo não for diferente, o cabeçalho do registro de atributo conterá uma lista de informações de recuperação que fornece um mapeamento entre VCN e LCN (número de cluster lógico) para o atributo. Se as informações de recuperação não se ajustarem ao segmento de arquivo base, elas poderão ser armazenadas em um segmento de registro de arquivo externo por si só. Se ele ainda não se ajustar a um segmento de registro de arquivo externo, haverá um provisionamento na lista de atributos para conter várias entradas para um atributo que requer informações de recuperação adicionais.
A matriz de pares de mapeamento é armazenada em um formulário compactado e pressupõe que as informações são descompactadas e armazenadas em cache pelo sistema. Ele consiste em uma série de pares NextVcn/CurrentLcn. Por exemplo, se um arquivo tiver uma única execução de 8 clusters começando no LCN 128 e o arquivo começar em LowerVcn 0, a matriz de pares de mapeamento terá apenas uma entrada, que é NextVcn=8 e CurrentLcn=128. A matriz é um fluxo de bytes que armazena as alterações nas variáveis de trabalho quando processadas sequencialmente. O fluxo de bytes deve ser interpretado como um fluxo com terminação zero de triplos, da seguinte maneira:
count byte = v + (l * 16)
em que v é o número de bytes vcn de baixa ordem alterados e l é o número de bytes LCN de ordem baixa alterados.
O algoritmo de descompactação é o seguinte:
- Inicialize NextVcn para
Attribute->LowestVcn
e CurrentLcn como 0. - Inicialize o ponteiro de fluxo de bytes para
(PCHAR)Attribute + Attribute->AttributeForm->Nonresident->MappingPairsOffset
. - Defina CurrentVcn como NextVcn.
- Leia o próximo byte do fluxo. Se for 0, então quebre; else extrai v e l conforme descrito anteriormente.
- Interprete os próximos bytes v como uma quantidade assinada, com o byte de baixa ordem primeiro. Desempacotar a assinatura estendida em 64 bits e adicioná-la ao NextVcn.
- Interprete os próximos l bytes como uma quantidade assinada, com o byte de baixa ordem primeiro. Desempacotar a assinatura estendida em 64 bits e adicioná-la ao CurrentLcn. Se isso produzir um CurrentLcn de 0, os VCNs de CurrentVcn para NextVcn–1 não serão alocados.
- Atualize as informações de mapeamento em cache de CurrentVcn, NextVcn e CurrentLcn.
- Vá para a etapa 3.
Confira também