# Arma a captura e NAO desiste se o jogo trocar de processo.
#
# Por que existe: o armar_captura.ps1 e o vigiar_e_injetar.ps1 injetam no PRIMEIRO AMo.exe
# que enxergam e param por ali. So que o jogo troca de processo durante a abertura -- em
# 24/08 a injecao pegou um AMo que viveu 2 segundos e morreu, e o processo que de fato jogou
# subiu 10 segundos depois, sem hook. O log ficava com 3941 bytes e parava, e a captura
# inteira se perdia sem aviso.
#
# Aqui o vigia continua rodando: se o PID mudar, injeta de novo no novo processo. So para
# quando confirmar RECV no log -- que e a unica prova de que o hook pegou os dois lados.
$ErrorActionPreference = 'Continue'

if (Get-Process AMo -ErrorAction SilentlyContinue) {
    Write-Host 'O AMo.exe ja esta aberto. Feche o jogo e rode de novo --' -ForegroundColor Yellow
    Write-Host 'injetar num processo ja rodando so captura SEND, e o RECV se perde.' -ForegroundColor Yellow
    exit 1
}
if (Test-Path 'C:\RoshHook\traffic.log') {
    $carimbo = Get-Date -Format 'MMdd_HHmm'
    Move-Item 'C:\RoshHook\traffic.log' "C:\RoshHook\traffic_$carimbo.log" -Force
    Write-Host "captura anterior guardada como traffic_$carimbo.log"
}

Write-Host 'ARMADO (persistente). Pode abrir o jogo.' -ForegroundColor Cyan

$limite = (Get-Date).AddMinutes(10)
$injetados = @{}
$confirmado = $false

while ((Get-Date) -lt $limite -and -not $confirmado) {
    $amo = Get-Process AMo -ErrorAction SilentlyContinue
    if ($amo) {
        foreach ($p in @($amo)) {
            if (-not $injetados.ContainsKey($p.Id)) {
                # 1,5 s e o meio-termo achado em 23/08: antes disso o ws2_32 pode nao estar
                # carregado; muito depois, o client ja postou os WSARecv e o RECV se perde.
                Start-Sleep -Milliseconds 1500
                if (Get-Process -Id $p.Id -ErrorAction SilentlyContinue) {
                    Write-Host "injetando no PID $($p.Id)..."
                    & 'D:\RoshEmulator\tools\hook\injector.exe' | Out-Null
                    $injetados[$p.Id] = $true
                }
            }
        }
    }
    if ((Test-Path 'C:\RoshHook\traffic.log') -and
        (Select-String -Path 'C:\RoshHook\traffic.log' -Pattern '\] RECV sock=' -CaseSensitive -Quiet)) {
        $confirmado = $true
        break
    }
    Start-Sleep -Milliseconds 500
}

if ($confirmado) {
    $n = (Get-Item 'C:\RoshHook\traffic.log').Length
    Write-Host "OK: RECV confirmado, $n bytes. Pode jogar." -ForegroundColor Green
    Write-Host "PIDs em que injetei: $($injetados.Keys -join ', ')"
    exit 0
}
Write-Host 'ATENCAO: nao confirmei RECV. So SEND ou nada.' -ForegroundColor Yellow
exit 2
