Режим отладки ядра windows 7 что это такое

Термин «отладка ядра» означает изучение внутренней структуры данных ядра и (или) пошаговую трассировку функций в ядре.

Термин «отладка ядра» означает изучение внутренней структуры данных ядра и (или) пошаговую трассировку функций в ядре. Эта отладка является весьма полезным способом исследования внутреннего устройства Windows, поскольку она позволяет получить отображения внутренней системной информации, недоступной при использовании каких-либо других средств, и дает четкое представление о ходе выполнения кода в ядре.

Прежде чем рассматривать различные способы отладки ядра, давайте исследуем набор файлов, который понадобится для осуществления любого вида такой отладки.

Символы для отладки ядра

Файлы символов содержат имена функций и переменных, а также схему и формат структур данных. Они генерируются программой-компоновщиком (linker) и используются отладчиками для ссылок на эти имена и для их отображения во время сеанса отладки. Эта информация обычно не хранится в двоичном коде, поскольку при выполнении кода она не нужна. Это означает, что без нее двоичный код становится меньше по размеру и выполняется быстрее. Но это также означает, что при отладке нужно обеспечить отладчику доступ к файлам символов, связанных с двоичными образами, на которые идут ссылки во время сеанса отладки.

ядро-windowsДля использования любого средства отладки в режиме ядра с целью исследования внутреннего устройства структуры данных ядра Windows (списка процессов, блоков потоков, списка загруженных драйверов, информации об использовании памяти и т. д.) вам нужны правильные файлы символов и, как минимум, файл символов для двоичного образа ядра — Ntoskrnl.exe. Файлы таблицы символов должны соответствовать версии того двоичного образа, из которого они были извлечены. Например, если установлен пакет Windows Service Pack или какое-нибудь исправление, обновляющее ядро, нужно получить соответствующим образом обновленные файлы символов.

Загрузить и установить символы для различных версий Windows нетрудно, а вот обновить символы для исправлений удается не всегда. Проще всего получить нужную версию символов для отладки путем обращения к специально предназначенному для этого серверу символов Microsoft, воспользовавшись для этого специальным синтаксисом для пути к символам, указываемом в отладчике. Например, следующий путь к символам заставляет средства отладки загрузить символы с интернет-сервера символов и сохранить локальную копию в папке c:symbols:srv*c:symbols*http://msdl.microsoft.com/download/symbols

Подробные инструкции по использованию символьного сервера можно найти в файле справки средств отладки или в Интернете на веб-странице http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx.

Запись от _lunar_ размещена 24.12.2021 в 19:41

Обновил(-а) _lunar_ 18.01.2022 в 16:20

Объекты операционной системы. Часть 1: Общие сведения
Объекты операционной системы. Часть 2: Объект ядра
Объекты операционной системы. Часть 3: Уровень целостности

В этой части я решил показать самые интересные, на мой взгляд, возможности ядерного отладчика WinDbg.
Но сначала немного слов о том, как его установить и как им пользоваться.
В этом блоге я буду показывать работу отладчика WinDbg сразу для двух операционных: Windows 7 (x64) и Windows 10/11 (x64).
Почему две ОС? По двум причинам:
1. Windows 7 всё ещё остаётся актуальной;
2. Работа ядер этих ОС имеет большие различия, которые несомненно вызывают интерес, и которые мы увидим на примерах.

Итак, начнём с Windows 7.
Здесь всё просто, идём на MSDN, качаем Windows 11 WDK (прямая ссылка на online установщик) и устанавливаем по умолчанию в папку Program Files (x86).
После установки отладчик WinDbg будет располагаться по пути: Program Files (x86)Windows Kits10Debuggersx64
Попробуйте запустить windbg.exe, если вылезет вот такая ошибка
Нажмите на изображение для увеличения
Название: 0.png
Просмотров: 170
Размер:	20.9 Кб
ID:	7328
то скачайте эту библиотеку api-ms-win-core-sysinfo-l1-2-0.rar и положите в туже папку, где находится windbg.exe, ещё раз проверьте запускается ли отладчик.
Теперь, чтобы воспользоваться именно KernelMode отладкой необходимо выполнить три шага:
1. В BIOS отключите опцию SecureBoot (должно быть Disabled), если такой опции в BIOS нет, то переходите ко второму шагу.
2. Запустите командную строку (cmd.exe) от имени администратора и введите следующую команду bcdedit -debug on, должна быть надпись об успешном выполнении команды.
3. Перезагрузите компьютер.
Запустите windbg.exe от имени администратора. В меню нажмите File -> Kernel Degug… -> выберите Local и нажмите OK
Нажмите на изображение для увеличения
Название: 0.5.png
Просмотров: 178
Размер:	15.7 Кб
ID:	7330
Дождитесь окончания загрузки символов (в командной строке должна появиться надпись lkd>, что означает, что отладчик готов к принятию команд).

Теперь установка и настройка для Windows 10/11.
В этих ОС можно выбрать какой отладчик устанавливать:
— тот же, что и описанный в Windows 7 из пакета Windows 11 WDK;
— либо из магазина Microsoft Store WinDbg Preview, который также можно найти и в самом магазине.
Лично я предпочитаю WinDbg Preview, у него неплохой интерактивный GUI, да и сам интерфейс куда более приятный и современный.
Настройка аналогична трем шагам из Windows 7: выключить SecureBoot, включить debug on и перезагрузить компьютер.
Из Пуска запустите WinDbg Preview от имени администратора. В меню нажмите File -> Attach to kernel -> выберите Local и нажмите OK
Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 200
Размер:	44.9 Кб
ID:	7327
Дождитесь окончания загрузки символов (в командной строке должна появиться надпись lkd>, что означает, что отладчик готов к принятию команд).

Так как отладчик сейчас работает в режиме ядра ОС, то эксперименты будем ставить над самым главным процессом — ядром операционной системы System.
Итак, первой командой, которой мы воспользуемся, это !process
Она выводит базовую информацию о процессе: сессию в которой он работает, идентификатор, родительский процесс, количество открытых дескрипторов этим процессом.
Давайте введем команду !process 0 0 System
Нажмите на изображение для увеличения
Название: 2.png
Просмотров: 202
Размер:	64.0 Кб
ID:	7331
Отлично! Теперь у нас есть значение объекта процесса System PROCESS fffffa80048d8040
Для того, чтобы понять что находится в этом объекте, необходимо получить заголовок этого объекта (ObjectHeader).
В отладчике WinDbg для этого предусмотрена команда !object
Соответственно введём эту команду и значение того объекта, у которого требуется получить заголовок !object fffffa80048d8040
Нажмите на изображение для увеличения
Название: 3.png
Просмотров: 195
Размер:	60.6 Кб
ID:	7332
Теперь у нас есть значение заголовка объекта процесса System ObjectHeader: fffffa80048d8010 (new version)
Зная это значение, можно посмотреть что содержится в структуре _OBJECT_HEADER
Воспользуемся следующей командой, которой передадим значение заголовка объекта dt nt!_object_header fffffa80048d8010
Нажмите на изображение для увеличения
Название: 4.png
Просмотров: 180
Размер:	45.6 Кб
ID:	7334
Самыми интересными полями этой структуры являются TypeIndex и SecurityDescriptor.
Начнём с SecurityDescriptor : 0xfffff8a0`0000464b.
Это указатель на структуру, содержащую уже знакомые нам ACL (SACL и DACL), а также их ACE, SID группы и владельца и их флаги.
Введем специальную команду, чтобы отобразить содержимое структуры, находящейся по значению SecurityDescriptor: !sd 0xfffff8a0`0000464b & -10
Нажмите на изображение для увеличения
Название: 5.png
Просмотров: 204
Размер:	84.5 Кб
ID:	7335
Заметьте, что KernelExplorer, кроме вывода этой информации, также выводит более детализированную информацию, в частности по структуре ACTRL_ALIST.
Данная структура является недокументированной, и собирать её содержимое достаточно сложно, видимо в Microsoft не стали заморачиваться, а ведь там есть очень ценная и уникальная информация по правам доступа каждого ACE (ACTRL_ACCESS_ENTRY)
Нажмите на изображение для увеличения
Название: 5.5.png
Просмотров: 213
Размер:	36.2 Кб
ID:	7336
Теперь давайте разберемся, что такое TypeIndex : 0x7.
TypeIndex это индекс указателя на структуру _OBJECT_TYPE в таблице ObTypeIndexTable.
Давайте посмотрим что это за таблица ObTypeIndexTable, находящаяся в ядре ОС. Для этого введём команду dps nt!ObTypeIndexTable
Нажмите на изображение для увеличения
Название: 6.png
Просмотров: 179
Размер:	64.7 Кб
ID:	7337
Так как эксперименты проводятся на 64 битной ОС, соответственно значения являются 8-ми байтовыми.
Обратите внимание: второе значение является ошибочным 00000000BAD0B0B0.
Что это такое? Это заплатка (patchGuard) от эксплойта вида
Нажмите на изображение для увеличения
Название: 8.png
Просмотров: 183
Размер:	13.9 Кб
ID:	7339
В Windows 7 существовал способ, позволяющий через shellcode получить контроль на объектами ядра в таблице ObTypeIndexTable.
После patchGuard все обращения ко второму значению приводили к ошибке вида BAD ObjectHeader.
В Windows 8.1 исправили этот баг непосредственно в коде ядра, тем самым представив метаданные следующим образом
Нажмите на изображение для увеличения
Название: 9.png
Просмотров: 175
Размер:	9.9 Кб
ID:	7340
Но давайте вернёмся к TypeIndex и его значению 0x7.
Начав отсчитывать от первого нулевого значения (нулевой индекс) до седьмого индекса (восьмого значения) в таблице ObTypeIndexTable, мы попадаем на значение fffffa80048769b0. Пока запомним его.
Для того, чтобы посмотреть содержимое структуры _OBJECT_TYPE воспользуемся специальной командой, в которой происходит арифметическое действие над таблицей с учетом индекса 7 и размерности значения, находящегося по этому индексу (8 байт)
dt nt!_OBJECT_TYPE poi(nt!ObTypeIndexTable + (7 * 8))
Нажмите на изображение для увеличения
Название: 7.png
Просмотров: 180
Размер:	63.9 Кб
ID:	7338
Первым делом посмотрите на поле Name : _UNICODE_STRING «Process».
Вернитесь в скриншоту, где мы использовали команду !object — поле Type: (fffffa80048769b0) Process: данный объект ядра является Process.
А теперь посмотрите на поле TypeList : _LIST_ENTRY (0xfffffa80`048769b0). Точно такое же значение, которое мы запомнили чуть раньше.
Поздравляю, мы получили валидный индекс процесса System (ядра ОС) в таблице ObTypeIndexTable.

Теперь вернёмся к Windows 10/11 и попробуем определить индекс в таблице ObTypeIndexTable. Вот что мы получим в итоге
Нажмите на изображение для увеличения
Название: 10.png
Просмотров: 205
Размер:	23.6 Кб
ID:	7343
TypeIndex в Windows 10/11 зашифрован.
Кроме того, в Windows 10 21H2 диапазон индексов лежит в промежутке [0…68]

Кликните здесь для просмотра всего текста

Код:

TypeName                         | TypeIndex
---------------------------------|----------
(null)                           |  0
                                 |  1
Type                             |  2
Directory                        |  3
SymbolicLink                     |  4
Token                            |  5
Job                              |  6
Process                          |  7
Thread                           |  8
Partition                        |  9
UserApcReserve                   | 10
IoCompletionReserve              | 11
ActivityReference                | 12
PsSiloContextPaged               | 13
PsSiloContextNonPaged            | 14
DebugObject                      | 15
Event                            | 16
Mutant                           | 17
Callback                         | 18
Semaphore                        | 19
Timer                            | 20
IRTimer                          | 21
Profile                          | 22
KeyedEvent                       | 23
WindowStation                    | 24
Desktop                          | 25
Composition                      | 26
RawInputManager                  | 27
CoreMessaging                    | 28
ActivationObject                 | 29
TpWorkerFactory                  | 30
Adapter                          | 31
Controller                       | 32
Device                           | 33
Driver                           | 34
IoCompletion                     | 35
WaitCompletionPacket             | 36
File                             | 37
TmTm                             | 38
TmTx                             | 39
TmRm                             | 40
TmEn                             | 41
Section                          | 42
Session                          | 43
Key                              | 44
RegistryTransaction              | 45
ALPC Port                        | 46
EnergyTracker                    | 47
PowerRequest                     | 48
WmiGuid                          | 49
EtwRegistration                  | 50
EtwSessionDemuxEntry             | 51
EtwConsumer                      | 52
CoverageSampler                  | 53
DmaAdapter                       | 54
PcwObject                        | 55
FilterConnectionPort             | 56
FilterCommunicationPort          | 57
NdisCmState                      | 58
DxgkSharedResource               | 59
DxgkSharedKeyedMutexObject       | 60
DxgkSharedSyncObject             | 61
DxgkSharedSwapChainObject        | 62
DxgkDisplayManagerObject         | 63
DxgkCurrentDxgThreadObject       | 64 // Only in Windows 10
DxgkSharedProtectedSessionObject | 65
DxgkSharedBundleObject           | 66
DxgkCompositionObject            | 67
VRegConfigurationContext         | 68

а 0x4E это 78, что уже означает выход за допустимый диапазон.
Кстати в Windows 11 21H2 диапазон индексов был расширен

Кликните здесь для просмотра всего текста

Код:

TypeName                         | TypeIndex
---------------------------------|----------
(null)                           |  0
                                 |  1
Type                             |  2
Directory                        |  3
SymbolicLink                     |  4
Token                            |  5
Job                              |  6
Process                          |  7
Thread                           |  8
Partition                        |  9
UserApcReserve                   | 10
IoCompletionReserve              | 11
ActivityReference                | 12
ProcessStateChange               | 13  // Only in Windows 11
ThreadStateChange                | 14  // Only in Windows 11
PsSiloContextPaged               | 15
PsSiloContextNonPaged            | 16
DebugObject                      | 17
Event                            | 18
Mutant                           | 19
Callback                         | 20
Semaphore                        | 21
Timer                            | 22
IRTimer                          | 23
Profile                          | 24
KeyedEvent                       | 25
WindowStation                    | 26
Desktop                          | 27
Composition                      | 28
RawInputManager                  | 29
CoreMessaging                    | 30
ActivationObject                 | 31
TpWorkerFactory                  | 32
Adapter                          | 33
Controller                       | 34
Device                           | 35
Driver                           | 36
IoCompletion                     | 37
WaitCompletionPacket             | 38
File                             | 39
IoRing                           | 40  // Only in Windows 11
TmTm                             | 41
TmTx                             | 42
TmRm                             | 43
TmEn                             | 44
Section                          | 45
Session                          | 46
Key                              | 47
RegistryTransaction              | 48
ALPC Port                        | 49
EnergyTracker                    | 50
PowerRequest                     | 51
WmiGuid                          | 52
EtwRegistration                  | 53
EtwSessionDemuxEntry             | 54
EtwConsumer                      | 55
CoverageSampler                  | 56
DmaAdapter                       | 57
PcwObject                        | 58
FilterConnectionPort             | 59
FilterCommunicationPort          | 60
NdisCmState                      | 61
DxgkSharedResource               | 62
DxgkSharedKeyedMutexObject       | 63
DxgkSharedSyncObject             | 64
DxgkSharedSwapChainObject        | 65
DxgkDisplayManagerObject         | 66
DxgkSharedProtectedSessionObject | 67
DxgkSharedBundleObject           | 68
DxgkCompositionObject            | 69
VRegConfigurationContext         | 70

Касаемо новых объектов ядра в Windows 11, могу порекомендовать почитать вот этот материал
ProcessStateChange и ThreadStateChange — Thread and Process State Change
IoRing — I/O Rings – When One I/O Operation is Not Enough

А это таблица индексов объектов ядра Windows 7

Кликните здесь для просмотра всего текста

Код:

TypeName                         | TypeIndex
---------------------------------|----------
(null)                           |  0
BAD0B0B0                         |  1
Type                             |  2
Directory                        |  3
SymbolicLink                     |  4
Token                            |  5
Job                              |  6
Process                          |  7
Thread                           |  8
UserApcReserve                   |  9
IoCompletionReserve              | 10
DebugObject                      | 11
Event                            | 12
EventPair                        | 13 // Only in Windows 7
Mutant                           | 14
Callback                         | 15
Semaphore                        | 16
Timer                            | 17
Profile                          | 18
KeyedEvent                       | 19
WindowStation                    | 20
Desktop                          | 21
TpWorkerFactory                  | 22
Adapter                          | 23
Controller                       | 24
Device                           | 25
Driver                           | 26
IoCompletion                     | 27
File                             | 28
TmTm                             | 29
TmTx                             | 30
TmRm                             | 31
TmEn                             | 32
Section                          | 33
Session                          | 34
Key                              | 35
ALPC Port                        | 36
PowerRequest                     | 37
WmiGuid                          | 38
EtwRegistration                  | 39
EtwConsumer                      | 40
FilterConnectionPort             | 41
FilterCommunicationPort          | 42
PcwObject                        | 43

В Microsoft посчитали, что такой лёгкий доступ к таблице индексов ObTypeIndexTable недопустим и постарались запутать исследователей.
Но их защита простояла недолго, достаточно быстро был найден способ получения валидного индекса, довольно нетрадиционным способом.

Во-первых, исследователи ядра начали искать фрагменты кода, которые имеют что-то общее со структурой _OBJECT_TYPE

Код:

lkd> x nt!ob*type*
fffff806`2bc21f8c nt!ObpCreateDefaultObjectTypeSD (void)
fffff806`2bc218d0 nt!ObCreateObjectTypeEx (void)
fffff806`2bd82214 nt!ObEnumerateObjectsByType (ObEnumerateObjectsByType)
fffff806`2c024ef0 nt!ObpTypeObjectType = <no type information>
fffff806`2c024ee0 nt!ObpDirectoryObjectType = <no type information>
fffff806`2c107470 nt!ObTypeIndexTable = <no type information>
fffff806`2bb23b28 nt!ObQueryTypeInfo (ObQueryTypeInfo)
fffff806`2bc21ef8 nt!ObpInitObjectTypeSD (ObpInitObjectTypeSD)
fffff806`2be36038 nt!ObpObjectTypesPathString = <no type information>
fffff806`2bd82a60 nt!ObpDestroyTypeArray (ObpDestroyTypeArray)
fffff806`2bd8295c nt!ObpCreateTypeArray (ObpCreateTypeArray)
fffff806`2bf54aa0 nt!ObpTypeMapping = <no type information>
fffff806`2be36028 nt!ObpObjectTypesNameString = <no type information>
fffff806`2baa3cc0 nt!ObGetObjectType (ObGetObjectType)
fffff806`2c024e20 nt!ObpTypeDirectoryObject = <no type information>
fffff806`2bc218b0 nt!ObCreateObjectType (ObCreateObjectType)
fffff806`2c024ee8 nt!ObpSymbolicLinkObjectType = <no type information>
fffff806`2c024620 nt!ObpObjectTypes = <no type information>
fffff806`2bd82d3c nt!ObQueryTypeName (ObQueryTypeName)

Поиски выявили интересную функцию, которую нельзя было упускать из виду только лишь из-за ее названия nt!ObGetObjectType.
Затем было решено посмотреть на её мнемонику ассемблерного кода

Код:

lkd> uf nt!ObGetObjectType
nt!ObGetObjectType:
fffff806`2baa3cc0 488d41d0        lea     rax,[rcx-30h]
fffff806`2baa3cc4 0fb649e8        movzx   ecx,byte ptr [rcx-18h]
fffff806`2baa3cc8 48c1e808        shr     rax,8
fffff806`2baa3ccc 0fb6c0          movzx   eax,al
fffff806`2baa3ccf 4833c1          xor     rax,rcx
fffff806`2baa3cd2 0fb60d2f2f6600  movzx   ecx,byte ptr [nt!ObHeaderCookie (fffff806`2c106c08)]
fffff806`2baa3cd9 4833c1          xor     rax,rcx
fffff806`2baa3cdc 488d0d8d376600  lea     rcx,[nt!ObTypeIndexTable (fffff806`2c107470)]
fffff806`2baa3ce3 488b04c1        mov     rax,qword ptr [rcx+rax*8]
fffff806`2baa3ce7 c3              ret

Функция ObGetObjectType принимает адрес объекта в качестве аргумента и выполняет следующие действия:
1. Код вычисляет адрес структуры _OBJECT_HEADER путем вычитания 0x30 из адреса памяти объекта, переданного в качестве аргумента.
0x30 это смещение от начала объекта до его заголовка в 64 битных ОС. В 32 битных ОС это смещение равняется 0x18.
2. Код выполняет операцию XOR для значения TypeIndex со вторым младшим байтом адреса структуры _OBJECT_HEADER, вычисленного на предыдущем шаге.
3. Затем код выполняет операцию XOR для результата из второго шага с байтом по адресу ObHeaderCookie.
4. Наконец результат операций XOR используется как индекс в ObTypeIndexTable и возвращает указатель на структуру _OBJECT_TYPE по этому индексу.

Теперь более простым языком, чтобы было понятно.
У нас есть объект PROCESS ffffc4052a8df040 процесса System, определенный после выполнения команды !process 0 0 System
От его значения мы отнимаем смещение до начала заголовка объекта: ffffc4052a8df040 — 0x30 = ffffc4052a8df010
Отсчёт байт начинается справа налево. Таким образом второй младший байт это 0xf0 (ffffc4052a8d f0 10).
Затем, необходимо выполнить команду db nt!ObHeaderCookie l1 чтобы определить байт в cookie, он равен 0xb9.
TypeIndex в зашифрованном виде равен 0x4e.
Теперь у нас есть все необходимые данные, они же ключи для расшифровки закодированного индекса методом XOR.
Введём следующую команду: ? f0 ^ 4e ^ b9
В итоге получаем расшифрованный TypeIndex: 0x7 для процесса System как и в случае с Windows 7.

Выведем таблицу ObTypeIndexTable командой dps nt!ObTypeIndexTable (как видите BAD ObjectHeader в Windows 10/11 уже нет).
Остаётся лишь только проверить имя Name : _UNICODE_STRING «Process» и адреса в TypeList : _LIST_ENTRY (0xffffc405`2a8bf380),
командой dt nt!_OBJECT_TYPE poi(nt!ObTypeIndexTable + (7 * 8))
Нажмите на изображение для увеличения
Название: 11.png
Просмотров: 186
Размер:	40.5 Кб
ID:	7345

Ну чтож, на этом я хотел бы поставить точку в изучении объектов операционной системы Windows.
Конечно же это только верхушка айсберга, и внутреннее устройство ОС Windows куда сложнее того, что я показал здесь.
Но главное, мы научились вскрывать то, что Microsoft зашифровала, причём на уровне ядра.

Как запустить отладчик ядра

Одной из важных составляющих процесса разработки программного обеспечения является отладка. В отношении прикладных программ она осуществляется средствами, работающими в пользовательском режиме и зачастую встроенными в IDE. Но для того чтобы иметь возможность отлаживать, например, драйвера, нужно запустить отладчик ядра.

Как запустить отладчик ядра

Вам понадобится

  • — права администратора на целевой машине.

Инструкция

Запустите командный процессор cmd. Кликните по кнопке «Пуск» в панели задач. Кликните по пункту «Выполнить…» появившегося меню. В текстовое поле диалога «Запуск программы» введите строку cmd и нажмите кнопку OK.

Создайте резервную копию файла boot.ini. Узнайте путь инсталляции текущей копии Windows при помощи команды:echo %SystemRoot%Перейдите на тот диск, куда установлена операционная система при помощи ввода литеры устройства с последующим двоеточием. Перейдите в его корневой каталог, используя команду cd. Снимите атрибуты «системный», «только для чтения» и «скрытый» с файла boot.ini при помощи команды attrib, создайте резервную копию командой copy и снова установите атрибуты:attrib -h -s -r boot.inicopy boot.ini boot.ini.oldattrib +h +s +r boot.ini

Выведите текущий список вариантов загрузки. Используйте команду:bootcfg /queryПросмотрите элементы списка и определите тот, на основе которого будет создана новая конфигурация с возможностью отладки в режиме ядра. Запомните идентификатор загрузочной записи.

Создайте новую загрузочную запись, исполнив команду bootcfg с параметром /copy. Используйте параметр /id для указания идентификатора записи, которая будет скопирована. При помощи параметра /d задайте отображаемое имя записи. Например:bootcfg /copy /id 1 /d «Win XP (Debug)»Снова выведите список вариантов загрузки командой bootcfg с параметром /query и узнайте идентификатор добавленной записи.

Включите опции для запуска отладчика ядра в загрузочную запись, созданную на предыдущем шаге. Если отладка будет производиться на целевой машине, просто добавьте опцию /debug. Например:bootcfg /debug on /id 2Если планируется удаленная отладка с подключением целевого компьютера к хост-машине через com-порт, дополнительно используйте опции /port /baud для указания номера порта и скорости обмена соответственно:bootcfg /debug on /port COM2 /baud 9600 /id 2Если удаленная отладка будет осуществляться с подключением через интерфейс IEEE 1394 (кабель FireWire), воспользуйтесь опцией /dbg1394 для включения соответствующего режима и опцией /ch для указания номера канала, например:bootcfg /dbg1394 on /ch 42 /id 2Просмотрите загрузочные записи командой bootcfg с параметром /query и убедитесь в том, что изменения внесены. Закройте окно командного процессора, выполнив команду exit.

Измените, если это необходимо, параметры загрузки операционной системы. Откройте панель управления, воспользовавшись соответствующим пунктом раздела «Настройка» меню «Пуск». Откройте элемент «Система». В диалоге «Свойства системы» перейдите на вкладку «Дополнительно». Кликните по кнопке «Параметры», расположенной в группе «Загрузка и восстановление». В отобразившемся диалоге «Загрузка и восстановление» активируйте опцию «Отображать список операционных систем». Нажмите кнопки OK в двух последних открытых диалогах.

Перезагрузите компьютер. Выберите вариант загрузки с отладчиком. Войдите в систему и работайте на целевой машине, либо начните сеанс удаленной отладки. Используйте такие средства как WinDbg и KD.

Полезный совет

Установите пакет Microsoft® Windows® checked build для комфортной отладки в режиме ядра.

Источники:

  • Adding Boot Entries

Войти на сайт

или

Забыли пароль?
Еще не зарегистрированы?

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

title description ms.date

Get started with WinDbg (kernel-mode)

Learn how to set up and establish a WinDbg kernel-mode debugging session. The WinDbg kernel-mode debugger is included in Debugging Tools for Windows.

12/09/2022

Get started with WinDbg (kernel-mode)

WinDbg is a kernel-mode and user-mode debugger that’s included in Debugging Tools for Windows. This article provides exercises to help you get started using WinDbg as a kernel-mode debugger.

For information about how to get Debugging Tools for Windows, see Debugging Tools for Windows (WinDbg, KD, CDB, NTSD). After you install the debugging tools, locate the installation directories for 64-bit (x64) and 32-bit (x86) versions of the tools. For example:

  • C:Program Files (x86)Windows Kits10Debuggersx64
  • C:Program Files (x86)Windows Kits10Debuggersx86

Set up a kernel-mode debugging

A kernel-mode debugging environment typically has two computers, the host computer and the target computer. The debugger runs on the host computer, and the code being debugged runs on the target computer. The host and target are connected by a debug cable.

The Windows debuggers support the following types of cables:

  • Ethernet
  • USB 2.0 / USB 3.0
  • Serial (also called null modem)

For speed and reliability, you should use an Ethernet cable with a local network hub. The following diagram illustrates a host and target computer connected for debugging with an Ethernet cable.

A diagram of the host and target computers with an ethernet connection.

An option for older versions of Windows is to use a direct cable, such as a USB or serial cable.

A diagram of the host and target computers with a debug cable.

For details about how to set up the host and target computers, see Setting up kernel-mode debugging manually.

Virtual machine — VM

For information on connecting a debugger to a Hyper-V virtual machine, see Setting up network debugging of a virtual machine — KDNET.

Establish a kernel-mode debugging session

After you set up your host and target computer and connect them with a debug cable, you can establish a kernel-mode debugging session. Follow the instructions in the same topic that you used for getting set up. For example, if you decide to set up your host and target computers for debugging over Ethernet, you can find instructions for establishing a kernel-mode debugging session in the following article:

  • Setting up KDNET network kernel debugging automatically

Get started using WinDbg

  1. On the host computer, open WinDbg and establish a kernel-mode debugging session with the target computer.

  2. To open the debugger documentation CHM file, go to the Help menu and select Contents. The debugger documentation is also available online in Debugging Tools for Windows.

  3. When you establish a kernel-mode debugging session, WinDbg might break in to the target computer automatically. If WinDbg doesn’t break in, go to the Debug menu and select Break.

  4. In the command line at the bottom of the WinDbg window, enter the following command:

    .sympath srv*

    The output is similar to the following example:

    Symbol search path is: srv*
    Expanded Symbol search path is: cache*;SRV*https://msdl.microsoft.com/download/symbols
    

    The symbol search path tells WinDbg where to look for symbol (PDB) files. The debugger needs symbol files to obtain information about code modules, such as function names and variable names.

    Enter the following command, which tells WinDbg to do its initial finding and loading of symbol files:

    .reload

  5. To see a list of loaded modules, enter the following command:

    lm

    The output is similar to the following example:

    0:000>3: kd> lm
    start             end                 module name
    fffff800`00000000 fffff800`00088000   CI         (deferred)
    ...
    fffff800`01143000 fffff800`01151000   BasicRender   (deferred)
    fffff800`01151000 fffff800`01163000   BasicDisplay  (deferred)
    ...
    fffff800`02a0e000 fffff800`03191000   nt  (pdb symbols) C:...ntkrnlmp.pdb
    fffff800`03191000 fffff800`03200000   hal (deferred)
    ...
    
  6. To start target computer running, enter the following command:

    g

  7. To break in again, go to the Debug menu and select Break.

  8. Enter the following command to examine the _FILE_OBJECT data type in the nt module:

    dt nt!_FILE_OBJECT

    The output is similar to the following example:

    0:000>0: kd> dt nt!_FILE_OBJECT
       +0x000 Type             : Int2B
       +0x002 Size             : Int2B
       +0x008 DeviceObject     : Ptr64 _DEVICE_OBJECT
       +0x010 Vpb              : Ptr64 _VPB
       ...
       +0x0c0 IrpList          : _LIST_ENTRY
       +0x0d0 FileObjectExtension : Ptr64 Void
    
  9. Enter the following command to examine some of the symbols in the nt module:

    x nt!*CreateProcess*

    The output is similar to the following example:

    0:000>0: kd> x nt!*CreateProcess*
    fffff800`030821cc nt!ViCreateProcessCallbackInternal (<no parameter info>)
    ...
    fffff800`02e03904 nt!MmCreateProcessAddressSpace (<no parameter info>)
    fffff800`02cece00 nt!PspCreateProcessNotifyRoutine = <no type information>
    ...
    
  10. Enter the following command to put a breakpoint at MmCreateProcessAddressSpace:

    bu nt!MmCreateProcessAddressSpace

    To verify that the breakpoint is set, enter the following command:

    bl

    The output is similar to the following example:

    0:000>0: kd> bu nt!MmCreateProcessAddressSpace
    0: kd> bl
    0 e fffff800`02e03904     0001 (0001) nt!MmCreateProcessAddressSpace
    

    Enter g to let the target computer run.

  11. If the target computer doesn’t break in to the debugger immediately, perform a few actions on the target computer (for example, open Notepad). The target computer will break in to the debugger when MmCreateProcessAddressSpace is called. To see the stack trace, enter the following commands:

    .reload

    k

    The output is similar to the following example:

    0:000>2: kd> k
    Child-SP          RetAddr           Call Site
    ffffd000`224b4c88 fffff800`02d96834 nt!MmCreateProcessAddressSpace
    ffffd000`224b4c90 fffff800`02dfef17 nt!PspAllocateProcess+0x5d4
    ffffd000`224b5060 fffff800`02b698b3 nt!NtCreateUserProcess+0x55b
    ...
    000000d7`4167fbb0 00007ffd`14b064ad KERNEL32!BaseThreadInitThunk+0xd
    000000d7`4167fbe0 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
    
  12. On the View menu, select Disassembly.

    On the Debug menu, select Step Over (or press F10). Enter step commands a few more times as you watch the Disassembly window.

  13. Clear your breakpoint by entering the following command:

    bc *

    Enter g to let the target computer run. To break in again, go to the Debug menu and select Break, or press CTRL-Break.

  14. To see a list of all processes, enter the following command:

    !process 0 0

    The output is similar to the following example:

    0:000>0: kd> !process 0 0
    **** NT ACTIVE PROCESS DUMP ****
    PROCESS ffffe000002287c0
        SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
        DirBase: 001aa000  ObjectTable: ffffc00000003000  HandleCount: <Data Not Accessible>
        Image: System
    
    PROCESS ffffe00001e5a900
        SessionId: none  Cid: 0124    Peb: 7ff7809df000  ParentCid: 0004
        DirBase: 100595000  ObjectTable: ffffc000002c5680  HandleCount: <Data Not Accessible>
        Image: smss.exe
    ...
    PROCESS ffffe00000d52900
        SessionId: 1  Cid: 0910    Peb: 7ff669b8e000  ParentCid: 0a98
        DirBase: 3fdba000  ObjectTable: ffffc00007bfd540  HandleCount: <Data Not Accessible>
        Image: explorer.exe
    
  15. Copy the address of one process, and enter the following command:

    !process Address 2

    For example: !process ffffe00000d5290 2

    The output shows the threads in the process.

    0:000>0:000>0: kd> !process ffffe00000d52900 2
    PROCESS ffffe00000d52900
        SessionId: 1  Cid: 0910    Peb: 7ff669b8e000  ParentCid: 0a98
        DirBase: 3fdba000  ObjectTable: ffffc00007bfd540  HandleCount:
        Image: explorer.exe
    
            THREAD ffffe00000a0d880  Cid 0910.090c  Teb: 00007ff669b8c000
                ffffe00000d57700  SynchronizationEvent
    
            THREAD ffffe00000e48880  Cid 0910.0ad8  Teb: 00007ff669b8a000
                ffffe00000d8e230  NotificationEvent
                ffffe00000cf6870  Semaphore Limit 0xffff
                ffffe000039c48c0  SynchronizationEvent
            ...
            THREAD ffffe00000e6d080  Cid 0910.0cc0  Teb: 00007ff669a10000
                ffffe0000089a300  QueueObject
    
  16. Copy the address of one thread, and enter the following command:

    !thread Address

    For example: !thread ffffe00000e6d080

    The output shows information about the individual thread.

    0: kd> !thread ffffe00000e6d080
    THREAD ffffe00000e6d080  Cid 0910.0cc0  Teb: 00007ff669a10000 Win32Thread: 0000000000000000 WAIT: ...
        ffffe0000089a300  QueueObject
    Not impersonating
    DeviceMap                 ffffc000034e7840
    Owning Process            ffffe00000d52900       Image:         explorer.exe
    Attached Process          N/A            Image:         N/A
    Wait Start TickCount      13777          Ticks: 2 (0:00:00:00.031)
    Context Switch Count      2              IdealProcessor: 1
    UserTime                  00:00:00.000
    KernelTime                00:00:00.000
    Win32 Start Address ntdll!TppWorkerThread (0x00007ffd14ab2850)
    Stack Init ffffd00021bf1dd0 Current ffffd00021bf1580
    Base ffffd00021bf2000 Limit ffffd00021bec000 Call 0
    Priority 13 BasePriority 13 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
    ...
    
  17. To see all the device nodes in the Plug and Play device tree, enter the following command:

    !devnode 0 1

    0:000>0: kd> !devnode 0 1
    Dumping IopRootDeviceNode (= 0xffffe000002dbd30)
    DevNode 0xffffe000002dbd30 for PDO 0xffffe000002dc9e0
      InstancePath is "HTREEROOT"
      State = DeviceNodeStarted (0x308)
      Previous State = DeviceNodeEnumerateCompletion (0x30d)
      DevNode 0xffffe000002d9d30 for PDO 0xffffe000002daa40
        InstancePath is "ROOTvolmgr000"
        ServiceName is "volmgr"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeEnumerateCompletion (0x30d)
        DevNode 0xffffe00001d49290 for PDO 0xffffe000002a9a90
          InstancePath is "STORAGEVolume{3007dfd3-df8d-11e3-824c-806e6f6e6963}#0000000000100000"
          ServiceName is "volsnap"
          TargetDeviceNotify List - f 0xffffc0000031b520  b 0xffffc0000008d0f0
          State = DeviceNodeStarted (0x308)
          Previous State = DeviceNodeStartPostWork (0x307)
    ...
    
  18. To see the device nodes and their hardware resources, enter the following command:

    !devnode 0 9

    0:000>...
            DevNode 0xffffe000010fa770 for PDO 0xffffe000010c2060
              InstancePath is "PCIVEN_8086&DEV_2937&SUBSYS_2819103C&REV_023&33fd14ca&0&D0"
              ServiceName is "usbuhci"
              State = DeviceNodeStarted (0x308)
              Previous State = DeviceNodeEnumerateCompletion (0x30d)
              TranslatedResourceList at 0xffffc00003c78b00  Version 1.1  Interface 0x5  Bus #0
                Entry 0 - Port (0x1) Device Exclusive (0x1)
                  Flags (0x131) - PORT_MEMORY PORT_IO 16_BIT_DECODE POSITIVE_DECODE
                  Range starts at 0x3120 for 0x20 bytes
                Entry 1 - DevicePrivate (0x81) Device Exclusive (0x1)
                  Flags (0000) -
                  Data - {0x00000001, 0x00000004, 0000000000}
                Entry 2 - Interrupt (0x2) Shared (0x3)
                  Flags (0000) - LEVEL_SENSITIVE
                  Level 0x8, Vector 0x81, Group 0, Affinity 0xf
    ...
    
  19. To see a device node that has a service name of disk, enter the following command:

    !devnode 0 1 disk

    0: kd> !devnode 0 1 disk
    Dumping IopRootDeviceNode (= 0xffffe000002dbd30)
    DevNode 0xffffe0000114fd30 for PDO 0xffffe00001159610
      InstancePath is "IDEDiskST3250820AS_____________________________3.CHL___5&14544e82&0&0.0.0"
      ServiceName is "disk"
      State = DeviceNodeStarted (0x308)
      Previous State = DeviceNodeEnumerateCompletion (0x30d)
    ...
    
  20. The output of !devnode 0 1 shows the address of the physical device object (PDO) for the node. Copy the address of a physical device object (PDO), and enter the following command:

    !devstack PdoAddress

    For example: <PdoAddress>!devstack 0xffffe00001159610

    0:000>0: kd> !devstack 0xffffe00001159610
      !DevObj           !DrvObj            !DevExt           ObjectName
      ffffe00001d50040  Driverpartmgr    ffffe00001d50190  
      ffffe00001d51450  Driverdisk       ffffe00001d515a0  DR0
      ffffe00001156e50  DriverACPI       ffffe000010d8bf0  
    
  21. To get information about the driver disk.sys, enter the following command:

    !drvobj disk 2

    0:000>0: kd> !drvobj disk 2
    Driver object (ffffe00001d52680) is for:
     Driverdisk
    DriverEntry:   fffff800006b1270 disk!GsDriverEntry
    DriverStartIo: 00000000
    DriverUnload:  fffff800010b0b5c CLASSPNP!ClassUnload
    AddDevice:     fffff800010aa110 CLASSPNP!ClassAddDevice
    
    Dispatch routines:
    [00] IRP_MJ_CREATE                      fffff8000106d160    CLASSPNP!ClassGlobalDispatch
    [01] IRP_MJ_CREATE_NAMED_PIPE           fffff80002b0ab24    nt!IopInvalidDeviceRequest
    [02] IRP_MJ_CLOSE                       fffff8000106d160    CLASSPNP!ClassGlobalDispatch
    [03] IRP_MJ_READ                        fffff8000106d160    CLASSPNP!ClassGlobalDispatch
    ...
    [1b] IRP_MJ_PNP                         fffff8000106d160    CLASSPNP!ClassGlobalDispatch
    
  22. The output of !drvobj shows addresses of dispatch routines. For example, CLASSPNP!ClassGlobalDispatch. To set and verify a breakpoint at ClassGlobalDispatch, enter the following commands:

    bu CLASSPNP!ClassGlobalDispatch

    bl

    Enter g to let the target computer run.

    If the target computer doesn’t break in to the debugger immediately, perform a few actions on the target computer (for example, open Notepad and save a file). The target computer will break in to the debugger when ClassGlobalDispatch is called. To see the stack trace, enter the following commands:

    .reload

    k

    The output is similar to the following example:

    2: kd> k
    Child-SP          RetAddr           Call Site
    ffffd000`21d06cf8 fffff800`0056c14e CLASSPNP!ClassGlobalDispatch
    ffffd000`21d06d00 fffff800`00f2c31d volmgr!VmReadWrite+0x13e
    ffffd000`21d06d40 fffff800`0064515d fvevol!FveFilterRundownReadWrite+0x28d
    ffffd000`21d06e20 fffff800`0064578b rdyboost!SmdProcessReadWrite+0x14d
    ffffd000`21d06ef0 fffff800`00fb06ad rdyboost!SmdDispatchReadWrite+0x8b
    ffffd000`21d06f20 fffff800`0085cef5 volsnap!VolSnapReadFilter+0x5d
    ffffd000`21d06f50 fffff800`02b619f7 Ntfs!NtfsStorageDriverCallout+0x16
    ...
    
  23. To end your debugging session, enter the following command:

    qd

Summary of commands

  • Contents command on the Help menu
  • .sympath (Set symbol path)
  • .reload (Reload module)
  • x (Examine symbols)
  • g (Go)
  • dt (Display type)
  • Break command on the Debug menu
  • lm (List loaded modules)
  • k (Display stack backtrace)
  • bu (Set breakpoint)
  • bl (Breakpoint list)
  • bc (Breakpoint clear)
  • Step Into command on the Debug menu (F11)
  • !process
  • !thread
  • !devnode
  • !devstack
  • !drvobj
  • qd (Quit and detach)

Related topics

  • Getting started with WinDbg (user-mode)

  • Setting Up KDNET network kernel debugging automatically

  • Debugger operation

  • Debugging techniques

  • Debugging Tools for Windows (WinDbg, KD, CDB, NTSD)

  • Debugging using WinDbg Preview

title description ms.date

Get started with WinDbg (kernel-mode)

Learn how to set up and establish a WinDbg kernel-mode debugging session. The WinDbg kernel-mode debugger is included in Debugging Tools for Windows.

12/09/2022

Get started with WinDbg (kernel-mode)

WinDbg is a kernel-mode and user-mode debugger that’s included in Debugging Tools for Windows. This article provides exercises to help you get started using WinDbg as a kernel-mode debugger.

For information about how to get Debugging Tools for Windows, see Debugging Tools for Windows (WinDbg, KD, CDB, NTSD). After you install the debugging tools, locate the installation directories for 64-bit (x64) and 32-bit (x86) versions of the tools. For example:

  • C:Program Files (x86)Windows Kits10Debuggersx64
  • C:Program Files (x86)Windows Kits10Debuggersx86

Set up a kernel-mode debugging

A kernel-mode debugging environment typically has two computers, the host computer and the target computer. The debugger runs on the host computer, and the code being debugged runs on the target computer. The host and target are connected by a debug cable.

The Windows debuggers support the following types of cables:

  • Ethernet
  • USB 2.0 / USB 3.0
  • Serial (also called null modem)

For speed and reliability, you should use an Ethernet cable with a local network hub. The following diagram illustrates a host and target computer connected for debugging with an Ethernet cable.

A diagram of the host and target computers with an ethernet connection.

An option for older versions of Windows is to use a direct cable, such as a USB or serial cable.

A diagram of the host and target computers with a debug cable.

For details about how to set up the host and target computers, see Setting up kernel-mode debugging manually.

Virtual machine — VM

For information on connecting a debugger to a Hyper-V virtual machine, see Setting up network debugging of a virtual machine — KDNET.

Establish a kernel-mode debugging session

After you set up your host and target computer and connect them with a debug cable, you can establish a kernel-mode debugging session. Follow the instructions in the same topic that you used for getting set up. For example, if you decide to set up your host and target computers for debugging over Ethernet, you can find instructions for establishing a kernel-mode debugging session in the following article:

  • Setting up KDNET network kernel debugging automatically

Get started using WinDbg

  1. On the host computer, open WinDbg and establish a kernel-mode debugging session with the target computer.

  2. To open the debugger documentation CHM file, go to the Help menu and select Contents. The debugger documentation is also available online in Debugging Tools for Windows.

  3. When you establish a kernel-mode debugging session, WinDbg might break in to the target computer automatically. If WinDbg doesn’t break in, go to the Debug menu and select Break.

  4. In the command line at the bottom of the WinDbg window, enter the following command:

    .sympath srv*

    The output is similar to the following example:

    Symbol search path is: srv*
    Expanded Symbol search path is: cache*;SRV*https://msdl.microsoft.com/download/symbols
    

    The symbol search path tells WinDbg where to look for symbol (PDB) files. The debugger needs symbol files to obtain information about code modules, such as function names and variable names.

    Enter the following command, which tells WinDbg to do its initial finding and loading of symbol files:

    .reload

  5. To see a list of loaded modules, enter the following command:

    lm

    The output is similar to the following example:

    0:000>3: kd> lm
    start             end                 module name
    fffff800`00000000 fffff800`00088000   CI         (deferred)
    ...
    fffff800`01143000 fffff800`01151000   BasicRender   (deferred)
    fffff800`01151000 fffff800`01163000   BasicDisplay  (deferred)
    ...
    fffff800`02a0e000 fffff800`03191000   nt  (pdb symbols) C:...ntkrnlmp.pdb
    fffff800`03191000 fffff800`03200000   hal (deferred)
    ...
    
  6. To start target computer running, enter the following command:

    g

  7. To break in again, go to the Debug menu and select Break.

  8. Enter the following command to examine the _FILE_OBJECT data type in the nt module:

    dt nt!_FILE_OBJECT

    The output is similar to the following example:

    0:000>0: kd> dt nt!_FILE_OBJECT
       +0x000 Type             : Int2B
       +0x002 Size             : Int2B
       +0x008 DeviceObject     : Ptr64 _DEVICE_OBJECT
       +0x010 Vpb              : Ptr64 _VPB
       ...
       +0x0c0 IrpList          : _LIST_ENTRY
       +0x0d0 FileObjectExtension : Ptr64 Void
    
  9. Enter the following command to examine some of the symbols in the nt module:

    x nt!*CreateProcess*

    The output is similar to the following example:

    0:000>0: kd> x nt!*CreateProcess*
    fffff800`030821cc nt!ViCreateProcessCallbackInternal (<no parameter info>)
    ...
    fffff800`02e03904 nt!MmCreateProcessAddressSpace (<no parameter info>)
    fffff800`02cece00 nt!PspCreateProcessNotifyRoutine = <no type information>
    ...
    
  10. Enter the following command to put a breakpoint at MmCreateProcessAddressSpace:

    bu nt!MmCreateProcessAddressSpace

    To verify that the breakpoint is set, enter the following command:

    bl

    The output is similar to the following example:

    0:000>0: kd> bu nt!MmCreateProcessAddressSpace
    0: kd> bl
    0 e fffff800`02e03904     0001 (0001) nt!MmCreateProcessAddressSpace
    

    Enter g to let the target computer run.

  11. If the target computer doesn’t break in to the debugger immediately, perform a few actions on the target computer (for example, open Notepad). The target computer will break in to the debugger when MmCreateProcessAddressSpace is called. To see the stack trace, enter the following commands:

    .reload

    k

    The output is similar to the following example:

    0:000>2: kd> k
    Child-SP          RetAddr           Call Site
    ffffd000`224b4c88 fffff800`02d96834 nt!MmCreateProcessAddressSpace
    ffffd000`224b4c90 fffff800`02dfef17 nt!PspAllocateProcess+0x5d4
    ffffd000`224b5060 fffff800`02b698b3 nt!NtCreateUserProcess+0x55b
    ...
    000000d7`4167fbb0 00007ffd`14b064ad KERNEL32!BaseThreadInitThunk+0xd
    000000d7`4167fbe0 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
    
  12. On the View menu, select Disassembly.

    On the Debug menu, select Step Over (or press F10). Enter step commands a few more times as you watch the Disassembly window.

  13. Clear your breakpoint by entering the following command:

    bc *

    Enter g to let the target computer run. To break in again, go to the Debug menu and select Break, or press CTRL-Break.

  14. To see a list of all processes, enter the following command:

    !process 0 0

    The output is similar to the following example:

    0:000>0: kd> !process 0 0
    **** NT ACTIVE PROCESS DUMP ****
    PROCESS ffffe000002287c0
        SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
        DirBase: 001aa000  ObjectTable: ffffc00000003000  HandleCount: <Data Not Accessible>
        Image: System
    
    PROCESS ffffe00001e5a900
        SessionId: none  Cid: 0124    Peb: 7ff7809df000  ParentCid: 0004
        DirBase: 100595000  ObjectTable: ffffc000002c5680  HandleCount: <Data Not Accessible>
        Image: smss.exe
    ...
    PROCESS ffffe00000d52900
        SessionId: 1  Cid: 0910    Peb: 7ff669b8e000  ParentCid: 0a98
        DirBase: 3fdba000  ObjectTable: ffffc00007bfd540  HandleCount: <Data Not Accessible>
        Image: explorer.exe
    
  15. Copy the address of one process, and enter the following command:

    !process Address 2

    For example: !process ffffe00000d5290 2

    The output shows the threads in the process.

    0:000>0:000>0: kd> !process ffffe00000d52900 2
    PROCESS ffffe00000d52900
        SessionId: 1  Cid: 0910    Peb: 7ff669b8e000  ParentCid: 0a98
        DirBase: 3fdba000  ObjectTable: ffffc00007bfd540  HandleCount:
        Image: explorer.exe
    
            THREAD ffffe00000a0d880  Cid 0910.090c  Teb: 00007ff669b8c000
                ffffe00000d57700  SynchronizationEvent
    
            THREAD ffffe00000e48880  Cid 0910.0ad8  Teb: 00007ff669b8a000
                ffffe00000d8e230  NotificationEvent
                ffffe00000cf6870  Semaphore Limit 0xffff
                ffffe000039c48c0  SynchronizationEvent
            ...
            THREAD ffffe00000e6d080  Cid 0910.0cc0  Teb: 00007ff669a10000
                ffffe0000089a300  QueueObject
    
  16. Copy the address of one thread, and enter the following command:

    !thread Address

    For example: !thread ffffe00000e6d080

    The output shows information about the individual thread.

    0: kd> !thread ffffe00000e6d080
    THREAD ffffe00000e6d080  Cid 0910.0cc0  Teb: 00007ff669a10000 Win32Thread: 0000000000000000 WAIT: ...
        ffffe0000089a300  QueueObject
    Not impersonating
    DeviceMap                 ffffc000034e7840
    Owning Process            ffffe00000d52900       Image:         explorer.exe
    Attached Process          N/A            Image:         N/A
    Wait Start TickCount      13777          Ticks: 2 (0:00:00:00.031)
    Context Switch Count      2              IdealProcessor: 1
    UserTime                  00:00:00.000
    KernelTime                00:00:00.000
    Win32 Start Address ntdll!TppWorkerThread (0x00007ffd14ab2850)
    Stack Init ffffd00021bf1dd0 Current ffffd00021bf1580
    Base ffffd00021bf2000 Limit ffffd00021bec000 Call 0
    Priority 13 BasePriority 13 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
    ...
    
  17. To see all the device nodes in the Plug and Play device tree, enter the following command:

    !devnode 0 1

    0:000>0: kd> !devnode 0 1
    Dumping IopRootDeviceNode (= 0xffffe000002dbd30)
    DevNode 0xffffe000002dbd30 for PDO 0xffffe000002dc9e0
      InstancePath is "HTREEROOT"
      State = DeviceNodeStarted (0x308)
      Previous State = DeviceNodeEnumerateCompletion (0x30d)
      DevNode 0xffffe000002d9d30 for PDO 0xffffe000002daa40
        InstancePath is "ROOTvolmgr000"
        ServiceName is "volmgr"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeEnumerateCompletion (0x30d)
        DevNode 0xffffe00001d49290 for PDO 0xffffe000002a9a90
          InstancePath is "STORAGEVolume{3007dfd3-df8d-11e3-824c-806e6f6e6963}#0000000000100000"
          ServiceName is "volsnap"
          TargetDeviceNotify List - f 0xffffc0000031b520  b 0xffffc0000008d0f0
          State = DeviceNodeStarted (0x308)
          Previous State = DeviceNodeStartPostWork (0x307)
    ...
    
  18. To see the device nodes and their hardware resources, enter the following command:

    !devnode 0 9

    0:000>...
            DevNode 0xffffe000010fa770 for PDO 0xffffe000010c2060
              InstancePath is "PCIVEN_8086&DEV_2937&SUBSYS_2819103C&REV_023&33fd14ca&0&D0"
              ServiceName is "usbuhci"
              State = DeviceNodeStarted (0x308)
              Previous State = DeviceNodeEnumerateCompletion (0x30d)
              TranslatedResourceList at 0xffffc00003c78b00  Version 1.1  Interface 0x5  Bus #0
                Entry 0 - Port (0x1) Device Exclusive (0x1)
                  Flags (0x131) - PORT_MEMORY PORT_IO 16_BIT_DECODE POSITIVE_DECODE
                  Range starts at 0x3120 for 0x20 bytes
                Entry 1 - DevicePrivate (0x81) Device Exclusive (0x1)
                  Flags (0000) -
                  Data - {0x00000001, 0x00000004, 0000000000}
                Entry 2 - Interrupt (0x2) Shared (0x3)
                  Flags (0000) - LEVEL_SENSITIVE
                  Level 0x8, Vector 0x81, Group 0, Affinity 0xf
    ...
    
  19. To see a device node that has a service name of disk, enter the following command:

    !devnode 0 1 disk

    0: kd> !devnode 0 1 disk
    Dumping IopRootDeviceNode (= 0xffffe000002dbd30)
    DevNode 0xffffe0000114fd30 for PDO 0xffffe00001159610
      InstancePath is "IDEDiskST3250820AS_____________________________3.CHL___5&14544e82&0&0.0.0"
      ServiceName is "disk"
      State = DeviceNodeStarted (0x308)
      Previous State = DeviceNodeEnumerateCompletion (0x30d)
    ...
    
  20. The output of !devnode 0 1 shows the address of the physical device object (PDO) for the node. Copy the address of a physical device object (PDO), and enter the following command:

    !devstack PdoAddress

    For example: <PdoAddress>!devstack 0xffffe00001159610

    0:000>0: kd> !devstack 0xffffe00001159610
      !DevObj           !DrvObj            !DevExt           ObjectName
      ffffe00001d50040  Driverpartmgr    ffffe00001d50190  
      ffffe00001d51450  Driverdisk       ffffe00001d515a0  DR0
      ffffe00001156e50  DriverACPI       ffffe000010d8bf0  
    
  21. To get information about the driver disk.sys, enter the following command:

    !drvobj disk 2

    0:000>0: kd> !drvobj disk 2
    Driver object (ffffe00001d52680) is for:
     Driverdisk
    DriverEntry:   fffff800006b1270 disk!GsDriverEntry
    DriverStartIo: 00000000
    DriverUnload:  fffff800010b0b5c CLASSPNP!ClassUnload
    AddDevice:     fffff800010aa110 CLASSPNP!ClassAddDevice
    
    Dispatch routines:
    [00] IRP_MJ_CREATE                      fffff8000106d160    CLASSPNP!ClassGlobalDispatch
    [01] IRP_MJ_CREATE_NAMED_PIPE           fffff80002b0ab24    nt!IopInvalidDeviceRequest
    [02] IRP_MJ_CLOSE                       fffff8000106d160    CLASSPNP!ClassGlobalDispatch
    [03] IRP_MJ_READ                        fffff8000106d160    CLASSPNP!ClassGlobalDispatch
    ...
    [1b] IRP_MJ_PNP                         fffff8000106d160    CLASSPNP!ClassGlobalDispatch
    
  22. The output of !drvobj shows addresses of dispatch routines. For example, CLASSPNP!ClassGlobalDispatch. To set and verify a breakpoint at ClassGlobalDispatch, enter the following commands:

    bu CLASSPNP!ClassGlobalDispatch

    bl

    Enter g to let the target computer run.

    If the target computer doesn’t break in to the debugger immediately, perform a few actions on the target computer (for example, open Notepad and save a file). The target computer will break in to the debugger when ClassGlobalDispatch is called. To see the stack trace, enter the following commands:

    .reload

    k

    The output is similar to the following example:

    2: kd> k
    Child-SP          RetAddr           Call Site
    ffffd000`21d06cf8 fffff800`0056c14e CLASSPNP!ClassGlobalDispatch
    ffffd000`21d06d00 fffff800`00f2c31d volmgr!VmReadWrite+0x13e
    ffffd000`21d06d40 fffff800`0064515d fvevol!FveFilterRundownReadWrite+0x28d
    ffffd000`21d06e20 fffff800`0064578b rdyboost!SmdProcessReadWrite+0x14d
    ffffd000`21d06ef0 fffff800`00fb06ad rdyboost!SmdDispatchReadWrite+0x8b
    ffffd000`21d06f20 fffff800`0085cef5 volsnap!VolSnapReadFilter+0x5d
    ffffd000`21d06f50 fffff800`02b619f7 Ntfs!NtfsStorageDriverCallout+0x16
    ...
    
  23. To end your debugging session, enter the following command:

    qd

Summary of commands

  • Contents command on the Help menu
  • .sympath (Set symbol path)
  • .reload (Reload module)
  • x (Examine symbols)
  • g (Go)
  • dt (Display type)
  • Break command on the Debug menu
  • lm (List loaded modules)
  • k (Display stack backtrace)
  • bu (Set breakpoint)
  • bl (Breakpoint list)
  • bc (Breakpoint clear)
  • Step Into command on the Debug menu (F11)
  • !process
  • !thread
  • !devnode
  • !devstack
  • !drvobj
  • qd (Quit and detach)

Related topics

  • Getting started with WinDbg (user-mode)

  • Setting Up KDNET network kernel debugging automatically

  • Debugger operation

  • Debugging techniques

  • Debugging Tools for Windows (WinDbg, KD, CDB, NTSD)

  • Debugging using WinDbg Preview

Термин «отладка ядра» означает изучение внутренней структуры данных ядра и (или) пошаговую трассировку функций в ядре. Эта отладка является весьма полезным способом исследования внутреннего устройства Windows, поскольку она позволяет получить отображения внутренней системной информации, недоступной при использовании каких-либо других средств, и дает четкое представление о ходе выполнения кода в ядре. Прежде чем рассматривать различные способы отладки ядра, давайте исследуем набор файлов, который понадобится для осуществления любого вида такой отладки.

Символы для отладки ядра

Файлы символов содержат имена функций и переменных, а также схему и формат структур данных. Они генерируются программой-компоновщиком (linker) и используются отладчиками для ссылок на эти имена и для их отображения во время сеанса отладки. Эта информация обычно не хранится в двоичном коде, поскольку при выполнении кода она не нужна. Это означает, что без нее двоичный код становится меньше по размеру и выполняется быстрее. Но это также означает, что при отладке нужно обеспечить отладчику доступ к файлам символов, связанных с двоичными образами, на которые идут ссылки во время сеанса отладки.

Отладка ядра Windows

Для использования любого средства отладки в режиме ядра с целью исследования внутреннего устройства структуры данных ядра Windows (списка процессов, блоков потоков, списка загруженных драйверов, информации об использовании памяти и т. д.) вам нужны правильные файлы символов и, как минимум, файл символов для двоичного образа ядра — Ntoskrnl.exe. Файлы таблицы символов должны соответствовать версии того двоичного образа, из которого они были извлечены. Например, если установлен пакет Windows Service Pack или какое-нибудь исправление, обновляющее ядро, нужно получить соответствующим образом обновленные файлы символов. Загрузить и установить символы для различных версий Windows нетрудно, а вот обновить символы для исправлений удается не всегда. Проще всего получить нужную версию символов для отладки путем обращения к специально предназначенному для этого серверу символов Microsoft, воспользовавшись для этого специальным синтаксисом для пути к символам, указываемом в отладчике. Например, следующий путь к символам заставляет средства отладки загрузить символы с интернет-сервера символов и сохранить локальную копию в папке c:symbols:srv*c:symbols*http://msdl.microsoft.com/download/symbols Подробные инструкции по использованию символьного сервера можно найти в файле справки средств отладки или в Интернете на странице http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Доброго времени суток. Пришло время потихоньку продолжать, некогда начатый цикл Базиса, а именно, необходимых знаний. Первая часть, напомню, обитает тут.

base

Я думаю, многие пользователи сталкивались с возможностью (а зачастую даже необходимостью) выбора различных вариантов загрузки Вашей операционной системы. Как раз о них мы и поговорим в данной статье.

Да и, даже если и не сталкивались, то этот материал будет для Вас особенно полезен, ибо здесь Вы почерпнете информацию, которая поможет Вам диагностировать и устранять ряд проблем с Вашим компьютером. Поехали.

  • Базис знаний и общее описание возможностей

  • Послесловие

Базис знаний и общее описание возможностей

Итак, как уже говорилось выше, помимо обычной загрузки системы, есть ряд режимов, которыми можно воспользоваться в целях решения возникающих проблем с работой системы. Список этих режимов и их описание Вы увидите ниже по тексту, а сейчас мы перейдем к тому как ими воспользоваться.

Чтобы мы могли выбрать один из вариантов загрузки Операционной Системы, нам надо при запуске компьютера, перед загрузкой Windows, нажать на кнопку F8 (можно несколько раз, если боитесь пропустить). В какой именно момент? Как раз перед тем самым загрузочным экраном где ползет полосочка Windows и, собственно, нарисованнаписан логотип.

Если мы вовремя успели до появления этого экрана надавить в вышеописанную кнопочку, то нам предложат несколько вариантов загрузки:

  • Безопасный режим.
  • Безопасный режим с загрузкой сетевых драйверов.
  • Безопасный режим с поддержкой командной строки.
  • Включить режим VGA.
  • Загрузка последней удачной конфигурации.
  • Восстановление службы каталогов.
  • Режим отладки.
  • Включить протоколирование загрузки.
  • Обычная загрузка Windows.
  • Перезагрузка.
  • Возврат к выбору операционной системы.

Остановимся на них подробнее:

  • «Безопасный режим» — в этом режиме для запуска Windows используется минимальный набор драйверов устройств и служб. Здесь не учитываются драйверы аудио, видеокарты и интернета, а в автозагрузке присутствуют лишь служебные необходимые для запуска программы, а посему имейте в виду, что ваш антивирус, фаервол и другие установленные Вами программы не будут запущены при старте ОС, если они запускались раньше из автозагрузки.
  • Безопасный режим  — это основной диагностический режим для восстановления системы и в нём можно починить автозапуск, если какая-либо программа оттуда не давала пользователю нормально запустить ОС (допустим, что Вы по ошибке поставили два антивируса или утилитудрайвер, которая(ый) вызывает при загрузке bsod), удалить конфликтные драйвера или восстановить систему с помощью встроенных средств восстановления. Здесь же можно провериться на вирусы по средством антивирусных утилит типа CureIt, AVZ (имейте в виду, что программы обновиться не смогут) и пр. В общем, в случае любых проблем со стартом ОС, как правило, первое, что проверяется, — это работоспособность безопасного режима и уже отсюда ведутся все работы по отладке.
  • «Безопасный режим с загрузкой сетевых драйверов» — отличается от предыдущего тем, что позволяет выйти в интернет. Не используйте режим, если у вас не установлен или поврежден драйвер сетевой карты, а также если поврежден драйвер vga.sys.
  • «Безопасный режим с поддержкой командной строки» — аналогично безопасному режиму, только вместо проводника Windows запускается консоль (cmd.exe). Если Вы не знаете что это такое и как этим пользоваться, то рекомендую не использовать данный режим так как он предназначен для опытных пользователей имеющих представление о командах консоли.
  • «Включить режим VGA»  — в этом случае Windows запускается с помощью текущего видео драйвера (а не универсально-стандартного vga.sys) в разрешении 640 x 480. Этот режим используется, когда выбрана конфигурация, которая не поддерживается монитором. Не используйте режим, если у вас повреждена видеокарта или ее драйвер.
  • «Загрузка последней удачной конфигурации» — загружается последняя удачная конфигурация, которая автоматически запоминается  Windows при каждом удачном старте системы. Этот режим актуален и порой сильно спасает, если ваша система с недавнего времени отказывается запускаться и безопасный режим не помогает. При старте этого режима подгружаются резервные копии рабочих драйверов и некоторых системных файлов, что особенно удобно в случае, если причиной сбоя является изменение драйверов или повреждение файлов системы. Данный режим не работает, если у вас отключено «Восстановление Системы» (можно проверить, зайдя в «Мой компьютер»→ «Свойства», вкладка «Восстановление системы»).
  • «Восстановление службы каталогов» — с его помощью производится восстановление службы каталогов (Active Dirrectory). Если Вы не знаете что это, то можете смело пропускать эту опцию так как она предназначена для опытного сегмента пользователей.
  • «Режим отладки» — в Windows включается режим отладки. Отладочная информация может быть послана по последовательному кабелю на другой компьютер с запущенным отладчиком. Если Вы не знаете как получить/передать отладочную информации и что вообще с ней делать, то пропускайте эту опцию так как она предназначена для опытного сегмента пользователей.
  • «Включить протоколирование загрузки» —  данная опция включает протоколирование, т.е.при выборе одного из вариантов безопасной загрузки (кроме «Загрузка последней удачной конфигурации») включается создание протоколов загрузки. Для хранения результатов протоколирования используется файл Ntbtlog.txt из папки %SystemRoot%. В файле содержится информация о том, какие драйверы были загружены, а какие нет. Таким образом можно выявить какой драйвер дает сбой.
  • «Обычная загрузка Windows» — это обычная загрузка Windows :-)
  • «Перезагрузка» — выполняется перезагрузка компьютера. Ребут — он и в Африке ребут :-)
  • «Возврат к выбору операционной системы» — возвращает назад к выбору ОС.

На этом, пожалуй, всё.

к содержанию ↑

Послесловие

Итак, теперь мы знакомы с различными вариантами загрузки ОС.

Наиболее полезные опции для рядового пользователя: Безопасный режим, Безопасный режим с загрузкой сетевых драйверов, Загрузка последней удачной конфигурации и, само собой, Обычная загрузка Windows.

Если есть какие-то вопросы, то спрашивайте, — я всегда буду рад ответить на них в комментариях или с помощью формы обратной связи.

PS: Статья написана благодаря человеку под ником “barn4k“, который является другом и активным помощником проекта. За что ему большое «Спасибо!» ;-)


Чтобы исправить различные проблемы с ПК, мы рекомендуем Restoro PC Repair Tool: это программное обеспечение исправит распространенные компьютерные ошибки, защитит вас от потери файлов, вредоносных программ, сбоев оборудования и оптимизирует ваш компьютер для максимальной производительности. Решите проблемы с ПК и удалите вирусы прямо сейчас, выполнив 3 простых шага:

  1. Загрузите Restoro PC Repair Tool, который поставляется с запатентованными технологиями (патент доступен здесь ).
  2. Нажмите Начать сканирование, чтобы найти проблемы Windows, которые могут вызывать проблемы с ПК.
  3. Нажмите «Восстановить все», чтобы исправить проблемы, влияющие на безопасность и производительность вашего компьютера.
  • В этом месяце Restoro скачали 657 095 читателей.

Ядро можно считать одним из строительных блоков Windows, в качестве операционной системы. Это главным образом потому, что он контролирует все процессы, запущенные в системе.

При этом любые проблемы и проблемы с ядрами могут привести к нарушению функциональности вашего ПК, в том числе к ошибкам Blue Screen of Death.

К сожалению, даже Windows 10, последняя версия ОС Windows не застрахована от таких проблем. Хорошая новость заключается в том, что код ядра можно отлаживать, если вы знаете, как это сделать.

К счастью, отладка ядра возможна и упрощена благодаря наличию отладчиков ядра.

Как я могу начать отладку ядра?

Ответ на этот вопрос довольно сложен, но достаточно сказать, что вам нужно выполнить ряд заранее определенных шагов, прежде чем вы сможете начать:

1 Определите, какой компьютер является хостом, а какой – целевой.

Самое главное, что вам нужно знать, это то, что вы не можете начать отладку без отладчика ядра. Отладчик ядра будет работать в хост-системе, а код, требующий отладки, будет выполняться в целевой системе.

Две системы могут быть одной и той же, но заранее должны быть выполнены определенные условия.

2 Определите, будете ли вы выполнять отладку в режиме ядра или в пользовательском режиме.

Выбрать тип отладки несложно. Все, что вам нужно сделать, это определить, какой тип отладки будет более эффективным.

  • Код режима ядра имеет разрешение на доступ к любой части системы и может получить доступ к любой части любого другого процесса, работающего либо в пользовательском режиме, либо в режиме ядра.
  • Пользовательский режим имеет больше ограничений, но он имеет то преимущество, что он не может вмешиваться в фактические системные ресурсы, если что-то пойдет не так.

3 Выберите среду отладки

Среда отладки – это в основном программа, которую вы будете использовать для отладки. WinDbg работает хорошо в большинстве ситуаций, но бывают случаи, когда другие могут работать лучше, например консольные отладчики для автоматизации или Visual Studio.

4 Выясните, как вы соедините цель и хост

Обычно и целевая, и хост-системы соединены сетью Ethernet. Если вы занимаетесь ранним воспитанием или у вас нет подключения к Ethernet на устройстве, можно использовать другие варианты подключения к сети.

5 Выберите между 32-битными или 64-битными инструментами отладки

Это, вероятно, самый простой шаг из всех, поскольку это зависит от того, какая версия Windows запущена на хосте и целевом компьютере, а также от того, является ли код, требующий отладки, 32-битным или 64-битным кодом.

6 Настройте свои символы

Запустите сканирование системы, чтобы обнаружить потенциальные ошибки

Нажмите «Начать сканирование», чтобы найти проблемы с Windows.

Нажмите «Восстановить все», чтобы исправить проблемы с запатентованными технологиями.

Запустите сканирование ПК с помощью Restoro Repair Tool, чтобы найти ошибки, вызывающие проблемы с безопасностью и замедление. После завершения сканирования в процессе восстановления поврежденные файлы заменяются новыми файлами и компонентами Windows.

Если вы используете такую ​​среду, как WinDbg, вам необходимо настроить правильные символы, если вы хотите использовать все ее расширенные функции. Если вы не настроите их, вы не сможете использовать какие-либо функции отладчика, которые зависят от этих символов.

7 Настройте исходный код

Необходимо определить путь к исходному коду, даже если это будет ваш собственный исходный код. Таким образом, настройка пути к нему во всех случаях является обязательной.

8 Ознакомьтесь с отладкой

Операции и методы отладчика не так уж и сложны, как только вы к ним привыкнете. Это благодаря обширной документации, прилагаемой к каждой операции, которая описывается пошагово.

9 Используйте справочные команды отладчика

Вы не можете знать все это, и вы не можете ничего помнить навсегда, но вы можете искать справочные команды отладчика, которые могут помочь.

Хорошим примером является команда .hh, которая отображает справочную документацию по каждой доступной команде.

10 Используйте расширения отладки

Код может быть чрезвычайно сложным, и он может быть разветвлен по-разному. Из-за этого вашей среды может быть недостаточно для выполнения отладки.

Таким образом, использование отладочных расширений, обеспечивающих синтаксический анализ структур данных, связанных с доменом, может быть очень полезным.

Заключительные мысли

Вышеупомянутые шаги – это все основные процедуры, которые необходимо выполнить при попытке отладки ядра.

Конечно, есть много конкретных ситуаций, в которых эти шаги могут отличаться, но суть в том, что все они включают более или менее эти 10 основных шагов.

Наша статья помогла вам лучше понять, как начать отладку ядра? Сообщите нам свое мнение в разделе комментариев ниже.

СООТВЕТСТВУЮЩИЕ СТАТЬИ, ВЫ ДОЛЖНЫ ПРОВЕРИТЬ:

  • Как мы навсегда исправили ошибку Kernel Security Check Failure
  • KB4530684 улучшает ядро ​​и виртуализацию Windows.
  • BSOD с повреждением кучи режима ядра в Windows 10 [БЫСТРОЕ ИСПРАВЛЕНИЕ]

Источник записи: windowsreport.com

Like this post? Please share to your friends:
  • Резервное копирование windows 10 на synology
  • Режим отладки при загрузке windows 10
  • Режим разработчика включен однако в центре обновления windows не удалось
  • Режим ожидания монитора в windows 10
  • Режим ожидания в windows 10 сочетание клавиш