В моей программе, используется некая библиотека. Эта библиотека использует регистр 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.
я так понял, что ты чего то мутишь с VDM. Так вот. В xp как и в прочих ntхах тсс, который нам нужен описывается дескриптором по селектору 28h. Этот сегмент используется всеми процессами системы в равной степени. Так вот, самое интересное, что в 2к его размер равен 68h и не так сильно запачкан, а в ХР там содержится уже много чего интересного и самое интересное, что вот этот самый регистр уже хранит какое то значение, пока не знаю для чего и что там, но, попробую разобраться. так что, скорее всего, он для чего то используется системой. будь осторожнее. Хотя, context должен его сохранять... Значит, это какой то глюк в системе, чегоразработчики могли и не учесть, потому , как по умолчанию, исходя из официальной литературы, данный регистр не используется....
Я пробовал в 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.
assad тогда лучше возьми bosch эмулятор, и не мучайся. Тем более, что он является 100% эмулятором, доступен в исходниках, кросплатформенный. Правда, требуется ему довольно мощная тачка
Что такое bosch я знаю. мне он не пойдёт. Слишком медленно. Тут лучше бы подошло vmware. но нужно именно так как задуманно. Ладно тем не менее спасибо за ответ.
assad ты знаешь, я порылся в коде ХР, котороый свопит контекст, хм, интересно то, что данный регистр тоже сохраняется, а в 2к такого нет... у тбя есть вариант прпатчить ntoskrnl
Cardinal! поставил бряк bpmw 28:5c он не сработал. Самое интересное что в tss GS так и остаётся равным 7 (т.е. команда tss 28 выдаёт GS = 7), а текущее содержимое GS(в окне регистров softice) 0. Вот это не очень понятно (я сейчас под XP): >ты знаешь, я порылся в коде ХР, котороый свопит контекст, >хм, интересно то, что данный регистр тоже сохраняется, а >в 2к такого нет... ты имеешь в виду, что 2000 всё должно быть ок?