Хочу попробовать сделать обработчик прерывания в драйвере, прерывание - 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)
<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--> Так поставь прерывание на существующий и посмотри, как его вызывают.
Большое спасибо, Four-F. Как я понял, я должен зарегистрировать обработчик IRP_MJ_PNP и в нем вызывать IoConnectInterrupt. А будет ли посылатся это сообщение, ведь у меня устройство виртуальное, физического нет?
Four-F Все правильно, приходит IRP_MJ_PNP.IRP_MN_START_DEVICE, но параметр irpStack->Parameters.StartDevice.AllocatedResourcesTranslated неправильный (0x00000080). Это не связано с выравниванием? --Так поставь прерывание на существующий и посмотри, как его вызывают. Существующие обработчики обрабатывают аппаратные, а мне хотелось именно программное.
Может очень грубо, но работает Код (Text): .data IDT_Base df 0 OldIDTEntry dq 0 .code HookInt proc IntN:DWORD, lpNewProc:DWORD cli push edi sidt fword ptr [IDT_Base] mov edi, dword ptr [IDT_Base+2] mov eax, IntN and eax,0FFh shl eax, 3 add edi, eax mov eax, dword ptr [edi] mov dword ptr [OldIDTEntry], eax mov eax, dword ptr [edi+4] mov dword ptr [OldIDTEntry+4], eax mov ax, cs mov word ptr [edi+2],ax mov eax, lpNewProc mov word ptr [edi], ax shr eax, 10h mov word ptr [edi+6], ax mov byte ptr [edi+5], 0EEh pop edi sti ret HookInt endp UnHookInt proc IntN:DWORD cli push edi sidt fword ptr [IDT_Base] mov edi, dword ptr [IDT_Base+2] mov eax, IntN and eax,0FFh shl eax, 3 add edi, eax mov eax, dword ptr [OldIDTEntry] mov dword ptr [edi], eax mov eax, dword ptr [OldIDTEntry+4] mov dword ptr [edi+4], eax pop edi sti ret UnHookInt endp MyIntHandler: cli ............ sti iretd
Работать то оно работает, но не на мультипроцессорных машинах. А они в наше время встречаються нередко. Лучше заюзать multiprocessor.c из исходников IceExt.
Код Bohdan200 работает, я его воткнул в драйвер на VC++ 7.1, обработчик пустой: Код (Text): __declspec(naked) INT80Handler() { __asm cli __asm sti __asm iretd }, в проге на Delphi вызываю: Код (Text): asm int 80h end, все работает. Пробовал в обработчик воткнуть DbgPrint("Int 80") - вылетает, если я хочу сделать так, то надо писать процедуру DPC, и все делать там?
<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, а там слишком много всего.
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, верно или не до конца?
<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 - это, как минимум, на несколько месяцев.
На полноту код конечно не претендует, я его использовал больше в целях "самообучения" Оной код потом дорос до системы Ring0 сервисов, которые я вызывал из Ring3 прожек на дельфи через INT n.