Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

mgrzeg.net - Admin on Rails :)

Bug check 0x0000007B (INACCESSIBLE_BOOT_DEVICE), czyli kilka słów o upper filters

Jednym z popularniejszych błędów pojawiających się przy starcie systemu, a przy tym nadzwyczaj złośliwym, jest INACCESSIBLE_BOOT_DEVICE, czyli bug check 0x0000007B. Przyczyn tego błędu jest całkiem sporo i podzielić je można na sprzętowe (np. po wymianie dysku, płyty głównej, padzie kontrolera, etc.) oraz programowe. O tych pierwszych teraz zapomnijmy, a ja skupię się dalej na klasie błędów programowych związanych ze sterownikami urządzeń.

Łyk teorii

Start systemu podzielony jest na kilka etapów. Na samym początku loader pracujący w trybie rzeczywistym pobiera z BIOSu różne informacje o podłączonym sprzęcie, po czym ładuje moduł jądra. Ciągle jeszcze w tym trybie załadowane zostają wybrane gałęzie rejestru oraz sterowniki oznaczone jako SERVICE_BOOT_START, w tym wielu urządzeń oraz inne, powiązane z nimi, np. lower- i upperfilters.
Aby wyjaśnić, czym są sterowniki filtrów, trzeba sięgnąć do modelu WDM (Windows Driver Model, którego następcą jest Windows Driver Foundation, a w nim KMDF trybu jądra oraz UMDF trybu użytkownika, czyli COM-y komunikujące się z systemem poprzez specjalny moduł - reflector, ale o tym kiedy indziej).

Sterowniki WDM mają architekturę warstwową, co sprowadza się do zgrubnego podziału:
1. Najniżej położone, najbliżej sprzętu mamy sterowniki magistrali (bus drivers), a z nimi powiązane są ‘fizyczne obiekty urządzeń’ (PDO);
2. Gdzieś w środku mamy sterowniki funkcyjne i powiązane z nimi ‘funkcyjne obiekty urządzeń’ (FDO).

Dodatkowo, sterowniki funkcyjne mogą mieć filtry:
- dolne (lowerfilters) - będące poniżej sterownika funkcyjnego, ale nad sterownikami magistrali
- górne (upperfilters) - będące powyżej sterownika funkcyjnego.

W dużym uproszczeniu, podczas obsługi pakietów IRP, które system przygotował po przejściu z trybu użytkownika (np. po wywołaniu funkcji DeviceIoControl), pakiety te trafiają najpierw do upperfilters, po czym schodzą w dół do sterowników funkcyjnych, lowerfilters i na końciu bus drivers. Powrót od urządzenia przechodzi przez bus driver -> lowerfilter -> functional -> upperfilter -> usermode. Gdy mamy więcej niż jeden sterownik na liście filtrów, to obsługa następuje zgodnie z kolejnością, z jaką są wpisane nazwy sterowników.

System wykorzystuje rejestr do przechowywania informacji o sterownikach i ich rozmieszczeniu w warstwach. W dalszym opisie zakładam, że mówimy o kluczach znajdujących się w  HKLM\SYSTEM\CurrentControlSet\. I tak:

1. \Enum - tu znajdują się klucze urządzeń (hardware keys). Dla każdej z magistral zdefiniowanych w systemie znajduje się odpowiadający jej klucz, a w ramach jego podkluczy konkretne urządzenia. Każda z instancji urządzenia należy do jakiejś klasy urządzeń, które opisane są w ramach Class oraz ClassGUID.


Rys 1. Hardware keys

2. \Contol\Class - tu znajdują się klucze klas urządzeń.


Rys 2. Class keys

3. \services - tu znajdują się klucze usług i sterowników.


Rys 3. Service keys

Sterowniki, które pracują jako upper-, lub lowerfilters mogą być powiązane z urządzeniem na dwa sposoby:
a. Bezpośrednio, w ramach ciągu UpperFilters (LowerFilters) będącego elementem klucza urządzenia (hardware key),
b. Jako filtr dla wszystkich urządzeń należących do danej klasy, poprzez ciąg UpperFilters (LowerFilters) w ramach klucza klasy.

Zachęcam do tego, aby każdy zajrzał teraz do swojego rejestru i zorientował się jakie ma klucze urządzeń, klas oraz sterowników, a także poszukał Upper- i LowerFilters, które na pewno w swoim systemie ma (najczęściej są to sterowniki programów antywirusowych, ale nie tylko). O tym, jak w stosie wywołań identyfikować sterowniki urządzeń jeszcze kiedyś wspomnę, na razie wychodzimy z teorii i przechodzimy do części ‘warsztatowej’ :)

Popsujmy coś! :)

Czasem zdarza się, że odinstalowane zostaje oprogramowanie, którego jednym z elementów składowych jest sterownik, będący górnym, lub dolnym filtrem jakiegoś urządzenia. Niestety, jak to w świecie bywa, deinstalacja nie przebiegła prawidłowo i pomimo usunięcia pliku sterownika z systemu plików, usunięciu sterownika z SCM, pozostaje wpis o tym, że jakieś urządzenie, lub cała klasa urządzeń ma jeden z UpperFilters (LowerFilters) ustawiony na odinstalowany właśnie sterownik. I mały problem, gdy urządzenie to inicjalizowane jest już po starcie systemu, prawdziwa zabawa zaczyna się, gdy mamy do czynienia z urządzeniem typu dysk, czy wolumen, które inicjalizowane są na samym początku startu systemu. Coś takiego za chwilę przećwiczymy.

Zaczynamy od dodania nieistniejącego sterownika do listy UpperFilters dla klasy urządzeń typu DiskDrive, a który zgodnie z definicjami Microsoftu znajdziemy tu:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E967-E325-11CE-BFC1-08002BE10318}


Rys 4. Lista UpperFilters z dodanym nieistniejącym sterownikiem zine

Wcześniej znajdował się tu już PartMgr, teraz dodajemy do niego jeszcze zine.

Dla pewności sprawdzamy, czy aby na pewno nie ma takiego sterownika w systemie:

>sc query zine
[SC] EnumQueryServicesStatus:OpenService FAILED 1060:

The specified service does not exist as an installed service.

i spokojnie przechodzimy do kolejnego kroku.

Bang!

Uruchamiamy ponownie system z debuggerem podłączonym w trybie jądra. Bardzo szybko dochodzimy do momentu, w którym lądujemy w debuggerze:

*** Fatal System Error: 0x0000007b
                       (0xF7A94528,0xC0000034,0x00000000,0x00000000)

Break instruction exception - code 80000003 (first chance)

A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.

A fatal system error has occurred.

Connected to Windows XP 2600 x86 compatible target at (Wed Jul 25 15:20:55.662 2012 (UTC + 2:00)), ptr64 FALSE
Loading Kernel Symbols
..............................
Loading User Symbols

*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

Use !analyze -v to get detailed debugging information.

BugCheck 7B, {f7a94528, c0000034, 0, 0}

Probably caused by : ntkrnlpa.exe ( nt!IopMarkBootPartition+f5 )

Followup: MachineOwner
---------

nt!RtlpBreakWithStatusInstruction:
80527bdc cc              int     3

Dodatkowa wredność tego błędu polega na tym, że nie jest tworzony zrzut pamięci na dysku (na jakim dysku?) i jedyne co nam pozostaje, to analiza na żywca.
Zaczynamy od proponowanej analizy:

kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

INACCESSIBLE_BOOT_DEVICE (7b)
During the initialization of the I/O system, it is possible that the driver
for the boot device failed to initialize the device that the system is
attempting to boot from, or it is possible for the file system that is
supposed to read that device to either fail its initialization or to simply
not recognize the data on the boot device as a file system structure that
it recognizes.  In the former case, the argument (#1) is the address of a
Unicode string data structure that is the ARC name of the device from which
the boot was being attempted.  In the latter case, the argument (#1) is the
address of the device object that could not be mounted.
If this is the initial setup of the system, then this error can occur if
the system was installed on an unsupported disk or SCSI controller.  Note
that some controllers are supported only by drivers which are in the Windows
Driver Library (WDL) which requires the user to do a custom install.  See
the Windows Driver Library for more information.
This error can also be caused by the installation of a new SCSI adapter or
disk controller or repartitioning the disk with the system partition.  If
this is the case, on x86 systems the boot.ini file must be edited or on ARC
systems setup must be run.  See the "Advanced Server System Administrator's
User Guide" for information on changing boot.ini.
If the argument is a pointer to an ARC name string, then the format of the
first two (and in this case only) longwords will be:
    USHORT Length;
    USHORT MaximumLength;
    PWSTR Buffer;
That is, the first longword will contain something like 00800020 where 20
is the actual length of the Unicode string, and the next longword will
contain the address of buffer.  This address will be in system space, so
the high order bit will be set.
If the argument is a pointer to a device object, then the format of the first
word will be:
    USHORT Type;
That is, the first word will contain a 0003, where the Type code will ALWAYS
be 0003.
Note that this makes it immediately obvious whether the argument is a pointer
to an ARC name string or a device object, since a Unicode string can never
have an odd number of bytes, and a device object will always have a Type
code of 3.
Arguments:
Arg1: f7a94528, Pointer to the device object or Unicode string of ARC name
Arg2: c0000034, (reserved)
Arg3: 00000000, (reserved)
Arg4: 00000000

Debugging Details:
------------------


DEFAULT_BUCKET_ID:  DRIVER_FAULT

BUGCHECK_STR:  0x7B

PROCESS_NAME:  System

LAST_CONTROL_TRANSFER:  from 804f7b9d to 80527bdc

STACK_TEXT: 
f7a94090 804f7b9d 00000003 f7a943ec 00000000 nt!RtlpBreakWithStatusInstruction
f7a940dc 804f878a 00000003 00000000 80087000 nt!KiBugCheckDebugBreak+0x19
f7a944bc 804f8cb5 0000007b f7a94528 c0000034 nt!KeBugCheck2+0x574
f7a944dc 80686ce9 0000007b f7a94528 c0000034 nt!KeBugCheckEx+0x1b
f7a94644 8068ae0a 80087000 00000000 80087000 nt!IopMarkBootPartition+0xf5
f7a94694 80687b48 80087000 f7a946b0 00034000 nt!IopInitializeBootDrivers+0x4ba
f7a9483c 80685fdd 80087000 00000000 86fc65b8 nt!IoInitSystem+0x712
f7a94dac 805c6160 80087000 00000000 00000000 nt!Phase1Initialization+0x9b5
f7a94ddc 80541dd2 80685628 80087000 00000000 nt!PspSystemThreadStartup+0x34
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16


STACK_COMMAND:  kb

FOLLOWUP_IP:
nt!IopMarkBootPartition+f5
80686ce9 8d85e0feffff    lea     eax,[ebp-120h]

SYMBOL_STACK_INDEX:  4

SYMBOL_NAME:  nt!IopMarkBootPartition+f5

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: nt

IMAGE_NAME:  ntkrnlpa.exe

DEBUG_FLR_IMAGE_TIMESTAMP:  4802516a

FAILURE_BUCKET_ID:  0x7B_nt!IopMarkBootPartition+f5

BUCKET_ID:  0x7B_nt!IopMarkBootPartition+f5

Followup: MachineOwner
---------

Oczywiście nie wiemy, czy jako pierwszy parametr mamy ścieżkę ARC, czy też adres obiektu urządzenia, więc sprawdzamy to organoleptycznie:

kd> !devobj f7a94528
f7a94528: is not a device object

Mamy już pewność, że nie jest to obiekt urządzenia, sprawdzamy zatem, czy jest to ścieżka ARC:

kd> dt nt!_UNICODE_STRING f7a94528
 "\ArcName\multi(0)disk(0)rdisk(0)partition(1)"
   +0x000 Length           : 0x58
   +0x002 MaximumLength    : 0x5a
   +0x004 Buffer           : 0xe1898a40  "\ArcName\multi(0)disk(0)rdisk(0)partition(1)"

OK, jedno już ustaliliśmy. W tym miejscu proponuję zajrzeć na stronę dokumentującą błąd, którą mamy również dostępną w helpie do debuggera.
Sprawdzamy, czy możemy coś więcej wyciągnąć. Zgodnie z sugestią robimy zrzut załadowanych modułów:

kd> lm
start    end        module name
804d7000 806cf580   nt         (pdb symbols)          c:\websymbols\ntkrnlpa.pdb\30B5FB31AE7E4ACAABA750AA241FF3311\ntkrnlpa.pdb
806d0000 806f0300   hal        (deferred)            
f735a000 f7373b80   Mup        (deferred)            
f7374000 f73a0980   NDIS       (deferred)            
f73a1000 f742d600   Ntfs       (deferred)            
f742e000 f7444880   KSecDD     (deferred)            
f7445000 f7456f00   sr         (deferred)            
f7457000 f7476b00   fltMgr     (deferred)            
f7477000 f748e880   SCSIPORT   (deferred)            
f748f000 f74a6900   atapi      (deferred)            
f74a7000 f74bd800   vmci       (deferred)            
f74be000 f74e3700   dmio       (deferred)            
f74e4000 f7502880   ftdisk     (deferred)            
f7503000 f7513a80   pci        (deferred)            
f7514000 f7541d80   ACPI       (deferred)            
f7542000 f756c000   KDVM       (deferred)            
f766d000 f7676180   isapnp     (deferred)            
f767d000 f7687580   MountMgr   (deferred)            
f768d000 f7699c80   VolSnap    (deferred)            
f769d000 f76a5e00   disk       (deferred)            
f76ad000 f76b9180   CLASSPNP   (deferred)            
f76bd000 f76c7580   agp440     (deferred)            
f78ed000 f78f3180   PCIIDEX    (deferred)            
f78f5000 f78f9d00   PartMgr    (deferred)            
f7a7d000 f7a80000   BOOTVID    (deferred)            
f7a81000 f7a83800   compbatt   (deferred)            
f7a85000 f7a88780   BATTC      (deferred)            
f7a89000 f7a8bc00   vmscsi     (deferred)            
f7b6d000 f7b6e100   WMILIB     (deferred)            
f7b6f000 f7b70580   intelide   (deferred)            
f7b71000 f7b72700   dmload     (deferred)            

Jak widać, mamy załadowane wszystkie podstawowe sterowniki urządzeń, w tym disk, classpnp, ftdisk, partmgr (również z listy UpperFilters) oraz ntfs. Mamy także pci, atapi oraz pciidex i intelide.
Przechodzimy dalej i sprawdzamy listę urządzeń korzystając z !devnode (ograniczam się do urządzeń atapi)

kd> !devnode 0 1 atapi
Dumping IopRootDeviceNode (= 0x86fb1ee8)
DevNode 0x86fe2160 for PDO 0x86ee7398
  InstancePath is "PCIIDE\IDEChannel\4&23686003&0&0"
  ServiceName is "atapi"
  State = DeviceNodeStarted (0x308)
  Previous State = DeviceNodeEnumerateCompletion (0x30d)
  DevNode 0x86995ee8 for PDO 0x86e45d98
    InstancePath is "IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3030303030303030303030303030303030303130"
    ServiceName is "disk"
    State = DeviceNodeInitialized (0x302)
    Previous State = DeviceNodeUninitialized (0x301)
    Problem = CM_PROB_REGISTRY
DevNode 0x86ee7250 for PDO 0x86fad950
  InstancePath is "PCIIDE\IDEChannel\4&23686003&0&1"
  ServiceName is "atapi"
  State = DeviceNodeStarted (0x308)
  Previous State = DeviceNodeEnumerateCompletion (0x30d)
  DevNode 0x86e459b8 for PDO 0x86aa7d98
    InstancePath is "IDE\CdRomNECVMWar_VMware_IDE_CDR10_______________1.00____\3031303030303030303030303030303030303130"
    ServiceName is "cdrom"
    State = DeviceNodeInitialized (0x302)
    Previous State = DeviceNodeUninitialized (0x301)

Jedno z urządzeń ma problem CM_PROB_REGISTRY, który zgodnie z opisem “Windows cannot start this hardware device because its configuration information (in the registry) is incomplete or damaged” oznacza, iż mamy problem z rejestrem. Robimy bardziej szczegółowy zrzut dla naszego urządzenia:

kd> !devnode 0x86995ee8
DevNode 0x86995ee8 for PDO 0x86e45d98
  Parent 0x86fe2160   Sibling 0000000000   Child 0000000000
  InstancePath is "IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3030303030303030303030303030303030303130"
  ServiceName is "disk"
  State = DeviceNodeInitialized (0x302)
  Previous State = DeviceNodeUninitialized (0x301)
  StateHistory[00] = DeviceNodeUninitialized (0x301)
  StateHistory[19] = Unknown State (0x0)
  StateHistory[18] = Unknown State (0x0)
  StateHistory[17] = Unknown State (0x0)
  StateHistory[16] = Unknown State (0x0)
  StateHistory[15] = Unknown State (0x0)
  StateHistory[14] = Unknown State (0x0)
  StateHistory[13] = Unknown State (0x0)
  StateHistory[12] = Unknown State (0x0)
  StateHistory[11] = Unknown State (0x0)
  StateHistory[10] = Unknown State (0x0)
  StateHistory[09] = Unknown State (0x0)
  StateHistory[08] = Unknown State (0x0)
  StateHistory[07] = Unknown State (0x0)
  StateHistory[06] = Unknown State (0x0)
  StateHistory[05] = Unknown State (0x0)
  StateHistory[04] = Unknown State (0x0)
  StateHistory[03] = Unknown State (0x0)
  StateHistory[02] = Unknown State (0x0)
  StateHistory[01] = Unknown State (0x0)
  Flags (0x00002030)  DNF_ENUMERATED, DNF_IDS_QUERIED,
                      DNF_HAS_PROBLEM
  CapabilityFlags (0x00000040)  UniqueID
  Problem = CM_PROB_REGISTRY

i jak widać urządzenie ma flagę DNF_HAS_PROBLEM i w związku z tym zostaje usunięte :)

Przyglądamy się bliżej samemu urządzeniu:

kd> !devobj 0x86e45d98
Device object (86e45d98) is for:
 IdeDeviceP0T0L0-3 \Driver\atapi DriverObject 86fcf508
Current Irp 00000000 RefCount 0 Type 0000002d Flags 00005050
Dacl e17b91fc DevExt 86e45e50 DevObjExt 86e45fd0 Dope 86fe4dc0 DevNode 86995ee8
ExtensionFlags (0x00000010)  DOE_START_PENDING
Characteristics (0x00000100)  FILE_DEVICE_SECURE_OPEN
Device queue is not busy.
kd> !devstack 0x86e45d98
  !DevObj   !DrvObj            !DevExt   ObjectName
> 86e45d98  \Driver\atapi      86e45e50  IdeDeviceP0T0L0-3
!DevNode 86995ee8 :
  DeviceInst is "IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3030303030303030303030303030303030303130"
  ServiceName is "disk"

i widzimy, że jest w trakcie uruchamiania (DOE_START_PENDING).

Na sam koniec, dla kompletu analizy patrzymy na zrzut otwartych kluczy rejestru:

kd> !reg openkeys

Index 49:   0bf8cbd5 kcb=e1034dc8 cell=001fe150 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\DISK
Index 88:   d927b0d4 kcb=e10340f8 cell=00000190 f=00200000 \REGISTRY\MACHINE\HARDWARE\DESCRIPTION
Index a0:   eebb2496 kcb=e10346e8 cell=001fc8c0 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\EVENTLOG
Index c3:   cdca03f8 kcb=e10340a8 cell=001e0588 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\INTELIDE
Index c6:   8515e17f kcb=e1034cd8 cell=0032fc50 f=002000a0 \REGISTRY\MACHINE\SYSTEM\WPA\SIGNINGHASH-V44KQMCFXKQCTQ
Index d1:   a98afff8 kcb=e1034468 cell=00218c00 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\HARDWARE PROFILES
Index d4:   96d26a30 kcb=e1034198 cell=00000020 f=002c0000 \REGISTRY\MACHINE\HARDWARE
Index d5:   0c06c871 kcb=e1034aa8 cell=001a9200 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\VMCI
Index d9:   105fe1d6 kcb=e10345a8 cell=00213b90 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES
Index e2:   f9ba0630 kcb=e1034a58 cell=0027cde8 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\SESSION MANAGER\MEMORY MANAGEMENT
Index 182:   0c006a50 kcb=e10344b8 cell=001d4af8 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\NDIS
Index 19f:   1b34c269 kcb=e10348c8 cell=001de420 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\ISAPNP
Index 1fe:   eb914c1c kcb=e1034f08 cell=001d6ef0 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\MUP
Index 21d:   f8d7beca kcb=e1034f58 cell=0020f9f8 f=00200004 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\AGP440
Index 270:   0fa111eb kcb=e1034af8 cell=00193de0 f=00200000 \REGISTRY\MACHINE\SYSTEM\WPA
Index 27d:   da8a3faa kcb=e1034698 cell=0027f2f0 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\SESSION MANAGER
Index 2de:   0eed37b7 kcb=e1034918 cell=001e45e8 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\FTDISK
Index 313:   aafb0757 kcb=e10341e8 cell=00210ec8 f=00200001 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\ACPI\PARAMETERS
Index 342:   6a053110 kcb=e1034508 cell=00288ad0 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\PRODUCTOPTIONS
Index 3c4:   a368fa25 kcb=e1034738 cell=001a7888 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\VOLSNAP
Index 417:   d567990b kcb=e1034148 cell=001d83a0 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\MOUNTMGR
Index 428:   a4501b08 kcb=e1034b98 cell=00193e78 f=002000a0 \REGISTRY\MACHINE\SYSTEM\WPA\MEDIACENTER
Index 430:   68084470 kcb=e1034788 cell=80004588 f=00200000 \REGISTRY\MACHINE\HARDWARE\DEVICEMAP\SCSI
Index 4bd:   ed7b78af kcb=e1034878 cell=001964e0 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL
Index 4d3:   ef8f4617 kcb=e10342d8 cell=00000020 f=002c0000 \REGISTRY\MACHINE\SYSTEM
Index 4de:   0bf659b7 kcb=e1034b48 cell=00210c40 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\ACPI
Index 4e4:   02ff208a kcb=e1034968 cell=00330500 f=002000a0 \REGISTRY\MACHINE\SYSTEM\WPA\KEY-4F3B2RFXKC9C637882MBM
Index 4ec:   90bebdb7 kcb=e10345f8 cell=001b64b8 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\SR
Index 514:   237bc884 kcb=e1034e18 cell=001dd530 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\KSECDD
Index 533:   3069276d kcb=e1034418 cell=00000208 f=00200004 \REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM
Index 549:   eb915986 kcb=e10347d8 cell=001cd870 f=00200004 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\PCI
Index 595:   d936a631 kcb=e1034008 cell=00000020 f=002c0000 \REGISTRY
Index 5a9:   acb2e9f0 kcb=e1034648 cell=00204dc8 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\COMPBATT
Index 5fb:   292eea1f kcb=e10349b8 cell=000003a8 f=00200000 \REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM\MULTIFUNCTIONADAPTER
Index 60d:   baa7cc35 kcb=e1034eb8 cell=0020be18 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\ATAPI
Index 610:   89a6ad81 kcb=e1034d78 cell=80004f18 f=00200000 \REGISTRY\MACHINE\HARDWARE\DEVICEMAP\SCSI\SCSI PORT 2
Index 63b:   50522e4b kcb=e1034c38 cell=001a8148 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\VMSCSI
Index 66b:   70d80645 kcb=e1034a08 cell=00193ed8 f=002000a0 \REGISTRY\MACHINE\SYSTEM\WPA\PNP
Index 690:   2e790750 kcb=e18ac008 cell=80004a88 f=00200000 \REGISTRY\MACHINE\HARDWARE\DEVICEMAP\SCSI\SCSI PORT 2\SCSI BUS 0\INITIATOR ID 7
Index 698:   bd68092e kcb=e1034288 cell=00000120 f=00200004 \REGISTRY\MACHINE
Index 69f:   93de5fa4 kcb=e1034fa8 cell=00193718 f=00200000 \REGISTRY\MACHINE\SYSTEM\SETUP
Index 6ae:   0625ee96 kcb=e1034058 cell=00000120 f=00200000 \REGISTRY\MACHINE\HARDWARE\DEVICEMAP
Index 6b0:   80f50566 kcb=e1034378 cell=00196480 f=00200004 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001
Index 6c6:   1701af7f kcb=e1034558 cell=80000378 f=00300000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\HARDWARE PROFILES\CURRENT
Index 6ee:   cb00de87 kcb=e1034328 cell=80000020 f=00300008 \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET
Index 6f1:   05e71fd3 kcb=e1034e68 cell=001fed60 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\DMLOAD
Index 711:   0e14e1ae kcb=e1034d28 cell=001e4100 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\FLTMGR
Index 7aa:   5ce76b1d kcb=e1034828 cell=0027b1d0 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\SESSION MANAGER\MEMORY MANAGEMENT\PREFETCHPARAMETERS
Index 7c2:   0bf8dfcb kcb=e1034be8 cell=001fea78 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\DMIO
Index 7c7:   0c00bf71 kcb=e10343c8 cell=001ce048 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\NTFS
Index 7d9:   fe386111 kcb=e1034c88 cell=80004f98 f=00200000 \REGISTRY\MACHINE\HARDWARE\DEVICEMAP\SCSI\SCSI PORT 2\SCSI BUS 0
Index 7f1:   d4a494d3 kcb=e1034238 cell=001cd4f0 f=00200000 \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\PARTMGR

0x34 keys found

i jak widać nie mamy w cache’u klucza klasy DiskDrive, więc nie jesteśmy w stanie niczego więcej sprawdzić.

Jak to naprawić?

W opisanym wyżej przypadku sprawa jest prosta. Uruchamiamy system z ‘ostatniej znanej dobrej konfiguracji’ i gotowe - lista UpperFilters została zmodyfikowana przed ostatnim restartem i w poprzedniej kopii CurrentControlSet nie mamy tego problemu.
W większości wypadków tak łatwo nie będzie i trzeba dobrać się do pliku SYSTEM z %SYSTEMROOT%\System32\config i sprawdzić stan wszystkich sterowników, zaczynając od tych, które znajdują się na liście UpperFilters (i LowerFilters) dla klas typu DiskDrive {4D36E967-E325-11CE-BFC1-08002BE10318} oraz Volume {71A27CDD-812A-11D0-BEC7-08002BE2092F}.

Dalsze zabawy

Ze swojej strony propnuję przyjrzeć się stosowi (brak teb oraz peb na tym etapie, więc nie mamy dostępu ani do !gle, ani innych rozszerzeń, a stos musimy przeglądać na podstawie @esp):
>dps @esp-1000 @esp+1000 (pod kątem symboli)
>dpu @esp-1000 @esp+1000 (pod kątem ciągów unicode)
a także popatrzeć na to, jakie obiekty są przeglądane podczas startu (najlepiej zrzucić wszystko do logu i przejrzeć na spokojnie):
>bp nt!ObpLookupObjectName "dt nt!_unicode_string Buffer @eax;g"
(przy czym pułapkę zakładamy na samym początku, gdy jedyny załadowany moduł to nt!)

Ciekawe, kto dotarł do tego miejsca i czuje niedosyt :)

Opublikowane 26 lipca 2012 01:52 przez mgrzeg

Powiadamianie o komentarzach

Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj

Subskrybuj komentarze za pomocą RSS

Komentarze:

Brak komentarzy

Co o tym myślisz?

(wymagane) 
(opcjonalne)
(wymagane) 

  
Wprowadź kod: (wymagane)
Wyślij

Subskrypcje

W oparciu o Community Server (Personal Edition), Telligent Systems