Of course. In fact, there are two more TSS. One for NMI, another... I forgot
JMI, convert me to "Volodya" then.
"Vlad" is always in abbreviation of "Vladislav"
"Vladimir" and "Volodya" both have the shorten form of "Vova", but the last one I really hate
OK. Sorry for offtop. As a partial excuse here is the code of SwapContext.
.text:00404334 SwapContext proc near ; CODE XREF: KiUnlockDispatcherDatabase+6Ep
.text:00404334 ; KiSwapThread+BCp ...
.text:00404334 or cl, cl ; esi - KTHREAD
.text:00404334 ; cl - BYTE WaitIrql
.text:00404334 ; ebx - KPCR.SelfPcr
.text:00404336 mov es:[esi+KTHREAD.State], 2
.text:0040433B pushf
.text:0040433C mov ecx, [ebx] ; ecx - *KPCR
.text:0040433E cmp dword ptr [ebx+80Ch], 0 ; KPCR.KPRCB.DpcRoutineActive
.text:00404345 push ecx
.text:00404346 jnz KeBugCheck
.text:0040434C mov ebp, cr0
.text:0040434F mov edx, ebp
.text:00404351 mov cl, [esi+KTHREAD.DebugActive]
.text:00404354 mov [ebx+50h], cl ; KPCR.DebugActive
.text:00404357 cli
.text:00404358 mov [edi+KTHREAD.KernelStack], esp
.text:0040435B mov eax, [esi+KTHREAD.InitialStack]
.text:0040435E mov ecx, [esi+KTHREAD.StackLimit]
.text:00404361 sub eax, 210h
.text:00404366 mov [ebx+KPCR.NtTib.StackLimit], ecx
.text:00404369 mov [ebx+KPCR.NtTib.StackBase], eax
.text:0040436C xor ecx, ecx
.text:0040436E mov cl, [esi+KTHREAD.NpxState]
.text:00404371 and edx, 0FFFFFFF1h
.text:00404374 or ecx, edx
.text:00404376 or ecx, [eax+20Ch]
.text:0040437C cmp ebp, ecx
.text:0040437E jnz zero_CR0
.text:00404384
.text:00404384 loc_404384: ; CODE XREF: SwapContext+107j
.text:00404384 test dword ptr [eax-1Ch], 20000h
.text:0040438B jnz short loc_404390
.text:0040438D sub eax, 10h
.text:00404390
.text:00404390 loc_404390: ; CODE XREF: SwapContext+57j
.text:00404390 mov ecx, [ebx+KPCR.TSS]
.text:00404393 mov [ecx+4], eax ; KTSS.Esp0
.text:00404396 mov esp, [esi+KTHREAD.KernelStack]
.text:00404399 mov eax, [esi+KTHREAD.Teb]
.text:0040439C mov [ebx+KPCR.NtTib.Self], eax
.text:0040439F sti
.text:004043A0 mov ecx, [ebx+KPCR.GDT]
.text:004043A3 mov [ecx+3Ah], ax ; into GDT fs
.text:004043A7 shr eax, 10h
.text:004043AA mov [ecx+3Ch], al
.text:004043AD shr eax, 8
.text:004043B0 mov [ecx+3Fh], al
.text:004043B3 mov eax, [edi+KTHREAD.ApcState.Process]
.text:004043B6 cmp eax, [esi+KTHREAD.ApcState.Process]
.text:004043B9 jz short __ret
.text:004043BB mov edi, [esi+KTHREAD.ApcState.Process]
.text:004043BE xor eax, eax
.text:004043C0 db 66h
.text:004043C0 mov gs, ax
.text:004043C3 mov eax, [edi+KPROCESS.DirectoryTableBase]
.text:004043C6 mov ebp, [ebx+KPCR.TSS]
.text:004043C9 mov ecx, dword ptr [edi+KPROCESS.IopmOffset]
.text:004043CC mov [ebp+KTSS.CR3], eax
.text:004043CF mov cr3, eax
.text:004043D2 mov [ebp+KTSS.IoMapBase], cx
.text:004043D6 xor eax, eax
.text:004043D8 cmp [edi+KPROCESS.LdtDescriptor.LimitLow], ax
.text:004043DC jnz short lldt
.text:004043DE lldt ax
.text:004043E1 lea ecx, [ecx]
.text:004043E3
.text:004043E3 __ret: ; CODE XREF: SwapContext+85j
.text:004043E3 ; SwapContext+102j
.text:004043E3 inc [esi+KTHREAD.ContextSwitches]
.text:004043E6 inc [ebx+KPCR.PrcbData.KeContextSwitches]
.text:004043EC pop ecx
.text:004043ED mov [ebx+KPCR.NtTib.ExceptionList], ecx
.text:004043EF cmp [esi+KTHREAD.ApcState.KernelApcPending], 0
.text:004043F3 jnz short _ret
.text:004043F5 popf
.text:004043F6 xor eax, eax
.text:004043F8 retn
.text:004043F9 ; ---------------------------------------------------------------------------
.text:004043F9
.text:004043F9 _ret: ; CODE XREF: SwapContext+BFj
.text:004043F9 popf
.text:004043FA jnz short ___ret
.text:004043FC mov al, 1
.text:004043FE retn
.text:004043FF ; ---------------------------------------------------------------------------
.text:004043FF
.text:004043FF ___ret: ; CODE XREF: SwapContext+C6j
.text:004043FF mov cl, 1
.text:00404401 call ds:_imp_HalRequestSoftwareInterrupt
.text:00404407 xor eax, eax
.text:00404409 retn
.text:0040440A ; ---------------------------------------------------------------------------
.text:0040440A
.text:0040440A lldt: ; CODE XREF: SwapContext+A8j
.text:0040440A mov ebp, [ebx+KPCR.GDT]
.text:0040440D mov eax, dword ptr [edi+KPROCESS.LdtDescriptor.LimitLow]
.text:00404410 mov [ebp+48h], eax
.text:00404413 mov eax, [edi+KPROCESS.LdtDescriptor.HighWord]
.text:00404416 mov [ebp+4Ch], eax
.text:00404419 mov eax, 48h
.text:0040441E mov ebp, [ebx+KPCR.IDT]
.text:00404421 mov ecx, dword ptr [edi+KPROCESS.Int21Descriptor.Offset]
.text:00404424 mov [ebp+108h], ecx
.text:0040442A mov ecx, dword ptr [edi+KPROCESS.Int21Descriptor.Access]
.text:0040442D mov [ebp+10Ch], ecx
.text:00404433 lldt ax
.text:00404436 jmp short __ret
.text:00404438 ; ---------------------------------------------------------------------------
.text:00404438
.text:00404438 zero_CR0: ; CODE XREF: SwapContext+4Aj
.text:00404438 mov cr0, ecx
.text:0040443B jmp loc_404384
.text:00404440 ; ---------------------------------------------------------------------------
.text:00404440
.text:00404440 KeBugCheck: ; CODE XREF: SwapContext+12j
.text:00404440 push 0B8h
.text:00404445 call KeBugCheck
.text:0040444A retn
.text:0040444A SwapContext endp