В рамках одного процесса есть несколько потоков, TEB каждого из них находится по адресу FS:0 в пользовательском режиме. Так вот, значения сегментного регистра FS в обоих потоках одинаковы и равны 0x3B, то есть селектор с этим значением описывает ОДИН сегмент, но линейные адреса, в которые преобразовывается логичнский FS:0 разные. Чем это можно объяснить?
Значение FS постоянно только на NT системах! вот что пишет Питрек: [источник] „I also noticed the different uses of the FS register between Windows NT and Windows 95. Under Windows NT, the FS register is always the same for each thread's TIB. This implies that the linear address for the FS selector has to change whenever a thread switch occurs. In contrast, Windows 95 dedicates a different selector for each TIB (and hence, for each thread). The linear address of a Windows 95 TIB selector doesn't change.“
This implies that the linear address for the FS selector has to change whenever a thread switch occurs вот это-то мне и интересно! Каким образом меняется лиейный адрес? Меняется база сегмента, на который указывает селектор в FS, то есть изменяется сам дескриптор в GDT?
А возможны ли другие способы? Вот фрагмент ф-ции SwapContext из "первоисточника" (рrivаtе\ntоs\kе\i386\сtxswар.аsm) Код (Text): mov eax, [esi]+ThTeb ; get user TEB address mov [ebx]+PcTeb, eax ; set user TEB address ; ; Edit the TEB descriptor to point to the TEB ; sti ; enable interrupts mov ecx, [ebx]+PcGdt ; mov [ecx]+(KGDT_R3_TEB+KgdtBaseLow), ax ; shr eax, 16 ; mov [ecx]+(KGDT_R3_TEB+KgdtBaseMid), al ; shr eax, 8 mov [ecx]+(KGDT_R3_TEB+KgdtBaseHi), al