Segredos do Windows Forçar identificadores fechado

Raymond Chen

Você já quis excluir um arquivo mas não pôde porque algum programa tinha o arquivo aberto? A correta coisa a nessa situação seria convencer o programa que tem o arquivo abertas para fechá-lo — você pode, por exemplo, peça à pessoa editar o documento para fechá-la. Mas, às vezes, você obter impaciente e usar alguns utilitário que pode forçar os identificadores de arquivo fechados. E, em seguida, você tiver negociado temporário Alívio de corrupção de dados de longo prazo.

Forçar uma alça de fechado é equivalente a chegar em um programa e liberando memória. O programa acha que o identificador (ou memória) ainda é válida e continuará a usá-lo. Mas como o identificador é realmente livre, ela será reutilizada para outra coisa.

Digamos que você está no alto escola e que você veja um livro no armário número 305 que deseja. Você força o armário aberto e levar o livro. Agora o armário está aberto e alguém vem por e coloca seu próprio recipiente de catálogo para ele. Enquanto isso, o proprietário original do armário 305 retorna de almoço, captura o recipiente de catálogo e leva-lo à classe.

Agora você tiver dois problemas: O usuário original do armário 305 tem o recipiente de catálogo errado e está em perigo de anotações no bloco de anotações do alguém. A pessoa de segundo, enquanto isso, apenas teve seu recipiente de catálogo roubado.

Se você estiver extremamente sorte, a próxima coisa que o programa fará é fechar o identificador que é forçado a fechar anteriormente. O programa recebe um erro de identificador inválido, mas como é nada que ele pode fazer, o programa apenas continuará como se o identificador fechado com êxito. Mas isso raramente é o caso.

Mais provavelmente, o programa será eventualmente voltar para a alça e tentar usá-lo, obtendo erros de identificador inválido. Ainda mais provavelmente é que o identificador você forçado fechado será ser usado para outra coisa. E isso é quando coisas começar a ir berserk completamente. Suponha que o identificador foram reutilizadas como outro arquivo. Agora o programa acha que ele é leitura e gravação do primeiro arquivo, mas na verdade ele está funcionando no segundo arquivo. O resultado é corrupção de dados no primeiro arquivo (dados que devem ter sido gravados não) e no arquivo segundo (intencional para o primeiro arquivo foi gravado o segundo arquivo de dados).

Quando o programa fecha o primeiro arquivo, ele também fecha o identificador de reciclagem. Você criou um erro em cascata: forçados ao primeiro arquivo fechado, e o resultado é que alguns segundo identificador foi forçado fechado.

Essa corrupção de dados pode continuar indefinidamente, como cada componente que solicita que um identificador tem essa alça inadvertidamente corrompida pelo componente anterior. Quando o componente anterior Finalmente fecha o que pensa é um identificador válido, na verdade, fecha o identificador usado pelo componente atual, que agora passa para corromper o próximo componente que solicita um identificador.

Suponha que um serviço de índice de pesquisa tem um arquivo aberto para a indexação, mas tenha chegado paralisado temporariamente e você deseja excluir o arquivo, portanto, você (unwisely) força o identificador fechado. O serviço de índice de pesquisa abre seu arquivo de log para registrar algumas informações, e o identificador para o arquivo excluído é reciclado como o identificador para o arquivo de log. A operação paralisada Finalmente é concluída e o serviço de índice de pesquisa Finalmente obtém ao redor para fechar esse identificador, ele tinha aberto, mas ele acaba inadvertidamente fechar o identificador de arquivo log.

O serviço de índice de pesquisa abre outro arquivo, digamos que um arquivo de configuração para escrever para ele pode atualizar algum estado persistente. A alça para o arquivo de log é reciclada como o identificador para o arquivo de configuração. O serviço de índice de pesquisa deseja registrar algumas informações, portanto, ele grava o arquivo de log. Infelizmente, o identificador de arquivo de log foi fechado e o identificador reutilizado para seu arquivo de configuração. As informações registradas vai para o arquivo de configuração, corrompendo-lo.

Enquanto isso, outro identificador você forçado fechado foi reutilizado como um identificador de mutex, que é usado para ajudar a impedir dados sendo corrompidos. Quando o identificador de arquivo original é fechado, o identificador de mutex é fechado e as proteções contra corrupção de dados são perdidas. Quanto mais o serviço é executado, mais corrompidos se tornam seus índices. Finalmente, alguém perceba que o índice está retornando resultados incorretos. E quando você tenta reiniciar o serviço, ele falhará porque seus arquivos de configuração tem sido corrompidos.

Relatar o problema para a empresa faz com que o serviço de índice de pesquisa e eles determinam que o índice tiver sido corrompido, o arquivo de log foi interrompido Misteriosamente log e o arquivo de configuração foi substituído com lixo. Alguns técnico ruim é atribuído a tarefa hopeless de descobrir por que o serviço corrompe seus índices e arquivos de configuração, não sabem que a fonte da corrupção é que você forçado um identificador fechado.

Raymond Chen Site da Web " The Old New Thing" e livro intitulado idêntico (Addison-Wesley, 2007) tratam Windows histórico, programação Win32 e misreading manchetes de jornal.