Как работает HalRequestSoftwareInterrupt?

Тема в разделе "WASM.RESEARCH", создана пользователем Noldor, 6 окт 2011.

  1. Noldor

    Noldor New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2011
    Сообщения:
    1
    Здравствуйте! Может кто позволит разрешить небольшую загадку? Ковырялся я недавно в исходниках винды (однопроцессорный 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
     
  2. reversecode

    reversecode Guest

    Публикаций:
    0
    так и запишет
    а то разрабы доказывают что с винды они не брали НИ СТРОЧКИ!!!
    все своими умами делали!!!
     
  3. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    or PCR[PcIRR], eax ; PCR[PcIRR] Какое ЗНАЧЕНИЯ будет?
    mov eax, PCR[PcIRR]
    and eax, 3
    Так откуда буду братся первые два бита?
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    shchetinin
    По-моему, тут больше вопрос в том, каким образом может из этого быть вызвана _HalpDispatchInterrupt2.
    Вызов ф-ии из таблицы же происходит только в случае, если dl > cl. Но к моменту этой проверки максимально возможное значение dl — это единица. Т.е. из таблицы не может быть вызвано ничего кроме _HalpApcInterrupt.
     
  5. Satsurok

    Satsurok New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2011
    Сообщения:
    25
    Здравствуйте меня зовут Санжур Сатсура. Я типа авер из Макафе, но меня скоро уволят.

    Я кидаю честных людей на бабло.

    Кидаю хорошо и уже давно.

    Зевсы покупаю значит а потом говорю всем что слил с гейта.

    Вот такой я нехороший человек.

    Недавно кинул хороших и честных ребят на 2К, сейчас не хочу признаваться в этом.
     
  6. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    l_inc
    А не меньше? при чем строго меньше ... jbe
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    shchetinin
    Зуб даю.
     
  8. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    l_inc
    Печалька...
    cmp dl, cl
    jbe ТАк когда же прыгним?
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    shchetinin
    Ну что ж Вы так невнимательно читаете (хотя откуда Ваше "строго меньше" взялось, вообще непонятно).
    Ну давайте маленькими шажочками, как в детском саду, разберёмся...
    jbe -> jump if below equal -> переход когда dl <= cl -> нет перехода, когда dl > cl ->
    Более подробно не смогу объяснить, даже если захочу.
     
  10. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    l_inc
    Сначало пусть автор даст оригинальный сорс а потом будем идти шагами маленькими и большими.