|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 18, 2004 20:38:34 Привет. Вообщем как сделать задержку, например на 165 ms, в ring0 (win2k)? Взялся за это недавно: непонятно ещё толком нихрена. Почитал Four-F, ну и всё такое... :P Нашёл: KeDelayExecutionThread. Думаю: ага - вот оно... Скомпилил, запустил - сайс выскочил... bsod... scandisk.. :) Выручайте. Пишу драйверок, который на уровне портов получает инфу о IDE-ATAPI устройствах. Так там нужно ждать не менее 3*55 ms, пока контроллер "опомнится"... :P P.S. Ага.. ну и ещё один вопрос. Если я обращаюсь к этому самому контроллеру через порты, то "по ходу" необходимо запретить прерывания, пока я с ним работаю. Ведь он же глобальный ресурс в системе ну и всё такое.. Или тут дельце обстоит по-другому ?.. :P Заранее благодарен. |
|
|
Дата: Май 18, 2004 20:44:16 PUSH OFFSET tHM_DELAY PUSH 0 ;false PUSH 0 ;KernelMode CALL KeDelayExecutionThread@12 , ГДЕ tHM_DELAY - LARGE_INTEGER MOV EAX,OFFSET tHM_DELAY ASSUME EAX:PTR LARGE_INTEGER MOV [EAX].LowValue,tH_SPEED ;задержка в " 100 anoseconds" - интервалах. MOV [EAX].HiValue,-1 ASSUME EAX:NOTHING |
|
|
Дата: Май 18, 2004 21:01:24 Хмм.. OFFSET, а не значение ? :P Посмотрим сейчас... |
|
|
Дата: Май 18, 2004 21:05:12 Значение в 8 байт запхать одной коммандой PUSH ??? |
|
|
Дата: Май 18, 2004 21:14:23 Хе-хе.. невнимательно посмотрел тип... :P |
|
|
Дата: Май 18, 2004 21:24:56
local liDelayTime:LARGE_INTEGER
or liDelayTime.HighPart, -1
mov liDelayTime.LowPart, not (165 * 1000000 / 100 )
invoke KeDelayExecutionThread, KernelMode, FALSE, addr liDelayTime
|
|
|
Дата: Май 18, 2004 21:52:16 · Поправил: snatch Эхе.. Спасибо.. Только вот у меня что-то случилось.. Винда отказывается после сбоя запускать мой драйвер.. Поменял названия символьной ссылки и устройства - всё равно... Что происходит?.. :( После вызова CreateService - код ошибки 0x436. Kernel Mode Driver Manager v1.1 by Four-F решил проблему. Драйвер будто бы уже был зарегистрирован. Странно... Что же это было? Может пора поставить SP4? ;) |
|
|
Дата: Май 19, 2004 14:50:23 Перед запуском драйвера ты его зарегестрировал в реестре. Потом кирдык, но запись в реестре осталась. После ребута ты пытаешься опять зарегестрировать уже зарегестрированный драйвер и получаешь облоом. Так что все нормально. |
|
|
Дата: Май 19, 2004 19:08:35 · Поправил: snatch - |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.058 |