That function is not supposed to be called by old bootloader directly. Why is that needed? And why in this function?
WBR, Aleksey Bragin. On Jul 30, 2009, at 9:54 PM, [email protected] wrote: > Author: dgorbachev > Date: Thu Jul 30 19:54:01 2009 > New Revision: 42305 > > URL: http://svn.reactos.org/svn/reactos?rev=42305&view=rev > Log: > Add a hack in KiSystemStartupReal function until Better Times. > > Modified: > trunk/reactos/ntoskrnl/ke/i386/kiinit.c > > Modified: trunk/reactos/ntoskrnl/ke/i386/kiinit.c > URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/ > i386/kiinit.c?rev=42305&r1=42304&r2=42305&view=diff > ====================================================================== > ======== > --- trunk/reactos/ntoskrnl/ke/i386/kiinit.c [iso-8859-1] (original) > +++ trunk/reactos/ntoskrnl/ke/i386/kiinit.c [iso-8859-1] Thu Jul 30 > 19:54:01 2009 > @@ -712,18 +712,34 @@ > 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)); > + /* HACK compensates for KiRosPrepareForSystemStartup hack */ > + if ((ULONG)Idt == KiIdtDescriptor.Base) > + { > + USHORT FlippedSelector; > + > + FlippedSelector = KiIdt[2].Selector; > + KiIdt[2].Selector = KiIdt[2].ExtendedOffset; > + KiIdt[2].ExtendedOffset = FlippedSelector; > + > + FlippedSelector = KiIdt[8].Selector; > + KiIdt[8].Selector = KiIdt[8].ExtendedOffset; > + KiIdt[8].ExtendedOffset = FlippedSelector; > + } > + else > + { > + /* 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 */ > > _______________________________________________ Ros-dev mailing list [email protected] http://www.reactos.org/mailman/listinfo/ros-dev
