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, dgorbachev(a)svn.reactos.org 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 */