Уважаемые, подскажите. Хочу сделать код, который бы читал поле Offset из дескриптора IDE для прерывания 2E. Стараюсь писать по док-ции Intel: "Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1" Вот получилось что: Код (Text): typedef struct _Idt { USHORT Size; ULONG Base; } TIdt; typedef struct _IDT_DESCRIPTOR { USHORT LowPartOffset; USHORT Selector; USHORT Flags; USHORT HighPartOffset; } IDT_DESCRIPTOR, *PIDT_DESCRIPTOR; ULONG CR0Reg; ULONG Trap2eOffset=0; void ClearInt() { __asm { cli mov eax, cr0 mov CR0Reg,eax and eax,0xFFFEFFFF mov cr0, eax } } void SetInt() { __asm { mov eax, CR0Reg mov cr0, eax sti } } VOID DriverUnload(IN PDRIVER_OBJECT DriverObject) { DPRINT("Driver unloaded"); return; } VOID GetIDT() { TIdt Idt; PIDT_DESCRIPTOR Desc2e; ClearInt(); __asm { sidt [Idt] } SetInt(); DPRINT("Idt.Base: %#0x",Idt.Base); DPRINT("Idt.Limit: %#0x",Idt.Size); Desc2e=(PIDT_DESCRIPTOR)(Idt.Base+(0x2e-1)*8); Trap2eOffset=(USHORT)Desc2e->HighPartOffset; //!!! Trap2eOffset=Trap2eOffset<<16; Trap2eOffset+=Desc2e->LowPartOffset; DPRINT("2E Int routine offset: %x", Trap2eOffset); } На строке, помеченной "//!!!", система падает (ребут). Подскажите, в чем моя ошибка, я хочу до конца разобраться. Инфа о системе: WXP SP3 on Microsoft Virtual PC 2007.
Это значит, что твоя струтура имеет размер 8 байт Код (Text): typedef struct _Idt { USHORT Size; // После этого идут два байта заполнения для оптимизации ULONG Base; } TIdt; А вот так она станет размером 6 байт , т.е. упакуется Код (Text): #pragma pack(push,2) typedef struct _Idt { USHORT Size; // После этого идут два байта ULONG Base; } TIdt;
Кстати, а не накосячил-ли я вот с этой строкой: Код (Text): Desc2e=(PIDT_DESCRIPTOR)(Idt.Base+(0x2e-1)*8); Потому как видел в дикой природе что-то вроде: Код (Text): Desc2e=(PIDT_DESCRIPTOR)Idt.Base+0x2e;
Great В руководстве Intel (см. выше) на схеме Figure 5-1 индексы идут с нуля, а векторы - с 1. Поэтому и спросил. Спасибо за ответ, сделаю без "-1".