как сохранить содержимое регистра GS

Тема в разделе "WASM.WIN32", создана пользователем assad, 7 окт 2004.

  1. assad

    assad New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2004
    Сообщения:
    7
    Адрес:
    Russia
    В моей программе, используется некая библиотека.

    Эта библиотека использует регистр gs. причем gs она сама устанавливает равным 7.

    Я создаю ldt c одной записью, затем библиотека заносит в gs 7.

    во время выполнения программы gs сбрасывается в 0.

    с помощью softice установил, что в tss gs = 0.

    Скорее всего gs сбрасывается при переключении задач.



    Вопрос. Как сделать так, чтобы при переключении задач gs не сбрасывался.

    Может можно как-то дать указание sheduler'у перед переключением контекста задачи сохранить содержимое этого регистра?



    Инициализация ldt, модификация и использования gs происходят в user mode.

    ldt точно создаётся. если отлавливать page fault в __try ... __except,

    а затем выставлять gs в нужную величину то вроде всё работает.

    Но это как-то некрасиво, т.е. заранее ведь неизвестно gs будет 7 или нет в другой системе может уже существовать 0 запись в ldt.

    системы winNT/2k/XP. в худшем случае хватит и win2k/XP.
     
  2. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    я так понял, что ты чего то мутишь с VDM. Так вот. В xp как и в прочих ntхах тсс, который нам нужен описывается дескриптором по селектору 28h. Этот сегмент используется всеми процессами системы в равной степени. Так вот, самое интересное, что в 2к его размер равен 68h и не так сильно запачкан, а в ХР там содержится уже много чего интересного и самое интересное, что вот этот самый регистр уже хранит какое то значение, пока не знаю для чего и что там, но, попробую разобраться. так что, скорее всего, он для чего то используется системой. будь осторожнее. Хотя, context должен его сохранять... Значит, это какой то глюк в системе, чегоразработчики могли и не учесть, потому , как по умолчанию, исходя из официальной литературы, данный регистр не используется....
     
  3. assad

    assad New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2004
    Сообщения:
    7
    Адрес:
    Russia
    Я пробовал в softice устанавливать GS хранящийся именно по этому селектору. методом тыка я определил что GS находиться по смещению 0x5c от начала селектора.

    но тем не менее GS сбрасывается всё равно. даже несмотру на хак в softice.



    вообще я мучу не с VDM, а с запуском под виндой linux программ. в Fedore ядро 2.6 glibc 2.3.4 регистр gs используется для организации tls.

    LDT как я понял ао умолчанию в винде не создана я её создаю так

    LDT_ENTRY l1;

    l1.BaseLow = ldt_info.base_addr & 0xFFFF;

    l1.HighWord.Bytes.BaseMid = ldt_info.base_addr >> 16;

    l1.HighWord.Bytes.BaseHi = ldt_info.base_addr >> 24;

    l1.LimitLow = (ldt_info.limit>> 12) & 0xFFFF;

    l1.HighWord.Bits.LimitHi = ldt_info.limit >> 28;

    l1.HighWord.Bits.Granularity = 1;//ldt_info.imit_in_pages;

    l1.HighWord.Bits.Default_Big = 1;//ldt_info.seg_32bit;

    l1.HighWord.Bits.Reserved_0 = 0; // 0/1

    l1.HighWord.Bits.Sys = 0; // 0/1

    l1.HighWord.Bits.Pres = 1; // 0/1 (presence bit)

    l1.HighWord.Bits.Dpl = 3; // only 3 allowed :-(

    l1.HighWord.Bits.Type = 18; // [16..27]



    DWORD buf[4];



    buf[0] = 0 & 0xFFFFFFF8;

    buf[1] = 8; // size (multiple selectors may be added)

    memcpy(&buf[2], &l1, 8);

    NtSetInformationProcess((HANDLE)-1,ProcessLdtInformation/*10*/,buf,16) ;



    дальше в linux коде выполняется что то типа

    mov edx,7

    mov gs,dx

    далее что то типа

    mov eax, gs:[0]



    весь код линукса в __try __catch

    я ловлю исключение заношу в gs значение 7 и повторяю попытку выполнить линуксовый код.

    но вся фишка в том что в принципе gs может быть и не первым в ldt.
     
  4. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    assad

    тогда лучше возьми bosch эмулятор, и не мучайся. Тем более, что он является 100% эмулятором, доступен в исходниках, кросплатформенный. Правда, требуется ему довольно мощная тачка
     
  5. assad

    assad New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2004
    Сообщения:
    7
    Адрес:
    Russia
    Что такое bosch я знаю. мне он не пойдёт. Слишком медленно. Тут лучше бы подошло vmware. но нужно именно так как задуманно.

    Ладно тем не менее спасибо за ответ.
     
  6. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    assad

    ты знаешь, я порылся в коде ХР, котороый свопит контекст, хм, интересно то, что данный регистр тоже сохраняется, а в 2к такого нет... у тбя есть вариант прпатчить ntoskrnl
     
  7. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    найти просто,, ставь бряки на тсс, и смотри, кто в него пишет в данное поле.
     
  8. assad

    assad New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2004
    Сообщения:
    7
    Адрес:
    Russia
    попробую, спасибо. а результатах нпишу.
     
  9. assad

    assad New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2004
    Сообщения:
    7
    Адрес:
    Russia
    Cardinal!



    поставил бряк

    bpmw 28:5c

    он не сработал. Самое интересное что в tss GS так и остаётся равным 7 (т.е. команда tss 28 выдаёт GS = 7),

    а текущее содержимое GS(в окне регистров softice) 0.



    Вот это не очень понятно (я сейчас под XP):

    >ты знаешь, я порылся в коде ХР, котороый свопит контекст, >хм, интересно то, что данный регистр тоже сохраняется, а >в 2к такого нет...

    ты имеешь в виду, что 2000 всё должно быть ок?