diff --git a/reactos/ntoskrnl/ke/i386/context.c b/reactos/ntoskrnl/ke/i386/context.c index e1a7f11a6c5..5617a678514 100644 --- a/reactos/ntoskrnl/ke/i386/context.c +++ b/reactos/ntoskrnl/ke/i386/context.c @@ -34,9 +34,17 @@ KiSwapProcess(IN PKPROCESS NewProcess, /* Check for new LDT */ if (NewProcess->LdtDescriptor.LimitLow != OldProcess->LdtDescriptor.LimitLow) { - /* Not handled yet */ - UNIMPLEMENTED_DBGBREAK(); - return; + if (NewProcess->LdtDescriptor.LimitLow) + { + KeSetGdtSelector(KGDT_LDT, + ((PULONG)&NewProcess->LdtDescriptor)[0], + ((PULONG)&NewProcess->LdtDescriptor)[1]); + Ke386SetLocalDescriptorTable(KGDT_LDT); + } + else + { + Ke386SetLocalDescriptorTable(0); + } } /* Update CR3 */ diff --git a/reactos/ntoskrnl/ke/i386/ldt.c b/reactos/ntoskrnl/ke/i386/ldt.c index 14298de2994..3501712ffaf 100644 --- a/reactos/ntoskrnl/ke/i386/ldt.c +++ b/reactos/ntoskrnl/ke/i386/ldt.c @@ -167,7 +167,7 @@ BOOLEAN PspIsDescriptorValid(PLDT_ENTRY ldt_entry) if ((Base + SegLimit > (ULONG_PTR) MmHighestUserAddress) || (Base > Base+SegLimit)) { - DPRINT1("WARNING: Windows would mark this descriptor invalid!"); + DPRINT1("WARNING: Windows would mark this descriptor invalid!\n"); } /* diff --git a/reactos/ntoskrnl/ke/i386/thrdini.c b/reactos/ntoskrnl/ke/i386/thrdini.c index ba7935c3dd1..66264b5030e 100644 --- a/reactos/ntoskrnl/ke/i386/thrdini.c +++ b/reactos/ntoskrnl/ke/i386/thrdini.c @@ -345,8 +345,17 @@ KiSwapContextExit(IN PKTHREAD OldThread, /* Check if there is a different LDT */ if (*(PULONGLONG)&OldProcess->LdtDescriptor != *(PULONGLONG)&NewProcess->LdtDescriptor) { - DPRINT1("LDT switch not implemented\n"); - ASSERT(FALSE); + if (NewProcess->LdtDescriptor.LimitLow) + { + KeSetGdtSelector(KGDT_LDT, + ((PULONG)&NewProcess->LdtDescriptor)[0], + ((PULONG)&NewProcess->LdtDescriptor)[1]); + Ke386SetLocalDescriptorTable(KGDT_LDT); + } + else + { + Ke386SetLocalDescriptorTable(0); + } } /* Switch address space and flush TLB */