Сейчас на форуме: tyns777, zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› Засада с WRMSR в DOS'е
Посл.ответ Сообщение

Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 мая 2013 11:40
· Личное сообщение · #1

Доброго времени суток!

Пишу в Borland Pascal'e (в чистом DOS'e) такую процедуру:

Procedure SetVID(D:Byte); assembler;
asm
push ds
db $66,$B9,$41,$00,$01,$C0 {mov ecx,0C0010041 в ECX номер MSR регистра}
db $66,$33,$D2 {xor edx,edx в EDX:EAX записываемое значение}
db $66,$0F,$BA,$E8,$10 {bts eax,16 устанавливаем 16 бит, такая особенность}
mov ah,D {записываем значение VID}

db $0F,$30 {wrmsr}
pop ds
pop ax
End;{SetVID}

При запуске происходит зависон на WRMSR, причем, не совсем зависон, комп реагирует на клаву (переполнение буфера клавиатуры)
Не могу понять в чем косяк???
Буду признателен за помощь.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 29 мая 2013 12:08
· Личное сообщение · #2

А чтение работает - RDMSR ??



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 мая 2013 12:41
· Личное сообщение · #3

RDMSR комп не вешает, процедура нормально завершается, но, судя по дебагеру, ничего не читает. Состояние ECX:EDX не изменяется.




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 29 мая 2013 13:37
· Личное сообщение · #4

А дос нормально работает с 32 битным кодом?



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 29 мая 2013 13:47 · Поправил: Veliant
· Личное сообщение · #5

попробуйте EAX очистить перед bts. И обернуть все в pusha/popa т.к. затираете общеупотребимые регистры



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 29 мая 2013 13:49 · Поправил: VodoleY
· Личное сообщение · #6

рекомендуют проверить поддерживает ли проц твой эти инструкции
The CPUID instruction should be used to determine whether MSRs are supported (EDX[5]=1) before using this instruction.
http://www.insidepro.com/kk/375/375r.shtml
статья криса.. там есть примеры

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 29 мая 2013 13:52
· Личное сообщение · #7

nfox76 пишет:
но, судя по дебагеру, ничего не читает. Состояние ECX:EDX не изменяется.

Во-первых EDX:EAX, в ECX номер. Во-вторых, возможно здесь есть над чем задуматься. К тому же, 0xC0010041 это MSR_K7_FID_VID_CTL, т.е. AMD'шные процессоры на старой архитектуре K7 -> возможно Ваш процессор более новый(или вообще Intel) и просто не поддерживает данную штуку (в силу ее ненужности).



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 мая 2013 14:24
· Личное сообщение · #8

Проц - Mobile AMD Athlon 64 4000+
Такую инструкцию поддерживает 100%
В винде всё работает отлично сам писАл прогу, всё чудненько записывает в этот MSR регистр.



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 мая 2013 14:34 · Поправил: nfox76
· Личное сообщение · #9

Nightshade пишет:
А дос нормально работает с 32 битным кодом?


Конечно, по идее и с 64 битным тоже должен, если переведешь его в 64 битный режим и будешь использовать 64 битные инструкции



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 мая 2013 14:39 · Поправил: nfox76
· Личное сообщение · #10

ELF_7719116 пишет:
Во-первых EDX:EAX, в ECX номер. Во-вторых, возможно здесь есть над чем задуматься. К тому же, 0xC0010041 это MSR_K7_FID_VID_CTL, т.е. AMD'шные процессоры на старой архитектуре K7 -> возможно Ваш процессор более новый(или вообще Intel) и просто не поддерживает данную штуку (в силу ее ненужности).


Да, по регистрам я ошибся....
Но, в моей процедуре, на мой взгляд, всё верно в ECX номер MSR регистра, а в EDX:EAX записываемое значение.
Проц - правильный.



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 мая 2013 14:47 · Поправил: nfox76
· Личное сообщение · #11

Veliant пишет:
попробуйте EAX очистить перед bts. И обернуть все в pusha/popa т.к. затираете общеупотребимые регистры


EAX очищать нельзя, в нем находится значение напряжение - множитель проца.
Я пытаюсь изменить напряжение.
Ещё раз повторюсь - такой алгоритм отлично работает в винде.



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 29 мая 2013 14:59 · Поправил: Veliant
· Личное сообщение · #12

Чего гадать на кофейной гуще? Возьмите любой отладчик под DOS и смотрите на чем именно тормозится/виснет. Еще не хватает перехватить прерывание GF, которое дергается если WRMSR не устраивает значение ECX




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 29 мая 2013 16:49
· Личное сообщение · #13

прям таки чистый дос? ой не верю, прям вот так вот с дискеточки запускаете паскакаль? ну допустим..
тогда EMM386 нужно выгружать



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 мая 2013 17:12
· Личное сообщение · #14

Veliant пишет:
Чего гадать на кофейной гуще? Возьмите любой отладчик под DOS и смотрите на чем именно тормозится/виснет. Еще не хватает перехватить прерывание GF, которое дергается если WRMSR не устраивает значение ECX


Так и делал. Запускаю Turbo Debugger борландовский, начинаю трассировку. Вешается на WRMSR.
По исключеню, да, у меня такая мысль была.
Цитата "Попытка чтения/записи зарезервированного или отсутствующего в данной модели MSR приводит к исключению GP0"
Но почему? Он не отсутствует, или что, в DOS'е стал зарезервированным?



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 мая 2013 17:19
· Личное сообщение · #15

reversecode пишет:
прям таки чистый дос? ой не верю, прям вот так вот с дискеточки запускаете паскакаль? ну допустим..тогда EMM386 нужно выгружать


Ну да. Чистый.
На машине стоит Sistem Commander (менеджер операционных систем) и кроме винды там есть ещё много всего, и в том числе DOS.
А что бы не грузились всякие дровишки достаточно держать Shift при старте, вот и будет чистый DOS.
Паскаль запускаю с винта, с раздела Fat32.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 29 мая 2013 17:27
· Личное сообщение · #16

дискету сделайте бутовой
и с нее грузитесь и тестируйте



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 30 мая 2013 10:44
· Личное сообщение · #17

reversecode пишет:
дискету сделайте бутовойи с нее грузитесь и тестируйте


Сделал всё по Вашему рецепту - бутовую дискетку DOS 6.22, никаких autoexec.bat и config.sys
Всё то же... ничего не изменилось.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 30 мая 2013 15:19 · Поправил: reversecode
· Личное сообщение · #18

делаете cli
потом делаете чтение msr
потом разрешаете прерывания
не повисло? хорошо

потом после чтения добавляете запись msr
cli/sti оставляете как было
если повиснет
значит где то в инициализации доса беда
и под чистым досом до msr в запись не добраться



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 30 мая 2013 15:31
· Личное сообщение · #19

Ок.
Один вопросик.
Что значит "разрешаете прерывания"
Просвятите пожалуйста.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 30 мая 2013 15:42
· Личное сообщение · #20

что то я завтыкал
--> Link <--
rdmsr and wrmsr are privileged instructions.
nfox76 пишет:
RDMSR комп не вешает, процедура нормально завершается, но, судя по дебагеру, ничего не читает. Состояние ECX:EDX не изменяется.

rdmsr похоже у вас тоже не работает

тема исчерпана



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 30 мая 2013 15:54
· Личное сообщение · #21

rmdmsr не работает, это я уже понял.
Ну, вообщем, на ring0 переходить, чтобы выполнить привилегированную инструкцию?



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 30 мая 2013 16:03
· Личное сообщение · #22

nfox76 я ж вам статью от Криса кидал.. там все четенько написано.. и сорцы драйвера.. ну неужто читать лень?

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 30 мая 2013 16:15
· Личное сообщение · #23

Нет, не лень, я это читал, один момент - "В ЗАЩИЩЕННОМ режиме обе команды могут вызываться только из нулевого кольца"
Я же пытаюсь её выполнить из Real Mode, по мануалам, вроде должна работать...

Ладно, буду пробовать из Ring0

Всем спасибо.
Тема исчерпана.


 eXeL@B —› Программирование —› Засада с WRMSR в DOS'е
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати