Comportamento, ciência, tecnologia, direito, política, religião, cinema e televisão, alguma controvérsia, algum bom senso, e um pouquinho de besteira, para dar um gostinho...

17 de jan. de 2010

O bug do Windows 98

Em 1997 eu ganhei meu primeiro computador. Era um top de linha da época, um K6-II 233MHz com 48MB de RAM, disco rígido de 4GB (um enorme Quantumm Bigfoot, muito barulhento), tinha até duas portas USB, que eram raríssimas naquele tempo.

Apesar de já ter lidado em DOS e Win 3.11 em cursos no colégio, e ter uma boa noção de como eles funcionavam, foi quando ganhei esse computador que a curiosidade realmente foi satisfeita. Devo ter quebrado o software dele ao menos umas 10 vezes nas primeiras semanas, e aprendi a consertar ele logo em seguida.

Nesse mesmo tempo, eu ganhei um jogo do meu irmão (será que ele lembra?) chamado Privateer 2: The Darkening. Aí vai adivinhação do inglês, dicionário, e um RPG muito grande cheio de missões, onde controlar a nave envolvia desde o Joystick até 80% das teclas existentes no teclado, entre controle de velocidade, estabilidade, alvos e equipamentos. O p2td rodava em DOS, era necessário criar um disco de boot DOS que desse suporte a todos os drivers necessários (CD-ROM, som, etc). Não demorou muito para que eu desvendasse os segredos do autoexec.bat, do config.sys e da linguagem batch de DOS.

Foi aí que eu descobri, por acidente, um dos maiores e talvez nunca corrigidos bugs do Windows 98. Procurei na Internet, mas não encontrei nenhum relato, então pode ser que ninguém tenha descoberto mesmo, ou não procurei direito. Enfim, resolvi divulgar ele aqui.

A sequência de inicialização do win 98 envolve o DOS, na verdade o win é apenas um programa que roda emcima do DOS e "assume" o controle. No entanto, quando se boota, o que dispara é o DOS mesmo. O DOS então chama o Windows através de um comando: WIN. Esse comando dispara o WIN.COM presente na pasta WINDOWS e roda o sistema. No entanto, por uma falha de design, o DOS chama WIN mesmo, e não WIN.COM. No DOS, se você chama um programa apenas pelo nome, sem a extensão, ele vai disparar o comando de acordo com uma precedência de extensões. Nessa precedência, o .COM não é o primeiro. Primeiro vem o .BAT!!!

Em suma, se um usuário criasse um arquivo chamado WIN.BAT no diretório WINDOWS, o sistema Windows nunca seria disparado, e sim aquele bat que pode conter o que você quiser. E se dentro desse .bat você criasse um loop infinito, nunca voltaria ao prompt do DOS.

Ainda não descobri a causa exata, mas a segunda parte do bug parece advir do fato do DOS passar a renegar os comandos, assumindo que o WINDOWS vai tomar precedência e agir sobre os comandos do teclado. Com exceção da PRIMEIRA keystroke (tecla ou combinação de teclas), destinada a passar um parâmetro para o Windows (bootar no Modo de Segurança, por exemplo), o DOS passa a NÃO RESPONDER COMANDOS DEPOIS DESSA PRIMEIRA KEYSTROKE, A NÃO SER QUANDO A EXECUÇÃO DO WIN CHAMADO FOR FINALIZADA!

Se um WIN.BAT for criado, portanto, a única maneira de SAIR da execução dele seria que o PRIMEIRO keystroke seja um comando de PARAR para o .BAT que está rodando com um loop infinito (CTRL + C). De outra forma, mesmo teclar espaço, ESC ou qualquer outra tecla, seria um reboot forçado, pois o BAT rodaria infinitamente, sem chance de ser parado. Portanto, em um Windows 98, um arquivo Win.BAT no diretório WINDOWS com o seguinte conteúdo:

@echo off
:loop
REM Insira aqui echos ou qualquer outro comando, ou mesmo deixe assim para nao aparecer nada.
goto loop

Impediria um Win 98 de inicializar corretamente até que o arquivo fosse deletado. E se qualquer tecla diferente de CTRL + C fosse pressionada, acarretaria em um reboot forçado pelo usuário, afim de sair do loop infinito que impede o boot normal.