VOID NTAPI HalpBorrowTss(VOID) { USHORT Tss; PKGDTENTRY TssGdt; ULONG_PTR TssLimit; PKTSS TssBase; // // Get the current TSS and its GDT entry // Tss = Ke386GetTr(); TssGdt = &((PKIPCR)KeGetPcr())->GDT[Tss / sizeof(KGDTENTRY)]; // // Get the KTSS limit and check if it has IOPM space // TssLimit = TssGdt->LimitLow | TssGdt->HighWord.Bits.LimitHi << 16; // // If the KTSS doesn't have enough space this is probably an NMI or DF // if (TssLimit > IOPM_SIZE) { // // We are good to go // HalpSavedTss = 0; return; } // // Get the "real" TSS // TssGdt = &((PKIPCR)KeGetPcr())->GDT[KGDT_TSS / sizeof(KGDTENTRY)]; TssBase = (PKTSS)(ULONG_PTR)(TssGdt->BaseLow | TssGdt->HighWord.Bytes.BaseMid << 16 | TssGdt->HighWord.Bytes.BaseHi << 24); // // Switch to it // KeGetPcr()->TSS = TssBase; // // Set it up // TssGdt->HighWord.Bits.Type = I386_TSS; TssGdt->HighWord.Bits.Pres = 1; TssGdt->HighWord.Bits.Dpl = 0; // // Load new TSS and return old one // Ke386SetTr(KGDT_TSS); HalpSavedTss = Tss; }
VOID FASTCALL INIT_FUNCTION KiGetMachineBootPointers(IN PKGDTENTRY *Gdt, IN PKIDTENTRY *Idt, IN PKIPCR *Pcr, IN PKTSS *Tss) { KDESCRIPTOR GdtDescriptor, IdtDescriptor; KGDTENTRY TssSelector, PcrSelector; USHORT Tr, Fs; /* Get GDT and IDT descriptors */ Ke386GetGlobalDescriptorTable(&GdtDescriptor.Limit); __sidt(&IdtDescriptor.Limit); /* Save IDT and GDT */ *Gdt = (PKGDTENTRY)GdtDescriptor.Base; *Idt = (PKIDTENTRY)IdtDescriptor.Base; /* Get TSS and FS Selectors */ Tr = Ke386GetTr(); Fs = Ke386GetFs(); /* Get PCR Selector, mask it and get its GDT Entry */ PcrSelector = *(PKGDTENTRY)((ULONG_PTR)*Gdt + (Fs & ~RPL_MASK)); /* Get the KPCR itself */ *Pcr = (PKIPCR)(ULONG_PTR)(PcrSelector.BaseLow | PcrSelector.HighWord.Bytes.BaseMid << 16 | PcrSelector.HighWord.Bytes.BaseHi << 24); /* Get TSS Selector, mask it and get its GDT Entry */ TssSelector = *(PKGDTENTRY)((ULONG_PTR)*Gdt + (Tr & ~RPL_MASK)); /* Get the KTSS itself */ *Tss = (PKTSS)(ULONG_PTR)(TssSelector.BaseLow | TssSelector.HighWord.Bytes.BaseMid << 16 | TssSelector.HighWord.Bytes.BaseHi << 24); }