IoConnectInterrupt

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

Статус темы:
Закрыта.
  1. angren

    angren New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    19
    Хочу попробовать сделать обработчик прерывания в драйвере, прерывание - INT 90, например, но можно любое другое неиспользуемое, а в пользовательской программе вызвать его - __asm int 90h. В DriverEntry вызываю IoConnectInterrupt:



    BOOLEAN IrqHandler( IN PKINTERRUPT Interrupt, IN PVOID ServiceContext )

    {

    return TRUE;

    }



    PKINTERRUPT InterruptObject;

    KAFFINITY affinity = 1;

    KIRQL irql, SynchronizeIrql;



    IoConnectInterrupt(&InterruptObject, (PKSERVICE_ROUTINE)IrqHandler,

    (PVOID)de, NULL, 0x90, irql,

    SynchronizeIrql, Latched, FALSE,

    affinity, FALSE);



    Мне не понятно, что нужно передавать в параметрах irql, SynchronizeIrql, ведь это обработчик программного прерывания, мне никто не передает эти параметры(как если бы вызов IoConnectInterrupt был из AddDevice). Пробовал подставлять разные числа, но всегда возвращает STATUS_INVALID_PARAMETERS. А может это Latched? Просто хочется зарегистрировать свой обработчик и в отладчике посмотреть, как он там вызывается(WinDBG + 2 compa)
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ angren</font><!--color--><font color="gray]: Мне не понятно, что нужно передавать в параметрах irql, SynchronizeIrql, ведь это обработчик программного прерывания, мне никто не передает эти параметры(как если бы вызов IoConnectInterrupt был из AddDevice). ]</font><!--color-->



    Передаёт. Запуская стеки устройств (IRP_MJ_PNP.IRP_MN_START_DEVICE), система формирует списки доступных для стека ресурсов и шлет их в стек в структуре CM_RESOURCE_LIST. Драйвер должен выбирать из предложенного списка. IoConnectInterrupt не предназначена для вызова ни из AddDevice, ни из DriverEntry.





    <font color="gray][ angren</font><!--color--><font color="gray]: Просто хочется зарегистрировать свой обработчик и в отладчике посмотреть, как он там вызывается(WinDBG + 2 compa) ]</font><!--color-->



    Так поставь прерывание на существующий и посмотри, как его вызывают.
     
  3. angren

    angren New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    19
    Большое спасибо, Four-F.

    Как я понял, я должен зарегистрировать обработчик IRP_MJ_PNP и в нем вызывать IoConnectInterrupt. А будет ли посылатся это сообщение, ведь у меня устройство виртуальное, физического нет?
     
  4. angren

    angren New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    19
    Four-F

    Все правильно, приходит IRP_MJ_PNP.IRP_MN_START_DEVICE, но параметр irpStack->Parameters.StartDevice.AllocatedResourcesTranslated неправильный (0x00000080). Это не связано с выравниванием?



    --Так поставь прерывание на существующий и посмотри, как его вызывают.



    Существующие обработчики обрабатывают аппаратные, а мне хотелось именно программное.
     
  5. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Может очень грубо, но работает :)


    Код (Text):
    1.  
    2. .data
    3. IDT_Base    df 0
    4. OldIDTEntry dq 0
    5.  
    6. .code
    7. HookInt proc IntN:DWORD, lpNewProc:DWORD
    8.     cli
    9.     push edi
    10.     sidt fword ptr [IDT_Base]
    11.     mov edi, dword ptr [IDT_Base+2]
    12.     mov eax, IntN
    13.     and eax,0FFh
    14.     shl eax, 3
    15.     add edi, eax
    16.     mov eax, dword ptr [edi]
    17.     mov dword ptr [OldIDTEntry], eax
    18.     mov eax, dword ptr [edi+4]
    19.     mov dword ptr [OldIDTEntry+4], eax
    20.     mov ax, cs
    21.     mov word ptr [edi+2],ax
    22.     mov eax, lpNewProc
    23.     mov word ptr [edi], ax
    24.     shr eax, 10h
    25.     mov word ptr [edi+6], ax
    26.     mov byte ptr [edi+5], 0EEh
    27.     pop edi
    28.     sti
    29.     ret
    30. HookInt endp
    31.  
    32. UnHookInt proc IntN:DWORD
    33.     cli
    34.     push edi
    35.     sidt fword ptr [IDT_Base]
    36.     mov edi, dword ptr [IDT_Base+2]
    37.     mov eax, IntN
    38.     and eax,0FFh
    39.     shl eax, 3
    40.     add edi, eax
    41.     mov eax, dword ptr [OldIDTEntry]
    42.     mov dword ptr [edi], eax
    43.     mov eax, dword ptr [OldIDTEntry+4]
    44.     mov dword ptr [edi+4], eax
    45.     pop edi
    46.     sti
    47.     ret
    48. UnHookInt endp
    49.  
    50. MyIntHandler:
    51.     cli
    52.     ............
    53.     sti
    54.     iretd
    55.  
     
  6. angren

    angren New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    19
    Bohdan200

    Спасибо большое, сейчас попробую
     
  7. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Работать то оно работает, но не на мультипроцессорных машинах. А они в наше время встречаються нередко.



    Лучше заюзать multiprocessor.c из исходников IceExt.
     
  8. angren

    angren New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    19
    Код Bohdan200 работает, я его воткнул в драйвер на VC++ 7.1, обработчик пустой:


    Код (Text):
    1.  
    2. __declspec(naked) INT80Handler()
    3. {
    4.     __asm   cli
    5.     __asm   sti
    6.     __asm   iretd
    7. },
    8.  


    в проге на Delphi вызываю:


    Код (Text):
    1.  
    2. asm
    3.   int 80h
    4. end,
    5.  


    все работает. Пробовал в обработчик воткнуть DbgPrint("Int 80") - вылетает, если я хочу сделать так, то надо писать процедуру DPC, и все делать там?
     
  9. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Значит что-то не так воткнул.
     
  10. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ angren</font><!--color--><font color="gray]: Все правильно, приходит IRP_MJ_PNP.IRP_MN_START_DEVICE, но параметр irpStack->Parameters.StartDevice.AllocatedResourcesTranslated неправильный (0x00000080). ]</font><!--color-->



    Дело в том, что перед тем как запускать стеки система шлет в них IRP_MN_QUERY_RESOURCE_REQUIREMENTS. По этому запросу шинные драйверы формируют списки нужных им ресурсов. Поимев все списки система пытается перераспределить все ресурсы таким образом, чтобы удовлетворить всех. Поскольку в ответ на IRP_MN_QUERY_RESOURCE_REQUIREMENTS система ничего не поимела от тебя, то посчитала, что ресурсы тебе не нужны. Любое (наверное) физ. устройство можно сэмулировать, так что физическое оно или виртуальное - это не принципиально.



    Если интересует именно исследование обработчика прерывания, то проще поставить хук, как предлагали. Иначе придется разбираться с PnP, а там слишком много всего.
     
  11. angren

    angren New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    19
    Four-F



    Из DDK:

    IRP_MN_QUERY_RESOURCE_REQUIREMENTS

    The PnP Manager uses this IRP to get a device's resource requirements list.



    Bus drivers must handle this request for their child devices that require hardware resources. Bus filter drivers can handle this request. Function and filter drivers do not handle this IRP



    Интересно, но мой драйвер не получает

    IRP_MN_QUERY_RESOURCE_REQUIREMENTS, из всех IRP_MJ_PNP получает только

    IRP_MN_START_DEVICE. MS говорит, что XX_RESOURCE_REQUIREMENTS обрабатывают только шинные драйвера.Может надо где-то дать системе знать, что это PnP-драйвер (не до конца понимаю, есть ли разница между PnP и Legacy)?



    А такой простой драйвер, как мой, который в DriverEntry создает вирт.устройство и регистрирует обработчики IRP_MJ_DEVICE_CONTROL, IRP_MJ_CLOSE и CREATE, относится к Legacy драйверам? Значит, нельзя считать его функциональным или еще каким, ведь это классификация WDM драйверов...



    Особенности PnP драйвера - использование AddDevice и реагирование на IRP_MJ_PNP, верно или не до конца?
     
  12. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ angren</font><!--color--><font color="gray]: Может надо где-то дать системе знать, что это PnP-драйвер (не до конца понимаю, есть ли разница между PnP и Legacy)? ]</font><!--color-->



    Нужно записать кое-что в реестр. Разница есть.





    <font color="gray][ angren</font><!--color--><font color="gray]: А такой простой драйвер, как мой, который в DriverEntry создает вирт.устройство и регистрирует обработчики IRP_MJ_DEVICE_CONTROL, IRP_MJ_CLOSE и CREATE, относится к Legacy драйверам? ]</font><!--color-->



    Да.





    <font color="gray][ angren</font><!--color--><font color="gray]: Значит, нельзя считать его функциональным или еще каким, ведь это классификация WDM драйверов... ]</font><!--color-->



    Нет, нельзя.





    <font color="gray][ angren</font><!--color--><font color="gray]: Особенности PnP драйвера - использование AddDevice и реагирование на IRP_MJ_PNP, верно или не до конца? ]</font><!--color-->



    Верно, почти до конца. Он ещё не должен пытаться самостоятельно выделять ресурсы для своего устройства, а должен использовать только то, что даст ему система.





    Для начала, прочти "Adding a PnP Device to a Running System" в ДДК. Потом смотри %ddk%\src\general\toaster - это пример виртуального устройства. В том числе там есть пример драйвера виртуальной шины. Но ещё раз повторю: если стоит задача разобраться с работой обработчика прерывания, то не нужно разбираться с PnP - это, как минимум, на несколько месяцев.
     
  13. Bohdan200

    Bohdan200 New Member

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




    На полноту код конечно не претендует, я его использовал больше в целях "самообучения" :)

    Оной код потом дорос до системы Ring0 сервисов, которые я вызывал из Ring3 прожек на дельфи через INT n.
     
Статус темы:
Закрыта.