Lista de Figuras - din.uem.broasantos/Monografias/Recuperador-de-Arquivos.pdf · levam a remoção...

74
Universidade Estadual de Maringá Centro de Tecnologia Departamento de Informática Ferramenta Recuperador de Arquivos Perdidos Marcos Massao Yamamoto TG-01-04 Maringá - Paraná Brasil

Transcript of Lista de Figuras - din.uem.broasantos/Monografias/Recuperador-de-Arquivos.pdf · levam a remoção...

Universidade Estadual de Maringá Centro de Tecnologia Departamento de Informática

Ferramenta Recuperador de Arquivos Perdidos

Marcos Massao Yamamoto

TG-01-04

Maringá - Paraná

Brasil

i

Universidade Estadual de Maringá Centro de Tecnologia

Departamento de Informática

Ferramenta Recuperador de Arquivos Perdidos

Marcos Massao Yamamoto

TG-01-04

Trabalho de Graduação apresentado ao Curso de Informática, do Centro de Tecnologia, da Universidade Estadual de Maringá. Orientador: Prof. MsC. Osvaldo Alves dos Santos

Maringá – Paraná

2004

i

Marcos Massao Yamamoto

Ferramenta Recuperador de Arquivos Perdidos

Este exemplar corresponde à redação final da monografia aprovada como requisito parcial para obtenção do grau de Bacharel em Informática da Universidade Estadual de Maringá, pela comissão formada pelos professores:

________________________________________ Orientador: Prof. MsC. Osvaldo Alves dos Santos

Departamento de Informática, CTC, DIN

________________________________________ Prof. Dr. Ronaldo Augusto de Lara Gonçalves

Departamento de Informática, CTC, DIN

________________________________________ Prof. MsC. Flávio Arnaldo Braga da Silva Departamento de Informática, CTC, DIN

Maringá, Fevereiro de 2004

ii

Universidade Estadual de Maringá Departamento de Informática

Av. Colombo 5790, Maringá-PR CEP 87020-900

Tel: (044) 2262727 R. 219/324 Fax: (044) 2232676

iii

Agradecimentos

Agradeço primeiramente a Deus, por ser fonte inesgotável de luz que ilumina e guia todos

os meus passos, trazendo paz e serenidade nos momentos escuros que fazem parte de

nossas vidas.

Agradeço de coração aos meus pais, pela oportunidade de vida, pelo amor e alegrias que os

fazem dela, pelos sábios conselhos nos momentos difíceis, pelos carinhos e motivação nos

momentos de desesperos. Por tudo, e que somente palavras não podem agradecer...

Agradeço ao meu orientador, Osvaldo, que mesmo passando por problemas de saúde,

esteve sempre ao meu lado, com nobres conselhos...

Agradeço aos professores Ronaldo e Flávio, que me ajudaram e orientaram durante a

ausência de meu orientador...

Agradeço aos demais professores, Franklin, Ricardo Ciferri, Morandini, que me ajudaram

com conselhos e materiais, na medida que possível...

Agradeço ao meu pai, ao Elton, ao Morikawa e ao Slivak, que me auxiliaram também, na

medida que possível, com informações, materiais e conselhos...

Agradeço também a toda a galera do curso, que vivem reclamando e se queixando, e me

deixaram mais desesperado no desenvolvimento de meu trabalho...

E é claro, agradeço ao tiozinho do boteco, que manteve a cerveja sempre gelada, trazendo

paz, serenidade e muita alegria nos momentos em que a nossa cabeça estava para explodir.

iv

Resumo

Neste trabalho serão apresentados propostas para implementação de uma ferramenta de

recuperação de arquivos perdidos ou apagados. Estes podem ser removidos por ação de

vírus, tabela de alocação de arquivos perdida, trilha zero danificada, mídia de baixa

qualidade, queda ou oscilação de energia, formatação rápida indevida ou acidental.

A ferramenta fará recuperação de dados que foram perdidos logicamente, ou seja, quando

estas informações não estiverem contidas em blocos de disco com danos físicos. Seu

objetivo é fazer uma varredura na mídia e apresentar todos os arquivos ainda disponíveis, e

executar a sua recuperação.

A ferramenta será baseada na recuperação de dados para o sistema operacional da família

Microsoft Windows 9X e ME, com sistema de arquivos de tabela de alocação de arquivos.

Serão apresentadas informações referentes à estrutura do disco rígido, os motivos que

levam a remoção de arquivos e como é possível executar uma recuperação.

v

Abstract

In this work, will be shown proposals for implementation of an extinguished or lost archives recovery's tool. These can be removed by virus action, by File Allocation Table lost, by zero track damaged, by low quality media type, by energy oscillation or lack, or by improper or accidental fast formatting. The tool will make data’s recovery that had been logically lost, or either, when these information is not contained in record's blocks that are physically damaged. It's objective is to make scans in the media and still to show all the available files, and to execute its recovery. The tool will be based on the recovery’s data for Microsoft Windows 9X and ME operational system family, with file’s system of file allocation table. It will be shown references information to the hard disk structure, the reasons that take the files to be removed and how it is possible to execute a recovery.

vi

Índice CAPÍTULO 1 1 INTRODUÇÃO 1 1.1 MOTIVAÇÃO 1 1.2 PROPÓSITOS E OBJETIVOS 2 1.2.1 Objetivos específicos 2 1.3 ORGANIZAÇÃO E AUDIÊNCIA DO DOCUMENTO 2 CAPÍTULO 2 4 GERENCIAMENTO DE DISCO 4 2.1 INTRODUÇÃO 4 2.2 OS DISCOS E SUA ORGANIZAÇÃO 4 2.3 TÉCNICAS DE ALOCAÇÃO DE ESPAÇO EM DISCO 5 2.4 SISTEMA DE TABELA DE ALOCAÇÃO DE ARQUIVOS 9 2.4.1 Setor de boot 10 2.4.2 Tabela de alocação de arquivos 11 2.4.2.1 Interpretando a tabela de alocação de arquivos 13 2.4.3 Diretório raiz 15 2.4.4 Nomes longos 17 2.5 ORGANIZAÇÃO LÓGICA: PARTIÇÕES E VOLUMES 18 CAPÍTULO 3 21 RECUPERAÇÃO DE ARQUIVOS PERDIDOS 21 3.1 INTRODUÇÃO 21 3.2 ARQUIVOS PERDIDOS 21 3.2.1 Problemas nas informações de controle do sistema 21 3.2.2 Dados apagados por remoção ou formatação 22 3.3 FERRAMENTAS DE RECUPERAÇÃO 25 3.3.1 Ferramenta Disk Investigator 25 3.3.2 Ferramenta File Recover 26 3.3.3 Ferramenta Magic Recovery 27 3.3.4 Ferramenta Recover4All Professional 28 3.3.5 Ferramenta Super Undelete 29 CAPÍTULO 4 30 PROPOSTAS DE METODOLOGIAS DE RECUPERAÇÃO 30 4.1 INTRODUÇÃO 30 4.2 RECUPERANDO ARQUIVOS 31 4.2.1 Danos no Master Boot Record 31 4.2.2 Danos no setor de boot da partição 33 4.2.3 Danos na tabela de alocação de arquivos 35 4.2.4 Danos no diretório raiz 36 4.2.5 Perda de arquivos por remoção ou formatação 37 4.3 TRANSFERÊNCIA DOS DADOS RECUPERADOS 38 4.4 LINGUAGEM DE PROGRAMAÇÃO C 39 CONCLUSÃO 41 REFERÊNCIA BIBLIOGRÁFICA 43

vii

Lista de Figuras

Figura 2.1 – Ilustração do disco rígido 4 Figura 2.2 – Ilustração técnica de alocação contígua 6 Figura 2.3 – Ilustração técnica de alocação por lista encadeada 7 Figura 2.4 – Ilustração técnica de alocação por lista encadeada com índice 7 Figura 2.5 – Ilustração técnica de alocação indexada 8 Figura 2.6 – Área de sistema e área de dados de uma partição 9 Figura 2.7 – Hexadecimal do setor de boot 10 Figura 2.8 – Diretório raiz com a tabela de alocação de arquivos 12 Figura 2.9 – Hexadecimal da tabela de alocação de arquivos 13 Figura 2.10 – Ilustração entrada de diretório do sistema TAA 16 15 Figura 2.11 – Hexadecimal do diretório raiz 16 Figura 2.12 – Ilustração entrada de diretório do sistema TAA 32 17 Figura 2.13 – Hexadecimal entrada de diretório com nome longo 18 Figura 2.14 – Hexadecimal do setor contendo uma tabela de partições 20 Figura 3.1 – Hexadecimal do diretório raiz antes de uma remoção 23 Figura 3.2 – Hexadecimal da tabela de alocação de arquivos antes de uma remoção 23 Figura 3.3 – Hexadecimal do diretório raiz depois de uma remoção 23 Figura 3.4 – Hexadecimal da tabela de alocação de arquivos depois de uma remoção 23 Figura 3.5 – Hexadecimal do diretório raiz antes de uma formatação 24 Figura 3.6 – Hexadecimal da tabela de alocação de arquivos antes de uma formatação 24 Figura 3.7 – Hexadecimal do diretório raiz depois de um formatação 24 Figura 3.8 – Hexadecimal da tabela de alocação de arquivos depois de uma formatação 24 Figura 3.9 – Tela principal da ferramenta Disk Investigator 25 Figura 3.10 – Tela principal da ferramenta File Recover 26 Figura 3.11 – Tela principal da ferramenta Magic Recovery 27 Figura 3.12 – Tela principal da ferramenta Recover4All 28 Figura 3.13 – Tela principal da ferramenta Super Undelete 29 Figura 4.1 – Hexadecimal do começo e final do setor de boot 31 Figura 4.2 – Hexadecimal do setor contendo a tabela de partições 32 Figura 4.3 – Hexadecimal início TAA 12 34 Figura 4.4 – Hexadecimal início TAA 16 34 Figura 4.5 – Hexadecimal início TAA 32 34 Figura 4.6 – Entrada reservada ponto e ponto-ponto dos sub-diretórios 37 Figura 4.7 – Informação de tamanho do arquivo na entrada de diretório 38

viii

Lista de Tabelas

Tabela 2.1 – Campos do setor de boot 11 Tabela 2.2 – Valores das entradas da tabela de alocação de arquivos 12 Tabela 2.3 – Entrada de diretório do sistema TAA 16 15 Tabela 2.4 – Entrada de diretório do sistema TAA 32 16 Tabela 2.5 – Informação especial no campo nome 17 Tabela 2.6 – Configuração da tabela de partições 19 Tabela 2.7 – Entrada na tabela de partições 19

1

Capítulo 1

Introdução

1.1 Motivação

Com freqüência, perdemos arquivos contendo informações importantes em nossos

computadores. Perdas podem ocorrer por vários motivos, como por ação de vírus, falhas no

sistema de arquivos, mídia de baixa qualidade, etc. Geralmente, as informações e os dados

de um arquivo perdido são mantidos no disco, porém, não visíveis ao sistema operacional.

E ali serão mantidos, até serem sobrescritos.

Existem muitas ferramentas e empresas especializadas que realizam a recuperação de

arquivos perdidos. Mas geralmente, essa recuperação possui um custo muito elevado,

sendo requisitada somente por empresas de grande porte, as quais trabalham com

informações realmente valiosas.

É necessário, nos dias de hoje, onde a informatização abrange a maior parte das pequenas

empresas, comércios e residências, a disponibilidade de uma ferramenta de baixo custo e

eficiente, para se recuperar arquivos nos problemas que ocorrem nos computadores em

nosso dia-a-dia. É de grande importância pois, quando ocorrem problemas, nem mesmo os

backups recuperam as últimas atualizações.

1.2 Propósitos e Objetivos

A idéia desse trabalho é servir como base, para futura implementação, das possibilidades

de recuperação de arquivos perdidos, conforme o problema especificado. São apresentados

de forma simples e clara, os possíveis sintomas da ocorrência de problemas que ocasionam

perdas, e como tratá-los. Para cada caso, haverá uma proposta de recuperação e, se o

mesmo não for possível, será apresentada sua justificativa.

2

1.2.1 Objetivos específicos

O objetivo principal desta monografia, é apresentar propostas de metodologias de

recuperação de arquivos, para que possam ser utilizadas em ensino de graduação, em uma

implementação ou em um aperfeiçoamento para utilização em outros projetos.

1.3 Organização e Audiência do documento

O capítulo 2 traz uma visão geral da organização de um disco, mostrando os conceitos e

definições de sua arquitetura. São apresentados a organização de sua estrutura física e

como são configuradas as informações referentes ao sistema de arquivo. Conheceremos

também toda a estrutura de controle de uma mídia, e como identificar e traduzir as

informações inerentes ao disco.

O capítulo 2 é um capítulo conceitual. Assim sendo, a audiência que pode se beneficiar da

leitura são pessoas que conhecem ou trabalham com implementação de ferramentas e

aplicativos, mas não estão envolvidas especificamente com as atividades relacionadas à

arquitetura física de uma mídia, ou então não as visualizam de maneira formalizada.

O capítulo 3 apresenta informações relacionadas à recuperação de arquivos perdidos. São

apresentados e comentados os principais fatores que levam a uma perda de arquivos, onde

são danificados ou alterados e porque resultam em remoções. São citadas também algumas

ferramentas que executam a recuperação de arquivos apagados, descrevendo suas

características e sua funcionalidade.

A audiência que pode se beneficiar da leitura do capítulo 3 são as pessoas que trabalham

com computadores, mas não conhecem os motivos que levam a problemas em suas

máquinas, ocasionando em perda de tempo e informações relacionados a sua função.

O capítulo 4 apresenta as propostas de metodologias de recuperação de arquivos perdidos,

organizado conforme o problema que ocasionou essa remoção. São citados os sintomas

que caracterizam o problema e como devem ser tratados para sua recuperação. Serão

apresentados passo-a-passo os procedimentos que devem ser executados para se obter as

3

informações referentes aos arquivos removidos. Será comentada também, a linguagem de

programação recomendada para a implementação dessa ferramenta, assim como as

características que levaram a sua escolha.

O capítulo 4 está voltado para as pessoas com conhecimento em programação, que desejem

implementar uma ferramenta que execute a recuperação de arquivos perdidos ou uma

operação similar. Também podem se beneficiar da leitura estudiosos da área de sistemas

operacionais ou algoritmos e estrutura de dados, para utilização em ensino de graduação.

4

Capítulo 2

Gerenciamento de disco

2.1 Introdução

Neste capítulo, teremos uma visão geral sobre a estrutura física de discos rígidos e

disquetes, e a organização lógica das áreas de um disco. Veremos os discos sob a

perspectiva do sistema operacional, como ele os organiza e usa.

2.2 Os discos e sua organização

Um disco consiste em um prato com inúmeros anéis de cada lado, onde esses anéis são

conhecidos como trilhas. Cada trilha é divido em seções, conhecidos como setores. Um

setor é a menor unidade física de armazenamento em um disco, geralmente com tamanho

de 512 bytes. Veja ilustração na figura 2.1. [Norton, 1989]

Figura 2.1 – Ilustração do disco rígido

As trilhas são uma estrutura lógica, estabelecidas na formatação de baixo nível. O conjunto

de trilha na mesma posição no disco, em relação à cabeça de leitura/escrita, é considerada

como cilindro. Uma cabeça de leitura/escrita é um transdutor que pode ser posicionado

sobre uma trilha de disco por meio de um solenóide ou motor, e pode alterar as

propriedades magnéticas da mídia. [Holzner,1990]

5

O sistema operacional não opera diretamente os setores, e sim, os agrupamentos de

unidades. Um agrupamento de unidades é um grupo seqüencial de setores, e todos

agrupamentos de unidades contêm a mesma quantidade de setores. Todas essas estruturas,

na mídia, são definidas na formatação, e nela o controlador de disco se baseia para se

movimentar e se localizar na superfície de um disco. [ClayBrook, 1985]

2.3 Técnicas de alocação de espaço em disco

Nesta seção, será apresentada a maneira de como os arquivos e diretórios são realmente

armazenados, como o espaço em disco é gerenciado e como tudo isso funciona eficiente e

confiavelmente. Conheceremos como são monitorados os blocos de disco que

acompanham um arquivo e os métodos utilizados por diferentes sistemas operacionais.

Existem várias técnicas de alocação de espaço em disco, e as principais são: alocação

contígua, alocação por lista encadeada, alocação por lista encadeada utilizando um índice e

alocação indexada (Nós-I).

2.3.1 Alocação contígua

Nessa técnica, os arquivos são armazenados em blocos contínuos de dados, conforme

ilustração na figura 2.2. È fácil de implementar, pois armazena nas entradas de diretório

somente o endereço do primeiro bloco do arquivo, e possui um excelente desempenho,

pois o arquivo inteiro pode ser lido do disco em uma única operação. [Unisinos, 2004]

Infelizmente, a alocação contígua possui duas desvantagens. A primeira consiste na

inviabilidade de gravação de arquivos, quando seu tamanho máximo não seja conhecido.

Sem essa informação, o sistema operacional não sabe quanto espaço em disco deve ser

reservado. A segunda desvantagem é o desperdício do espaço que, de outra maneira,

poderia ser utilizado. Esse problema resulta na fragmentação do disco. [Tanenbaum, 2000]

6

Figura 2.2 – Ilustração técnica de alocação contígua

2.3.2 Alocação por lista encadeada

Na alocação por lista encadeada, cada arquivo é mantido como uma lista encadeada de

blocos de disco, conforme a ilustração na figura 2.3. A primeira palavra de cada bloco de

dados é utilizada para apontar o bloco seguinte, e todos os blocos do disco podem ser

utilizados, evitando a fragmentação. Nessa técnica, armazena-se também somente o

endereço do primeiro bloco do arquivo, na entrada de diretório, onde o restante pode ser

encontrado a partir dos blocos de dados. [Tanenbaum, 2000]

Embora a leitura seqüencial seja rápida, o acesso aleatório é extremamente lento. Além

disso, os dados armazenados em blocos não são potência de dois, devido o espaço ocupado

pelo ponteiro da lista encadeada. [Tanenbaum, 2000]

7

Figura 2.3 – Ilustração técnica de alocação por lista encadeada

2.3.3 Alocação por lista encadeada utilizando um índice

Nessa técnica é utilizada uma tabela, alocada na memória, para armazenar os ponteiros que

apontam os bloco utilizados, conforme a ilustração na figura 2.4. Dessa maneira, elimina-

se as desvantagens da alocação por lista encadeada, pois agiliza o acesso aos blocos e

disponibiliza o bloco inteiro para o armazenamento dos dados. O sistema operacional MS-

DOS/Windows 95 utiliza esse método, denominado Tabela de Alocação de Arquivos.

[Unisinos, 2004]

Figura 2.4 – Ilustração técnica de alocação por lista encadeada com índice

8

A principal desvantagem desse método é que a tabela inteira deve estar na memória, o

tempo todo, para o seu funcionamento. Isso se percebe claramente nas tabelas maiores,

relacionados aos discos com grandes quantidades de blocos. [Tanenbaum, 2000]

2.3.4 Alocação indexada

Na alocação indexada, é associada em cada arquivo uma pequena tabela chamada de nó-i

(nó de índice), que lista os atributos e endereço de disco dos blocos do arquivo, conforme a

ilustração na figura 2.5. Na entrada de diretório do arquivo, é armazenado somente o

endereço do bloco de dados dessa tabela. Os primeiros endereços de disco, de um arquivo,

são armazenados nessa tabela nó-i. Caso o arquivo for muito grande, um dos endereços

dessa tabela aponta para um bloco contendo o restante dos endereços. Esse bloco é

denominado de bloco indireto, e a quantidade de blocos indiretos é determinada pelo

tamanho do arquivo. O Unix utiliza esse método. [Tanenbaum, 2000]

Figura 2.5 – Ilustração técnica de alocação indexada

9

2.4 Sistema de Tabela de alocação de arquivos

A fim de organizar os discos, o sistema operacional divide-o em duas partes: área de

sistema, com as informações sobre o disco, e a área de dados, onde os arquivos são

armazenados (figura 2.6). A área do sistema armazena as informações do disco, conforme

o sistema de arquivo definido na formatação. Conforme o problema proposto,

trabalharemos somente com o sistema de arquivo de tabela de alocação de arquivos.

Figura 2.6 – Área de sistema e área de dados de uma partição

O setor de boot, ou registro de boot, é a primeira parte de um disco para o sistema

operacional. Ele contém informações importantes da estrutura lógica do disco e um

programa curto, que executa a tarefa de iniciar a carga do sistema operacional na memória

do computador. [Holzner, 1990]

Logo após o setor de boot, se encontra uma seção do sistema conhecida com tabela de

alocação de arquivos – TAA. O TAA é responsável pela informação da situação de cada

parte do disco. Através da TAA é possível verificar quais os agrupamentos de unidades

estão ocupados e quais estão disponíveis para novos dados.

A última parte da área de sistema do disco é o diretório raiz. Ele contém o registro das

informações dos arquivos armazenados no disco. Entre o TAA e o diretório raiz, podem

existir cópias adicionais do TAA. Como o TAA serve como um índice dos blocos de um

disco, é necessário manter pelo menos uma cópia de segurança, para garantir sua

integridade.

10

No primeiro setor de um disco rígido, junto com a primeira partição, está localizado o

Master Boot Record. Ele contém uma pequena quantidade de código executável e a tabela

de partições. Essa tabela contém as informações sobre as partições existentes no disco.

Cada partição é visualizada pelo sistema operacional como um disco lógico, podendo

conter sistemas de arquivos diferentes. [WinNT, 1997]

2.4.1 Setor de Boot

O setor de boot, localizado sempre no primeiro setor da partição, é a estrutura de dados

mais importante do sistema de arquivo. Um grande componente deste setor de inicialização

é o bloco de parâmetros BIOS (BPB), que possui as informações apresentadas na tabela

2.1. Esta estrutura contém as características do disco físico, que permitem o acionador de

disco calcular o endereço apropriado para um dado número de setor lógico. Nela é possível

também, que os utilitários do sistema, calculem o endereço e o tamanho de cada uma das

áreas de controle do disco (tabela de alocação de arquivos e diretório raiz). [Duncan, 1991]

Figura 2.7 – Hexadecimal do setor de boot

11

Tabela 2.1 – Campos do setor de boot

Offset do

byte

Tamanho do

campo Significado

0X00

0X03

0X0B

0X0D

0X0E

0X10

0X11

0X13

0X15

0X16

0X18

0X1A

0X1C

0X20

0X24

0X25

0X26

0X27

0X2B

0X36

0X3E

8 BYTES

2 BYTES

BYTE

2 BYTES

BYTE

2 BYTES

2 BYTES

BYTE

2 BYTES

2 BYTES

2 BYTES

DWORD

DWORD

BYTE

BYTE

BYTE

4 BYTE

11 BYTES

8 BYTES

E9 XX XX ou EB XX 90

Nome e versão OEM

Bytes por setor.

Setores por agrupamento de unidades.

Setores reservados.

Número de tabelas de alocação de arquivos.

Número de entradas ao diretório raiz.

Número de setores no volume, se couber em 16 bits.

Byte de descrição da mídia.

Setores por tabela de alocação de arquivos.

Setores por trilha.

Número de cabeças.

Número de setores ocultos.

Número de setores no volume, maiores que 16 bits.

Número da unidade física.

Reservado.

Registro de assinatura de inicialização estendida

Número de série do volume.

Rótulo do volume.

Reservado.

Auto inicialização.

2.4.2 Tabela de Alocação de Arquivos - TAA

A área de arquivos de um disco é dividida em grupos de setores, conhecidos como unidade

de alocação ou clusters (agrupamento de unidades). A quantidade de setores em um

agrupamento de unidades é definida na formatação e está definida no bloco de parâmetros

da BIOS, podendo ser encontrado no setor de inicialização. A tabela de alocação de

arquivos é dividida em campos, onde cada campo corresponde diretamente a um

agrupamento de unidades atribuído no disco, conforme ilustração na figura 2.8. [Tischer,

1992]

12

Figura 2.8 – Diretório raiz com a tabela de alocação de arquivos

Cada campo da TAA pode ter 12, 16 ou 32 bits. O TAA 12 possui entradas de 12 bits e é

utilizado para mídias com menos de 4087 agrupamentos de unidades, armazenando

informações de discos ou partições de até 32 Mbytes. Já o TAA 16, possui entrada de 16

bits e consegue trabalhar com 65536 agrupamentos de unidades por disco, armazenando

até 2 Gbytes. O TAA 32, possui entradas de 32 bits, mas possui o tamanho máximo de 2

Tbytes. Apesar de seu endereçamento ser de 32 bits, na verdade são usados apenas 28. E,

segundo a Microsoft, o número máximo de setores que um disco pode ter é de 2 elevado a

32, ou seja, como cada setor tem 512 bytes, o tamanho máximo de um disco no TAA 32

acaba sendo de 2 Tbytes.[Infowester, 2004]

Os dois primeiros campos da TAA são sempre reservados. O restante descreve a utilização

de seus agrupamentos correspondentes e podem ser interpretados da seguinte maneira:

Tabela 2.2 – Valores das entradas da tabela de alocação de arquivos

Valor Significado (D)000H

(F)FF0-(F)FF6H

(F)FF7H

(F)FF8-(F)FFFH

(X)XXX

Agrupamento de unidade disponível

Agrupamento de unidade reservado

Agrupamento de unidade com defeito, se não for parte da cadeia

Último agrupamento do arquivo

Próximo agrupamento do arquivo

13

No diretório raiz, cada arquivo contém o número do primeiro agrupamento atribuído

àquele arquivo, que representa a sua entrada na TAA. A partir dessa entrada na TAA, cada

campo contém o número do próximo agrupamento, até encontrar o valor de último

agrupamento. As entradas podem ter outros valores, conforme a tabela 2.2.

Figura 2.9 – Hexadecimal da tabela de alocação de arquivos

Para garantir a integridade das informações, geralmente são definidas uma ou mais cópias

da TAA em cada volume, na formatação. O sistema operacional atualiza simultaneamente

todas as cópias, toda vez que a TAA é alterada. Se ocorrer uma falha na TAA, o sistema

operacional verifica as cópias, até que seja obtida uma leitura bem-sucedida ou que todas

cópias sejam exauridas. [Tischer, 1992]

2.4.2.1 Interpretando a Tabela de Alocação de Arquivos

Após compreender como a tabela de alocação de arquivos é estruturada, veremos como

utilizar este conhecimento para encontrar uma posição na tabela a partir de um número de

agrupamento de unidades. (Modelo de código implementado no Apêndice B)

14

Se a tabela de alocação de arquivos tiver entradas de 12bits, utilize o seguinte

procedimento:

1) Utilize a entrada de diretório para encontrar o agrupamento inicial do arquivo em

questão;

2) Multiplique o número do agrupamento por 1.5;

3) Utilize a parte inteira do produto como o deslocamento na tabela de alocação de

arquivos e mova a palavra naquele deslocamento para um registrador;

4) Se o produto for um número inteiro, execute um AND entre o registrador e 0FFFH;

5) Caso contrário, faça um “deslocamento lógico” do registrador 4 bits para a direta;

6) Se o resultado for o valor de final de arquivo, o mesmo não tem mais nenhum

agrupamento de unidades. Caso contrário, o resultado é o número do próximo

agrupamento.

Se a tabela de alocação de arquivos tiver entradas de 16 bits, utilize os seguintes

procedimentos:

1) Utilize a entrada de diretório para encontrar o agrupamento inicial do arquivo em

questão;

2) Multiplique o número do agrupamento por 2;

3) Utilize o produto como deslocamento na tabela de alocação de arquivos e mova a

palavra naquele deslocamento para um registrador;

4) Se o resultado for um valor de final de arquivo, o mesmo não tem mais nenhum

agrupamento de unidade. Caso contrário, o resultado é o número do próximo

agrupamento.

Se a tabela de alocação de arquivos tiver entradas de 32 bits, utilize os mesmos

procedimentos usados na tabela de 16 bits, mudando apenas a multiplicação solicitada no

passo 2 para 4, pois cada entrada na tabela ocupam agora 4 bytes.

15

2.4.3 Diretório Raiz

O diretório raiz ocupa alguns setores no disco, logo após os setores ocupados pela tabela de

alocação de arquivos. Cada arquivo ou diretório contido nesta partição possui uma entrada

no diretório raiz, com o nome do arquivo, a extensão, a data de quando foi criado ou

quando foi feita a última modificação, o tamanho em bytes e o número do agrupamento de

unidades onde o arquivo começa. O tamanho de cada entrada no diretório raiz é de 32

bytes. [Duncan, 1991]

Os campos das entradas do diretório raiz para o sistema de tabela de alocação de arquivos

com entradas de 16 bits possui a seguinte configuração:

Tabela 2.3 – Entrada de diretório do sistema TAA 16

Valor Siginificado

00H

08H

0BH

0CH

16H

18H

1AH

1CH

Nome do arquivo.

Extensão.

Atributo do arquivo.

Reservado.

Horário de criação ou última atualização.

Data de criação ou última atualização.

Agrupamento de unidades inicial.

Tamanho do arquivo

Figura 2.10 – Ilustração entrada de diretório do sistema TAA 16

16

Figura 2.11 – Hexadecimal do diretório raiz

Já no sistema de tabela de alocação de arquivos com entradas de 32 bits, são utilizados os

campos antes reservados, e possui a seguinte configuração:

Tabela 2.4 – Entrada de diretório do sistema TAA 32

Valor Siginificado

00H

08H

0BH

0CH

0DH

0EH

10H

12H

14H

16H

18H

1AH

1CH

Nome do arquivo.

Extensão.

Atributo do arquivo.

Capitalização.

Mseg. da criação

Horário de criação.

Horário de acesso.

Data de acesso.

Agrupamento de unidades inicial – H.

Horário da última atualização.

Data da última atualização.

Agrupamento de unidades inicial – L.

Tamanho do arquivo.

17

Figura 2.12 – Ilustração entrada de diretório do sistema TAA 32

O primeiro byte do campo do nome de arquivo de uma entrada de diretório pode conter

ainda a seguinte informação especial:

Tabela 2.5 – Informação especial do campo nome

Valor Significado 00H

05H

2EH

E5H

Entrada ao diretório nunca foi utilizada; fim da porção ocupada do diretório.

O primeiro caractere do nome do arquivo é realmente E5H.

Entrada é um pseudônimo para o diretório pai ou atual.

Arquivo foi apagado.

A primeira entrada do diretório raiz pode conter o rótulo de volume, caso possuir. A

localização exata e o tamanho do diretório raiz são definidos na formatação, quando o

disco é inicializado.

2.4.4 Nomes Longos

A tabela de alocação de arquivos com endereçamento de 12 e 16 bits, usada pelo DOS

possui uma grande restrição em relação ao tamanho dos nomes de arquivos, que não

podem ter mais de oito caracteres. Para eliminar essa limitação, e continuar usando a tabela

de alocação de arquivos com endereçamento de 12 e 16 bits, foi integrada a essa tabela um

novo sistema chamado VFAT. [Guia, 2004]

18

Através do VFAT, os arquivos com nomes longos são gravados no diretório raiz

respeitando sua configuração, de oito caracteres, e o nome verdadeiro gravado em uma

área reservada. Uma listagem de arquivos a partir do DOS, o sistema leria apenas o nome

simplificado (com oito caracteres). Através do Windows 95 seria possível acessar as áreas

ocultas do VFAT e ver os nomes completos dos arquivos. [Guia, 2004]

Nos testes executados nos sistemas TAA 16 e TAA 32, pôde-se verificar que as entradas

de diretório mantém a mesma configuração de 8 caracteres no diretório raiz. Entretanto,

quando se utilizam nomes longos, são reservadas outras entradas de diretório,

subseqüentes, contendo os caracteres do nome do arquivo.

Figura 2.13 – Hexadecimal entrada de diretório com nome longo

2.5 Organização lógica: Partições e Volumes

Um disco rígido pode ser dividido em mais de um agrupamento de setores lógicos,

considerados partições. Cada partição é tratada como uma unidade lógica separada,

podendo ter sistemas de arquivos diferentes. [Duncan, 1991]

As informações sobre as partições primárias e partições estendidas estão contidas na tabela

de partição, uma estrutura de dados de 64 bytes posicionada no Master Boot Record (setor

1, cabeça 0, cilindro 0). Cada entrada na tabela de partições tem o tamanho de 16 bytes,

possibilitando um número máximo de 4 entradas, conforme ilustrado na Tabela 2.6.

[WinNT, 1997]

19

Tabela 2.6 – Configuração da tabela de partições

Bytes Conteúdo 0X0000

0X01BE

0X01CE

0X01DE

0X01EE

0X01FE – 0x1FF

Reservado

Partição 01

Partição 02

Partição 03

Partição 04

Palavra de assinatura – sempre 0X55AA

A tabela a seguir descreve cada entrada da tabela de partições:

Tabela 2.7 – Entrada na tabela de partições

Offset do

byte

Tamanho do

campo Significado

00

01

02

03

04

05

06

07

08

12

BYTE

BYTE

6 bits

10 bits

BYTE

BYTE

6 bits

10 bits

DWORD

DWORD

Boot Indicator. Indica se é a partição do sistema.

Cabeça inicial.

Setor inicial. Somente os bits de 0 a 5 são usados.

Cilindro inicial.

System ID. Esse byte define o tipo de volume.

Cabeça inicial.

Setor final.

Cilindro final.

Setor relativo.

Total de setores.

Quando existir uma partição estendida no disco rígido, a entrada para tal partição na

Tabela de Partições aponta para o primeiro setor de disco da partição estendida. O primeiro

setor de cada unidade lógica em uma partição estendida também possui uma Tabela de

Partições, que ocupa os últimos 66 bytes do setor (64 bytes da tabela mais 2 bytes dos

marcadores de final de setor). [WinNT, 1997]

20

Na figura seguinte veremos uma demonstração, em hexadecimal, da tabela de partições de

um disco. Quando há menos de quatro partições, os campos remanescentes são todos zeros.

Figura 2.14 – Hexadecimal do setor contendo uma tabela de partições

21

Capítulo 3

Recuperação de Arquivos Perdidos

3.1 Introdução Após compreender como é realizado o gerenciamento do disco, conheceremos os

principais motivos que levam a uma remoção indesejada de arquivos. Como vimos, para o

gerenciamento de espaço em disco, vários controles são realizados para manipulação de

um arquivo. Falhas nessas informações de controle ocasionam em perdas de dados do

arquivo, resultando em remoções. Algumas ferramentas existentes no mercado conseguem

driblar essas falhas, possibilitando a recuperação de arquivos removidos. Conheceremos

nesse capítulo, as principais causas que levam a uma remoção de arquivos e algumas

ferramentas que realizam a recuperação.

3.2 Arquivos Perdidos Geralmente, os problemas em um disco rígido ou disquete ocorrem devido a erros de

hardware. Entretanto, freqüentemente o problema ocorre porque o sistema operacional não

consegue encontrar as informações sobre o disco ou sobre o seu conteúdo, devido a perda

de informações de controle da mídia. Neste capítulo, conheceremos alguns tipos de falhas

que podem ocorrer em um disco rígido, ou disquete, e que ocasionam a perda de dados.

3.2.1 Problemas nas informações de controle do sistema

As informações de controle (setor de boot, diretório raiz, tabela de alocação de arquivos,

tabela de partições) são essenciais para o funcionamento do sistema. Uma falha, em

qualquer uma dessas informações, pode ocasionar a perda de dados em uma mídia.

Uma oscilação ou queda de energia, por exemplo, pode corromper e danificar a tabela de

alocação de arquivos; ou o diretório raiz; ou a tabela de partições, caso o sistema caia

durante uma atualização no mesmo. No caso da tabela de alocação de arquivos, o próprio

sistema operacional pode se recuperar, através da verificação da cópia da tabela contida no

22

sistema. Contudo, se o dano nessas áreas de controle não permitirem uma leitura correta

pelo sistema, provavelmente ocorrerão perdas de dados, ou até mesmo, a perda de

partições inteiras.

Alguns vírus também costumam atacar nas áreas de controle, principalmente no Master

Boot Record ou no setor de boot da partição. Eles danificam ou alteram esses setores, de

modo que o sistema não consiga mais obter as informações corretas para a inicialização,

necessitando a execução do FDISK, ou de uma formatação. Alguns vírus que se alocam ou

alteram esses áreas de controle são: Dark Avenger, Andre, Bleah, Ping Pong, FEC.dr,

Bnut.mp.cav.448, BootEXE, Breasts, Dir-2, Bye-Bye, etc. [Mcafee, 2004]

Outro problema, que ocasiona a perda das informações de controle, são as mídias de baixa

qualidade. Nessas mídias, os disco perdem mais facilmente o magnetismo, não

conseguindo armazenar corretamente as informações. Além do problema das mídias de

baixa qualidade, pode ocorrer também o desgaste do disco, causado pelo tempo de

utilização ou pelo uso excessivo da mídia.

3.2.2 Dados apagados por remoção ou formatação

A remoção de arquivos pode acontecer acidentalmente ou de forma mal-intensionada. No

sistema operacional Windows, ao apagar um arquivo, ele vai para uma pasta especial

denominada lixeira. Esse arquivo continuará com todas as suas informações armazenadas,

assim como todos seus blocos de dados alocados. Assim que ele for apagado da lixeira,

suas informações não serão mais visíveis ao sistema operacional e seus blocos de dados

serão desalocados, sendo disponibilizado para a utilização por outros arquivos. Nesse caso,

o Windows não pode mais recuperar as informações, nem os dados, desse arquivo.

Uma remoção, tratada em baixo nível, modifica as seguintes áreas de controle: o diretório

raiz e a tabela de alocação de arquivos. No diretório raiz, o primeiro Byte do campo nome

de arquivo é alterado para E5H, sinalizando-o como arquivo apagado. Na tabela de

alocação de arquivos, todos os agrupamentos de unidade referentes àquele arquivo são

desalocados, ficando disponíveis para serem reutilizados. (Ilustração na Figura 3.1 a 3.4)

23

Figura 3.1 – Hexadecimal do diretório raiz antes de uma remoção

Figura 3.2 – Hexadecimal tabela de alocação de arquivos antes de uma remoção

Figura 3.3 – Hexadecimal do diretório raiz depois de uma remoção

Figura 3.4 – Hexadecimal tabela de alocação de arquivos depois de uma remoção

Em uma formatação, ocorre um processo diferente da remoção. Tanto na formatação

rápida como na completa, o sistema disponibiliza todos os setores contidos na unidade, ou

seja, todos os arquivos armazenados nessa unidade são apagados. Na formatação rápida,

tratando-a em baixo nível, são zerados todos os campos da tabela de alocação de arquivos e

do diretório raiz. Na formatação completa, além do diretório raiz e da tabela de alocação de

arquivos, são zerados também todos os bytes contidos na área de dados. (Ilustração na

Figura 3.5 a 3.8)

24

Figura 3.5 – Hexadecimal do diretório raiz antes de uma formatação

Figura 3.6 – Hexadecimal da tabela de alocação de arquivos antes de uma formatação

Figura 3.7 – Hexadecimal do diretório raiz depois de uma formatação

Figura 3.8 – Hexadecimal da tabela de alocação de arquivos depois de uma formatação

25

3.3 Ferramentas de recuperação

Foram analisadas algumas ferramentas de recuperação de arquivos removidos, encontrados

pela internet, para verificar os tipos de dados que elas recuperam e qual a sua forma de

interface com o usuário. Em algumas delas, não foi possível uma análise mais aprofundada

por ser uma versão demo da ferramenta, limitando-se apenas na execução das operações

mais simples.

3.3.1 Ferramenta Disk Investigator

O Disk Investigator é um utilitário que encontra os arquivos ocultos em um disco rígido e

ajuda a recuperar dados perdidos. Lista as unidades realmente existentes e diretórios,

arquivos, agrupamentos de unidades e setores do sistema. Recupera arquivos previamente

apagados. [Absolute, 2004]

Figura 3.9 – Tela principal da ferramenta Disk Investigator

A versão da ferramenta analisada é v1.31, de Kevin Solway, e apresenta as seguintes

características:

- Lista os arquivos e diretórios em uma janela semelhante ao do Windows Explorer,

sinalizando-os como ativos ou apagados;

26

- Lista as informações do setor de boot, da tabela de alocação de arquivos e do

diretório raiz da partição selecionada;

- Executa recuperação de arquivos individualmente, onde o procedimento “recupera

todos” será adicionado na versão futura;

- Não consegue recuperar nem listar os arquivos e diretórios de uma partição após

uma formatação rápida.

3.3.2 Ferramenta File Recover

A ferramenta File Recover é um tipo de programa utilitário para recuperação de arquivos

removidos. Ele simplesmente identifica se os arquivos estão intactos no disco rígido e lista

as opções de recuperação. É de fácil utilização e designado para recuperar arquivos

apagados acidentalmente. Suporta disco rígido com sistemas de arquivos de tabela de

alocação de arquivos e NTFS.[Filerecover, 2004]

Figura 3.10 – Tela principal da ferramenta File Recover

A versão da ferramenta analisada é v2.78_0_0d e apresenta as seguintes características:

- Faz uma varredura para identificar os arquivos apagados na partição selecionada;

- Não consegue recuperar nem listar os arquivos e diretórios de uma partição após

uma formatação rápida;

27

- Não foi possível executar uma recuperação e uma análise mais detalhada por ser

uma versão demo.

3.3.3 Ferramenta Magic Recovery

A ferramenta Magic Recovery recupera arquivos e diretórios removidos de forma rápida e

fácil. Não recupera arquivos afetados por vírus ou por problemas físicos do disco rígido.

Funciona em Windows 3.11 / 95 / 98 / Me / NT / 2000. [Ondata, 2004]

Figura 3.11 – Tela principal da ferramenta Magic Recovery

A versão da ferramenta analisada é v1.0 e apresenta as seguintes características:

- Lista na abertura do programa as opções de “Recuperar arquivos”, “Procurar dados

perdidos” e “Procurar partição perdida”;

- Lista informações do sistema como quantidade de processadores na máquina

avaliada, quantidade de memória, capacidade de resolução do monitor, tamanho de

swap, versão do Windows, unidades existentes e as informações da unidade;

- Não consegue recuperar nem listar os arquivos e diretórios de uma partição após

uma formatação rápida;

- Não foi possível executar uma recuperação e uma análise mais detalhada por ser

uma versão demo.

28

3.3.4 Ferramenta Recover4all Professional

A ferramenta Recover4all Professional é um programa que permite recuperar facilmente

arquivos apagados acidentalmente do Windows. Para evitar que o arquivo apagado seja

sobrescrito, essa ferramenta não requer a instalação podendo funcionar diretamente de um

disco flexível. O Recover4all funciona em Windows 95 / 98 / Me / NT / 2000 / XP, ou seja,

em sistema de arquivo de tabela de partição de arquivos e NTFS. Suporta drives

reconhecidos pelo Windows com IDE, SCSI, USB, PCMCIA e outras interfaces.

[Recover4all, 2004]

Figura 3.12 – Tela principal da ferramenta Recover4all

A versão da ferramenta analisada é v2.21 e apresenta as seguintes características:

- Lista os arquivos apagados da partição selecionada;

- Não consegue recuperar nem listar os arquivos e diretórios de uma partição após

uma formatação rápida;

- Não foi possível executar uma recuperação e uma análise mais detalhada por ser

uma versão demo.

29

3.3.5 Ferramenta Super Undelete

A ferramenta Super Undelete é um programa de recuperação de arquivos apagados do

Windows. Não é possível a recuperação de dados causados por problemas físicos no disco

rígido. Em todas as outras situações a recuperação é possível, dependendo apenas da

situação e condição específica da integridade da cada arquivo. É possível recuperar

arquivos que não estão mais na lixeira, arquivos apagados por ação de vírus, arquivos

apagados por problema na tabela de partição de arquivos e por perda de partições e discos

lógicos. Funciona em sistemas de arquivos de tabela de partição de arquivos.

[Siliconaction, 2004]

Figura 3.13 – Tela principal da ferramenta Super Undelete

A versão da ferramenta analisada é v4.0 e apresenta as seguintes características:

- Lista arquivos do “disco real”, “perdidos”, “encontrados” e “apagados” da partição

selecionada;

- Possui um recurso de localização de arquivos igual ao do Windows;

- Não consegue recuperar nem listar os arquivos e diretórios de uma partição após

uma formatação rápida;

- Não foi possível executar uma recuperação por ser uma versão demo.

30

Capítulo 4

Proposta de Metodologias de recuperação

4.1 Introdução

Nesta seção, trataremos as propostas de metodologias de recuperação de arquivos perdidos,

considerando os fatores citados anteriormente, que ocasionam em uma remoção

indesejada. Para facilitar as ilustrações, utilizaremos as informações de um disco rígido de

2,40 Gbytes, com a partição primária de 1 Gbytes e a partição estendida com 3 partições

lógicas. O sistema operacional instalado no disco é o Windows 98SE e o sistema de

arquivo de tabela de partição de arquivos com entradas de 16bits.

Serão apresentados, de maneira simples e clara, os procedimentos que devem ser

realizados na recuperação de arquivos. São procedimentos de baixo custo e fácil

implementação, podendo ser rapidamente desenvolvido, para a utilização em ensino de

graduação ou para um possível aperfeiçoamento e utilização em outros projetos. São

metodologias que permitem ao programador, com um editor de disco ou em assembly, se

recuperar de qualquer problema ocorrido na área de controle do disco, recuperando

arquivos, pois são propostas altamente especializadas.

Para facilitar a compreensão, veremos cada problema separadamente, identificando os

possíveis efeitos sobre o sistema e o modo de como a ferramenta deve tratá-lo, de forma a

‘enxergar’ os dados do disco para que se possa executar a recuperação. Discutiremos

individualmente como se recuperar dos problemas ocorridos nas informações da área de

controle, as remoções decorrentes da “deleção” e formatação, e como executar a

transferência das informações a serem recuperadas para outra mídia.

Os procedimentos serão apresentados utilizando-se de operações possíveis na linguagem

de programação C. Não serão utilizados comandos nem funções específicas da linguagem,

somente procedimentos suportados. Essa linguagem possui recursos de linguagens de

baixo nível com as facilidades das linguagens de alto nível, que facilitam a implementação.

31

4.2 Recuperando arquivos

4.2.1 Danos no Master Boot Record

O Master Boot Record contém a tabela de partições para o disco e uma pequena

quantidade de código executável. Danos nesse setor impossibilitam a inicialização do

computador a partir desse disco. Como o código no Master Boot Record é executado antes

de qualquer sistema operacional ser inicializado, não é possível detectar ou se recuperar de

corrupções neste setor. Além de não conseguir inicializar o sistema, perde-se também a

tabela de partições, que contém informações importantes referentes ao disco.

Para fazer funcionar o disco rígido e executar a ferramenta proposta, deve-se, após detectar

algum problema no Master Boot Record, inicializar o sistema através do disco de

inicialização (disquete de boot), ou através de outro disco rígido, deixando o disco com

problema como secundário.

Para executar uma recuperação de arquivos nessa situação, é preciso executar os seguintes

procedimentos:

1) Varredura do disco rígido. Executar uma varredura, setor por setor, para localizar

a seguinte informação:

• Setor que possuir os três primeiros bytes com os valores “E9 XX XX” ou

“EB XX 90”, e terminar com os valores “55 AA” nos dois últimos bytes,

conforme a Figura 4.1.

Figura 4.1 – Hexadecimal do começo e final do setor de boot

Essa é a configuração do setor de Boot das partições. Os três primeiros bytes

representam a instrução de jump e os dois últimos bytes representam a

marcação de final de setor; e

32

• Setor que possuir o byte no offset 0x01BF (byte de número 447 do setor)

igual a “00” ou “80”, e terminar com os valores “55 AA” nos dois últimos

bytes, conforme a Figura 4.2.

Figura 4.2 – Hexadecimal do setor contendo a tabela de partições

Essa é a configuração da tabela de partições contida no primeiro setor da

segunda partição, caso houver. No offset 0x01BF, o valor “80” indica que é

uma partição do sistema, e o valor “00”, que não é utilizado para

inicialização.

Essa varredura deve ser executada até encontrar o setor que contém a tabela de

partições da segunda partição ou o final do disco. Sempre que identificar os setores

acima citados, deve-se armazenar o tipo de setor e a sua localização em um vetor,

para análise posterior pelo próximo procedimento.

2) Montagem da tabela de partição. Com as informações obtidas na varredura, é

possível remontar a tabela de partição e obter informações completas dos dados

existentes no disco. Se a varredura terminar com o final de disco, conclui-se que só

existe uma partição e o endereço armazenado é o setor de boot com o bloco de

parâmetros da única partição ativa no disco. Mas, se a varredura terminar ao

encontrar o primeiro setor da segunda partição, o vetor conterá o endereço do setor

de boot da primeira partição e o endereço contendo uma tabela de partições. A

partir desse endereço, contendo a tabela de partições, pode-se calcular os endereços

do restante das partições no disco. Com essas informações, tendo o disco uma ou

mais partições, é possível montar uma tabela de partições na memória, para uso da

ferramenta na recuperação dos arquivos.

33

3) Identificação das áreas de controle de cada partição. Com uma tabela de

partições montada na memória, é possível vasculhar qualquer informação contida

no disco. Para garantir a integridade das informações de controle do disco, a

ferramenta poderia listar todas as informações contidas no bloco de parâmetros do

setor de boot de cada partição, assim como a tabela de alocação de arquivos e suas

cópias. Essa listagem permitiria ao usuário identificar algum problema em outros

setores na área de controle, ou se a tabela de partições foi montada corretamente.

4) Listagem dos arquivos e diretórios. Certificando-se de que a tabela de partições

contenha informações coerentes, deve-se listar ao usuário o diretório raiz,

mostrando os arquivos e diretórios contidos nas partições, assim como os

subdiretórios, para que seja selecionado o conteúdo a ser recuperado.

A transferência dos dados a serem recuperados para outra mídia será tratada na seção 4.3

4.2.2 Danos no setor de boot da partição

Caso ocorram danos no setor de boot da partição utilizada para inicialização, com a

utilização de um disco de inicialização (disquete de boot), geralmente é possível o acesso

aos arquivos nessa partição. Transferindo esses arquivos para outra unidade de disco, pode-

se formatar a partição para corrigir o setor de boot, sem que seja perdido nenhum arquivo.

Se o disco de inicialização não permitir a leitura dessa partição, na tentativa de seu acesso

ocorrerá um erro, onde o sistema solicitará a sua formatação. Para recuperar arquivos nessa

situação, deve-se executar os seguintes procedimentos:

1) Obter informações dessa partição. Através do Master Boot Record, a ferramenta

pode obter as informações referentes ao início e o fim da partição em questão.

2) Localizar os setores da área de controle do sistema. A partir do primeiro setor

dessa partição, é necessário fazer uma varredura para identificar as seguintes

informações:

34

• Setores com os primeiros bytes com os valores “F8 FF FF 0F FF FF FF 07”

para sistema TAA 32, “F8 FF FF 7F” para sistema TAA 16, ou “F8 FF FF”

para sistema TAA 12. Essa é a configuração do início de uma tabela de

alocação de arquivos, onde as duas primeiras entradas são reservadas,

conforme as ilustrações a seguir;

Figura 4.3 – Hexadecimal início TAA 12

Figura 4.4 – Hexadecimal início TAA 16

Figura 4.5 – Hexadecimal início TAA 32

• Em seguida, deve-se localizar o próximo setor contendo essa mesma

configuração, para localizar a cópia da tabela de alocação de arquivos. A

quantidade de setores entre essas duas tabelas representa o seu tamanho;

• Após a quantidade de setores referente às duas tabelas, podem existir mais

cópias da tabela de alocação de arquivos. Caso não tiver, a próxima

estrutura após as tabelas é o diretório raiz;

• Para identificar o tamanho do diretório raiz e o início da área de dados,

deve-se executar uma varredura verificando se os setores contém, a cada 32

bytes, a configuração das entradas de diretório. Por exemplo, pode-se

verificar se os campos de atributo do arquivo e data de criação contém

valores válidos. Caso contrário, o setor representa o início da área de dados.

35

3) Listar as informações das áreas de controle. Para garantir a integridade das

informações de controle do disco, a ferramenta poderia listar todas as informações

encontradas até o momento. Essa listagem permitiria ao usuário identificar se foram

encontradas informações coerentes, como por exemplo, se as cópias da tabela de

alocação de arquivos são iguais e se o diretório raiz contém informações contendo

os nomes dos arquivos.

4) Listagem dos arquivos e diretórios. Certificando-se de que as informações

encontradas são coerentes, deve-se listar ao usuário o diretório raiz, mostrando os

arquivos e diretórios contidos nas partições, assim como os subdiretórios, para que

seja selecionado o conteúdo a ser recuperado.

A transferência dos dados a serem recuperados para outra mídia será tratada na seção 4.3

4.2.3 Danos na Tabela de Alocação de Arquivos - TAA

Quando ocorrem problemas na tabela de alocação de arquivos, o próprio sistema tenta se

recuperar através das cópias da tabela existente no disco. Caso as cópias também estiverem

danificadas, são recuperadas somente as informações que o sistema considerar consistente,

ou seja, que estiverem fora da área danificada. Nesse caso, os arquivos que tiverem as

informações de seus blocos na área danificada da tabela serão removidos, não sendo

possível a sua recuperação.

Geralmente, quando ocorrem danos na tabela de alocação de arquivos, o próprio sistema

consegue se recuperar. Quando o sistema não consegue se recuperar, possivelmente houve

perda integral da tabela e de suas cópias. Considerando essa situação, não foi possível

propor uma metodologia de recuperação de arquivos, pois em todas propostas aqui

tratadas, são essenciais as informações da tabela de alocação de arquivos.

36

4.2.4 Danos no Diretório Raiz

Se danos ocorrerem no diretório raiz, provavelmente o sistema não reconhecerá a partição

e pedirá uma formatação. Pode acontecer do sistema reconhecer a partição, mas não

conseguirá mostrar nenhum conteúdo e não conseguirá manusear corretamente gravações e

leituras no diretório raiz. Com a perda das informações do diretório raiz, é possível

recuperar somente os arquivos contidos nos sub-diretórios, pois suas entradas de diretório

estão localizados na área de dados do disco. Para isso, é preciso executar os seguintes

procedimentos:

1) Identificar o início da área de dados. Para se efetuar a recuperação dos sub-

diretórios, é necessário identificar, primeiramente, o início da área de dados. Todas

as informações para esse cálculo podem ser encontradas no setor de boot. Somando

o tamanho do diretório raiz com o tamanho das tabelas de alocação de arquivos

mais os setores reservados, obtém-se o tamanho da área de sistema. Posterior a essa

área encontra-se a área de dados.

2) Localizar as entradas dos sub-diretórios. Após encontrar o início da área de

dados, deve-se executar uma varredura procurando todos os setores que contiverem

a seguinte configuração:

• Primeiro byte com o valor em hexadecimal igual a “2E”, e o segundo até o

oitavo byte com os valores iguais a “20”;

• Trigésimo terceiro e o trigésimo quarto byte com o valor igual a “2E”, e o

trigésimo quinto até o quadrigésimo byte com o valores iguais a “20”.

Essa é a configuração dos setores contendo as entradas dos sub-diretórios, com as

duas primeiras entradas reservadas ponto e ponto-ponto, ilustrado na Figura 4.6.

Após encontrar esses setores, deve-se calcular sua localização na tabela de alocação

de arquivos, para poder encontrar os blocos que contém sua continuação.

37

Figura 4.6 – Entrada reservada ponto e ponto-ponto dos sub-diretórios

3) Listagem dos arquivos e diretórios. Encontrados os setores do passo anterior, é

possível a listagem e a obtenção de informações de todos os arquivos e diretórios

dos sub-diretórios.

A transferência dos dados a serem recuperados para outra mídia será tratada na seção 4.3.

4.2.5 Perda de arquivos por remoção ou formatação

Em uma remoção, o sistema operacional marca no diretório raiz como arquivo apagado e

libera suas entradas na tabela de alocação de arquivos. Sem as informações referentes ao

arquivo na tabela de alocação de arquivos, não é possível executar sua recuperação. Uma

tentativa, que possivelmente poderia recuperar um arquivo removido, seria da seguinte

maneira:

1) Verificar no diretório raiz, na entrada do arquivo a ser recuperado, qual o primeiro

agrupamento de unidades para localizá-lo na tabela de alocação de arquivos;

2) A partir desse agrupamento, verificar se existe uma seqüência de agrupamentos de

unidades consecutivas do tamanho do arquivo apagado;

3) Se não existir, marcar o arquivo como não recuperável. Caso contrário, permitiria

sua recuperação. Na tentativa de recuperação, é preciso ativar o arquivo no

diretório raiz, mudando o primeiro byte por um caractere válido, e realizar as

devidas ligações, consecutivas, nas entradas da tabela de alocação de arquivos a

partir do primeiro agrupamento.

38

Nessa tentativa, existe uma possibilidade do arquivo ser recuperado. Caso o arquivo não

ocupe agrupamentos de unidades seqüenciais, ou alguns deles já não tiverem os dados

corretos, o arquivo será recuperado e não permitirá sua execução. Se isso acontecer, será

emitida uma mensagem de erro de “Arquivo corrompido” ou “Arquivo inválido”. Nessa

situação, basta apagá-lo novamente.

Já na formatação, tanto a rápida como a completa, são “zerados” todos os campos do

diretório raiz e da tabela de alocação de arquivos. Sem essas duas estruturas de controle,

não é possível executar a recuperação de qualquer informação. Talvez exista uma maneira

de recuperar esses arquivos, mas até o momento, não foi possível encontrar uma solução

para esse problema.

4.3 Transferência dos dados recuperados

Após a listagem e a seleção dos arquivos a serem recuperados, é necessário a sua

transferência para outra mídia. Geralmente, não é feita a recuperação de arquivos na

mesma mídia para evitar que outros dados removidos sejam sobrescritos. Para a

transferência, é necessário executar os seguintes procedimentos:

1) Verificação de espaço para transferência. Após a seleção, pelo usuário, dos

arquivos a serem recuperados e a mídia destino, deve-se verificar se a mídia destino

possui espaço suficiente para a gravação. Essa verificação pode ser realizada da

seguinte maneira:

• Calcular, através das informações de tamanho do arquivo, contido no

diretório raiz dos arquivos selecionados, o tamanho total exigido para

transferência. Basta, para cada arquivo, verificar sua entrada de diretório o

valor do Byte no offset 1CH, ilustrado na Figura 4.7.

Figura 4.7 – Informação de tamanho do arquivo na entrada de diretório

39

• Verificar, através de operações de alto nível, se a unidade destino possui

espaço suficiente para a gravação requerida.

2) Transferência de dados. Caso haja espaço suficiente na mídia destino, deve-se

iniciar a transferência dos arquivos da seguinte maneira:

• Localizar o bloco de dados inicial, do arquivo a ser transferido, através do

diretório raiz;

• Calcular e encontrar, através da tabela de alocação de arquivos, os blocos

subsequentes desse arquivo. Caso o arquivo tenha mais de um bloco, devem

ser todos armazenados na memória, para a montagem do arquivo;

• Gravar na outra unidade, através de operações de escrita de arquivos, da

linguagem de programação. Utilizando-se essas operações de alto nível, não

é necessário a identificação da estrutura do sistema de arquivos na unidade

destino, pois o próprio sistema operacional se encarrega de seu

gerenciamento.

4.4 Linguagem de programação C

A linguagem de programação C foi desenvolvida no início dos anos 70 nos Laboratórios

AT&T Bell, nos Estados Unidos. Um dos grandes atrativos dessa linguagem é o balanço

atingido entre características próximas da arquitetura de computadores e características de

linguagens de programação de alto nível de abstração. A simplicidade da linguagem não

restringe, no entanto, a potencialidade de suas aplicações. Blocos de tarefas complexas

podem ser criados a partir de blocos elementares, podendo se estender por diversos níveis.

Esta habilidade de construir aplicações complexas a partir de elementos simples é uma das

principais características da linguagem. [DCA, 2004]

As linguagens de baixo nível são as linguagens que mais se aproximam do código de

máquina, ou seja, dos 0 ou 1. Os programas resultantes destas linguagens são pequenos em

40

tamanho e extremamente rápidos. As linguagens de alto nível são orientadas para o

problema, necessitando pouca ou nenhuma atenção às características do computador que

irá executar o programa, onde facilita a interação da linguagem com o programador. A

linguagem C possui boa parte dessas duas características, de alto e de baixo nível. A

combinação dos apontadores e operadores a nível de bit, faz do C uma linguagem capaz de

substituir o Assembly, com as propriedades e abstrações de uma linguagem de alto nível.

A facilidade de utilização de recursos de baixo nível, com operadores similares ao

Assembly, é o fator mais importante da linguagem C para a implementação da metodologia

proposta. Nela é possível executar operações de baixo nível como as interrupções de

hardware, e alocando seus valores em endereços de memória, pode-se tratar facilmente

essas informações através de operadores de alto nível. Veja as funções de interrupções da

Linguagem Assembly no Apêndice A, que podem ser utilizados similarmente na

Linguagem C.

41

Conclusão Com a conclusão deste trabalho, podemos perceber que com a evolução da informática e a

crescente necessidade de armazenamento de dados, cresce também a necessidade de se

utilizar ferramentas de back-up e de recuperação de arquivos removidos. Com freqüência

houve-se falar em perda de informações por ação de vírus ou remoções indesejadas. A

crescente necessidade de informatização, das empresas e das pessoas, induz ao manuseio

de computadores por usuários leigos, sem conhecimentos em relação aos programas mal

intencionados e até mesmo aos aplicativos que ocasionam na remoção de arquivos.

Como se pode ver, dependendo do motivo da remoção do arquivo, é possível garantir

100% da integridade na sua recuperação. É claro que empresas especializadas em

recuperação de arquivos e discos rígidos garantem a possibilidade de recuperação em

qualquer tipo de situação, mas os mesmos possuem equipamentos avançados e cobram

uma fortuna para fazer o serviço. Agora, para usuários domésticos ou pequenas empresas,

que possuem documentos de textos, trabalhos escolares ou aplicações comerciais, e tudo

isso em computadores de pequeno porte, necessitam de uma ferramenta não tão avançada,

de baixo custo e que permita recuperar informações sempre que houver algum problema.

A recuperação de arquivos removidos não é uma operação muito complexa, mas como

podemos ver, ficamos muito dependentes do diretório raiz e da tabela de alocação de

arquivos. Estas duas estruturas, principalmente a tabela de alocação de arquivos, são

essenciais para a localização dos arquivos na superfície do disco. Além das soluções

baseadas nessas estruturas, não foi encontrado nenhum outro meio em que fosse possível

identificar os agrupamentos de unidades inerentes a um arquivo removido.

Outro problema, que pode prejudicar uma correta recuperação de arquivo pela ferramenta

proposta é o modo de como identificar de maneira automatizada o tipo de dano a ser

tratado. Um programador, com conhecimentos em linguagem assembly para manusear

diretamente as informações do disco, por exemplo, consegue identificar e executar uma

recuperação de arquivos facilmente, se baseando nas metodologias apresentadas. Agora,

como uma ferramenta automatizada poderia identificar de forma realmente correta,

sempre, em que área de controle ocorreu o problema? Sempre haverão casos em que a

42

ferramenta por si só, não conseguirá identificar exatamente qual o procedimento a ser

executado. E é por isso que muitas ferramentas, existentes no mercado, são direcionadas

para um tipo de problema específico.

Mas, considerando serem propostas de metodologias para recuperação de arquivos

removidos, e não para reconhecimento de danos na área de controle, espera-se poder

garantir a recuperação dos arquivos, de maneira simples e rápida, na sua execução em

problemas claramente identificado.

43

Referências Bibliográficas [ClayBrook, 1985] ClayBrook, Billy G.; Técnicas de gerenciamento de arquivos,

tradução de Luiz Orlando Coutinho Lemos, Editora Campus, 1985. [Tanenbaum, 2000] Tanenbaum, Andrew S.; Sistemas Operacionais: projeto e

implementação, tradução de Edson Furmankiewicz, Editora Bookman, 2000.

[Holzner, 1990] Holzner, Steven; Linguagem Assembly avançada para IBM PC,

McGraw Hill, 1990. [Norton, 1989] Norton, Peter; Desvendando o IBM PC (acesso a características

avançadas de programação), Editora Campos, 1989. [WinNT, 1997] Microsoft Windows NT Server 4.0 Resource Guide, Microsoft

Corporation, MAKRON Books do Brasil Editora Ltda, 1997. [Duncan, 1991] Duncan, Ray; MS-DOS Avançado, MAKRON Books do Brasil

Ltda., Editora McGraw-Hill Ltda, 1952. [Tischer, 1992] Tischer, Michael; PC Intern System Programming – The

Encyclopedia of DOS Programming Know How, ABACUS A data becker book, 1953.

[Mcaffe, 2004] Network Associates, Inc., disponível em www.mcafee.com.br,

acessado em fevereiro de 2004. [Absolute, 2004] The Absolute, disponível em

www.theabsolute.net/sware/dskinv.html, acessado em fevereiro de 2004

[Filerecover, 2004] FileRecover, disponível em www.filerecover.com, acessado em

fevereiro de 2004. [Ondata, 2004] Ondata Laboratórios, disponível em www.ondata.es, acessado em

fevereiro de 2004. [Recover4all, 2004] Recover4all, disponível em www.recover4all.com, acessado em

fevereiro de 2004. [Siliconaction, 2004] Siliconaction, disponível em www.siliconaction.com.br, acessado

em fevereiro de 2004. [DCA, 2004] Departament of Computer Engineering and Industrial Automation

School of Electrical and Computer Engineering State University of Campinas, disponível em http://www.dca.fee.unicamp.br, acessado em fevereiro de 2004.

44

[Guia, 2004] Morimoto, Carlos E.; Guia do Hardware.net, disponível em

www.guiadohardware.info, acessado em fevereiro de 2004. [Infowester, 2004] Info Wester, disponível em www.infowester.com, acessado em

fevereiro de 2004. [Unisinos, 2004] Unisinos – Universidade do Vale do Rio dos Sinos, curso de

informática, disponível em www.inf.unisinos.br/~cac/sisop/material/sisarq.pdf, acessado em fevereiro de 2004

45

Apêndice A

Referências da BIOS e do DOS

A.1 Introdução

Este apêndice pode ser usado como referência em uma implementação em baixo nível. Serão apresentadas as principais interrupções da BIOS e interrupções do DOS, em linguagem Assembly, para manipulação de disco, na qual são similares às utilizadas na linguagem de programação C.

A.2 Interrupções da BIOS INT 13 Serviço 0 – Reinicializar o Disco Entrada Saída AH = 0 CF = 0 → AH = 0, Sucesso

CF = 1 → AH = Código de erro

Sistemas com disco rígido:

DL = 80H → Reinicializa os disquetes

DL = 81H → Reinicializa o disco rígido

INT 13 Serviço 1 – Ler o estado da última operação Entrada Saída AH = 1 Código de erro

AL = 00 Sem erros

AL = 01 Comando inválido passado para o controlador

AL = 02 Marca de início de setor não encontrado

AL = 03 Disco protegido contra escrita

AL = 04 Setor não encontrado

AL = 05 Falha de reinicialização

AL = 07 Parâmetros do acionador errados

AL = 09 Transferência de dados além do final do segmento

AL = 0BH encontrado sinalizador de trilha ruim

AL = 10H Encontrado erro no CRC

AL = 11H Os dados são erros corrigidos

AL = 20H Falha do controlador

46

AL = 40H Erro no posicionamento da cabeça de leitura

AL = 80H Sem resposta do disco

AL = 0BBH Erro Indefinido

AL = 0FFH Falha na operação

INT 13 Serviço 2 – Ler Setores para a Memória Entrada Saída AH = 2 CF = 0 → AH = 0, Sucesso

DL = Número do acionador CF = 1 → AH = Código de erro

DH = Número da cabeça

CH = Número da trilha

CL = Número do setor

AL = Número de setores a ler

ES:BX = Endereço do buffer para leitura e escrita

Para disco rígido, o número do acionador em DL pode variar de 80H a 87H.

INT 13 Serviço 3 – Escrever setores para o disco Entrada Saída AH = 3 CF = 0 → AH = 0, Sucesso

DL = Número do acionador CF = 1 → AH = Código de erro

DH = Número da cabeça

CH = Número da trilha

CL = Número do setor

AL = Número de setores a ler

ES:BX = Endereço do buffer para leitura e escrita

Para disco rígido, o número do acionador em DL pode variar de 80H a 87H.

INT 13 Serviço 4 – Verificar os setores Entrada Saída AH = 4 CF = 0 → AH = 0, Sucesso

DL = Número do acionador CF = 1 → AH = Código de erro

DH = Número da cabeça

CH = Número da trilha

CL = Número do setor

AL = Número de setores a ler

ES:BX = Endereço do buffer para leitura e escrita

47

Para disco rígido, o número do acionador em DL pode variar de 80H a 87H.

INT 13 Serviço 5, 6 e 7 – Formatar Entrada Saída AH = 5, 6 ou 7 CF = 0 → AH = 0, Sucesso

DL = Número do acionador CF = 1 → AH = Código de erro

DH = Número da cabeça

CH = Número da trilha

AH = 5 Formatar a trilha desejada

AH = 6 Formatar a trilha desejada e marcar os setores ruins

AH = 7 Formatar o disco desejado, iniciando pela trilha indicada

O serviço 5 é válido somente para discos flexíveis. Os serviços 6 e 7 são válidos somente para

discos rígidos.

INT 13 Serviço 8 – Informar parâmetros do acionador Entrada Saída AH = 8 DL = Número de acionadores ligados ao controlador

DL > 80H DH = Valor máximo para o número da cabeça

CH = Valor máximo para cilindro

CL = Valor máximo para o número do setor e bits altos do

número do cilindro

Este serviço é válido somente para discos rígidos.

INT 13 Serviço 9 – Inicializar o acionador Este é um serviço usado internamente pela BIOS para inicializar o acionador.

INT 13 Serviços 0AH e 0BH – Ler e escrever longos setores Entrada Saída AH = 0AH (ler) CF = 0 → AH = 0, Sucesso

AH = 0BH (Escrever) CF = 1 → AH = Código de erro

DL = Número do acionador

DH = Número da cabeça

CH = Número do cilindro

48

CL = Número do setor

AL = Número de setores a ler

ES:BX = Endereço do buffer para leitura e escrita

Este serviço é válido somente para discos rígidos.

INT 13 Serviço 0CH – Posicionar a cabeça de leitura Entrada Saída AH = 0CH CF = 0 → AH = 0, Sucesso

DL = Número do acionador CF = 1 → AH = Código de erro

DH = Número da cabeça

CH = Número do cilindro

CL = Número do setor

Esse serviço é válido somente para discos rígidos.

INT 13 Serviço 0DH – Reinicializar o disco Este é um serviço alternativo para reinicializar o disco, usado somente para discos rígidos.

INT 13 Serviços 0EH e 0FH – Ler e escrever o buffer de setor Entrada Saída AH = 0EH (ler) CF = 0 → AH = 0, Sucesso

AH = 0FH (Escrever) CF = 1 → AH = Código de erro

DL = Número do acionador

DH = Número da cabeça

CH = Número do cilindro

CL = Número do setor

AL = Número de setores a ler

ES:BX = Endereço do buffer para leitura e escrita

Este serviço é válido somente para discos rígidos.

INT 13 Serviço 10H – Verificar se o acionador está pronto Este é uma verificação interna que a BIOS faz, para testar se o acionador de disco rígido está ou

não pronto.

49

INT 13 Serviço 11H – Recalibrar o acionador de disco rígido Entrada Saída AH = 11H CF = 0 → AH = 0, Sucesso

DL = Número do acionador CF = 1 → AH = Código de erro

Esse serviço é válido somente para discos rígidos.

INT 13 – Serviços de diagnóstico Entrada Saída AH = 12H (teste da RAM) CF = 0 → AH = 0, Sucesso

AH = 13H (teste do acionador) CF = 1 → AH = Código de erro

AH = 14H (teste do controlador)

DL = Número do acionador

Esse serviço é válido somente para discos rígidos.

A.3 Interrupções do DOS INT 21 Serviço 0DH – Reinicializar o Disco Entrada Saída AH = 0DH

INT 21 Serviço 0EH – Selecionar o Acionador de Disco Entrada Saída AH = 0EH

DL = Número do Acionador (DL=0 → A DL=1→B etc.)

INT 21 Serviço 19H – Informar o Acionador Corrente Entrada Saída AH = 19H AL = Acionador corrente (DL=0 → A DL=1→B etc.)

INT 21 Serviço 1BH – Informar sobre a FAT do Acionador Default Entrada Saída AH = 1BH DS:BX aponta para o byte da FAT

DX = Número de Clusters

AL = Número de setores/Cluster

CX = Tamanho de um setor (512)

50

INT 21 Serviço 1CH – Informar sobre a FAT do Acionador Especificado Entrada Saída AH = 1CH DS:BX aponta para o byte da FAT

DL = Número do Acionador DX = Número de Clusters

(0=Default, 1=A...) AL = Número de setores/Cluster

CX = Tamanho de um setor (512)

51

Apêndice B

Código Fonte utilizando Interrupções

B.1 Introdução

Este apêndice pode ser usado como referência em uma implementação em baixo nível utilizando interrupções na Linguagem C. Será apresentado o código fonte de um programa implementado no desenvolvimento do trabalho, que encontra as informações de controle em um disquete.

B.2 Código Fonte

#include<dos.h>

#include<stdio.h>

#include<conio.h>

typedef unsigned int Word;

//definicao das variaveis globais...

unsigned char *buf, *fat, *fat1, boot[512];

int nsetor, cilindro, setor, superficie, temp, pos;

Word endereco[30];

//executa a interrupcao no boot com os parametros passados

void interrupcao_boot() //ao chamar precisa definir nsetor, cilindro,

//setor, superficie.

{

_AH = 0; //RESETA

_DL = 0; //DRIVE

geninterrupt(0x13);

_ES = FP_SEG(boot);

_BX = FP_OFF(boot);

_AH = 2; //LEITURA

_AL = nsetor; //N. DE SETOR - TAMANHO

52

_CH = cilindro; //CILINDRO 0

_CL = setor; //SETOR 1

_DH = superficie; //SUPERFICIE 0

_DL = 0; //DRIVE

geninterrupt(0x13);

clrscr();

}

//executa a interrupcao com os parametros passados...

void interrupcao() //ao chamar precisa definir nsetor, cilindro,

//setor, superficie.

{

_AH = 0; //RESETA

_DL = 0; //DRIVE

geninterrupt(0x13);

_ES = FP_SEG(buf);

_BX = FP_OFF(buf);

_AH = 2; //LEITURA

_AL = nsetor; //N. DE SETOR - TAMANHO

_CH = cilindro; //CILINDRO 0

_CL = setor; //SETOR 1

_DH = superficie; //SUPERFICIE 0

_DL = 0; //DRIVE

geninterrupt(0x13);

}

//executa a interrupcao na fat com os parametros passados...

void interrupcao_fat() //ao chamar precisa definir nsetor, cilindro,

//setor, superficie.

{

_AH = 0; //RESETA

53

_DL = 0; //DRIVE

geninterrupt(0x13);

_ES = FP_SEG(fat);

_BX = FP_OFF(fat);

_AH = 2; //LEITURA

_AL = nsetor; //N. DE SETOR - TAMANHO

_CH = cilindro; //CILINDRO 0

_CL = setor; //SETOR 1

_DH = superficie; //SUPERFICIE 0

_DL = 0; //DRIVE

geninterrupt(0x13);

clrscr();

}

//executa a interrupcao na fat com os parametros passados...

void interrupcao_fat1() //ao chamar precisa definir nsetor, cilindro,

//setor, superficie.

{

_AH = 0; //RESETA

_DL = 0; //DRIVE

geninterrupt(0x13);

_ES = FP_SEG(fat1);

_BX = FP_OFF(fat1);

_AH = 2; //LEITURA

_AL = nsetor; //N. DE SETOR - TAMANHO

_CH = cilindro; //CILINDRO 0

_CL = setor; //SETOR 1

_DH = superficie; //SUPERFICIE 0

_DL = 0; //DRIVE

geninterrupt(0x13);

clrscr();

}

54

void mostrafat()

{

int pranada, p, contia, espera;

contia = 0;

espera = 1;

do {

pranada = contia;

p = contia * 1.5;

if( !(pranada&0x0001))

pranada = (fat[p]) + (((Word)fat[p + 1]&0x000f) << 8);

else

pranada = ((fat[p]&0x00f0) >> 4) + ((Word)fat[p + 1] << 4);

printf("%4u = %4u ", contia, pranada);

contia = contia + 1;

if ((espera % 5) == 0) printf ("\n");

if (espera > 114)

{

getch();

printf("\n");

espera = 1;

}

else espera = espera + 1;

} while (contia < ((boot[0x13] + boot[0x14] * 256) / (boot[0x0D])));

getch();

}

void recuperabyte()

{

int byte;

//calcula o endereco do diretorio raiz

nsetor = (((boot[0x11]+boot[0x12]*256) * 32) / (boot[0x0B]+boot[0x0C]*256) +

1);

55

//nsetor recebe n. de entradas no diretorio raiz * 32 bytes por entrada

//dividido pela qtdade bytes por setor para saber o tamanho do dir.

//raiz em setores. + 1 para setores nao inteiros...

setor = ((boot[0x0f]*256 + boot[0x0e]) + (boot[0x10] * (boot[0x17]*256 +

boot[0x16])) + 1);

//setor recebe n. de setores reservados + n. de fat * n.setores por

//fat + 1

temp = setor / (boot[0x18]+boot[0x19]*256);

if ((temp % (boot[0x1A])) == 0) superficie = 0;

else superficie = 1;

cilindro = temp / boot[0x1A];

//cilindro = trilha / n. de cabeca

setor = setor % (boot[0x18]+boot[0x19]*256);

//setor recebe setor no determinado cilindro/trilha

interrupcao();

//executa interrupcao no diretorio raiz

buf[128] = 'P';

_AH = 0; //RESETA

_DL = 0; //DRIVE

geninterrupt(0x13);

_ES = FP_SEG(buf);

_BX = FP_OFF(buf);

_AH = 3; //ESCRITA

_AL = nsetor; //N. DE SETOR - TAMANHO

_CH = cilindro; //CILINDRO 0

_CL = setor; //SETOR 1

56

_DH = superficie; //SUPERFICIE 0

_DL = 0; //DRIVE

geninterrupt(0x13);

}

void subdiretorio(int xpos)//lista os subdiretorios se houver

{

nsetor = 1;

setor = ((endereco[xpos]-2) * (boot[0x0D]) + 33);

temp = setor / (boot[0x18]+boot[0x19]*256);

if ((temp % (boot[0x1A])) == 0) superficie = 0;

else superficie = 1;

cilindro = temp / boot[0x1A];

setor = (setor % (boot[0x18]+boot[0x19]*256) + 1);

interrupcao();

//executa interrupcao no endereco do arquivo encontrada pela fat

unsigned int momento;

unsigned int data;

int arquivus, demais, byte, dirlocal;

arquivus = 0;

dirlocal = 0;

demais = 0;

byte = 0;

printf("LISTAGEM DO DIRETORIO %u\n", xpos);

do {

do {

57

printf("\n%c%c%c%c%c%c%c%c", buf[byte], buf[byte + 1], buf[byte +

2],buf[byte + 3],buf[byte + 4],buf[byte + 5], buf[byte + 6], buf[byte + 7]);

if ((buf[byte + 11] == '\x10') && (buf[byte] != '.'))

{

printf(" <DIR> ");

if (buf[byte] != 0xe5)

{

endereco[pos] = (buf[byte + 26] + buf[byte + 27]*256);

pos = pos + 1;

dirlocal = dirlocal + 1;

}

}

else if (buf[byte + 11] == ' ')

{

printf(" %c%c%c ", buf[byte + 8], buf[byte + 9], buf[byte +

10]);

arquivus = arquivus + 1;

}

else

{

printf(" -- -- ");

demais = demais + 1;

}

if ((buf[byte + 11] == '\x10') || (buf[byte + 11] == ' '))

{

momento = buf[byte + 22] + buf[byte + 23] * 256;

printf("%02u:%02u:%02u", (momento & 0xf800)>>11 , (momento &

0x07e0)>>5, (momento & 0x001f)*2);

data = buf[byte + 24] + buf[byte + 25] * 256;

printf(" %02u\\%02u\\%u", (data & 0x001f), (data & 0x01e0)>>5,

(((data & 0xfe00)>>9) + 1980));

if (buf[byte + 11] != '\x10') printf(" %u", (buf[byte + 28] + buf[byte

+ 29]*256 + buf[byte + 30]*65536 + buf[byte + 31]*256*65536));

58

}

byte = byte + 32;

} while ((buf[byte] != 0x00) || ((byte % 32) != 0) || (byte < 32));//(byte < 7168);

//era 7168

// para quando o primeiro char do nome == 0x00 -> ultima entrada

//busca na fat o endereco do proximo bloco

int end;

end = endereco[xpos] * 1.5;

if( !(endereco[xpos]&0x0001))

endereco[xpos] = (fat[end]) + (((Word)fat[end + 1]&0x000f) << 8);

else

endereco[xpos] = ((fat[end]&0x00f0) >> 4) + ((Word)fat[end + 1] << 4);

nsetor = 1;

setor = ((endereco[xpos]-2) * (boot[0x0D]) + 33);

temp = setor / (boot[0x18]+boot[0x19]*256);

if ((temp % (boot[0x1A])) == 0) superficie = 0;

else superficie = 1;

cilindro = temp / boot[0x1A];

setor = setor % (boot[0x18]+boot[0x19]*256);

interrupcao();

//executa interrupcao no endereco do arquivo encontrada pela fat

} while (buf[byte] != 0x00);

printf("\n\nNumero de arquivos ativos: %u", arquivus);

printf("\nNumero de diretorios ativos: %u", dirlocal);

printf("\nDemais (sistema/oculto/apagados): %u", demais);

59

printf("\n\nPressione qualquer tecla para continuar...");

getch();

clrscr();

}

void diretorio()//lista diretorio raiz

{

int byte;

//calcula o endereco do diretorio raiz

nsetor = (((boot[0x11]+boot[0x12]*256) * 32) / (boot[0x0B]+boot[0x0C]*256) +

1);

//nsetor recebe n. de entradas no diretorio raiz * 32 bytes por entrada

//dividido pela qtdade bytes por setor para saber o tamanho do dir.

//raiz em setores. + 1 para setores nao inteiros...

setor = ((boot[0x0f]*256 + boot[0x0e]) + (boot[0x10] * (boot[0x17]*256 +

boot[0x16])) + 1);

//setor recebe n. de setores reservados + n. de fat * n.setores por

//fat + 1

temp = setor / (boot[0x18]+boot[0x19]*256);

if ((temp % (boot[0x1A])) == 0) superficie = 0;

else superficie = 1;

cilindro = temp / boot[0x1A];

//cilindro = trilha / n. de cabeca

setor = setor % (boot[0x18]+boot[0x19]*256);

//setor recebe setor no determinado cilindro/trilha

interrupcao();

//executa interrupcao no diretorio raiz

60

byte = 0;

pos = 0;

unsigned int momento;

unsigned int data;

int arquivus, demais;

arquivus = 0;

demais = 0;

printf("LISTAGEM DO DIRETORIO RAIZ\n");

do {

printf("\n%c%c%c%c%c%c%c%c", buf[byte], buf[byte + 1], buf[byte +

2],buf[byte + 3],buf[byte + 4],buf[byte + 5], buf[byte + 6], buf[byte + 7]);

if (buf[byte + 11] == '\x10')

{

printf(" <DIR> ");

if (buf[byte] != 0xe5)

{

endereco[pos] = (buf[byte + 26] + buf[byte + 27]*256);

pos = pos + 1;

}

}

else if (buf[byte + 11] == ' ')

{

printf(" %c%c%c ", buf[byte + 8], buf[byte + 9], buf[byte +

10]);

arquivus = arquivus + 1;

}

else

{

printf(" -- -- ");

demais = demais + 1;

}

if ((buf[byte + 11] == '\x10') || (buf[byte + 11] == ' '))

61

{

momento = buf[byte + 22] + buf[byte + 23] * 256;

printf("%02u:%02u:%02u", (momento & 0xf800)>>11 , (momento &

0x07e0)>>5, (momento & 0x001f)*2);

data = buf[byte + 24] + buf[byte + 25] * 256;

printf(" %02u\\%02u\\%u", (data & 0x001f), (data & 0x01e0)>>5,

(((data & 0xfe00)>>9) + 1980));

if (buf[byte + 11] != '\x10') printf(" %u", (buf[byte + 28] + buf[byte

+ 29]*256 + buf[byte + 30]*65536 + buf[byte + 31]*256*65536));

}

byte = byte + 32;

} while ((buf[byte] != 0x00) || ((byte % 32) != 0) || (byte < 32));//(byte < 7168);

//era 7168

// para quando o primeiro char do nome == 0x00 -> ultima entrada

printf("\n\nNumero de arquivos ativos: %u", arquivus);

printf("\nNumero de diretorios ativos: %u", pos);

printf("\nDemais (sistema/oculto/apagados): %u", demais);

printf("\n\nPressione qualquer tecla para continuar...");

getch();

clrscr();

if (endereco[0] != 0)

{

int xpos;

xpos = 0;

do

{

subdiretorio(xpos);

xpos = xpos + 1;

} while (xpos < pos);

}

}

62

void fati()//lista fat

{

//define o buffer fat com o tamanho da fat (n. setor fat * bytes setor)

//calcula o endereco da primeira fat

nsetor = (boot[0x16]+boot[0x17]*256);

//nsetor recebe o tamanho da fat

setor = ((boot[0x0f]*256 + boot[0x0e]) + 1);

//setor recebe n. de setores reservados + 1

temp = setor / (boot[0x18]+boot[0x19]*256);

if ((temp % (boot[0x1A])) == 0) superficie = 0;

else superficie = 1;

cilindro = temp / boot[0x1A];

//cilindro = trilha / n. de cabeca

setor = setor % (boot[0x18]+boot[0x19]*256);

//setor recebe setor no determinado cilindro/trilha

interrupcao_fat();

//executa interrupcao na fat

//calcula o endereco da segunda fat

nsetor = (boot[0x16]+boot[0x17]*256);

//nsetor recebe o tamanho da fat

setor = ((boot[0x0f]*256 + boot[0x0e]) + 1 + (boot[0x16]+boot[0x17]*256));

//setor recebe n. de setores reservados + 1 + n. setor por fat(primeira fat)

63

temp = setor / (boot[0x18]+boot[0x19]*256);

if ((temp % (boot[0x1A])) == 0) superficie = 0;

else superficie = 1;

cilindro = temp / boot[0x1A];

//cilindro = trilha / n. de cabeca

setor = setor % (boot[0x18]+boot[0x19]*256);

//setor recebe setor no determinado cilindro/trilha

interrupcao_fat1();

//executa interrupcao na fat1

temp = 0;

do {

printf("%u %u\n", fat[temp], fat1[temp]);

temp = temp + 1;

} while (temp < 25); //mostra primeiros 100 char das 2 fats

getch();

}

void info()

{

printf("Informacoes do BOOT da midia\n\n");

printf("Bytes por setor: %u \n", boot[0x0B]+boot[0x0C]*256);

printf("Setor por cluster: %u \n", boot[0x0D]);

printf("N. setores reservados: %u \n", boot[0x0E]+boot[0x0F]*256);

printf("N. de FATs: %u \n", boot[0x10]);

printf("N. de entradas no Dir. Raiz: %u \n", boot[0x11]+boot[0x12]*256);

printf("N. setores no volume: %u \n", boot[0x13]+boot[0x14]*256);

printf("Descritor da midia: %u \n", boot[0x15]);

printf("N. de setor por FAT: %u \n", boot[0x16]+boot[0x17]*256);

printf("N. de setor por trilha: %u \n", boot[0x18]+boot[0x19]*256);

64

printf("N. de cabeca de r/w: %u \n", boot[0x1A]+boot[0x1B]*256);

printf("N. setores escondidos: %u \n", boot[0x1C]+boot[0x1D]*256);

printf("\nPressione qualquer tecla para continuar...\n");

getch();

}

void main()

{

nsetor = 1;

setor = 1;

superficie = 0;

cilindro = 0;

for (pos = 0; pos < 30; pos++) endereco[pos] = 0;

interrupcao_boot(); //executa uma interrupcao no setor de boot...

fat = (unsigned char *)new unsigned char[((boot[0x16] + boot[0x17]*256) *

(boot[0x0b] + boot[0x0c]*256))];

fat1 = (unsigned char *)new unsigned char[((boot[0x16] + boot[0x17]*256) *

(boot[0x0b] + boot[0x0c]*256))];

buf = (unsigned char *)new unsigned char[((boot[0x11] + boot[0x12]*256) * 32)];

//clrscr();

//info();//lista info do boot

//clrscr();

//recuperabyte();

//clrscr();

//diretorio();//lista diretorio raiz

clrscr();

fati();//lista fat

clrscr();

mostrafat(); }