Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > Доступ в Ring0 под Windows 9x |
Автор: jungle 26.6.2006, 10:37 | ||
Хэллоу, друзья! Помогите корректно перевести сишный сорсис для доступа в привилегированный режим ядра Windows 9x – Ring0. Мой перевод, увы, пока не работает. Может быть кто-то силён в Си и Delphi (паскаль) одновременно? Исходный cpp код в прикреплении.
|
Автор: Romikgy 26.6.2006, 11:16 | ||
Имхо так ![]() вроде не ошибся |
Автор: jungle 26.6.2006, 11:39 | ||
Romikgy, Пишет Incompatible types для строчки pCallgate:=CALLGATE_DESCRIPTOR(pGDTDescriptor); ![]() О! Надо просто было объявить переменную pCallgate : CALLGATE_DESCRIPTOR; Сейчас заценим под Windows 9x на другой машине… Добавлено @ 11:51 Romikgy, Неа, не катит - исключение "ошибка доступа... Запись данных по адресу". Код обновил.
|
Автор: Romikgy 26.6.2006, 12:24 |
Это где? И я не понял , ты делаешь прогу не под 98, а запускаешь под 98? Добавлено @ 12:34 И вопрос который меня мучает в этой теме : НА КОЙ ТЕБЕ ПОД 98 НУЖНО НУЛЕВОЕ КОЛЬЦО????? Имхо в 98 проблем с асмом нет, нулевое кольцо нужно для планки виндов НТ |
Автор: jungle 26.6.2006, 13:37 |
Romikgy, Исходный код компилируется отлично. Как самый простейший пример – вызов функции CallRing0 я передаю в обработчике нажатия кнопки. Так вот после нажатия кнопки вываливается ошибка «Access violation at address XXXXX in module Project1.exe.Write of address XXXXX» Нулевое кольцо под Windows 98 мне нужно для чтения привилегированных MSR-регистров процессора, в частности, для вызова инструкции rdmsr. Конечно, это цивилизованно делается через vxd-драйвер, который ещё нужно грамотно написать, но, увы, нет желания постигать устаревшую «грамоту». |
Автор: Romikgy 26.6.2006, 14:59 |
jungle, покажи как используешь ![]() Я дома проверю на 98 |
Автор: jungle 26.6.2006, 15:14 |
Romikgy, Испоьзую очень просто: CallRing0(@Ring0ReadMSR,$10,0,0); MSR $00000010 - счетчик тактов процессора TSC. Я б Delphi на ту машину с Win98 поставил бы да в отладчике прозвонил бы, да вот места на харде нет. |
Автор: Romikgy 26.6.2006, 15:20 |
какой структуры? |
Автор: jungle 26.6.2006, 15:36 |
Ring0ReadMSR - это процедура чтения MSR регистра, адрес которой должен передаваться в функцию CallRing0 для выполнения Ring0ReadMSR в нулевом кольце. |
Автор: Romikgy 26.6.2006, 16:12 |
Что должно быть после выполнения этой функции? |
Автор: jungle 26.6.2006, 16:43 |
Число, которое, увеличивается при каждом повторном считывании TSC регистра (адрес $10). Добавлено @ 16:49 Хотя не принципиально, какая функция должна быть выполнена в нулевом кольце. Можно, например, написать функцию чтения портов или любую другую и передать ее адрес в функцию CallRing0 в качестве первого параметра. Просто процедура чтения MSR регистров Ring0ReadMSR как раз та, которая мне нужна. |
Автор: Damarus 26.6.2006, 18:49 |
Я конечно не очень разбираюсь в Delphi, но моё мнение: структуры TGDT_DESCRIPTOR, TCALLGATE_DESCRIPTOR, TGDTR описаны не верно. |
Автор: Damarus 26.6.2006, 20:30 | ||||||||
Romikgy, думаю хедерный файл не поможет. Мне кожется они и в нём описаны не верно. Моё мнение основано на этом: IA-32 Intel® Architecture Software Developer’s Manual Volume 3: System Programming Guide
|
Автор: jungle 27.6.2006, 08:35 | ||
Romikgy, Вот хедер:
|
Автор: Romikgy 27.6.2006, 10:46 | ||
Так попробуй |
Автор: jungle 27.6.2006, 13:55 |
Нет, не катит. Пишет "Access violation at address.... Read of address....". |
Автор: Romikgy 27.6.2006, 15:27 |
jungle, после какой команды это? |
Автор: SergeCpp 27.6.2006, 15:50 |
Что касается RDTSC (MSR#10h), то он читается и без перехода в 0 кольцо... В DOS-овской программе, работающей в Win9x-окне, правда не проходит... |
Автор: jungle 27.6.2006, 16:01 | ||||
Romikgy, Откуда ж мне знать? ![]()
Мне не нужна инструкция RDTSC, хотя и ее тоже можно сделать привилегированной через установку единственного бита CR-регистр процессора. TSC регистр взят в качестве совместимого как для всех AMD, так и Intel процессоров. Добавлено @ 16:04
RDTSC - типичная инструкция процессора, а MSR 10h - регистр процессора, т.е. это абсолютно разные вещи. |
Автор: Romikgy 27.6.2006, 16:32 |
jungle, дай весь исходник , что компилируешь, я дома проверю |
Автор: jungle 27.6.2006, 16:57 |
Romikgy, наиболее корректный: http://forum.vingrad.ru/index.php?showtopic=101839&st=0# (моё второе сообщение в этой ветке) Код, с учетом твоих последних поправок, также не рабочий. Поэтому код надо юзать тот, что указан по ссылке выше. |
Автор: Romikgy 27.6.2006, 17:01 |
jungle, нда , трудно было свой проект сжать и сюда закинуть ? Или ты считаешь , что у меня этого кода нет? Странный ты , тебе помочь , хочу, а ты не шивелишься ![]() Как знаешь , сегодня я уже домой иду, буду в нете (нормальном) только послезавтра) бывай ![]() |
Автор: jungle 27.6.2006, 17:11 |
Лови! Добавлено @ 17:14 Надеюсь успел ![]() |
Автор: jungle 29.6.2006, 11:45 |
Здарова! Заново переписал аналогичный сишный код, позаимствованный из книжки «Программирование аппаратных средств в Windows». Код отличается тем, что функция вызывает в нулевом кольце процедуры не чтения MSR-регистров, а чтения-записи портов. Сама суть поиска свободных дескрипторов та же самая. Прилагаемый архив содержит 4 страницы подробного сишного кода из вышеназванной книги и почти завершенный Delphi проект. Однако полагаю, что проблема как раз с передачей адреса вызываемой процедуры: call fword ptr [CallgateAddr] В Delphi типа fword не существует. Т.е. проблема с переводом кода на Delphi уже решена, остаётся только найти конкретную ошибку. |
Автор: Romikgy 29.6.2006, 11:49 |
нет У меня все работает, кроме: эти асм команды не воспринимаются , немного помучился с SGDT , и его заюать получилось ![]() но в ХР он ссылается на реальный участок памяти , в 98 в никуда ![]() Что должно возращать эта команда? и что за команды , которые не воспринимаются? с какого проца они есть ? у меня дома Атлон и или он не видит , или компилятор дельфей ![]() Пробовал даже исходник на си запустить в си билдере, тоже не работает ![]() отсель вопрос откуда код взят? и почему ты решил что он рабочий? |
Автор: jungle 29.6.2006, 14:26 |
Romikgy, Замени инструкции следующими эквивалентами в ассемблерной вставке rdmsr – dw $320F wrmsr – dw $300F Инструкции rdmsr и wrmsr понимаются компилятором Delphi 6 и выше, иначе заменяй их опкодами, приведенными выше. Сорсис я нашел в инете – Гуглой по запросу Ring0+Delphi+Windows9x. Очень много ссылок приводилось на китайские сайты. С одного из них я и слил cpp и h-файл, ссылку, увы, не запомнил. Но сейчас я больше доверяю коду, который перевёл с книги, название которой я уже приводил. Сейчас у меня проблема одна: компилятор Delphi 6 спотыкается на строчке call fword ptr [CallgateAddr] в ассемблерной вставке. |
Автор: Romikgy 29.6.2006, 16:45 |
А че это за тип такой? |
Автор: jungle 29.6.2006, 17:26 |
Похоже Паскальный аналог Int64 - 4 слова. |
Автор: dumb 30.6.2006, 01:57 | ||
не, не похоже ![]() 48 бит. селектор+оффсет примерно так, чтобы не париться с компилером:
если что, заменить "call fword ptr [esp]" на "dd 90241cffh" |
Автор: Girder 30.6.2006, 09:08 | ||
|
Автор: jungle 30.6.2006, 12:16 | ||||
Вот в чем фигня:
Процедура showmessage вызовет исключение, т.к. переменная pGDTHandle будет содержать только адрес gdt.dwGDTBase дескриптора, но не заполненную структуру GDT_HANDLE. А значит, при попытке обратиться к полям записи pGDTHandle будет всегда генерироваться ошибка чтения. Т.е. строчка
Не заполняет поля переменной pGDTHandle содержанием полей дескриптора! |