Перемещение TSS

Тема в разделе "WASM.NT.KERNEL", создана пользователем Asvald, 27 мар 2008.

  1. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Приветствую всех!
    В винде пытаюсь перенести TSS в другое место. Не получается - вываливается int3 в какой-то функции ядра(щас точно не помню). Я в этом деле начинающий, возможно что-то принципиальное упускаю и вообще позволит ли винда это сделать. Вот часть кода из моей DriverEntry
    Код (Text):
    1. cli
    2. ;Получаем адрес дескриптора
    3. str word [rtr]
    4. mov ebx, [rtr]
    5. sgdt [gdtr]
    6. shr ebx, 3
    7. lea ebx,[ebx*8]
    8. add ebx, [gdt_base]
    9. ;Переносим TSS в другое место
    10. invoke MmAllocateNonCachedMemory, 4000h
    11. cmp eax, 0
    12. jz ex
    13. mov [TSS_base],eax
    14. push eax
    15. mov eax, [ebx]
    16. mov edx, [ebx+4]
    17. mov ax, dx
    18. mov ah, byte [ebx+7]
    19. rol eax, 16
    20. ;Переносим TSS в новое место
    21. xor ecx,ecx
    22. mov cx, word [ebx]
    23. inc ecx
    24. mov esi,eax
    25. pop eax
    26. mov edi, eax
    27. rep movsb
    28.  
    29. ;Расширяем границу TSS на 32 байта
    30. mov dword [limingdt], ebx
    31. add word [ebx], 32
    32. mov dx, [ebx]
    33. mov word [TSS_limit], dx
    34.  
    35. ;И заносим новый адрес в дескриптор
    36. mov word [ebx+2], ax
    37. rol eax, 16
    38. mov byte [ebx+4], al
    39. mov byte [ebx+7], ah
    40.  
    41. ;Помечаем его как свободный иначе ltr вызовет ошибку
    42. and byte [ebx+5],11111101b
    43.  
    44. ;Обнуляем новую IOPM
    45. mov edi, [TSS_base]
    46. add di, [TSS_limit]
    47. sub edi, 32
    48. mov eax, 0
    49. mov ecx, 32/4
    50. rep stosd
    51. ;Перегружаем TR
    52. ltr word [rtr]
    53. sti
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Переместить нереально наверно, придётся изменять KPCR.TSS; смотри KiSwapContext. Попробуй найти адрес его в переменных ntos и hal.
     
  3. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Спасибо за подсказку насчет KPCR.TSS, вставил единственую строчку кода
    Код (Text):
    1. ;И заносим новый адрес в дескриптор
    2.  
    3. mov dword [fs:40h],eax ;в KPCR
    4. mov word [ebx+2], ax
    5. rol eax, 16
    6. mov byte [ebx+4], al
    7. mov byte [ebx+7], ah
    И все прекрасно работает с TSS на новом месте. Это я делал для того, чтобы любым приложениям открыть доступ к нужным портам(так как у всех процессов по дефолту EProcess->IopmOffset = 20AC). Перед тем как это сделать я встречал примеры с расширением TSS по оригинальному базовому адресу, я тоже пытался так сделать, но на моей XP сразу за TSS идет какой-то код ядра, поэтому изменять его, обнуляя нужные биты для портов не получится. И я решил перенести TSS в другое более просторное место.
    Теперь у меня прямо с нужными портами работают и win32 и старые досовские приложения и мне переписывать их не придется, пока глюков в работе ос не замечено.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Интересная идея. У тебя однопроцессорная система ?
     
  5. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Да это писалось на однопроцессорной, вечером проверю на Core 2 Duo. А с чем могут быть проблемы?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Не будет работать, там два TSS на каждом процессоре, конечно если не использовать AffinityMask.
    Кстати у тебя всёравно общий на все процессы TSS, ты мне идею дал использовать уникальные..
    А с простым отрытием портов у меня всё нормально, для этого TSS перемещать не надо.
     
  7. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    А какие еще есть методы открытия портов для всех приложений сразу?
    На ум приходит еще пропатчить ядерную функцию, которая при запуске нового процесса выполняет pProcess->IopmOffset = 20AC и заменить 20AC на что-нибудь поменьше, тогда TSS перемещать не придется. Но что это за функция я пока не знаю.
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    идея то, конечно, интересная, но в Linux такое не прокатит
    это так, к слову
    на MP системе этот код не даст нужного эффекта
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Установи вручную:
    TSS_IOPM_OFFSET equ KTSS.IoMaps.IoMap ;88h
    Или юзай:
    Ke386GetIoAccessMap
    Ke386IoSetAccessMap
    Ke386IoSetAccessProcess
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Да и EPROCESS.IopmOffset не забудь..
     
  11. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    не по этому
    TR в остальных CPU будет содержать старый дескриптор TSS
     
  12. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    А как можно изменить TR в остальных CPU?
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Смотри как реализована Ke386SetIoAccessMap(->KeGenericCallDpc).
     
  14. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Еще вопрос, функция KeSetSystemAffinityThread сразу переводит текущий поток на другое ядро или только после его прерывания и получения им следующего кванта времени? И можно ли ее использовать для перехода на другое ядро и установку регистра TR по порядку на всех ядрах системы?
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Сразу
     
  16. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    каким таким образом?
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KiSelectNextThread()
     
  18. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Clerk
    меня интересует не выбор потока, а процесс связывания с другим процессором
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Тебя не поймёшь..
     
  20. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    а все-таки?
    в Linux, к примеру, для этого используются миграционные процессы
    т. е запрос на изменение привязки процесса к процессору ставится в очередь миграционного процесса, выполняющегося на том же процессоре (на каждом процессоре выполняется один миграционный процесс), что и этот процесс, и этот миграционный процесс переводится в состояние готовности к выполнению
    после получения управления идет обработка всех поступивших запросов
    путем перемещения процессов из одних очередей выполнения в другие
    т. е все происходит далеко не сразу