· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› как сохранить содержимое регистра GS

Посл.отвђт Сообщенiе


Дата: Окт 7, 2004 13:08:36

В моей программе, используется некая библиотека.
Эта библиотека использует регистр 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.


Дата: Окт 7, 2004 18:22:52

я так понял, что ты чего то мутишь с VDM. Так вот. В xp как и в прочих ntхах тсс, который нам нужен описывается дескриптором по селектору 28h. Этот сегмент используется всеми процессами системы в равной степени. Так вот, самое интересное, что в 2к его размер равен 68h и не так сильно запачкан, а в ХР там содержится уже много чего интересного и самое интересное, что вот этот самый регистр уже хранит какое то значение, пока не знаю для чего и что там, но, попробую разобраться. так что, скорее всего, он для чего то используется системой. будь осторожнее. Хотя, context должен его сохранять... Значит, это какой то глюк в системе, чегоразработчики могли и не учесть, потому , как по умолчанию, исходя из официальной литературы, данный регистр не используется....


Дата: Окт 7, 2004 18:43:58

Я пробовал в 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.


Дата: Окт 8, 2004 06:34:29

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


Дата: Окт 8, 2004 09:07:26

Что такое bosch я знаю. мне он не пойдёт. Слишком медленно. Тут лучше бы подошло vmware. но нужно именно так как задуманно.
Ладно тем не менее спасибо за ответ.


Дата: Окт 10, 2004 07:58:04

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


Дата: Окт 10, 2004 07:59:34

найти просто,, ставь бряки на тсс, и смотри, кто в него пишет в данное поле.


Дата: Окт 11, 2004 09:05:28

попробую, спасибо. а результатах нпишу.


Дата: Окт 11, 2004 11:18:13

Cardinal!

поставил бряк
bpmw 28:5c
он не сработал. Самое интересное что в tss GS так и остаётся равным 7 (т.е. команда tss 28 выдаёт GS = 7),
а текущее содержимое GS(в окне регистров softice) 0.

Вот это не очень понятно (я сейчас под XP):
>ты знаешь, я порылся в коде ХР, котороый свопит контекст, >хм, интересно то, что данный регистр тоже сохраняется, а >в 2к такого нет...
ты имеешь в виду, что 2000 всё должно быть ок?


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.049