Я пишу: Код (Text): struct IDT_REGISTER { unsigned short size; unsigned int* address; }; /* ... */ IDT_REGISTER IDT_ADDR; IDT_ADDR.address=0; IDT_ADDR.size=0; long ptr; __asm { sidt fword ptr IDT_ADDR } DbgPrint("IDT_ADDR:%x, size:%i",IDT_ADDR.address,(long)IDT_ADDR.size); int i9; __try { i9=IDT_ADDR.address[9]; DbgPrint("I9:%i",i9); } __except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("Exception!"); }; Вот, что выводить DbgView: IDT_ADDR:8003, size:2047 Exception! Я конечно понимаю, что вопрос ужасно глупый, но почему?? Ведь по идеи, загружаем IDT в переменную, далее просто высовываем 9 элемент массива... А оно не пашет
ANDLL IDT_REGISTER IDT_ADDR; Как это будет выглядеть? кодом: IDT_ADDR.address ты обращаешься к маленкой переменной! Так как В стеке создается только sizeof(IDT_REGISTER) байт! Я бы сказал IDT_REGISTER IDT_ADDR[n_прерываний]; зы: может глуплю?
Если б я знал Ну это кажеться как-то не логично. Как я понимаю, sidt загружает содержимое шестибайтового регистра IDT в переменную в памяти. Соответственно переменная то же должна иметь размер шесть байт. А в твоем случае получается больше... Хотя бы эти соображения правильные?
Элементами IDT являтся 8-байтовые дескрипторы, а не указатели как в реальном режиме. Соответственно unsigned int* address надо заменить на struct ID * address
Посмотри, может тебе это поможет? ; Загрузка в idt ; Получить текущий idt_base sidt fword ptr idt_descr mov ebx,dword ptr idt_descr.lin_addr ; Получить начало описателя #1 - debug add ebx,8 ; Установить ловушку #1, сохранив старую mov eax,dword ptr trap xchg [ebx],eax mov dword ptr old_trap_01,eax mov eax,dword ptr trap+4 xchg [ebx+4],eax mov dword ptr old_trap_01+4,eax Взято из Интернет.
crypto, спасибо, но я этот код видел... И делает он аналогичную операцию.... 2green:Проблема не в этом. Какая разница, восемь или четыре байта занимает каждый элемент в таблице, если в данном случае получается, что IDT_ADDR.address это _неправильный_ указатель. Или не так?(кстати, на слово ID компилятор ругается)
ANDLL адрес неверен вероятно из-за того что у тебя лимит выравнивания членов структуры 4 байт или выше. Вот так надо #pragma pack(push, 1) struct IDT_REGISTER { unsigned short size; unsigned int* address; }; #pragma pack(pop)
ANDLL Я под struct ID имел ввиду структуру дескриптора прерывания. По-моему так её определить надо (хотя лучше сам глянь в документацию): struct ID { short selector; DWORD offset; // адрес т.е. short flags; }; Опять же, с выравниванием 1.
2green:Спасибо, теперь по крайней мере нет exception'а, и адрес вполне рельный... О дальнейших изысканиях напишу