Код (Text): #include "ntddk.h" #include <stdio.h> #define MAKELONG(a, b)((LONG) (((WORD) (a)) | ((DWORD) ((WORD) (b))) << 16)) typedef unsigned char byte,BYTE; typedef unsigned short int word,WORD; typedef unsigned int dword,DWORD; typedef DWORD *PDWORD,*LPDWORD; typedef WORD *PWORD,*LPWORD; VOID OnUnload( IN PDRIVER_OBJECT DriverObject ) { DbgPrint("\nDriver unloaded\n"); } typedef struct { WORD IDTLimit; WORD LowIDTbase; WORD HiIDTbase; } IDTINFO; typedef struct { unsigned short LowOffset; unsigned short selector; unsigned char unused_lo; unsigned char segment_type:4; unsigned char system_segment_flag:1; unsigned char DPL:2; unsigned char P:1; unsigned short HiOffset; } IDTENTRY; NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath) { unsigned int ADDR; char out_[255]; IDTINFO idt_info; IDTENTRY* idt_entries; IDTENTRY* i; __asm SIDT idt_info; idt_entries = (IDTENTRY*) MAKELONG(idt_info.LowIDTbase, idt_info.HiIDTbase); i = &idt_entries[0xFF]; idt_entries[0xFF].LowOffset = 0xFFFF; idt_entries[0xFF].HiOffset = 0xFFFF; ADDR = MAKELONG(i->LowOffset, i->HiOffset); _snprintf(out_, sizeof(out_), "%X\n", ADDR); DbgPrint(out_); theDriverObject->DriverUnload = OnUnload; return 0; } Почему после этого кода livekd показывает что адрес 255 прерывания остался прежним, а не стал 0xFFFFFFFF ?
WinDbg показывает с первого процессора или как задать с какого процессора показывать содержимое IDT? Как исполнить sidt на другом процессоре, есть инструкция для этого? Или только через сис. сервисы? Еще вопрос не в тему, кем экспортируется MmCheckSystemImage() ?
sysexit В WinDBG команда ~ позволяет переключать текущие процессоры. ~0 - переключение на нулевой, ~1 - на первый и тп.) 0: kd> означает нулевой 1: kd> означает первый и так далее.
Еще вопрос не в тему, кем экспортируется MmCheckSystemImage() ? Еще прочел что в текущих 64 битных редакциях Windows используется виртуальная адресация только 48 битами, т.е. я ограничиваюсь виртуальным пространством от 0x0000000000000000 - 0x0000FFFFFFFFFFFF ? livekd показал что в IDT были внесены изменения только после перезапуска livekd. А как объясняется это? Заменил ISR прерывания 0xFF на пустой. Бсода при вызове из юзермода не вышло. Заменил 0x2A, бсод вышел.
x64 Можно есчо использовать извраты с аффинитетом. sysexit #4. Она не экспортируется, а используется системным загрузчиком(MmLoadSystemImage()). Если вопрос чисто софтверный(в частности кривой виндбг), то я удалю отсюда этот топик.