Skip to content

Низкоуровневые структуры ядра (Windows 10 22H2 x64) ​

Данные извлечены из базы PDB-символов Microsoft (10.0.19045.2965-x64.yml).


1. _KPCR (Kernel Processor Control Region) ​

Структура управления процессором ядра (x64). Адресуется через сегментный регистр GS (gs:[0x0]):

c
struct _KPCR // sizeof = 0x180 (384 bytes)
{
    union {
        struct _NT_TIB NtTib;                      // 0x000
        struct {
            struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
            PVOID Used_StackBase;
            PVOID PerfGlobalGroupMask;
            PVOID TssCopy;
            PVOID Context;
            PVOID SetMemberCopy;
            PVOID Used_Self;
        };
    };
    struct _KPRCB *CurrentPrcb;                    // 0x038 (Указатель на KPRCB)
    struct _KSPIN_LOCK_QUEUE LockArray[33];        // 0x040
    PVOID Used_Self;                               // 0x108
    struct _KIDTENTRY64 *IdtBase;                  // 0x038 (Базовый адрес IDT)
    struct _KGDTENTRY64 *GdtBase;                  // 0x040 (Базовый адрес GDT)
    struct _KTSS64 *TssBase;                       // 0x048 (Базовый адрес TSS)
    USHORT MajorVersion;                           // 0x050
    USHORT MinorVersion;                           // 0x052
    ULONG StallScaleFactor;                        // 0x054
    UCHAR Spare02;                                 // 0x058
    UCHAR SecondLevelCacheAssociativity;           // 0x059
    UCHAR VmxEnabled;                              // 0x05A
    UCHAR Number;                                  // 0x05B (Номер логического ядра)
    struct _KPRCB Prcb;                            // 0x180 (Блок KPRCB)
};

2. _KPRCB (Kernel Processor Control Block) ​

Блок управления процессором, содержащий состояние планировщика и очередей DPC (gs:[0x180]):

c
struct _KPRCB // sizeof = 0xB640
{
    ULONG MxCsr;                                   // 0x000
    UCHAR Number;                                  // 0x004 (Номер процессора)
    UCHAR NestingLevel;                            // 0x005
    UCHAR PrcbPad00[2];                            // 0x006
    struct _KTHREAD *CurrentThread;                // 0x008 (Текущий исполняемый поток)
    struct _KTHREAD *NextThread;                   // 0x010 (Следующий поток в очереди)
    struct _KTHREAD *IdleThread;                   // 0x018 (Поток простоя ядра)
    UCHAR Group;                                   // 0x020 (Группа процессоров)
    UCHAR ProcessorGroup;                          // 0x021
    struct _KNODE *ParentNode;                     // 0x040 (NUMA-узел)
    ULONG64 GroupSetMember;                        // 0x048
    UCHAR SmtIndex;                                // 0x050 (Индекс Hyper-Threading)
    struct _KSPIN_LOCK_QUEUE LockQueue[33];        // 0x080
    struct _KDPC_DATA DpcData[2];                  // 0x24C0 (Очереди DPC: Normal / Threaded)
    PVOID DpcStack;                                // 0x2500 (Выделенный стек под DPC)
    struct _LIST_ENTRY ReadyListHead[32];          // 0x2B40 (32 очереди приоритетов потоков)
    ULONG ReadySummary;                            // 0x2D40 (Битовая маска очередей с готовыми потоками)
    ULONG PrcbFlags;                               // 0x2D44
};

3. _LOADER_PARAMETER_BLOCK ​

Структура передачи параметров от загрузчика winload.efi ядру ntoskrnl.exe:

c
struct _LOADER_PARAMETER_BLOCK // sizeof = 0x110
{
    struct _LIST_ENTRY LoadOrderListHead;          // 0x000 (Список загруженных PE-модулей)
    struct _LIST_ENTRY MemoryDescriptorListHead;   // 0x010 (Карта физической памяти)
    struct _LIST_ENTRY BootDriverListHead;         // 0x020 (Список загруженных BOOT_START драйверов)
    ULONG_PTR KernelStack;                         // 0x030 (Базовый адрес стека ядра)
    ULONG_PTR Prcb;                                // 0x038 (Адрес KPRCB процессора 0)
    ULONG_PTR Process;                             // 0x040 (Адрес EPROCESS процесса System)
    ULONG_PTR Thread;                              // 0x048 (Адрес ETHREAD потока Phase1)
    ULONG RegistryLength;                          // 0x050
    PVOID RegistryBase;                            // 0x058 (Адрес куста SYSTEM в памяти)
    struct _CONFIGURATION_COMPONENT_DATA *ConfigurationRoot; // 0x060
    PCHAR ArcBootDeviceName;                       // 0x068
    PCHAR ArcHalDeviceName;                        // 0x070
    PCHAR NtBootPathName;                          // 0x078
    PCHAR NtHalPathName;                           // 0x080
    PCHAR LoadOptions;                             // 0x088 (Командная строка загрузки BCD)
    struct _NLS_DATA_BLOCK *NlsData;               // 0x090 (Указатели на таблицы NLS)
    struct _ARC_DISK_INFORMATION *ArcDiskInformation; // 0x098
    PVOID Extension;                               // 0x0A0 (_LOADER_PARAMETER_EXTENSION)
};

4. _EPROCESS (Executive Process Block) ​

Главная управляющая структура процесса в ядре Windows:

c
struct _EPROCESS // sizeof = 0xAD0
{
    struct _KPROCESS Pcb;                          // 0x000 (Низкоуровневая структура ядра KPROCESS)
    struct _EX_PUSH_LOCK ProcessLock;              // 0x438
    struct _LARGE_INTEGER CreateTime;              // 0x440 (Время создания процесса)
    struct _EX_RUNDOWN_REF RundownProtect;         // 0x448
    PVOID UniqueProcessId;                         // 0x450 (PID процесса)
    struct _LIST_ENTRY ActiveProcessLinks;         // 0x458 (Глобальный двусвязный список процессов)
    ULONG Flags2;                                  // 0x474
    struct _RTL_AVL_TREE VadRoot;                  // 0x7D8 (Корень AVL-дерева VAD - виртуальной памяти)
    struct _EX_FAST_REF Token;                     // 0x4B8 (Токен безопасности / Access Token)
    struct _HANDLE_TABLE *ObjectTable;             // 0x570 (Таблица дескрипторов Handles)
    struct _PEB *Peb;                              // 0x550 (Указатель на PEB в пользовательском пространстве)
    CHAR ImageFileName[15];                        // 0x5A8 (Имя исполняемого файла процесса)
    struct _SE_AUDIT_PROCESS_CREATION_INFO ImageFileNameInfo; // 0x5C0
};

Interactive documentation of Windows NT (Build 10.0.19045.2965 x64) • Source Code