Removendo WinFsp travado no Windows: diagnóstico real, erro MSI e remoção forçada na prática#
Durante uma manutenção em servidor Windows, precisei remover o WinFsp e encontrei um cenário clássico de infraestrutura: base de dados MSI inconsistente, diretório protegido e DLL travada em nível de kernel por handles ativos.
Tentar desinstalar o WinFsp como um aplicativo comum de usuário muitas vezes resulta em falhas silenciosas ou travamento completo do assistente de remoção. Este artigo detalha o diagnóstico passo a passo por camadas e o runbook prático de remoção forçada e estabilização do sistema.
1) Identificação do componente e catálogo MSI#
O primeiro passo é validar se o WinFsp está registrado formalmente e identificar o seu identificador exclusivo (GUID).
# Alternativa moderna com Get-CimInstance (Recomendado)
Get-CimInstance -ClassName Win32_Product | Where-Object { $_.Name -like "*WinFsp*" } | Select-Object Name, Version, IdentifyingNumber
# Alternativa clássica do PowerShell (Get-WmiObject)
Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like "*WinFsp*" } | Select-Object Name, Version, IdentifyingNumber
Caso a base de dados MSI local esteja corrompida, a desinstalação convencional via msiexec /x {GUID} falhará. Se o desinstalador oficial não estiver acessível, podemos obter a ferramenta Microsoft Program Install and Uninstall Troubleshooter.
# Opção 1: Download direto do utilitário de diagnóstico da Microsoft
Invoke-WebRequest -Uri "https://support.microsoft.com/en-us/topic/fix-problems-that-block-programs-from-being-installed-or-removed-cca7d1b6-65a9-3d98-426b-e9f927e1eb4d" -OutFile "$env:USERPROFILE\Downloads\MicrosoftProgram_Install_and_Uninstall.meta.diagcab"
# Opção 2: Instalação rápida via Windows Package Manager (winget) - Caso disponível
winget install Microsoft.MicrosoftProgramInstallandUninstall
2) O erro clássico: serviço vs. driver de filtro#
Um erro muito comum em administração de sistemas Windows é verificar apenas os serviços em execução e assumir que o software está inativo. Se você rodar:
# Consultar se o serviço Launcher do WinFsp está ativo
sc query winfsp
E receber o retorno de que não há serviço ativo, isso não garante que os hooks de sistema de arquivos foram removidos. No WinFsp, a persistência e os locks de arquivos são mantidos diretamente no kernel pelo driver de filtro (winfsp-ms-sys ou similar).
O diagnóstico adequado deve auditar o stack de drivers ativos. Embora o utilitário genérico driverquery liste todos os drivers carregados na máquina, a ferramenta fltmc (Filter Manager Control) é a mais precisa e apropriada para auditoria DFIR, pois consulta diretamente o gerenciador de filtros do sistema de arquivos:
# Listar drivers ativos na pilha do Filter Manager (Recomendado)
fltmc | findstr /i winfsp
# Listar drivers gerais carregados na memória ativa
driverquery /v | findstr /i winfsp
Se o comando fltmc exibir uma linha relacionada ao WinFsp (como winfsp), o driver ainda está carregado no stack do sistema de arquivos, interceptando chamadas de I/O de baixo nível. Para auditar os serviços associados e identificar serviços inoperantes relativos ao WinFsp:
# Listar todos os serviços que contenham "WinFsp" no nome
Get-Service | Where-Object { $_.Name -like "*WinFsp*" -or $_.DisplayName -like "*WinFsp*" }
# Inspecionar serviços específicos de drivers de filtro de sistema de arquivos
Get-Service | Where-Object { $_.Name -like "*flt*" }
# Listar qualquer serviço atrelado ao WinFsp que esteja parado no sistema
Get-Service | Where-Object { $_.Name -like "*WinFsp*" -and $_.Status -ne "Running" } | Select-Object Name, Status
3) Verificação de dependências, tarefas e Windows update#
Antes de remover manualmente qualquer chave de registro ou arquivo físico, verifique se outros componentes ou processos ativos dependem da biblioteca do WinFsp, pesquisando no diretório C:/Program Files:
# Buscar referências ao executável ou biblioteca em Program Files
Get-ChildItem "C:\Program Files" -Recurse -Filter "*.exe" -ErrorAction SilentlyContinue | Select-String -Pattern "WinFsp" -SimpleMatch
# Buscar atalhos corrompidos na Área de Trabalho do host
Get-ChildItem "$env:USERPROFILE\Desktop" -Recurse -Filter "*.lnk" -ErrorAction SilentlyContinue | Select-String -Pattern "WinFsp"
# Buscar variáveis de ambiente atreladas ao WinFsp
[Environment]::GetEnvironmentVariables("Machine") | Where-Object { $_.Values -like "*WinFsp*" }
Também é importante verificar se há tarefas automatizadas agendadas no Windows ou se atualizações pendentes do sistema operacional estão retendo os arquivos do driver:
# Listar tarefas agendadas na raiz (escopo reduzido para evitar lentidão em servidores grandes)
Get-ScheduledTask -TaskPath "\" -ErrorAction SilentlyContinue | Where-Object { $_.TaskName -like "*WinFsp*" -or $_.Actions.Execute -like "*WinFsp*" }
# Consultar se há atualizações do Windows pendentes de reinicialização (requer o módulo PSWindowsUpdate)
Get-WindowsUpdate
# Auditar o histórico recente de patches instalados no host
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10
---
## 4) Segurança operacional: backup do registro
**ATENÇÃO:** Manipular o registro do Windows sem backup pode corromper o boot do sistema operacional. Antes de remover ou alterar qualquer chave do driver, exporte as chaves de segurança:
> [!CAUTION]
> **AVISO DE SEGURANÇA CRÍTICO:** A edição inadequada do registro do Windows pode causar danos irreparáveis ao sistema operacional, resultando em falhas críticas de inicialização (Tela Azul/BSOD). Certifique-se de realizar o backup conforme instruído e exportar as chaves de registro afetadas antes de qualquer alteração.
Backup da chave de serviço do Launcher do WinFsp#
reg export "HKLM\SYSTEM\CurrentControlSet\Services\WinFsp.Launcher" "$env:USERPROFILE\Desktop\WinFsp-backup.reg"
Backup de segurança de toda a árvore de serviços (recomendado)#
reg export "HKLM\SYSTEM\CurrentControlSet\Services" "$env:USERPROFILE\Desktop\Services-backup.reg"
Caso precise restaurar a chave original em caso de falha:#
reg import "$env:USERPROFILE\Desktop\WinFsp-backup.reg"#
---
## 5) Identificação de lock e remoção física de arquivos
Tentar apagar o diretório [C:/Program Files (x86)/WinFsp](file:///C:/Program%20Files%20(x86)/WinFsp) com comandos legados do CMD dentro do PowerShell (por exemplo: `rd /s /q`) resulta em erros de sintaxe e falso diagnóstico de acesso negado. A remoção correta no PowerShell deve ser:
Comando nativo do PowerShell para remoção recursiva e forçada#
Remove-Item "C:\Program Files (x86)\WinFsp" -Recurse -Force
Se o comando retornar `Access Denied` mesmo após redefinir a propriedade dos arquivos e permissões NTFS (`takeown` e `icacls`):
Atribuir propriedade da pasta ao grupo de Administradores#
takeown /f "C:\Program Files (x86)\WinFsp" /r /d y
Conceder controle total de acesso aos Administradores#
icacls "C:\Program Files (x86)\WinFsp" /grant Administrators:F /t
O problema real não é permissão de arquivo, mas sim um lock ativo da biblioteca `winfsp-x64.dll` no kernel do Windows.
Diferente de um lock em nível de espaço de usuário (onde um processo comum como o `explorer.exe` ou `notepad.exe` retém o handle do arquivo e pode ser finalizado via Gerenciador de Tarefas ou `taskkill`), um **lock de kernel** ocorre quando um driver carregado no Ring 0 (como o driver de filtro do WinFsp) mantém referências ativas à biblioteca mapeada na memória do sistema. Nesses casos, o subsistema de E/S do kernel do Windows impede qualquer alteração física ou exclusão do arquivo para proteger a integridade do sistema, resultando em erros de "Acesso Negado" mesmo para contas de Administrador ou `SYSTEM`. A liberação depende do descarregamento completo do driver (`fltmc unload`) ou do boot em Modo Seguro.
Para identificar qual processo ou serviço em espaço de usuário está retendo handles adicionais que impedem a liberação da biblioteca:
1. Obtenha a suíte de diagnósticos Sysinternals:
Baixar a suíte oficial do Sysinternals#
Invoke-WebRequest -Uri "https://download.sysinternals.com/files/SysinternalsSuite.zip" -OutFile "$env:USERPROFILE\Downloads\SysinternalsSuite.zip"
Criar o diretório de destino antes da extração para evitar erros#
New-Item -ItemType Directory -Path "$env:USERPROFILE\Tools\Sysinternals" -Force
Extrair a suíte na pasta local criada#
Expand-Archive -Path "$env:USERPROFILE\Downloads\SysinternalsSuite.zip" -DestinationPath "$env:USERPROFILE\Tools\Sysinternals" -Force
2. Execute o utilitário `handle64.exe` para mapear o arquivo:
Mapear handles de processo ativos apontando para a DLL travada#
cd "$env:USERPROFILE\Tools\Sysinternals" .\handle64.exe winfsp-x64.dll
Se o lock estiver atrelado ao `explorer.exe` ou a algum serviço de sincronização/backup de terceiros, reiniciar esse processo específico pode ser o suficiente para liberar a DLL sem um reboot total do servidor.
---
## 6) Modo seguro (safe mode)
Se o driver estiver acoplado de forma persistente, a melhor forma de removê-lo é forçar o boot do Windows em Modo Seguro, impedindo que drivers de terceiros não essenciais sejam carregados:
- **Opção 1 (Interface Gráfica):** Execute `msconfig`, vá na aba **Boot (Inicialização)**, marque a opção **Safe boot (Inicialização segura)** e reinicie o servidor.
- **Opção 2 (PowerShell):** Execute o comando abaixo para forçar o menu de opções avançadas de inicialização do Windows na próxima carga:
Shutdown /r /o /t 0
- **Opção 3 (Físico/Console):** Mantenha pressionada a tecla `Shift` ao clicar no botão "Reiniciar" no menu Iniciar do Windows.
---
## 7) Limpeza de resíduos e purga do registro
Após a remoção física dos arquivos, limpe as definições de serviço órfãs do registro para evitar que o Windows tente carregar binários inexistentes no boot.
Aqui está o fluxo de decisão técnica recomendado para desinstalação segura e purga:
graph TD A[Início da Desinstalação do WinFsp] --> B{MSI íntegro?} B -- Não --> C[Executar Microsoft Program Troubleshooter] B -- Sim --> D[Executar msiexec /x {GUID}] C --> E{Remoção física bloqueada?} D --> E E -- Sim --> F{Driver de Filtro ativo em fltmc?} E -- Não --> J[Purgar chaves órfãs do registro] F -- Sim --> G[Executar fltmc unload winfsp] F -- Não --> H[Verificar handles com handle64.exe] G --> I{DLL ainda travada?} H --> I I -- Sim --> K[Reiniciar em Modo Seguro / Safe Mode] I -- Não --> L[Remover diretório WinFsp] K --> L L --> J J --> M[Fim: Sistema Estabilizado]
Deletar de forma definitiva a chave de serviço Launcher do WinFsp#
reg delete "HKLM\SYSTEM\CurrentControlSet\Services\WinFsp.Launcher" /f
---
## 8) Validação pós-remoção e auditoria de eventos
Com a desinstalação física e a limpeza lógica efetuadas, execute os testes finais para comprovar a eliminação de resíduos e acompanhar a inicialização:
1. Garantir que o driver foi descarregado da pilha de filtros#
fltmc | findstr /i winfsp driverquery /v | findstr /i winfsp
2. Confirmar a exclusão física do diretório de instalação#
Test-Path "C:\Program Files (x86)\WinFsp"
3. Certificar a ausência lógica da chave no registro#
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\WinFsp.Launcher" -ErrorAction SilentlyContinue
4. Verificar se há DLLs residuais carregadas na memória ativa dos processos#
Get-Process | Where-Object { $_.Modules.ModuleName -like "winfsp" }
Inspecione os logs do Event Viewer por avisos ou erros residuais gerados pelo Service Control Manager (SCM) relativos ao WinFsp:
Filtrar logs do sistema (System) para eventos de erro com "WinFsp"#
Get-WinEvent -LogName "System" -MaxEvents 100 -ErrorAction SilentlyContinue | Where-Object { $_.Message -like "WinFsp" } | Format-Table TimeCreated, Message -Wrap
Filtrar logs via comando CMD wevtutil#
wevtutil qe System /f:text /c:50 /q:"*[System[Provider[@Name='Service Control Manager'] and (Level=2)]]" | findstr /i "WinFsp"
Buscar ocorrências de falhas no log de Aplicação#
Get-WinEvent -LogName "Application" -MaxEvents 100 -ErrorAction SilentlyContinue | Where-Object { $_.Message -like "WinFsp" }
---
## Checklist: remoção completa do winfsp
Siga este roteiro estruturado para garantir a limpeza do servidor sem risco de instabilidade.
### 1. Fase de diagnóstico
- [ ] Verificar instalação registrada: `wmic product`
- [ ] Verificar se há driver ativo listado no stack: `fltmc` / `driverquery`
- [ ] Listar processos com handles abertos na biblioteca: `handle64.exe`
### 2. Preparação de segurança
- [ ] Criar backup do registro de serviços: `reg export HKLM\SYSTEM\CurrentControlSet\Services`
- [ ] Identificar e documentar softwares dependentes ou atalhos ativos
- [ ] Mapear se há atualizações do Windows pendentes de aplicação
### 3. Execução da remoção
- [ ] Executar remoção padrão ou forçar através do Troubleshooter da Microsoft
- [ ] Terminar processos com handles ativos ou reiniciar em Modo Seguro (Safe Mode)
- [ ] Remover pasta física: `Remove-Item -Recurse -Force`
- [ ] Purgar chave de inicialização órfã do registro: `reg delete`
### 4. Pós-remoção e fechamento
- [ ] Validar a exclusão da pasta e chaves no registro
- [ ] Monitorar logs de erros de sistema via Event Viewer
- [ ] Registrar a intervenção no runbook de infraestrutura da empresa
Este artigo foi útil?
Deixe uma reação rápida para apoiar o conteúdo:
Este post está licenciado sob CC BY-NC.



Comentários
Participe da discussão abaixo.
0 comentários