Capítulo – 16
DESENVOLVENDO MAIS UTILITÁRIOS DE DISCO
Introdução
Neste capítulo, discutiremos como usar MBR, DBR, FAT e informações de diretório raiz para desenvolver utilitários que podem nos ajudar a gerenciar dados, otimizar o armazenamento ou resolver muitos problemas de solução de problemas de disco.
Normalmente, esses programas são uma solução para um problema específico. Alguns utilitários e sua programação foram discutidos neste capítulo.
Escondendo seções
Normalmente, o utilitário de ocultação de partições é usado por usuários que trabalham no mesmo sistema de computador que os outros usuários. Se houver muitos usuários em um computador, há uma grande probabilidade de que os dados de outro usuário possam ser lidos, roubados ou excluídos.
Nesse caso, se o usuário tiver alguns dados importantes ou informações confidenciais no mesmo computador, ele pode querer ocultar a partição onde seus dados estão localizados para que a partição não possa ser acessada pelo sistema operacional e, portanto, não possa ser acessada por outro usuário.
Quando o usuário quiser trabalhar no sistema, ele pode acessar a seção novamente simplesmente abrindo-a. Normalmente, esses eventos ocorrem em instituições profissionais onde os computadores são usados por muitos alunos, mas os alunos mais velhos estão sempre preocupados com seus dados importantes ou trabalhos de projeto. Assim como acontece com a falta de conhecimento, um novo aluno pode danificar ou até mesmo apagar seus dados.
Como uma seção fica oculta?
A tabela a seguir mostra o formato da partição na tabela de partição MBR:
Compensar |
Significado |
Tamanho |
Descrição |
00H |
Byte indicador do tipo de inicialização |
1 byte |
Se o byte for 00H, a partição estará inativa, e se o byte for 80H , a partição estará ativa (ou inicializável). |
01H |
Número da seção inicial |
1 byte |
Número da partição inicial em hexadecimal |
02H |
Setor e número do cilindro do início da partição |
2 bytes |
Os 6 bits do primeiro byte compõem o número do setor inicial, e a combinação dos 2 bits restantes (como os dois bits mais significativos) e os 8 bits do outro byte (os 8 bits menos significativos restantes do número de 10 bits) compõem o número do cilindro inicial da partição. |
04H |
Byte Indicador do Sistema de Arquivos |
1 byte |
Byte indicador do sistema de arquivos em hexadecimal (para uma lista completa de bytes indicadores de partição, consulte o capítulo "Abordagem lógica para discos e sistemas operacionais" discutido anteriormente neste livro) |
05H |
Número do título do fim da seção |
1 byte |
Número da partição final em hexadecimal |
06H |
Setor e número do cilindro no final da seção |
2 bytes |
Os 6 bits do primeiro byte compõem o número final do setor, e a combinação dos 2 bits restantes (como os dois bits mais significativos) e os 8 bits do outro byte (os 8 bits menos significativos restantes do número de 10 bits) compõem o número final do cilindro da partição. |
08H |
Número absoluto do setor do início da partição |
4 bytes |
Número de setores entre MBR e o primeiro setor na partição |
0H |
Número absoluto do setor do final da partição |
4 bytes |
Número de setores na seção |
|
|
Total = 16 bytes |
|
No deslocamento 04H, em cada entrada de partição, há um byte indicador do sistema de arquivos. Este byte indicador representa o tipo de sistema de arquivos desta partição. Se o valor deste byte mudar, a identificação da seção muda.
Por exemplo, o valor do byte indicador de partição para "DOS 12-Bit FAT" é 0x01. Se esse valor for alterado para 0x11, o identificador do sistema de arquivos na entrada da tabela de partição será alterado para "DOS oculto de 12 bits FAT" (para uma lista completa de bytes indicadores de partição, consulte o capítulo "Abordagem lógica para discos e sistemas operacionais" discutido anteriormente neste livro).
A tabela abaixo mostra mais alguns exemplos de bytes indicadores do sistema de arquivos para alguns tipos de partição:
Byte indicador do tipo de partição |
Descrição do sistema de arquivos de partição |
0x01 |
DOS 12 bits FAT |
0x11 |
DOS oculto 12 bits FAT |
0x04 |
DOS 16 bits FAT (<=32 MB) |
0x14 |
DOS oculto 16 bits FAT (<=32 MB) |
0x05 |
DOS estendido |
0x15 |
DOS oculto estendido |
0x06 |
DOS 16 bits grande (>32 MB) |
0x16 |
DOS oculto de 16 bits grande (>32 MB) |
0x07 |
NTFS |
0x17 |
NTFS oculto |
0x0B |
Windows FAT32 |
0x1B |
Janelas ocultas FAT32 |
0x0C |
Windows FAT32 (LBA) |
0x1C |
Windows Oculto FAT32 (LBA) |
0x0E |
Windows FAT16 (LBA) |
0x1E |
Janelas ocultas FAT16 (LBA) |
0x0F |
Janelas expandidas |
0x1F |
Janelas ocultas expandidas |
Aqui vemos que a partição oculta correspondente para qualquer sistema de arquivos é encontrada adicionando o valor 0x10 ao seu byte indicador de sistema.
Embora não seja a regra rígida e rápida para ocultar a partição, ela funciona até mesmo para a maioria dos sistemas de arquivos. A razão por trás disso é que quando alteramos o valor do byte indicador de partição, a identidade do sistema de arquivos na entrada da tabela de partição é alterada. E é muito raro que o novo sistema de arquivos também seja suportado pelo mesmo sistema operacional.
Escrevendo programa para ocultar partição
O programa fornecido a seguir é usado para ocultar a partição usando a entrada de partição dessa partição da tabela de partição do MBR. Se você quiser ocultar outras partições lógicas no volume estendido, você deve acessar os MBRs estendidos.
A codificação do programa foi dada a seguir:
/* Programa para ocultar a partição usando a entrada da tabela de partição dessa partição do MBR */
#incluir <bios.h>
#incluir <stdio.h>
int principal(vazio)
{
estrutura diskinfo_t dinfo;
int resultado, para ocultar;
int eu;
static char dbuf[512];/* Buffer de dados para leitura e gravação de
Informações do setor */
clrscr();
dinfo.drive = 0x80; /* número da unidade para o primeiro
Disco Rígido */
dinfo.head = 0; /* número da cabeça do disco */
dinfo.track = 0; /* número da trilha */
dinfo.sector = 1; /* número do setor */
dinfo.nsectors = 1; /* contagem de setores */
dinfo.buffer = dbuf; /* buffer de dados */
/* Leia o Primeiro Setor do Disco */
resultado = _bios_disk(_DISK_READ, &dinfo);
se ((resultado & 0xff00) == 0)
{
printf("Os códigos de partição de quatro entradas de partição são,
0x%02x, 0x%02x, 0x%02x e 0x%02x.\n",
dbuf[450] e 0xff, dbuf[466] e 0xff,
dbuf[482] e 0xff, dbuf[498] e 0xff);
cor do texto(15);
gotoxy(5,5);cprintf("A entrada da partição no MBR é como
segue:");
gotoxy(10,7);cprintf("1. "); showtype(dbuf[450] & 0xff);
gotoxy(10,8);cprintf("2. "); showtype(dbuf[466] & 0xff);
gotoxy(10,9);cprintf("3."); showtype(dbuf[482] & 0xff);
gotoxy(10,10);cprintf("4."); showtype(dbuf[498] & 0xff);
/* obtém a entrada do usuário para ocultar a partição */
gotoxi(1,15);
printf("Digite o número da partição que você deseja ocultar,
Ou pressione qualquer outra tecla para sair... ");
esconder=obter();
alternar (para esconder)
{
caso '1': /* Ocultar a primeira partição na tabela de partições */
dbuf[450] = dbuf[450] +16;
resultado = _bios_disk(_DISK_WRITE, &dinfo);
quebrar;
caso '2': /* Ocultar segunda partição na tabela de partições */
dbuf[466] = dbuf[466]+16;
resultado = _bios_disk(_DISK_WRITE, &dinfo);
quebrar;
caso '3': /* Ocultar terceira partição na tabela de partições */
dbuf[482] = dbuf[482] +16;
resultado = _bios_disk(_DISK_WRITE, &dinfo);
quebrar;
caso '4': /* Ocultar a Quarta Partição na Tabela de Partição */
dbuf[498] = dbuf[498]+16;
resultado = _bios_disk(_DISK_WRITE, &dinfo);
quebrar;
padrão:
saída(0);
}
se ((resultado & 0xff00) == 0)
{
printf("\n\nOs novos códigos de partição de quatro partições
As entradas são 0x%02x, 0x%02x, 0x%02x e 0x%02x.\n",
dbuf[450] e 0xff, dbuf[466] e 0xff,
dbuf[482] e 0xff, dbuf[498] e 0xff);
obter();
}
outro
{
printf("Não é possível alterar o byte, status = 0x%02x\n",
resultado);
obter();
}
}
retornar 0;
}
Comentários sobre codificação:
O programa lê bytes indicadores do sistema de arquivos de todas as quatro entradas de partição na tabela de partição do MBR. A função showtype( ) é usada para mostrar o nome do sistema de arquivos para o valor correspondente do byte indicador do sistema de arquivos.
O usuário seleciona a partição a ser ocultada no menu exibido na tela e então 16 (0x10) é adicionado ao valor do byte indicador do sistema de arquivos dessa partição para ocultá-la.
A codificação da função showtype( ) é a seguinte:
/* Função para mostrar o nome do sistema de arquivos correspondente ao valor do byte indicador do sistema de arquivos */
tipo de exibição(i)
{
interruptor (i)
{
caso 0x00 :cprintf("Vazio"); break;
caso 0x01 :cprintf("DOS 12 bits FAT"); break;
caso 0x02 :cprintf("raiz XENIX"); break;
caso 0x03 :cprintf("XENIX usr"); pausa;
caso 0x04 :cprintf("DOS 16 bits <32M"); break;
caso 0x05 :cprintf("Estendido"); break;
caso 0x06 :cprintf("DOS 16 bits >=32M"); quebra;
caso 0x07 :cprintf("OS/2 HPFS"); interrupção;
caso 0x08 :cprintf("AIX"); quebra;
caso 0x09 :cprintf("AIX inicializável"); break;
caso 0xa :cprintf("Gerenciador de inicialização do OS/2"); break;
caso 0xb :cprintf("Win95/98/ME FAT32"); quebra;
caso 0xc :cprintf("Win95/98/ME FAT32 (LBA)"); quebra;
caso 0xd :cprintf("Win95 FAT16"); quebra;
caso 0xe :cprintf("Win95 FAT16 (LBA)"); quebra;
caso 0xf :cprintf("Win95 estendido"); quebra;
caso 0x11 :cprintf("FAT-12 oculto");break;
caso 0x12 :cprintf("Diagnóstico Compaq");break;
caso 0x14 :cprintf("FAT-16 oculto (<32)");break;
caso 0x15 :cprintf("Oculto Estendido");break;
caso 0x16 :cprintf("FAT-16 oculto");break;
caso 0x17 :cprintf("NTFS"); quebra;
caso 0x40 :cprintf("Venix 80286"); quebra;
caso 0x51 :cprintf("Novell?"); quebra;
caso 0x52 :cprintf("Microporta"); quebra;
caso 0x63 :cprintf("GNU HURD"); quebra;
caso 0x64:
caso 0x65 :cprintf("Novell Netware"); quebra;
caso 0x75 :cprintf("PC/IX"); quebra;
caso 0x80 :cprintf("MINIX antigo"); break;
caso 0x81 :cprintf("Linux/MINIX"); pausa;
caso 0x82 :cprintf("Swap do Linux"); interrupção;
caso 0x83 :cprintf("Linux nativo"); break;
caso 0x85 :cprintf("Linux Estendido"); break;
caso 0x93 :cprintf("Ameba"); quebra;
caso 0x94 :cprintf("Ameba BBT"); quebra;
caso 0xa5 :cprintf("BSD/386"); quebra;
caso 0xa6 :cprintf("OpenBSD"); quebra;
caso 0xa7 :cprintf("PRÓXIMO PASSO"); pausa;
caso 0xb7 :cprintf("BSDI fs"); pausa;
caso 0xb8 :cprintf("troca BSDI"); interrupção;
caso 0xc7 :cprintf("Syrinx"); quebra;
caso 0xdb :cprintf("CP/M"); quebra;
caso 0xe1 :cprintf("acesso DOS"); break;
caso 0xe3 :cprintf("DOS R/O"); quebra;
caso 0xf2 :cprintf("DOS secundário"); break;
caso 0xff :cprintf("BBT"); quebra;
padrão :cprintf("DESCONHECIDO");
}
retornar 0;
}
Escrevendo programa para exibir a partição
O programa para desocultar a partição oculta funciona exatamente o oposto do programa que oculta o programa. Neste programa, subtraímos 16 (0x10) do valor do byte indicador do sistema de arquivos da partição oculta.
A codificação do programa é a seguinte:
/* Programa para exibir a partição oculta pelo programa anterior */
#incluir <bios.h>
#incluir <stdio.h>
int principal(vazio)
{
estrutura diskinfo_t dinfo;
int resultado, para ocultar;
int eu;
char estático dbuf[512];/* Buffer de dados */
clrscr();
dinfo.drive = 0x80; /* número da unidade para
Primeiro Disco Rígido */
dinfo.head = 0; /* número da cabeça do disco */
dinfo.track = 0; /* número da trilha */
dinfo.sector = 1; /* número do setor */
dinfo.nsectors = 1; /* contagem de setores */
dinfo.buffer = dbuf; /* buffer de dados */
resultado = _bios_disk(_DISK_READ, &dinfo);
se ((resultado & 0xff00) == 0)
{
printf("Os códigos de partição de quatro partições
As entradas são 0x%02x, 0x%02x, 0x%02x e 0x%02x.\n",
dbuf[450] e 0xff, dbuf[466] e 0xff,
dbuf[482] e 0xff, dbuf[498] e 0xff);
cor do texto(15);
gotoxi(5,5);
cprintf("A entrada da partição no MBR é a seguinte:");
gotoxy(10,7);cprintf("1. "); showtype(dbuf[450] & 0xff);
gotoxy(10,8);cprintf("2. "); showtype(dbuf[466] & 0xff);
gotoxy(10,9);cprintf("3."); showtype(dbuf[482] & 0xff);
gotoxy(10,10);cprintf("4."); showtype(dbuf[498] & 0xff);
/* Obtenha a entrada Use para exibir a partição */
gotoxy(1,15);printf("Digite o número da partição, qual
mostrar, ou pressione qualquer outra tecla para
Saída... ");
esconder=obter();
alternar (para esconder)
{
/* Exibe a primeira partição da tabela de partições */
caso '1':
dbuf[450] = dbuf[450] -16;
resultado = _bios_disk(_DISK_WRITE, &dinfo);
quebrar;
/* Exibe a segunda partição da tabela de partições */
caso '2':
dbuf[466] = dbuf[466]-16;
resultado = _bios_disk(_DISK_WRITE, &dinfo);
quebrar;
/* Exibe a terceira partição da tabela de partições */
caso '3':
dbuf[482] = dbuf[482] -16;
resultado = _bios_disk(_DISK_WRITE, &dinfo);
quebrar;
/* Exibe a quarta partição da tabela de partições */
caso '4':
dbuf[498] = dbuf[498]-16;
resultado = _bios_disk(_DISK_WRITE, &dinfo);
quebrar;
padrão:
saída(0);
}
se ((resultado & 0xff00) == 0)
{
printf("\n\nOs novos códigos de partição de quatro partições
As entradas são 0x%02x, 0x%02x, 0x%02x e 0x%02x.\n",
dbuf[450] e 0xff, dbuf[466] e 0xff,
dbuf[482] e 0xff, dbuf[498] e 0xff);
obter();
}
outro
{
printf("Não é possível alterar o byte, status = 0x%02x\n",
resultado);
obter();
}
}
retornar 0;
}
Comentários sobre o programa
Tenha cuidado ao dar o número da partição para desocultar. Se o número da partição for inserido errado por engano, as informações do sistema de arquivos dessa partição serão alteradas e a partição pode se tornar inacessível. No entanto, o programa discutido anteriormente para ocultar as partições pode ajudar você a curar o byte indicador do sistema de arquivos dessa partição.
Escrevendo programa para excluir partição
O programa para apagar partição é usado para propósitos de solução de problemas. Por exemplo, suponha que você tinha as partições do sistema de arquivos FAT32 no seu disco. Agora você decidiu instalar o sistema operacional LINUX no seu disco simultaneamente.
Se de alguma forma, a instalação do sistema operacional for interrompida no meio, no estágio em que as modificações estavam sendo feitas na tabela de partição do MBR. Em tais casos, há muitas possibilidades de que a partição, na qual você iria instalar o outro sistema operacional, se torne inacessível.
Neste caso, o espaço em disco da partição perdida se torna inútil por ser inacessível. No entanto, se excluirmos as informações de partição daquela partição da tabela de partição de qualquer forma, podemos tornar esse espaço utilizável novamente usando o comando FDISK do DOS.
O programa para excluir a entrada de partição da tabela de partição do MBR é fornecido a seguir:
/* Programa para excluir a segunda entrada de partição da tabela de partição do MBR */
# incluir <bios.h>
/* estrutura para ler a entrada da partição da tabela de partição */
partição de estrutura
{
/* Byte de partição ativa */
char não assinado inicializável;
/* Cabeçalho inicial */
char sem sinal start_side ;
/* combinação do setor de partida e número do cilindro */
int não assinado start_sec_cyl;
/* Byte indicador do sistema de arquivos */
tipo de parte char não assinado;
/* Cabeçalho final */
char sem sinal fim_lado;
/* combinação do setor de partida e número do cilindro */
int sem sinal end_sec_cyl;
/* Número relativo do setor */
unsigned long part_beg ;
/* Comprimento da partição em setores */
longo sem sinal plen;
} ;
/* Estrutura para leitura e gravação de MBR */
parte da estrutura
{
/* IPL (Carregador de Programa Inicial) */
char não assinado master_boot[446] ;
/* Tabela de partição */
estrutura partição pt[4] ;
/* Número mágico */
int últimos dois;
} ;
estrutura parte p;
vazio principal()
{
int sem sinal t1,t2;
clrscr();
biosdisco ( 2, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* exibe as informações de
Tabela de partição */
obter();
p.pt[1].inicializável = 0;
p.pt[1].lado_inicial = 0 ;
p.pt[1].start_sec_cil = 0 ;
p.pt[1].tipo de peça = 0;
p.pt[1].fim_lado = 0;
p.pt[1].end_sec_cil = 0;
p.pt[1].part_beg = 0;
p.pt[1].plen = 0;
printf("\n\n\n Após Excluir a Segunda Partição
Entrada da tabela de partição MBR,");
printf("\n A tabela de partição será alterada como
Segue: ");
/* Para excluir informações da segunda partição da partição
tabela de MBR Remova as barras invertidas do
função biosdisk( ). Não use descuidadamente, partição
informações da Segunda Partição da Tabela de Partição irão
ser apagado completamente. */
////// biosdisco ( 3, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* Exibe as informações da partição
tabela após modificação */
obter();
}
Comentários sobre o programa:
Descomente a função biosdisk (3, 0x80, 0, 0, 1, 1, &p) para excluir a segunda partição da tabela de partições do MBR.
Para excluir a partição, todos os parâmetros dela são definidos como 0 na entrada da tabela de partição no MBR. Lembre-se sempre de que, se você excluir a partição estendida, todas as partições lógicas dessa partição estendida também ficarão inacessíveis.
A função display( ) é usada para exibir a tabela de partição do MBR. A codificação da função é a seguinte:
/* Função para exibir a tabela de partição do MBR */
mostrar()
{
int não assinado s_sec, s_trk, e_sec, e_trk, i, t1, t2 ;
char tipo[20], boot[5] ;
printf("\n\nParte. Inicialização Local de início Local de término
Número relativo de");
printf("\nTipo Lado Cilindro Setor Lado Cilindro
Setor Setores Setores\n");
para ( i = 0 ; i <= 3 ; i++ )
{
se ( p.pt[i].bootable == 0x80 )
strcpy ( boot, "Sim" ) ;
outro
strcpy ( boot, "Não" ) ;
interruptor ( p.pt[i].parttype )
{
caso 0x00:
strcpy ( tipo, "Não utilizado" ) ; break ;
caso 0x1:
strcpy ( tipo, "FAT12" ) ; quebrar ;
caso 0x2:
strcpy ( tipo, "Xenix" ) ; quebrar ;
caso 0x3:
strcpy ( tipo, "Xenix:usr" ) ; quebrar ;
caso 0x4:
strcpy ( tipo, "FAT16<32M" ) ; quebrar ;
caso 0x5:
strcpy ( tipo, "DOS-Ext." ) ; quebrar ;
caso 0x6:
strcpy ( tipo, "FAT16>32M" ) ; quebrar ;
caso 0x7:
strcpy ( tipo, "NTFS" ) ; quebrar ;
caso 0x0b:
strcpy ( tipo, "FAT32" ) ; quebrar ;
caso 0x0c:
strcpy ( tipo, "FAT32-LBA" ) ; quebrar ;
caso 0x0d:
strcpy ( tipo, "VFAT16" ) ; quebrar ;
caso 0x0e:
strcpy ( tipo, "VFAT16-LBA" ) ; quebrar ;
caso 0x0f:
strcpy ( tipo, "FAT EXT" ) ; quebrar ;
caso 0x17:
strcpy ( tipo, "HPFS" ) ; quebrar ;
caso 0x81:
strcpy ( tipo, "LINUX antigo" ) ; break ;
caso 0x82:
strcpy ( tipo, "LinuxSwap" ) ; quebrar ;
caso 0x83:
strcpy ( tipo, "LinuxNative" ) ; quebrar ;
caso 0x85:
strcpy ( tipo, "Linux Ext." ) ; quebrar ;
padrão :
strcpy ( tipo, "Desconhecido" ) ; break ;
}
s_sec = ( p.pt[i].start_sec_cyl & 0x3f ) ;
t1 = ( p.pt[i].start_sec_cyl & 0xff00 ) >> 8 ;
t2 = ( p.pt[i].start_sec_cyl & 0x00c0 ) << 2 ;
s_trk = t1 | t2 ;
e_sec = ( p.pt[i].end_sec_cyl & 0x3f ) ;
t1 = ( p.pt[i].end_sec_cyl & 0xff00 ) >> 8 ;
t2 = ( p.pt[i].end_sec_cyl & 0x00c0 ) << 2 ;
e_trk = t1 | t2 ;
printf("\n%6s %3s", tipo, inicialização);
printf("%4d %6d %8d", p.pt[i].start_side,
s_trk,s_sec ) ;
printf("%7d %6u %8u", p.pt[i].end_side, e_trk,
e_sec ) ;
printf(" %10lu %10lu", p.pt[i].part_beg,
p.pt[i].plen ) ;
}
retornar 0;
}
Formatando o disquete “Track 0 Bad”
Este programa é usado para formatar aqueles disquetes que têm setores defeituosos em sua trilha 0 e quando são formatados com DOS ou Windows, exibem mensagens de erro como “Trilha 0 RUIM”. No entanto, você também pode usá-lo para formatar disquetes normais.
A codificação do programa foi dada no disco incluído neste livro com o nome “TTFORMAT.C”. A lógica de funcionamento do programa é a mesma do programa publicado na revista de informática PCQUEST, edição de fevereiro de 2003.
Neste programa, tentamos tornar este tipo de disquete reutilizável, formatando-os. O programa parece que você pode lidar com o disquete mesmo com alguns setores defeituosos nele. No entanto, se o primeiro setor do disco estiver ruim, o disquete não pode ser formatado.
O programa reescreve todas as informações de DBR, FAT e Root Directory. Se houver setores defeituosos na superfície do disco, eles são marcados como ruins em FAT.
Na codificação do programa, a estrutura BPB é usada para escrever o BIOS Parameter Block do DBR. A estrutura boot_sector é usada para escrever o DBR do disco. A estrutura address_field é usada para interagir com o número de cilindros, cabeças e setores por trilha e com o tamanho do setor.
Diferentes funções usadas na codificação do programa e suas descrições foram fornecidas na tabela a seguir.

O número de série do volume do disquete é calculado pelo DOS de acordo com a data e hora atuais do relógio do sistema.
A primeira parte do número de série é calculada pela soma do tempo (segundos e centésimos de segundo) e da data (mês e dia). A segunda parte do número de série é igual à soma do tempo (horas e minutos) e da data (ano).
Todos os cálculos são realizados no sistema hexadecimal. Por exemplo, vamos supor que você formatou o disquete no ambiente DOS às 11:16:28:65 em 23/10/2003. Agora vamos calcular o número de série do disco.
O tempo no formato (segundos e centésimos de segundos) é
= (28 e 65)
= (1CH e 41H)
Escreva como 1C41
Da mesma forma, a data no formato (mês e dia) é
= (10 e 23)
= (0AH e 17H)
Escreva como 0A17
Da mesma forma, o tempo no formato (horas e minutos) é,
= (11 e 16)
= (0BH e 10H)
Escreva como 0B10
E o ano será
= 2003
= 07D3
Agora, vamos calcular o número de série do disquete, de acordo com a descrição dada antes. A primeira parte do número de série será (1C41 + 0A17) = 2658 e a segunda parte do número de série será (0B10 + 07D3) = 12E3.
Escrevendo a ferramenta de edição de disco
A codificação do programa de edição de disco foi fornecida no disco incluído neste livro, com o nome de arquivo "TTEDITOR.C". Você pode usar este programa para analisar a superfície de discos rígidos ou disquetes. Na maior parte do tempo em que escrevi este livro, usei o TTEDITOR para analisar a superfície do disco ou realizar modificações no disco.
Aqui estão algumas das tarefas importantes que este programa de edição pode executar:
- Leitura de informações setor por setor da superfície de discos rígidos e disquetes.
- Grave uma cópia de backup de qualquer setor em um arquivo.
- Recuperar dados do setor do arquivo.
- Alterar um byte.
- Calculadora para converter números hexadecimais em decimais e binários.
O programa usa as funções biosdisk( ) e _bios_disk( ) para acessar discos. Se você quiser analisar um disco com mais de 8,4 GB, modifique o programa para usar extensões INT 13H. A descrição das funções utilizadas no programa é dada na tabela a seguir:
Função |
Descrição |
fundo() |
cria o fundo e a moldura da primeira tela |
linhacls( ) |
Usado para limpar uma linha inteira da tela especificada pelo número da linha. |
atualizar( ) |
Função para chamar todas as funções de exibição na tela |
escreverparaarquivo() |
Função para gravar dados do setor em um arquivo de usuário. |
escrever para o setor ( ) |
A função de restaurar um setor de um arquivo especificado. |
mensagemdisp() |
Função de exibir mensagens na tela. |
mudar( ) |
Função para alterar um byte de qualquer setor especificado pelo usuário. |
quadro( ) |
Função de desenho da estrutura do quadro de exibição do setor |
dispmax() |
Exibe o número máximo de CHS de um disco (válido para discos de até 8,4 GB) |
mostrar( ) |
Exibir setor e informações na tela. |
hextodec( ) |
Função para converter um número hexadecimal em seu número decimal e binário correspondente. |