Приветствую всех! В винде пытаюсь перенести TSS в другое место. Не получается - вываливается int3 в какой-то функции ядра(щас точно не помню). Я в этом деле начинающий, возможно что-то принципиальное упускаю и вообще позволит ли винда это сделать. Вот часть кода из моей DriverEntry Код (Text): cli ;Получаем адрес дескриптора str word [rtr] mov ebx, [rtr] sgdt [gdtr] shr ebx, 3 lea ebx,[ebx*8] add ebx, [gdt_base] ;Переносим TSS в другое место invoke MmAllocateNonCachedMemory, 4000h cmp eax, 0 jz ex mov [TSS_base],eax push eax mov eax, [ebx] mov edx, [ebx+4] mov ax, dx mov ah, byte [ebx+7] rol eax, 16 ;Переносим TSS в новое место xor ecx,ecx mov cx, word [ebx] inc ecx mov esi,eax pop eax mov edi, eax rep movsb ;Расширяем границу TSS на 32 байта mov dword [limingdt], ebx add word [ebx], 32 mov dx, [ebx] mov word [TSS_limit], dx ;И заносим новый адрес в дескриптор mov word [ebx+2], ax rol eax, 16 mov byte [ebx+4], al mov byte [ebx+7], ah ;Помечаем его как свободный иначе ltr вызовет ошибку and byte [ebx+5],11111101b ;Обнуляем новую IOPM mov edi, [TSS_base] add di, [TSS_limit] sub edi, 32 mov eax, 0 mov ecx, 32/4 rep stosd ;Перегружаем TR ltr word [rtr] sti
Переместить нереально наверно, придётся изменять KPCR.TSS; смотри KiSwapContext. Попробуй найти адрес его в переменных ntos и hal.
Спасибо за подсказку насчет KPCR.TSS, вставил единственую строчку кода Код (Text): ;И заносим новый адрес в дескриптор mov dword [fs:40h],eax ;в KPCR mov word [ebx+2], ax rol eax, 16 mov byte [ebx+4], al mov byte [ebx+7], ah И все прекрасно работает с TSS на новом месте. Это я делал для того, чтобы любым приложениям открыть доступ к нужным портам(так как у всех процессов по дефолту EProcess->IopmOffset = 20AC). Перед тем как это сделать я встречал примеры с расширением TSS по оригинальному базовому адресу, я тоже пытался так сделать, но на моей XP сразу за TSS идет какой-то код ядра, поэтому изменять его, обнуляя нужные биты для портов не получится. И я решил перенести TSS в другое более просторное место. Теперь у меня прямо с нужными портами работают и win32 и старые досовские приложения и мне переписывать их не придется, пока глюков в работе ос не замечено.
Не будет работать, там два TSS на каждом процессоре, конечно если не использовать AffinityMask. Кстати у тебя всёравно общий на все процессы TSS, ты мне идею дал использовать уникальные.. А с простым отрытием портов у меня всё нормально, для этого TSS перемещать не надо.
А какие еще есть методы открытия портов для всех приложений сразу? На ум приходит еще пропатчить ядерную функцию, которая при запуске нового процесса выполняет pProcess->IopmOffset = 20AC и заменить 20AC на что-нибудь поменьше, тогда TSS перемещать не придется. Но что это за функция я пока не знаю.
идея то, конечно, интересная, но в Linux такое не прокатит это так, к слову на MP системе этот код не даст нужного эффекта
Установи вручную: TSS_IOPM_OFFSET equ KTSS.IoMaps.IoMap ;88h Или юзай: Ke386GetIoAccessMap Ke386IoSetAccessMap Ke386IoSetAccessProcess
Еще вопрос, функция KeSetSystemAffinityThread сразу переводит текущий поток на другое ядро или только после его прерывания и получения им следующего кванта времени? И можно ли ее использовать для перехода на другое ядро и установку регистра TR по порядку на всех ядрах системы?
а все-таки? в Linux, к примеру, для этого используются миграционные процессы т. е запрос на изменение привязки процесса к процессору ставится в очередь миграционного процесса, выполняющегося на том же процессоре (на каждом процессоре выполняется один миграционный процесс), что и этот процесс, и этот миграционный процесс переводится в состояние готовности к выполнению после получения управления идет обработка всех поступивших запросов путем перемещения процессов из одних очередей выполнения в другие т. е все происходит далеко не сразу