- Copy kernel's IDT entries to the IDT we've got from the bootloader. Fixes boot-process initiated by ntldr-compatible loaders.

svn path=/trunk/; revision=29477
This commit is contained in:
Aleksey Bragin 2007-10-10 12:39:54 +00:00
parent 336b29de42
commit 5257ae8196

View file

@ -661,6 +661,7 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
ULONG InitialStack;
PKGDTENTRY Gdt;
PKIDTENTRY Idt;
KIDTENTRY NmiEntry, DoubleFaultEntry;
PKTSS Tss;
PKIPCR Pcr;
@ -722,6 +723,19 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
/* Save NMI and double fault traps */
RtlCopyMemory(&NmiEntry, &Idt[2], sizeof(KIDTENTRY));
RtlCopyMemory(&DoubleFaultEntry, &Idt[8], sizeof(KIDTENTRY));
/* Copy kernel's trap handlers */
RtlCopyMemory(Idt,
(PVOID)KiIdtDescriptor.Base,
KiIdtDescriptor.Limit + 1);
/* Restore NMI and double fault */
RtlCopyMemory(&Idt[2], &NmiEntry, sizeof(KIDTENTRY));
RtlCopyMemory(&Idt[8], &DoubleFaultEntry, sizeof(KIDTENTRY));
AppCpuInit:
/* Loop until we can release the freeze lock */
do