У меня следующие вопросы: 1.Как определить номер прерывания по irq(через порты ввода-вывода)?(Soft-Ice же как-то узнает). 2.Как обратится к файлу из обработчика irq.(У меня это вызвает перезагрузку).
2. Код в студию. Но с начало прочитай http://www.wasm.ru/article.php?article=drvw2k11 1. это действительно проблема в Win98 они вроде фиксированые и в доке есть а для win2k/xp/2003 нужно копаться в направлении контроллера прерываний
В общем вопрос был задан на основе такого куска драйвера: .data idtr dd 0,0 old_proc dd 0 ;CreateFile и AppendFile я взял из статьи Four-F(спасибо ему) ;Файл создается в C:\ ;Все вызовы DbgPrint убраны DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING cli sidt fword ptr idtr mov eax,dword ptr idtr+2 add eax,(093h*8)+6 ;For APIC ; add eax,(0B3h*8)+6 ;For usually PIC mov cx,[eax] sub eax,6 rol ecx,16 mov cx,[eax] mov old_proc,ecx lea ecx,kbdhandler mov [eax],cx ror ecx,16 add eax,6 mov [eax],cx sidt fword ptr idtr ; mov eax,STATUS_DEVICE_CONFIGURATION_ERROR sti mov eax,STATUS_SUCCESS ret DriverEntry endp kbdhandler: pushad invoke CreateFile ; invoke AppendFile popad jmp [old_proc] end DriverEntry В результате я не могу обращатся из kbdhandler к CreateFile И хотелось бы через контроллер прерываний получить номер прерывания по irq( я смотрел в Зубкове -- там написано про инициализацию, а как прочитать -- нет)
[ hedgehog: <font color="indigo]В результате я не могу обращатся из kbdhandler к CreateFile</font><!--color--> ] Так какие ж файлы при IRQL > PASSIVE_LEVEL ?
hedgehog по первому вопросу. В своё время я тоже задавал себе подобный вопрос. в win9x группа аппаратных ирков промапирована с 50h го вектора. что касается nt сколько я не прверял , этот адрес всегда был равен 30h. Да и судя по исходникам там не очень-то придерживается тенденции изменения базового адреса. Как остоят дела в лонгхорне не знаю, всё лень глянуть, да и никакой айс под ним из тех что у меня есть работать не хочет. Приходится самопальными средствами.
Ну хорошо. У нас есть область памяти, которая доступна и и обработчику и другим процедурам. Я хочу записать эту область по событию внутри обработчика. Может я уже почти и ответил на свой вопрос(надо использовать объект синхронизации), но хотелось бы узнать мнение профессионалов. К вопросу о 1: как определить, какой контроллер прерываний: APIC или PIC(это решит проблему хотя бы отчасти)
[ hedgehog: <font color="indigo]Ну хорошо. У нас есть область памяти, которая доступна и и обработчику и другим роцедурам. Я хочу записать эту область по событию внутри обработчика.</font><!--color--> ] Не понимаю в чем проблема. Если область памяти уже есть, так бери и пиши. Если она неподкачиваемая, так и вообще думать не надо. Конкретизируй вопрос. Касательно файлов на повышенных IRQL, можно использовать рабочие элементы (work items). Они всегда на PASSIVE_LEVEL работают. Ты им делегируешь часть работы, они её делают. Пример можно глянуть \KmdKit\examples\basic\WorkItem. Можно рабочему элементу и запись в файл заказать.
hedgehog а вот о контроллере как я уже говорил реестр поведает !!! Искать, и ещё раз искать !!! Госспади, как же ты всё усложняешь себе . !
hedgehog и вообще, заведи себе системный поток, пусть он сам рулит с вопросами файлов и записи в них в дравере
В общем спасибо всем ответившим. Теперь все работает(в файл пишет). Однако есть еще одна фича: обработчик вида pushad in al,60h popad jmp [old_proc] поглощает все клавиши.. Как это исправить?
В Зубкове нашел - описание работы с портами клавиатуры: команда F3 ??, порт 60h для записи: ... команда FEh - послать последний скэн-код еще раз ну или call вместо jmp и смотри буфер или что там.