|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 6, 2003 02:07:58 Знатоки PM и внутренностей NT, помогите разобраться! Мне необходимо получить доступ к ring0 из ring3. Для этого я решил использовать callgate. Как я правлю GDT - это не существенно (пробовал и прямо из KD). Итак, я описываю этот самый шлюз вызова (DPL и все остальное выставляю 100% правильно), в качестве селектора указываю 0008h. Это есть селектор кода для ring0 в NT (KGDT_R0_CODE, описан в ntddk.h) Далее, делаю call far - управление получает мой код. Но вот в чем проблема - через раз я читаю "A fatal system error has occurred", и приходиться ребутать VMWare... Причем ошибка вылезает каждый раз разная, в разных модулях и т.д. Если же добавить в GDT свой собственный дескриптор, аналагичный дескриптору кода NT, и использовать новый селектор - то все отлично работает! В чем же дело? Почему нельзя использовать NT'шный селектор??? |
|
|
Дата: Ноя 7, 2003 19:24:51 |
|
|
Дата: Ноя 9, 2003 00:23:06 Сегодня прочел я это дело. К сожалению, ничего нового там нет, хотя дока безусловно заслуживат внимания (попадись она мне недельку назад - не пришлось бы самому думать - хотя, это и к лучшему...). Однако, при создании callgate используется селектор 8h: CgDesc->selector = 8; Единственный момент не очень понятный мне момент:
if(!VirtualLock((PVOID) Ring0Func, 0x30)) {
printf("error: unable to lock function\n");
CurMap.pAddress.QuadPart = 1;
} else {
CurMap.vAddress = vAddress; //ugly way to passargument
CurMap.Offset = (DWORD) vAddress % Granularity;
(DWORD) CurMap.vAddress -= CurMap.Offset;
SetThreadPriority(Thread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(0);
_asm call fword ptr [farcall]
SetThreadPriority(Thread,THREAD_PRIORITY_NORMAL);
VirtualUnlock((PVOID) Ring0Func, 0x30);
}
Зачем VirtualLock я еще могу понять, но для чего изменение приоритета потока? Может, есть идеи? ЗЫ И почему при использовании собвственного дескриптора эти "финты ушами" не требуются? Дзен сплошной..... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.085 |