ShiduLab · BugHunted Duranted · Manuale narrato
SE 01 EP 05

L'ORA FANTASMA DEL BLOCCO SCHERMO

Desktop giusto. Lock screen un'ora indietro. Da sempre. Una chiacchiera notturna diventa una caccia al bug, fra ipotesi sbagliate, registro, fuso orario e un campo vuoto che non avrebbe dovuto esserlo.

"Oh Scriba, ci ho sta cosa che il blocco schermo ha un'ora indietro. Solo il blocco schermo."

La radio intanto continuava a suonare sotto il blocco schermo. Quello era il bello. Il brutto era l'orologio: desktop corretto, lock screen a −1 ora.

Prima tentazione: dare la colpa alla sincronizzazione, al server delle notizie, a Windows Spotlight, all'ora legale, a qualche folletto Microsoft in giacca e cravatta. Tutto plausibile. Quindi tutto da verificare.

Prima retina: il fuso

Partiamo dal cartello più semplice:

C:\Users\Josta>tzutil /g
W. Europe Standard Time

Il fuso è quello giusto. Italia, Europa occidentale, niente Pacifico infilato di nascosto nel BIOS.

Quindi lanciamo la prima retina nel Registro:

reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal

Risposta:

Errore: Impossibile trovare la chiave del Registro di sistema o il valore specificato.

Bene. Nessun evidente override del clock hardware in UTC. Primo pesciolino lasciato andare.

Seconda retina: ora legale

Altro comando:

reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v DynamicDaylightTimeDisabled

Ed eccolo:

DynamicDaylightTimeDisabled    REG_DWORD    0x1

Qui Billy-Scriba parte allegro: "Ah! Ora legale disattivata, ecco l'ora mancante."

Josta lo prende per la collottola:

"Ma era così anche prima del cambio ora, stava sempre un'ora indietro, Billy... :D"

Giusto. Una spiegazione che funziona solo oggi non spiega un difetto presente da sempre. Ipotesi ridimensionata. Si riapre la scatola.

La farfalla che non dovrebbe essere vuota

A questo punto niente più pesca con la canna. Tiriamo su tutta la rete:

reg query HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation

Il dump restituisce:

Bias                          REG_DWORD    0xffffffc4
DaylightBias                  REG_DWORD    0xffffffc4
DaylightName                  REG_SZ       ora legale Europa occidentale
DaylightStart                 REG_BINARY   00000300050002000000000000000000
StandardBias                  REG_DWORD    0x0
StandardName                  REG_SZ       ora solare Europa occidentale
StandardStart                 REG_BINARY   00000A00050003000000000000000000
TimeZoneKeyName               REG_SZ
DynamicDaylightTimeDisabled   REG_DWORD    0x1
ActiveTimeBias                REG_DWORD    0xffffff88

Ed è lì che compare la cosa interessante:

TimeZoneKeyName    REG_SZ

Vuoto.

Non un numero sbagliato. Non un'ora palesemente errata. Un nome assente.

Nel frattempo tzutil /g continuava a rispondere W. Europe Standard Time. Quindi Windows, da una parte, sapeva quale fuso stava usando; dall'altra, nel blocco persistente del Registro, il campo che normalmente lo nomina risultava vuoto.

È il genere di dettaglio che non urla. Fa solo una piccola increspatura sulla superficie. Ma se stai guardando avanti sul nastro, quella increspatura è la farfalla.

I numeri non erano il colpevole

ActiveTimeBias = 0xffffff88 corrisponde a −120 minuti. Tradotto nel meccanismo di Windows, la sessione stava lavorando con l'offset coerente con UTC+2.

Questo spiega perché il desktop mostrava l'ora giusta. Quindi non avevamo semplicemente un sistema intero spostato di un'ora.

Avevamo invece due comportamenti diversi nello stesso Windows:

ParteStato
Sessione desktopora corretta
Lock screen−1 ora
tzutil /gW. Europe Standard Time
TimeZoneKeyNamevuoto

Non serve ancora inventare quale DLL, servizio o componente stesse leggendo cosa. Basta tenere separati fatto e ipotesi.

Il fix più piccolo possibile

Invece di modificare a mano bias, minuti, chiavi e geroglifici binari, si chiede a Windows di riscrivere la stessa timezone che già dichiara di usare:

tzutil /s "W. Europe Standard Time"

Nessun cambio di paese. Nessun trucco. Nessun riavvio della civiltà occidentale.

Solo: "Windows, riscriviti bene quello che dici già di essere."

Risultato immediato:
TimeZoneKeyName torna valorizzato correttamente.
Il blocco schermo mostra finalmente l'ora giusta.

BugHunted

La catena osservata è semplice:

PRIMA
desktop corretto
lock screen -1h
tzutil /g = W. Europe Standard Time
TimeZoneKeyName = vuoto

AZIONE
tzutil /s "W. Europe Standard Time"

DOPO
TimeZoneKeyName = W. Europe Standard Time
lock screen = ora corretta

Questo non dimostra da solo l'implementazione interna del bug. Dimostra però una relazione operativa molto forte: la riscrittura canonica del fuso ricostruisce uno stato coerente e il difetto sparisce.

Manuale, ma narrato

Il punto non è soltanto il comando finale. È il percorso.

Prima una spiegazione troppo facile. Poi il dettaglio storico che la smentisce. Poi un controllo più largo. Poi il campo vuoto. Poi il fix minimo. Poi il riscontro visivo.

vedo
→ ipotizzo
→ verifico
→ sbaglio
→ correggo
→ allargo la retina
→ trovo l'incongruenza
→ applico il minimo intervento
→ verifico di nuovo
→ FIXATO

Fra lenti, farfalle, retine e pesciolini, il manuale resta tecnico. Solo che non finge che il tecnico sappia già dall'inizio dove sta andando.

Interessanted x TEDx

Perché può diventare materiale da palco? Perché in piccolo racconta una cosa più grande: la differenza tra avere dati e vedere una relazione.

Un sistema può mostrare contemporaneamente informazioni apparentemente coerenti e uno stato interno incompleto. La soluzione non arriva sempre dal valore più vistoso. A volte arriva da ciò che manca.

E soprattutto: correggere un'ipotesi davanti all'evidenza non indebolisce il ragionamento. È il ragionamento che funziona.

BugHunted Duranted: non soltanto trovare il bug. Lasciare visibile il sentiero con cui ci sei arrivato.
Il tuo supporto