#include <ntddk.h>
// Этот псевдодрайвер предназначен для исследования ядра Windows XP.
//
// Задача:
//
// 1. Извлечь содержимое регистра процессора CR3 (адрес каталога страниц).
//
// 2. Выполнить п.1 для регистров GDTR и IDTR.
//
// 3. Показать результат в окне программы Debug View с помощью функции native API DbgPrint(PCH fmt, ...).
///////////////////////////////////////////////////////////////////////////////////
typedef struct P48 {
unsigned short limit;
unsigned base;
} P48;
void OnUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
unsigned CR3_Value;
P48 GDTR;
P48 IDTR;
DriverObject->DriverUnload = OnUnload;
__asm{
; получаем CR3
mov eax, cr3
mov dword ptr CR3_Value, eax
; Получаем GDTR
sgdt GDTR
; получаем IDTR
sidt IDTR
}
// показываем
DbgPrint("CR3 = %08X\n", CR3_Value);
DbgPrint("GDT base = %08X\n", GDTR.base);
DbgPrint("IDT base = %08X\n", IDTR.base);
return STATUS_SUCCESS;
}
void OnUnload(IN PDRIVER_OBJECT DriverObject)
{
DbgPrint("Driver unloaded success...");
}
А я раньше думал, что всё понимаю...
Вот накарябал простой драйверок, чтобы уяснить некоторые подробности устройства ядра Windows XP.
Код:
И что же я вижу?
Таблицы GDT и IDT находятся выше 0xF0000000. А я всегда думал, что регистры-указатели системных объектов, вроде Global descriptor table должны содержать физические адреса.
Ведь адрес 0xF0000000 явно виртуальный. У моего компьютера ведь памяти всего 768Мб.
Откройте томик №3 Интеловского мануала и прочитайте раздел "Global and Local Descriptor Tables" например.
Регистры IDTR и GDTR содержат виртуальные адреса. В третьем томике где-то в начале есть рисунок, на котором нарисована общая модель памяти процессора.
Есть ещё вопросы. Если курение мануала не поможет - приду к вам.
Цитата: assign
Ладно, щас скачаю мануал, буду курить.
А где можно скачать данный мануал ? - киньте ссылочку пожалуйста ...
Цитата: spyrytus
А где можно скачать данный мануал ? - киньте ссылочку пожалуйста ...
Большое спасибо ...