Два вопроса по драйверам в Windows

Тема в разделе "WASM.WIN32", создана пользователем hedgehog, 4 янв 2005.

  1. hedgehog

    hedgehog New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2005
    Сообщения:
    13
    Адрес:
    Russia
    У меня следующие вопросы:

    1.Как определить номер прерывания по irq(через порты ввода-вывода)?(Soft-Ice же как-то узнает).

    2.Как обратится к файлу из обработчика irq.(У меня это вызвает перезагрузку).
     
  2. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    2. Код в студию. Но с начало прочитай http://www.wasm.ru/article.php?article=drvw2k11



    1. это действительно проблема :dntknw: в Win98 они вроде фиксированые и в доке есть а для win2k/xp/2003 нужно копаться в направлении контроллера прерываний
     
  3. hedgehog

    hedgehog New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2005
    Сообщения:
    13
    Адрес:
    Russia
    В общем вопрос был задан на основе такого куска драйвера:

    .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(

    я смотрел в Зубкове -- там написано про инициализацию, а как прочитать -- нет)
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    [ hedgehog: <font color="indigo]В результате я не могу обращатся из kbdhandler к CreateFile</font><!--color--> ]



    Так какие ж файлы при IRQL > PASSIVE_LEVEL ?
     
  5. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    hedgehog



    по первому вопросу. В своё время я тоже задавал себе подобный вопрос.

    в win9x группа аппаратных ирков промапирована с 50h го вектора.

    что касается nt сколько я не прверял , этот адрес всегда был равен 30h. Да и судя по исходникам там не очень-то придерживается тенденции изменения базового адреса.

    Как остоят дела в лонгхорне не знаю, всё лень глянуть, да и никакой айс под ним из тех что у меня есть работать не хочет. Приходится самопальными средствами.
     
  6. hedgehog

    hedgehog New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2005
    Сообщения:
    13
    Адрес:
    Russia


    Ну хорошо. У нас есть область памяти, которая

    доступна и и обработчику и другим процедурам.

    Я хочу записать эту область по событию внутри обработчика.

    Может я уже почти и ответил на свой вопрос(надо использовать объект синхронизации), но хотелось бы узнать мнение профессионалов.

    К вопросу о 1: как определить, какой контроллер прерываний: APIC или PIC(это решит проблему хотя бы отчасти)
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    [ hedgehog: <font color="indigo]Ну хорошо. У нас есть область памяти, которая доступна и и обработчику и другим роцедурам.

    Я хочу записать эту область по событию внутри обработчика.
    </font><!--color--> ]



    Не понимаю в чем проблема. Если область памяти уже есть, так бери и пиши. Если она неподкачиваемая, так и вообще думать не надо. Конкретизируй вопрос.



    Касательно файлов на повышенных IRQL, можно использовать рабочие элементы (work items). Они всегда на PASSIVE_LEVEL работают. Ты им делегируешь часть работы, они её делают. Пример можно глянуть \KmdKit\examples\basic\WorkItem. Можно рабочему элементу и запись в файл заказать.
     
  8. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    hedgehog

    а вот о контроллере как я уже говорил реестр поведает !!! Искать, и ещё раз искать !!! Госспади, как же ты всё усложняешь себе . !
     
  9. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    hedgehog



    и вообще, заведи себе системный поток, пусть он сам рулит с вопросами файлов и записи в них в дравере
     
  10. hedgehog

    hedgehog New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2005
    Сообщения:
    13
    Адрес:
    Russia
    В общем спасибо всем ответившим. Теперь все работает(в файл пишет).

    Однако есть еще одна фича:

    обработчик вида

    pushad

    in al,60h

    popad

    jmp [old_proc]

    поглощает все клавиши.. Как это исправить?
     
  11. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    В Зубкове нашел - описание работы с портами клавиатуры:



    команда F3 ??, порт 60h для записи:

    ...

    команда FEh - послать последний скэн-код еще раз



    ну или call вместо jmp и смотри буфер или что там.