søndag 2. mai 2010

Feilsøking av datamaskin med et mystisk oppstartsproblem.

Kom over en litt fiffig sak der brukeren klagde på at datamaskinen ikke ville slå seg på. Når jeg startet opp datamaskinen fikk jeg den normale BIOS-splashscreenen men ble møtt av dette bildet når Windows ble forsøkt lastet:


Dette ga jo ikke særlig mye å gå på men jeg forsøkte å restarte maskinen og trykke F8 under oppstarten av NTLDR. Dette fungerte bra og jeg fikk opp de vante valgene, dette betydde da at BIOS hadde detektert en gyldig MBR på harddisken hvorpå tilsist NTLDR hadde blitt lastet inn i minnet. En svart skjerm tidlig i oppstarten kan ofte bety hardware-problemer men jeg hadde vertfall indikeringer på at BIOS fant harddisken og fikk lastet de første oppstarsfasene av Windows. Spørsmålet ble da: når stoppet lastingen av Windows opp?

En mulig måte å finne mere info om hva som skjer i oppstarten er å starte windows med /SOS bryteren. Dette gir deg litt mer info over hva som skjer og gir blant annet muligheten til å se driverne som blir lastet inn i oppstarten. (Dette gjøres forsåvidt automatisk når du velger sikkermodus.) Når jeg startet Windows med /SOS bryteren fikk jeg se følgende liste:

Lastet driver \WINDOWS\system32\ntoskrnl.exe
Lastet driver \WINDOWS\system32\hal.dll
Lastet driver \WINDOWS\system32\KDCOM.DLL
Lastet driver \WINDOWS\system32\BOOTVID.dll
Lastet driver ACPI.sys
Lastet driver \WINDOWS\system32\DRIVERS\WMILIB.SYS
Lastet driver pci.sys
Lastet driver isapnp.sys


Noe som egentlig ikke forteller så mye da denne listen bare viser hvilke drivere som ble lastet inn med suksess. Driveren som er problemet blir da med andre ord forsøkt lastet etter isapnp.sys, men hvordan kan finne ut hvilken driver dette er? På systinernals finnes det et program kalt LoadOrder som viser hvilken rekkefølge drivere lastes inn i men dette må kjøres i Windows og på denne maskinen er det ikke mulig å komme inn i Windows. Finnes det da noen måte å finne ut hvilken driver som lastes inn etter isapnp?

Det er faktisk bare tre verdier som avgjør prioriteten til driveren i oppstarten (eller senere) disse verdiene er Start, Tag og Group. For enkelhets skyld har jeg valgt å bruke begrepet tjeneste som en fellesbetegnelse for tjenester/drivere. Under følger en forklaring på hva som menes med disse verdiene og hva de kan brukes til.

Start:
Angir hvilket stadie i oppstarten driveren lastes inn i. Vi har 5 mulige verdier som er: SERVICE_BOOT_START (0) - Lastes inn av osloaderen tidlig i oppstarten
SERVICE_SYSTEM_START (1) - Lastess inn av osloaderen etter at samtlige SERVICE_BOOT_START drivere har blitt lastet.
SERVICE_AUTO_START (2)- Startes av Service Control Manageren (SCM) etter at tjenesteprosessen Services.exe har blitt startet.
SERVICE_DEMAND_START (3) Startes av SCM ved behov.
SERVICE_DISABLED (4) Tjenesten vil aldri lastes.

Tag:
Angir prioritet innenfor en gitt gruppe. En tjeneste som er gitt Tag 1 vil starte før en tjenste gitt Tag 2. Tjenester uten Tag vil starte etter Taggede tjenester.

Group:
Samler tjenester med lignende bruksområder innenfor et gitt gruppenavn. Alle tjenestene innenfor en gitt gruppe må startes før Windows går videre til neste gruppe. Prioriteten til gruppene er gitt gjennom registernøkkelen HKLM\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List. Her følger et utdrag av denne listen med de 5 første gruppene:

System Reserved
Boot Bus Extender
System Bus Extender
SCSI miniport
Port


Alle tjenster er å finne innunder HKLM\SYSTEM\CurrentControlSet\Services\. En snedig funksjon i registereditering er at du kan importere register-hi fra andre datamaskiner ved å merke HKLM eller HCU og velge Last inn struktur. Jeg kopierte derfor SYSTEM-hiet fra datamaskinen som opplevde problemet og Lastet da inn dette hiet på min lokale datamaskin for å undersøke hvilke data som var gitt for tjenesten isapnp.sys:



Vi ser da at det er snakk om en BOOT driver under Boot Bus Extender gruppen. Siden alle BOOT driverne ikke har blitt lastet kan vi være sikre på at det dreier seg om en BOOT driver og vi kan se av prioriteringene at den enten må ligge i Boot Bus Extender gruppen eller i System Bus Extender gruppen. Ved å søke i registeret etter disse gruppenavnene kunne man søke opp de driverne som lå i disse gruppene og dermed lage seg en tabell over boot-prioriteringer basert på tagging. Jeg fikk da opp følgende liste i prioritert rekkefølge:

Boot Bus Extendere:
ACPI.sys tag - 1
pci.sys tag - 2
isapnp.sy tag - 3
psiksxvv Ikke tagget.

System Bus Extendere:
pcmcia tag 1
Compbatt.sys Tag 2
pciide.sys tag 3
viaidexp.sys tag 4
Partmgr tag 5
ACPIEC.SYS tag - 6
Mountmgr tag 8
ftdisk.sys tag 9
dmload.sys tag 12
dmio.sys tag 13
Volsnap Ikke tagget.

Vi ser da at ifølge vår liste skulle tjenesten med det merkelige navnet psiksxvv skulle være den neste til å starte opp. La oss ta en nærmere kikk på denne:



Dette gir ikke mye mening og vi kan se flere registerverdier som er bare fyllt med nonsens. Vi kan dermed være sikre på at det dreier seg om en korrupt registernøkkel. For å sjekke at det var denne som skapte problemer satte jeg Start verdien fra 0 til 4 noe som vi husker var SERVICE_DISABLED. Den ville med andre ord ikke bli lastet i oppstarten. Jeg kopierte SYSTEM-hiet tilbake til datamaskinen med problemet og nå startet den opp normalt.