Здравствуйте! Может кто позволит разрешить небольшую загадку? Ковырялся я недавно в исходниках винды (однопроцессорный hal.dll для WinNt4), хотел узнать, как там устроены прерывания. Споткнулся на функции HalRequestSoftwareInterrupt. Такое впечатление, что она вообще не должна работать. Но она ведь тем не менее работает, и не только в винде, но и в ReactOS перенесена с точностью до строчки. Вывод - я где-то что глобально не понимаю в ассемблерных командах. Может, вы подскажете, что. Проблема с функцией должна происходить, когда запрашивается прерывание диспетчеризации DISPATCH_LEVEL c кодом 2. Передача аргумента осуществляется в cl. Мои комментарии в скобках cPublicFastCall HalRequestSoftwareInterrupt ,1 cPublicFpo 0, 1 mov eax,1 shl eax, cl ; convert to mask (теперь в eax 100b) pushfd ; save interrupt mode cli ; disable interrupt or PCR[PcIRR], eax ; set the request bit mov cl, PCR[PcIrql] ; get current IRQL mov eax, PCR[PcIRR] ; get SW interrupt request register and eax, 3 ; mask off pending HW interrupts (Почему не 7? Ведь единица в третьем разряде. Теперь после этой команды в eax будет нуль) xor edx, edx mov dl, SWInterruptLookUpTable[eax] ; get the highest pending ; software interrupt level (SWInterruptLookUpTable[0] = 0) cmp dl, cl ; Is highest SW int level > irql? jbe short KsiExit ; No, jmp ksiexit call SWInterruptHandlerTable[edx*4] ; yes, simulate interrupt (Получается, вместо HalpDispatchInterrupt2 вызывается :_KiUnexpectedInterrupt) ; to the appropriate handler KsiExit: popfd ; restore original interrupt mode fstRET HalRequestSoftwareInterrupt fstENDP HalRequestSoftwareInterrupt public SWInterruptLookUpTable SWInterruptLookUpTable label byte db 0 ; SWIRR=0, so highest pending SW irql= 0 db 0 ; SWIRR=1, so highest pending SW irql= 0 db 1 ; SWIRR=2, so highest pending SW irql= 1 db 1 ; SWIRR=3, so highest pending SW irql= 1 db 2 ; SWIRR=4, so highest pending SW irql= 2 db 2 ; SWIRR=5, so highest pending SW irql= 2 db 2 ; SWIRR=6, so highest pending SW irql= 2 db 2 ; SWIRR=7, so highest pending SW irql= 2 public SWInterruptHandlerTable SWInterruptHandlerTable label dword dd offset FLAT:_KiUnexpectedInterrupt ; irql 0 dd offset FLAT:_HalpApcInterrupt ; irql 1 dd offset FLAT:_HalpDispatchInterrupt2 ; irql 2 dd offset FLAT:_KiUnexpectedInterrupt ; irql 3
так и запишет а то разрабы доказывают что с винды они не брали НИ СТРОЧКИ!!! все своими умами делали!!!
or PCR[PcIRR], eax ; PCR[PcIRR] Какое ЗНАЧЕНИЯ будет? mov eax, PCR[PcIRR] and eax, 3 Так откуда буду братся первые два бита?
shchetinin По-моему, тут больше вопрос в том, каким образом может из этого быть вызвана _HalpDispatchInterrupt2. Вызов ф-ии из таблицы же происходит только в случае, если dl > cl. Но к моменту этой проверки максимально возможное значение dl — это единица. Т.е. из таблицы не может быть вызвано ничего кроме _HalpApcInterrupt.
Здравствуйте меня зовут Санжур Сатсура. Я типа авер из Макафе, но меня скоро уволят. Я кидаю честных людей на бабло. Кидаю хорошо и уже давно. Зевсы покупаю значит а потом говорю всем что слил с гейта. Вот такой я нехороший человек. Недавно кинул хороших и честных ребят на 2К, сейчас не хочу признаваться в этом.
shchetinin Ну что ж Вы так невнимательно читаете (хотя откуда Ваше "строго меньше" взялось, вообще непонятно). Ну давайте маленькими шажочками, как в детском саду, разберёмся... jbe -> jump if below equal -> переход когда dl <= cl -> нет перехода, когда dl > cl -> Более подробно не смогу объяснить, даже если захочу.